Explorar el Código

迎宾巡逻安防机器人后端

zmj hace 2 semanas
padre
commit
acaf96c85c
Se han modificado 38 ficheros con 3642 adiciones y 3 borrados
  1. 5 2
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  2. 106 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsAppointmentRecordController.java
  3. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsFaqController.java
  4. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsFaqSimilarController.java
  5. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsMediaAssetController.java
  6. 105 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsVisitorRecordController.java
  7. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsWhitelistController.java
  8. 1 1
      ruoyi-admin/src/main/resources/application.yml
  9. 165 0
      ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsAppointmentRecord.java
  10. 132 0
      ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsFaq.java
  11. 81 0
      ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsFaqSimilar.java
  12. 206 0
      ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsMediaAsset.java
  13. 208 0
      ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsVisitorRecord.java
  14. 179 0
      ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsWhitelist.java
  15. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsAppointmentRecordMapper.java
  16. 87 0
      ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsFaqMapper.java
  17. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsFaqSimilarMapper.java
  18. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsMediaAssetMapper.java
  19. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsVisitorRecordMapper.java
  20. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsWhitelistMapper.java
  21. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsAppointmentRecordService.java
  22. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsFaqService.java
  23. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsFaqSimilarService.java
  24. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsMediaAssetService.java
  25. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsVisitorRecordService.java
  26. 61 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsWhitelistService.java
  27. 96 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsAppointmentRecordServiceImpl.java
  28. 134 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsFaqServiceImpl.java
  29. 93 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsFaqSimilarServiceImpl.java
  30. 96 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsMediaAssetServiceImpl.java
  31. 96 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsVisitorRecordServiceImpl.java
  32. 96 0
      ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsWhitelistServiceImpl.java
  33. 109 0
      ruoyi-system/src/main/resources/mapper/base/RobotOpsAppointmentRecordMapper.xml
  34. 134 0
      ruoyi-system/src/main/resources/mapper/base/RobotOpsFaqMapper.xml
  35. 74 0
      ruoyi-system/src/main/resources/mapper/base/RobotOpsFaqSimilarMapper.xml
  36. 120 0
      ruoyi-system/src/main/resources/mapper/base/RobotOpsMediaAssetMapper.xml
  37. 124 0
      ruoyi-system/src/main/resources/mapper/base/RobotOpsVisitorRecordMapper.xml
  38. 108 0
      ruoyi-system/src/main/resources/mapper/base/RobotOpsWhitelistMapper.xml

+ 5 - 2
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -3,20 +3,23 @@ package com.ruoyi;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
 
 /**
  * 启动程序
  *
  * @author ruoyi
  */
-@SpringBootApplication
+
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }, scanBasePackages = { "com.ruoyi.*", "com.test.*" })
 @MapperScan("com.ruoyi.**.mapper")
 public class RuoYiApplication
 {
     public static void main(String[] args)
     {
         SpringApplication.run(RuoYiApplication.class, args);
-        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)号楼  \n" +
+        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)  \n" +
                 " .-------.       ____     __        \n" +
                 " |  _ _   \\      \\   \\   /  /    \n" +
                 " | ( ' )  |       \\  _. /  '       \n" +

+ 106 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsAppointmentRecordController.java

@@ -0,0 +1,106 @@
+package com.ruoyi.web.controller.base;
+
+import com.ruoyi.base.domain.RobotOpsAppointmentRecord;
+import com.ruoyi.base.service.IRobotOpsAppointmentRecordService;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 访客预约记录Controller
+ *
+ * @author ruoyi
+ * @date 2026-04-28
+ */
+@RestController
+@RequestMapping("/base/appointmentRecord")
+public class RobotOpsAppointmentRecordController extends BaseController
+{
+    @Autowired
+    private IRobotOpsAppointmentRecordService robotOpsAppointmentRecordService;
+
+    /**
+     * 查询访客预约记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:appointmentRecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RobotOpsAppointmentRecord robotOpsAppointmentRecord,
+                              @RequestParam(required = false) String appointmentTimeStart,
+                              @RequestParam(required = false) String appointmentTimeEnd)
+    {
+        startPage();
+        if (appointmentTimeStart != null && !appointmentTimeStart.isEmpty()) {
+            robotOpsAppointmentRecord.getParams().put("beginTime", appointmentTimeStart);
+        }
+        if (appointmentTimeEnd != null && !appointmentTimeEnd.isEmpty()) {
+            robotOpsAppointmentRecord.getParams().put("endTime", appointmentTimeEnd);
+        }
+        List<RobotOpsAppointmentRecord> list = robotOpsAppointmentRecordService.selectRobotOpsAppointmentRecordList(robotOpsAppointmentRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出访客预约记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:appointmentRecord:export')")
+    @Log(title = "访客预约记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RobotOpsAppointmentRecord robotOpsAppointmentRecord)
+    {
+        List<RobotOpsAppointmentRecord> list = robotOpsAppointmentRecordService.selectRobotOpsAppointmentRecordList(robotOpsAppointmentRecord);
+        ExcelUtil<RobotOpsAppointmentRecord> util = new ExcelUtil<RobotOpsAppointmentRecord>(RobotOpsAppointmentRecord.class);
+        util.exportExcel(response, list, "访客预约记录数据");
+    }
+
+    /**
+     * 获取访客预约记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('base:appointmentRecord:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(robotOpsAppointmentRecordService.selectRobotOpsAppointmentRecordById(id));
+    }
+
+    /**
+     * 新增访客预约记录
+     */
+    @PreAuthorize("@ss.hasPermi('base:appointmentRecord:add')")
+    @Log(title = "访客预约记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RobotOpsAppointmentRecord robotOpsAppointmentRecord)
+    {
+        return toAjax(robotOpsAppointmentRecordService.insertRobotOpsAppointmentRecord(robotOpsAppointmentRecord));
+    }
+
+    /**
+     * 修改访客预约记录
+     */
+    @PreAuthorize("@ss.hasPermi('base:appointmentRecord:edit')")
+    @Log(title = "访客预约记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RobotOpsAppointmentRecord robotOpsAppointmentRecord)
+    {
+        return toAjax(robotOpsAppointmentRecordService.updateRobotOpsAppointmentRecord(robotOpsAppointmentRecord));
+    }
+
+    /**
+     * 删除访客预约记录
+     */
+    @PreAuthorize("@ss.hasPermi('base:appointmentRecord:remove')")
+    @Log(title = "访客预约记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(robotOpsAppointmentRecordService.deleteRobotOpsAppointmentRecordByIds(ids));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsFaqController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.base;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.base.domain.RobotOpsFaq;
+import com.ruoyi.base.service.IRobotOpsFaqService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 问答库管理Controller
+ *
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+@RestController
+@RequestMapping("/base/faq")
+public class RobotOpsFaqController extends BaseController
+{
+    @Autowired
+    private IRobotOpsFaqService robotOpsFaqService;
+
+    /**
+     * 查询问答库管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:faq:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RobotOpsFaq robotOpsFaq)
+    {
+        startPage();
+        List<RobotOpsFaq> list = robotOpsFaqService.selectRobotOpsFaqList(robotOpsFaq);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出问答库管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:faq:export')")
+    @Log(title = "问答库管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RobotOpsFaq robotOpsFaq)
+    {
+        List<RobotOpsFaq> list = robotOpsFaqService.selectRobotOpsFaqList(robotOpsFaq);
+        ExcelUtil<RobotOpsFaq> util = new ExcelUtil<RobotOpsFaq>(RobotOpsFaq.class);
+        util.exportExcel(response, list, "问答库管理数据");
+    }
+
+    /**
+     * 获取问答库管理详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('base:faq:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(robotOpsFaqService.selectRobotOpsFaqById(id));
+    }
+
+    /**
+     * 新增问答库管理
+     */
+    @PreAuthorize("@ss.hasPermi('base:faq:add')")
+    @Log(title = "问答库管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RobotOpsFaq robotOpsFaq)
+    {
+        return toAjax(robotOpsFaqService.insertRobotOpsFaq(robotOpsFaq));
+    }
+
+    /**
+     * 修改问答库管理
+     */
+    @PreAuthorize("@ss.hasPermi('base:faq:edit')")
+    @Log(title = "问答库管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RobotOpsFaq robotOpsFaq)
+    {
+        return toAjax(robotOpsFaqService.updateRobotOpsFaq(robotOpsFaq));
+    }
+
+    /**
+     * 删除问答库管理
+     */
+    @PreAuthorize("@ss.hasPermi('base:faq:remove')")
+    @Log(title = "问答库管理", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(robotOpsFaqService.deleteRobotOpsFaqByIds(ids));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsFaqSimilarController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.base;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.base.domain.RobotOpsFaqSimilar;
+import com.ruoyi.base.service.IRobotOpsFaqSimilarService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 相似问答表Controller
+ *
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+@RestController
+@RequestMapping("/base/similar")
+public class RobotOpsFaqSimilarController extends BaseController
+{
+    @Autowired
+    private IRobotOpsFaqSimilarService robotOpsFaqSimilarService;
+
+    /**
+     * 查询相似问答表列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:similar:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        startPage();
+        List<RobotOpsFaqSimilar> list = robotOpsFaqSimilarService.selectRobotOpsFaqSimilarList(robotOpsFaqSimilar);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出相似问答表列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:similar:export')")
+    @Log(title = "相似问答表", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        List<RobotOpsFaqSimilar> list = robotOpsFaqSimilarService.selectRobotOpsFaqSimilarList(robotOpsFaqSimilar);
+        ExcelUtil<RobotOpsFaqSimilar> util = new ExcelUtil<RobotOpsFaqSimilar>(RobotOpsFaqSimilar.class);
+        util.exportExcel(response, list, "相似问答表数据");
+    }
+
+    /**
+     * 获取相似问答表详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('base:similar:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(robotOpsFaqSimilarService.selectRobotOpsFaqSimilarById(id));
+    }
+
+    /**
+     * 新增相似问答表
+     */
+    @PreAuthorize("@ss.hasPermi('base:similar:add')")
+    @Log(title = "相似问答表", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        return toAjax(robotOpsFaqSimilarService.insertRobotOpsFaqSimilar(robotOpsFaqSimilar));
+    }
+
+    /**
+     * 修改相似问答表
+     */
+    @PreAuthorize("@ss.hasPermi('base:similar:edit')")
+    @Log(title = "相似问答表", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        return toAjax(robotOpsFaqSimilarService.updateRobotOpsFaqSimilar(robotOpsFaqSimilar));
+    }
+
+    /**
+     * 删除相似问答表
+     */
+    @PreAuthorize("@ss.hasPermi('base:similar:remove')")
+    @Log(title = "相似问答表", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(robotOpsFaqSimilarService.deleteRobotOpsFaqSimilarByIds(ids));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsMediaAssetController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.base;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.base.domain.RobotOpsMediaAsset;
+import com.ruoyi.base.service.IRobotOpsMediaAssetService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 素材资源Controller
+ *
+ * @author ruoyi
+ * @date 2026-05-08
+ */
+@RestController
+@RequestMapping("/base/mediAasset")
+public class RobotOpsMediaAssetController extends BaseController
+{
+    @Autowired
+    private IRobotOpsMediaAssetService robotOpsMediaAssetService;
+
+    /**
+     * 查询素材资源列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:mediAasset:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        startPage();
+        List<RobotOpsMediaAsset> list = robotOpsMediaAssetService.selectRobotOpsMediaAssetList(robotOpsMediaAsset);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出素材资源列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:mediAasset:export')")
+    @Log(title = "素材资源", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        List<RobotOpsMediaAsset> list = robotOpsMediaAssetService.selectRobotOpsMediaAssetList(robotOpsMediaAsset);
+        ExcelUtil<RobotOpsMediaAsset> util = new ExcelUtil<RobotOpsMediaAsset>(RobotOpsMediaAsset.class);
+        util.exportExcel(response, list, "素材资源数据");
+    }
+
+    /**
+     * 获取素材资源详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('base:mediAasset:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(robotOpsMediaAssetService.selectRobotOpsMediaAssetById(id));
+    }
+
+    /**
+     * 新增素材资源
+     */
+    @PreAuthorize("@ss.hasPermi('base:mediAasset:add')")
+    @Log(title = "素材资源", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        return toAjax(robotOpsMediaAssetService.insertRobotOpsMediaAsset(robotOpsMediaAsset));
+    }
+
+    /**
+     * 修改素材资源
+     */
+    @PreAuthorize("@ss.hasPermi('base:mediAasset:edit')")
+    @Log(title = "素材资源", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        return toAjax(robotOpsMediaAssetService.updateRobotOpsMediaAsset(robotOpsMediaAsset));
+    }
+
+    /**
+     * 删除素材资源
+     */
+    @PreAuthorize("@ss.hasPermi('base:mediAasset:remove')")
+    @Log(title = "素材资源", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(robotOpsMediaAssetService.deleteRobotOpsMediaAssetByIds(ids));
+    }
+}

+ 105 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsVisitorRecordController.java

@@ -0,0 +1,105 @@
+package com.ruoyi.web.controller.base;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.base.domain.RobotOpsVisitorRecord;
+import com.ruoyi.base.service.IRobotOpsVisitorRecordService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 访客登记记录Controller
+ *
+ * @author ruoyi
+ * @date 2026-04-30
+ */
+@RestController
+@RequestMapping("/base/visitorRecord")
+public class RobotOpsVisitorRecordController extends BaseController
+{
+    @Autowired
+    private IRobotOpsVisitorRecordService robotOpsVisitorRecordService;
+
+    /**
+     * 查询访客登记记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:visitorRecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RobotOpsVisitorRecord robotOpsVisitorRecord,
+                              @RequestParam(required = false) String visitTimeStart,
+                              @RequestParam(required = false) String visitTimeEnd)
+    {
+        startPage();
+        if (visitTimeStart != null && !visitTimeStart.isEmpty()) {
+            robotOpsVisitorRecord.getParams().put("beginTime", visitTimeStart);
+        }
+        if (visitTimeEnd != null && !visitTimeEnd.isEmpty()) {
+            robotOpsVisitorRecord.getParams().put("endTime", visitTimeEnd);
+        }
+        List<RobotOpsVisitorRecord> list = robotOpsVisitorRecordService.selectRobotOpsVisitorRecordList(robotOpsVisitorRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出访客登记记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:visitorRecord:export')")
+    @Log(title = "访客登记记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RobotOpsVisitorRecord robotOpsVisitorRecord)
+    {
+        List<RobotOpsVisitorRecord> list = robotOpsVisitorRecordService.selectRobotOpsVisitorRecordList(robotOpsVisitorRecord);
+        ExcelUtil<RobotOpsVisitorRecord> util = new ExcelUtil<RobotOpsVisitorRecord>(RobotOpsVisitorRecord.class);
+        util.exportExcel(response, list, "访客登记记录数据");
+    }
+
+    /**
+     * 获取访客登记记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('base:visitorRecord:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(robotOpsVisitorRecordService.selectRobotOpsVisitorRecordById(id));
+    }
+
+    /**
+     * 新增访客登记记录
+     */
+    @PreAuthorize("@ss.hasPermi('base:visitorRecord:add')")
+    @Log(title = "访客登记记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RobotOpsVisitorRecord robotOpsVisitorRecord)
+    {
+        return toAjax(robotOpsVisitorRecordService.insertRobotOpsVisitorRecord(robotOpsVisitorRecord));
+    }
+
+    /**
+     * 修改访客登记记录
+     */
+    @PreAuthorize("@ss.hasPermi('base:visitorRecord:edit')")
+    @Log(title = "访客登记记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RobotOpsVisitorRecord robotOpsVisitorRecord)
+    {
+        return toAjax(robotOpsVisitorRecordService.updateRobotOpsVisitorRecord(robotOpsVisitorRecord));
+    }
+
+    /**
+     * 删除访客登记记录
+     */
+    @PreAuthorize("@ss.hasPermi('base:visitorRecord:remove')")
+    @Log(title = "访客登记记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(robotOpsVisitorRecordService.deleteRobotOpsVisitorRecordByIds(ids));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/base/RobotOpsWhitelistController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.base.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.base.domain.RobotOpsWhitelist;
+import com.ruoyi.base.service.IRobotOpsWhitelistService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 访客白名单Controller
+ *
+ * @author ruoyi
+ * @date 2026-04-29
+ */
+@RestController
+@RequestMapping("/base/whitelist")
+public class RobotOpsWhitelistController extends BaseController
+{
+    @Autowired
+    private IRobotOpsWhitelistService robotOpsWhitelistService;
+
+    /**
+     * 查询访客白名单列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:whitelist:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RobotOpsWhitelist robotOpsWhitelist)
+    {
+        startPage();
+        List<RobotOpsWhitelist> list = robotOpsWhitelistService.selectRobotOpsWhitelistList(robotOpsWhitelist);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出访客白名单列表
+     */
+    @PreAuthorize("@ss.hasPermi('base:whitelist:export')")
+    @Log(title = "访客白名单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RobotOpsWhitelist robotOpsWhitelist)
+    {
+        List<RobotOpsWhitelist> list = robotOpsWhitelistService.selectRobotOpsWhitelistList(robotOpsWhitelist);
+        ExcelUtil<RobotOpsWhitelist> util = new ExcelUtil<RobotOpsWhitelist>(RobotOpsWhitelist.class);
+        util.exportExcel(response, list, "访客白名单数据");
+    }
+
+    /**
+     * 获取访客白名单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('base:whitelist:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(robotOpsWhitelistService.selectRobotOpsWhitelistById(id));
+    }
+
+    /**
+     * 新增访客白名单
+     */
+    @PreAuthorize("@ss.hasPermi('base:whitelist:add')")
+    @Log(title = "访客白名单", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RobotOpsWhitelist robotOpsWhitelist)
+    {
+        return toAjax(robotOpsWhitelistService.insertRobotOpsWhitelist(robotOpsWhitelist));
+    }
+
+    /**
+     * 修改访客白名单
+     */
+    @PreAuthorize("@ss.hasPermi('base:whitelist:edit')")
+    @Log(title = "访客白名单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RobotOpsWhitelist robotOpsWhitelist)
+    {
+        return toAjax(robotOpsWhitelistService.updateRobotOpsWhitelist(robotOpsWhitelist));
+    }
+
+    /**
+     * 删除访客白名单
+     */
+    @PreAuthorize("@ss.hasPermi('base:whitelist:remove')")
+    @Log(title = "访客白名单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(robotOpsWhitelistService.deleteRobotOpsWhitelistByIds(ids));
+    }
+}

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -7,7 +7,7 @@ ruoyi:
   # 版权年份
   copyrightYear: 2026
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: D:/ruoyi/uploadPath
+  profile: /opt/app/jiqiren/uploadPath
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证

+ 165 - 0
ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsAppointmentRecord.java

@@ -0,0 +1,165 @@
+package com.ruoyi.base.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 访客预约记录对象 robot_ops_appointment_record
+ *
+ * @author ruoyi
+ * @date 2026-04-28
+ */
+
+public class RobotOpsAppointmentRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 预约单号 */
+    @Excel(name = "预约单号")
+    private String appointmentNo;
+
+    /** 访客姓名 */
+    @Excel(name = "访客姓名")
+    private String visitorName;
+
+    /** 访客手机号 */
+    @Excel(name = "访客手机号")
+    private String mobile;
+
+    /** 被访人/被访对象 */
+    @Excel(name = "被访人/被访对象")
+    private String visitedPerson;
+
+    /** 预约到访时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "预约到访时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date appointmentTime;
+
+    /** 预约状态 */
+    @Excel(name = "预约状态")
+    private Long status;
+
+    /** 同步到本地时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "同步到本地时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date syncTime;
+
+    /** 来源平台 */
+    @Excel(name = "来源平台")
+    private String sourcePlatform;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setAppointmentNo(String appointmentNo)
+    {
+        this.appointmentNo = appointmentNo;
+    }
+
+    public String getAppointmentNo()
+    {
+        return appointmentNo;
+    }
+
+    public void setVisitorName(String visitorName)
+    {
+        this.visitorName = visitorName;
+    }
+
+    public String getVisitorName()
+    {
+        return visitorName;
+    }
+
+    public void setMobile(String mobile)
+    {
+        this.mobile = mobile;
+    }
+
+    public String getMobile()
+    {
+        return mobile;
+    }
+
+    public void setVisitedPerson(String visitedPerson)
+    {
+        this.visitedPerson = visitedPerson;
+    }
+
+    public String getVisitedPerson()
+    {
+        return visitedPerson;
+    }
+
+    public void setAppointmentTime(Date appointmentTime)
+    {
+        this.appointmentTime = appointmentTime;
+    }
+
+    public Date getAppointmentTime()
+    {
+        return appointmentTime;
+    }
+
+    public void setStatus(Long status)
+    {
+        this.status = status;
+    }
+
+    public Long getStatus()
+    {
+        return status;
+    }
+
+    public void setSyncTime(Date syncTime)
+    {
+        this.syncTime = syncTime;
+    }
+
+    public Date getSyncTime()
+    {
+        return syncTime;
+    }
+
+    public void setSourcePlatform(String sourcePlatform)
+    {
+        this.sourcePlatform = sourcePlatform;
+    }
+
+    public String getSourcePlatform()
+    {
+        return sourcePlatform;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("appointmentNo", getAppointmentNo())
+            .append("visitorName", getVisitorName())
+            .append("mobile", getMobile())
+            .append("visitedPerson", getVisitedPerson())
+            .append("appointmentTime", getAppointmentTime())
+            .append("status", getStatus())
+            .append("syncTime", getSyncTime())
+            .append("sourcePlatform", getSourcePlatform())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 132 - 0
ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsFaq.java

@@ -0,0 +1,132 @@
+package com.ruoyi.base.domain;
+
+import java.util.List;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 问答库管理对象 robot_ops_faq
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+public class RobotOpsFaq extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 问题分类字典值,字典类型:robot_faq_category */
+    @Excel(name = "问题分类字典值,字典类型:robot_faq_category")
+    private String categoryType;
+
+    /** 标准问题 */
+    @Excel(name = "标准问题")
+    private String question;
+
+    /** 答案内容 */
+    @Excel(name = "答案内容")
+    private String answer;
+
+    /** 排序号,数字越小越靠前 */
+    @Excel(name = "排序号,数字越小越靠前")
+    private Long sortNo;
+
+    /** 启用状态:0停用,1启用 */
+    @Excel(name = "启用状态:0停用,1启用")
+    private String status;
+
+    /** 问答相似问信息 */
+    private List<RobotOpsFaqSimilar> robotOpsFaqSimilarList;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setCategoryType(String categoryType) 
+    {
+        this.categoryType = categoryType;
+    }
+
+    public String getCategoryType() 
+    {
+        return categoryType;
+    }
+
+    public void setQuestion(String question) 
+    {
+        this.question = question;
+    }
+
+    public String getQuestion() 
+    {
+        return question;
+    }
+
+    public void setAnswer(String answer) 
+    {
+        this.answer = answer;
+    }
+
+    public String getAnswer() 
+    {
+        return answer;
+    }
+
+    public void setSortNo(Long sortNo) 
+    {
+        this.sortNo = sortNo;
+    }
+
+    public Long getSortNo() 
+    {
+        return sortNo;
+    }
+
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+
+    public List<RobotOpsFaqSimilar> getRobotOpsFaqSimilarList()
+    {
+        return robotOpsFaqSimilarList;
+    }
+
+    public void setRobotOpsFaqSimilarList(List<RobotOpsFaqSimilar> robotOpsFaqSimilarList)
+    {
+        this.robotOpsFaqSimilarList = robotOpsFaqSimilarList;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("categoryType", getCategoryType())
+            .append("question", getQuestion())
+            .append("answer", getAnswer())
+            .append("sortNo", getSortNo())
+            .append("status", getStatus())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("createBy", getCreateBy())
+            .append("updateBy", getUpdateBy())
+            .append("robotOpsFaqSimilarList", getRobotOpsFaqSimilarList())
+            .toString();
+    }
+}

+ 81 - 0
ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsFaqSimilar.java

@@ -0,0 +1,81 @@
+package com.ruoyi.base.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 问答相似问对象 robot_ops_faq_similar
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+public class RobotOpsFaqSimilar extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 问答ID,关联robot_ops_faq.id */
+    @Excel(name = "问答ID,关联robot_ops_faq.id")
+    private Long faqId;
+
+    /** 相似问文本 */
+    @Excel(name = "相似问文本")
+    private String similarQuestion;
+
+    /** 排序号,数字越小越靠前 */
+    @Excel(name = "排序号,数字越小越靠前")
+    private Long sortNo;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setFaqId(Long faqId) 
+    {
+        this.faqId = faqId;
+    }
+
+    public Long getFaqId() 
+    {
+        return faqId;
+    }
+    public void setSimilarQuestion(String similarQuestion) 
+    {
+        this.similarQuestion = similarQuestion;
+    }
+
+    public String getSimilarQuestion() 
+    {
+        return similarQuestion;
+    }
+    public void setSortNo(Long sortNo) 
+    {
+        this.sortNo = sortNo;
+    }
+
+    public Long getSortNo() 
+    {
+        return sortNo;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("faqId", getFaqId())
+            .append("similarQuestion", getSimilarQuestion())
+            .append("sortNo", getSortNo())
+            .append("createBy", getCreateBy())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}

+ 206 - 0
ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsMediaAsset.java

@@ -0,0 +1,206 @@
+package com.ruoyi.base.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 素材资源对象 robot_ops_media_asset
+ * 
+ * @author ruoyi
+ * @date 2026-05-08
+ */
+public class RobotOpsMediaAsset extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 素材名称 */
+    @Excel(name = "素材名称")
+    private String assetName;
+
+    /** 素材类型 */
+    @Excel(name = "素材类型")
+    private String assetType;
+
+    /** 素材文件地址 */
+    private String fileUrl;
+
+    /** 缩略图地址 */
+    @Excel(name = "缩略图地址")
+    private String thumbnailUrl;
+
+    /** 文件大小 */
+    @Excel(name = "文件大小")
+    private Long fileSize;
+
+    /** 文件格式 */
+    @Excel(name = "文件格式")
+    private String fileFormat;
+
+    /** 文件MIME类型,如image/jpeg、video/mp4 */
+    @Excel(name = "文件MIME类型,如image/jpeg、video/mp4")
+    private String mimeType;
+
+    /** 视频时长,单位秒;图片为空 */
+    @Excel(name = "视频时长,单位秒;图片为空")
+    private Long durationSeconds;
+
+    /** 分辨率,如1920x1080 */
+    @Excel(name = "分辨率,如1920x1080")
+    private String resolution;
+
+    /** 启用状态:0停用,1启用 */
+    @Excel(name = "启用状态:0停用,1启用")
+    private String status;
+
+    /** 是否被播放方案引用:0否,1是,由系统维护 */
+    @Excel(name = "是否被播放方案引用:0否,1是,由系统维护")
+    private String quotedFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setAssetName(String assetName) 
+    {
+        this.assetName = assetName;
+    }
+
+    public String getAssetName() 
+    {
+        return assetName;
+    }
+
+    public void setAssetType(String assetType) 
+    {
+        this.assetType = assetType;
+    }
+
+    public String getAssetType() 
+    {
+        return assetType;
+    }
+
+    public void setFileUrl(String fileUrl) 
+    {
+        this.fileUrl = fileUrl;
+    }
+
+    public String getFileUrl() 
+    {
+        return fileUrl;
+    }
+
+    public void setThumbnailUrl(String thumbnailUrl) 
+    {
+        this.thumbnailUrl = thumbnailUrl;
+    }
+
+    public String getThumbnailUrl() 
+    {
+        return thumbnailUrl;
+    }
+
+    public void setFileSize(Long fileSize) 
+    {
+        this.fileSize = fileSize;
+    }
+
+    public Long getFileSize() 
+    {
+        return fileSize;
+    }
+
+    public void setFileFormat(String fileFormat) 
+    {
+        this.fileFormat = fileFormat;
+    }
+
+    public String getFileFormat() 
+    {
+        return fileFormat;
+    }
+
+    public void setMimeType(String mimeType) 
+    {
+        this.mimeType = mimeType;
+    }
+
+    public String getMimeType() 
+    {
+        return mimeType;
+    }
+
+    public void setDurationSeconds(Long durationSeconds) 
+    {
+        this.durationSeconds = durationSeconds;
+    }
+
+    public Long getDurationSeconds() 
+    {
+        return durationSeconds;
+    }
+
+    public void setResolution(String resolution) 
+    {
+        this.resolution = resolution;
+    }
+
+    public String getResolution() 
+    {
+        return resolution;
+    }
+
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+
+    public void setQuotedFlag(String quotedFlag) 
+    {
+        this.quotedFlag = quotedFlag;
+    }
+
+    public String getQuotedFlag() 
+    {
+        return quotedFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("assetName", getAssetName())
+            .append("assetType", getAssetType())
+            .append("fileUrl", getFileUrl())
+            .append("thumbnailUrl", getThumbnailUrl())
+            .append("fileSize", getFileSize())
+            .append("fileFormat", getFileFormat())
+            .append("mimeType", getMimeType())
+            .append("durationSeconds", getDurationSeconds())
+            .append("resolution", getResolution())
+            .append("status", getStatus())
+            .append("quotedFlag", getQuotedFlag())
+            .append("remark", getRemark())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 208 - 0
ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsVisitorRecord.java

@@ -0,0 +1,208 @@
+package com.ruoyi.base.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 访客登记记录对象 robot_ops_visitor_record
+ *
+ * @author ruoyi
+ * @date 2026-04-30
+ */
+public class RobotOpsVisitorRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 访客姓名 */
+    @Excel(name = "访客姓名")
+    private String visitorName;
+
+    /** 访客手机号 */
+    @Excel(name = "访客手机号")
+    private String mobile;
+
+    /** 证件号码 */
+    @Excel(name = "证件号码")
+    private String idCardNo;
+
+    /** 到访类型 */
+    @Excel(name = "到访类型")
+    private String visitType;
+
+    /** 访客来源,如公司、单位、亲友、外卖、快递、供应商等 */
+    @Excel(name = "访客来源,如公司、单位、亲友、外卖、快递、供应商等")
+    private String visitorSource;
+
+    /** 来访事由,如业务接洽、走亲访友、酒店入住、配送、维修、参观等 */
+    @Excel(name = "来访事由,如业务接洽、走亲访友、酒店入住、配送、维修、参观等")
+    private String visitReason;
+
+    /** 访客照片地址 */
+    @Excel(name = "访客照片地址")
+    private String visitorPhoto;
+
+    /** 关联预约单号,现场登记可为空 */
+    @Excel(name = "关联预约单号,现场登记可为空")
+    private String appointmentNo;
+
+    /** 被访人/被访对象 */
+    @Excel(name = "被访人/被访对象")
+    private String visitedPerson;
+
+    /** 来访/登记时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "来访/登记时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date visitTime;
+
+    /** 登记方式 */
+    @Excel(name = "登记方式")
+    private String registerType;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setVisitorName(String visitorName)
+    {
+        this.visitorName = visitorName;
+    }
+
+    public String getVisitorName()
+    {
+        return visitorName;
+    }
+
+    public void setMobile(String mobile)
+    {
+        this.mobile = mobile;
+    }
+
+    public String getMobile()
+    {
+        return mobile;
+    }
+
+    public void setIdCardNo(String idCardNo)
+    {
+        this.idCardNo = idCardNo;
+    }
+
+    public String getIdCardNo()
+    {
+        return idCardNo;
+    }
+
+    public void setVisitType(String visitType)
+    {
+        this.visitType = visitType;
+    }
+
+    public String getVisitType()
+    {
+        return visitType;
+    }
+
+    public void setVisitorSource(String visitorSource)
+    {
+        this.visitorSource = visitorSource;
+    }
+
+    public String getVisitorSource()
+    {
+        return visitorSource;
+    }
+
+    public void setVisitReason(String visitReason)
+    {
+        this.visitReason = visitReason;
+    }
+
+    public String getVisitReason()
+    {
+        return visitReason;
+    }
+
+    public void setVisitorPhoto(String visitorPhoto)
+    {
+        this.visitorPhoto = visitorPhoto;
+    }
+
+    public String getVisitorPhoto()
+    {
+        return visitorPhoto;
+    }
+
+    public void setAppointmentNo(String appointmentNo)
+    {
+        this.appointmentNo = appointmentNo;
+    }
+
+    public String getAppointmentNo()
+    {
+        return appointmentNo;
+    }
+
+    public void setVisitedPerson(String visitedPerson)
+    {
+        this.visitedPerson = visitedPerson;
+    }
+
+    public String getVisitedPerson()
+    {
+        return visitedPerson;
+    }
+
+    public void setVisitTime(Date visitTime)
+    {
+        this.visitTime = visitTime;
+    }
+
+    public Date getVisitTime()
+    {
+        return visitTime;
+    }
+
+    public void setRegisterType(String registerType)
+    {
+        this.registerType = registerType;
+    }
+
+    public String getRegisterType()
+    {
+        return registerType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("visitorName", getVisitorName())
+                .append("mobile", getMobile())
+                .append("idCardNo", getIdCardNo())
+                .append("visitType", getVisitType())
+                .append("visitorSource", getVisitorSource())
+                .append("visitReason", getVisitReason())
+                .append("visitorPhoto", getVisitorPhoto())
+                .append("appointmentNo", getAppointmentNo())
+                .append("visitedPerson", getVisitedPerson())
+                .append("visitTime", getVisitTime())
+                .append("remark", getRemark())
+                .append("createTime", getCreateTime())
+                .append("updateTime", getUpdateTime())
+                .append("registerType", getRegisterType())
+                .toString();
+    }
+}

+ 179 - 0
ruoyi-system/src/main/java/com/ruoyi/base/domain/RobotOpsWhitelist.java

@@ -0,0 +1,179 @@
+package com.ruoyi.base.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 访客白名单对象 robot_ops_whitelist
+ *
+ * @author ruoyi
+ * @date 2026-04-29
+ */
+public class RobotOpsWhitelist extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    private String name;
+
+    /** 手机号 */
+    @Excel(name = "手机号")
+    private String mobile;
+
+    /** 身份证号 */
+    @Excel(name = "身份证号")
+    private String idCardNo;
+
+    /** 人脸照片地址,用于机器人侧照片比对 */
+    @Excel(name = "人脸照片地址,用于机器人侧照片比对")
+    private String faceImageUrl;
+
+    /** 有效开始时间,不填表示立即生效 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "有效开始时间,不填表示立即生效", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date validStartTime;
+
+    /** 有效结束时间,不填表示长期有效 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "有效结束时间,不填表示长期有效", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date validEndTime;
+
+    /** 启用状态:0停用,1启用 */
+    @Excel(name = "启用状态:0停用,1启用")
+    private String status;
+
+    /** 人员类型 */
+    @Excel(name = "人员类型")
+    private Long whitelistType;
+
+    /** 来源类型 */
+    @Excel(name = "来源类型")
+    private Long sourceType;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setMobile(String mobile)
+    {
+        this.mobile = mobile;
+    }
+
+    public String getMobile()
+    {
+        return mobile;
+    }
+
+    public void setIdCardNo(String idCardNo)
+    {
+        this.idCardNo = idCardNo;
+    }
+
+    public String getIdCardNo()
+    {
+        return idCardNo;
+    }
+
+    public void setFaceImageUrl(String faceImageUrl)
+    {
+        this.faceImageUrl = faceImageUrl;
+    }
+
+    public String getFaceImageUrl()
+    {
+        return faceImageUrl;
+    }
+
+    public void setValidStartTime(Date validStartTime)
+    {
+        this.validStartTime = validStartTime;
+    }
+
+    public Date getValidStartTime()
+    {
+        return validStartTime;
+    }
+
+    public void setValidEndTime(Date validEndTime)
+    {
+        this.validEndTime = validEndTime;
+    }
+
+    public Date getValidEndTime()
+    {
+        return validEndTime;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setWhitelistType(Long whitelistType)
+    {
+        this.whitelistType = whitelistType;
+    }
+
+    public Long getWhitelistType()
+    {
+        return whitelistType;
+    }
+
+    public void setSourceType(Long sourceType)
+    {
+        this.sourceType = sourceType;
+    }
+
+    public Long getSourceType()
+    {
+        return sourceType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("name", getName())
+                .append("mobile", getMobile())
+                .append("idCardNo", getIdCardNo())
+                .append("faceImageUrl", getFaceImageUrl())
+                .append("validStartTime", getValidStartTime())
+                .append("validEndTime", getValidEndTime())
+                .append("status", getStatus())
+                .append("remark", getRemark())
+                .append("createTime", getCreateTime())
+                .append("updateTime", getUpdateTime())
+                .append("whitelistType", getWhitelistType())
+                .append("sourceType", getSourceType())
+                .toString();
+    }
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsAppointmentRecordMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.mapper;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsAppointmentRecord;
+
+/**
+ * 访客预约记录Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-04-28
+ */
+public interface RobotOpsAppointmentRecordMapper 
+{
+    /**
+     * 查询访客预约记录
+     * 
+     * @param id 访客预约记录主键
+     * @return 访客预约记录
+     */
+    public RobotOpsAppointmentRecord selectRobotOpsAppointmentRecordById(Long id);
+
+    /**
+     * 查询访客预约记录列表
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 访客预约记录集合
+     */
+    public List<RobotOpsAppointmentRecord> selectRobotOpsAppointmentRecordList(RobotOpsAppointmentRecord robotOpsAppointmentRecord);
+
+    /**
+     * 新增访客预约记录
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 结果
+     */
+    public int insertRobotOpsAppointmentRecord(RobotOpsAppointmentRecord robotOpsAppointmentRecord);
+
+    /**
+     * 修改访客预约记录
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 结果
+     */
+    public int updateRobotOpsAppointmentRecord(RobotOpsAppointmentRecord robotOpsAppointmentRecord);
+
+    /**
+     * 删除访客预约记录
+     * 
+     * @param id 访客预约记录主键
+     * @return 结果
+     */
+    public int deleteRobotOpsAppointmentRecordById(Long id);
+
+    /**
+     * 批量删除访客预约记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsAppointmentRecordByIds(Long[] ids);
+}

+ 87 - 0
ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsFaqMapper.java

@@ -0,0 +1,87 @@
+package com.ruoyi.base.mapper;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsFaq;
+import com.ruoyi.base.domain.RobotOpsFaqSimilar;
+
+/**
+ * 问答库管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+public interface RobotOpsFaqMapper 
+{
+    /**
+     * 查询问答库管理
+     * 
+     * @param id 问答库管理主键
+     * @return 问答库管理
+     */
+    public RobotOpsFaq selectRobotOpsFaqById(Long id);
+
+    /**
+     * 查询问答库管理列表
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 问答库管理集合
+     */
+    public List<RobotOpsFaq> selectRobotOpsFaqList(RobotOpsFaq robotOpsFaq);
+
+    /**
+     * 新增问答库管理
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 结果
+     */
+    public int insertRobotOpsFaq(RobotOpsFaq robotOpsFaq);
+
+    /**
+     * 修改问答库管理
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 结果
+     */
+    public int updateRobotOpsFaq(RobotOpsFaq robotOpsFaq);
+
+    /**
+     * 删除问答库管理
+     * 
+     * @param id 问答库管理主键
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqById(Long id);
+
+    /**
+     * 批量删除问答库管理
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqByIds(Long[] ids);
+
+    /**
+     * 批量删除问答相似问
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqSimilarByFaqIds(Long[] ids);
+    
+    /**
+     * 批量新增问答相似问
+     * 
+     * @param robotOpsFaqSimilarList 问答相似问列表
+     * @return 结果
+     */
+    public int batchRobotOpsFaqSimilar(List<RobotOpsFaqSimilar> robotOpsFaqSimilarList);
+    
+
+    /**
+     * 通过问答库管理主键删除问答相似问信息
+     * 
+     * @param id 问答库管理ID
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqSimilarByFaqId(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsFaqSimilarMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.mapper;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsFaqSimilar;
+
+/**
+ * 相似问答表Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+public interface RobotOpsFaqSimilarMapper 
+{
+    /**
+     * 查询相似问答表
+     * 
+     * @param id 相似问答表主键
+     * @return 相似问答表
+     */
+    public RobotOpsFaqSimilar selectRobotOpsFaqSimilarById(Long id);
+
+    /**
+     * 查询相似问答表列表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 相似问答表集合
+     */
+    public List<RobotOpsFaqSimilar> selectRobotOpsFaqSimilarList(RobotOpsFaqSimilar robotOpsFaqSimilar);
+
+    /**
+     * 新增相似问答表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 结果
+     */
+    public int insertRobotOpsFaqSimilar(RobotOpsFaqSimilar robotOpsFaqSimilar);
+
+    /**
+     * 修改相似问答表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 结果
+     */
+    public int updateRobotOpsFaqSimilar(RobotOpsFaqSimilar robotOpsFaqSimilar);
+
+    /**
+     * 删除相似问答表
+     * 
+     * @param id 相似问答表主键
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqSimilarById(Long id);
+
+    /**
+     * 批量删除相似问答表
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqSimilarByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsMediaAssetMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.mapper;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsMediaAsset;
+
+/**
+ * 素材资源Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-05-08
+ */
+public interface RobotOpsMediaAssetMapper 
+{
+    /**
+     * 查询素材资源
+     * 
+     * @param id 素材资源主键
+     * @return 素材资源
+     */
+    public RobotOpsMediaAsset selectRobotOpsMediaAssetById(Long id);
+
+    /**
+     * 查询素材资源列表
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 素材资源集合
+     */
+    public List<RobotOpsMediaAsset> selectRobotOpsMediaAssetList(RobotOpsMediaAsset robotOpsMediaAsset);
+
+    /**
+     * 新增素材资源
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 结果
+     */
+    public int insertRobotOpsMediaAsset(RobotOpsMediaAsset robotOpsMediaAsset);
+
+    /**
+     * 修改素材资源
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 结果
+     */
+    public int updateRobotOpsMediaAsset(RobotOpsMediaAsset robotOpsMediaAsset);
+
+    /**
+     * 删除素材资源
+     * 
+     * @param id 素材资源主键
+     * @return 结果
+     */
+    public int deleteRobotOpsMediaAssetById(Long id);
+
+    /**
+     * 批量删除素材资源
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsMediaAssetByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsVisitorRecordMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.mapper;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsVisitorRecord;
+
+/**
+ * 访客登记记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-04-30
+ */
+public interface RobotOpsVisitorRecordMapper
+{
+    /**
+     * 查询访客登记记录
+     *
+     * @param id 访客登记记录主键
+     * @return 访客登记记录
+     */
+    public RobotOpsVisitorRecord selectRobotOpsVisitorRecordById(Long id);
+
+    /**
+     * 查询访客登记记录列表
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 访客登记记录集合
+     */
+    public List<RobotOpsVisitorRecord> selectRobotOpsVisitorRecordList(RobotOpsVisitorRecord robotOpsVisitorRecord);
+
+    /**
+     * 新增访客登记记录
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 结果
+     */
+    public int insertRobotOpsVisitorRecord(RobotOpsVisitorRecord robotOpsVisitorRecord);
+
+    /**
+     * 修改访客登记记录
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 结果
+     */
+    public int updateRobotOpsVisitorRecord(RobotOpsVisitorRecord robotOpsVisitorRecord);
+
+    /**
+     * 删除访客登记记录
+     *
+     * @param id 访客登记记录主键
+     * @return 结果
+     */
+    public int deleteRobotOpsVisitorRecordById(Long id);
+
+    /**
+     * 批量删除访客登记记录
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsVisitorRecordByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/mapper/RobotOpsWhitelistMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.mapper;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsWhitelist;
+
+/**
+ * 访客白名单Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-04-29
+ */
+public interface RobotOpsWhitelistMapper
+{
+    /**
+     * 查询访客白名单
+     *
+     * @param id 访客白名单主键
+     * @return 访客白名单
+     */
+    public RobotOpsWhitelist selectRobotOpsWhitelistById(Long id);
+
+    /**
+     * 查询访客白名单列表
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 访客白名单集合
+     */
+    public List<RobotOpsWhitelist> selectRobotOpsWhitelistList(RobotOpsWhitelist robotOpsWhitelist);
+
+    /**
+     * 新增访客白名单
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 结果
+     */
+    public int insertRobotOpsWhitelist(RobotOpsWhitelist robotOpsWhitelist);
+
+    /**
+     * 修改访客白名单
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 结果
+     */
+    public int updateRobotOpsWhitelist(RobotOpsWhitelist robotOpsWhitelist);
+
+    /**
+     * 删除访客白名单
+     *
+     * @param id 访客白名单主键
+     * @return 结果
+     */
+    public int deleteRobotOpsWhitelistById(Long id);
+
+    /**
+     * 批量删除访客白名单
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsWhitelistByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsAppointmentRecordService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.service;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsAppointmentRecord;
+
+/**
+ * 访客预约记录Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-04-28
+ */
+public interface IRobotOpsAppointmentRecordService 
+{
+    /**
+     * 查询访客预约记录
+     * 
+     * @param id 访客预约记录主键
+     * @return 访客预约记录
+     */
+    public RobotOpsAppointmentRecord selectRobotOpsAppointmentRecordById(Long id);
+
+    /**
+     * 查询访客预约记录列表
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 访客预约记录集合
+     */
+    public List<RobotOpsAppointmentRecord> selectRobotOpsAppointmentRecordList(RobotOpsAppointmentRecord robotOpsAppointmentRecord);
+
+    /**
+     * 新增访客预约记录
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 结果
+     */
+    public int insertRobotOpsAppointmentRecord(RobotOpsAppointmentRecord robotOpsAppointmentRecord);
+
+    /**
+     * 修改访客预约记录
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 结果
+     */
+    public int updateRobotOpsAppointmentRecord(RobotOpsAppointmentRecord robotOpsAppointmentRecord);
+
+    /**
+     * 批量删除访客预约记录
+     * 
+     * @param ids 需要删除的访客预约记录主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsAppointmentRecordByIds(Long[] ids);
+
+    /**
+     * 删除访客预约记录信息
+     * 
+     * @param id 访客预约记录主键
+     * @return 结果
+     */
+    public int deleteRobotOpsAppointmentRecordById(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsFaqService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.service;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsFaq;
+
+/**
+ * 问答库管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+public interface IRobotOpsFaqService 
+{
+    /**
+     * 查询问答库管理
+     * 
+     * @param id 问答库管理主键
+     * @return 问答库管理
+     */
+    public RobotOpsFaq selectRobotOpsFaqById(Long id);
+
+    /**
+     * 查询问答库管理列表
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 问答库管理集合
+     */
+    public List<RobotOpsFaq> selectRobotOpsFaqList(RobotOpsFaq robotOpsFaq);
+
+    /**
+     * 新增问答库管理
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 结果
+     */
+    public int insertRobotOpsFaq(RobotOpsFaq robotOpsFaq);
+
+    /**
+     * 修改问答库管理
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 结果
+     */
+    public int updateRobotOpsFaq(RobotOpsFaq robotOpsFaq);
+
+    /**
+     * 批量删除问答库管理
+     * 
+     * @param ids 需要删除的问答库管理主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqByIds(Long[] ids);
+
+    /**
+     * 删除问答库管理信息
+     * 
+     * @param id 问答库管理主键
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqById(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsFaqSimilarService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.service;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsFaqSimilar;
+
+/**
+ * 相似问答表Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+public interface IRobotOpsFaqSimilarService 
+{
+    /**
+     * 查询相似问答表
+     * 
+     * @param id 相似问答表主键
+     * @return 相似问答表
+     */
+    public RobotOpsFaqSimilar selectRobotOpsFaqSimilarById(Long id);
+
+    /**
+     * 查询相似问答表列表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 相似问答表集合
+     */
+    public List<RobotOpsFaqSimilar> selectRobotOpsFaqSimilarList(RobotOpsFaqSimilar robotOpsFaqSimilar);
+
+    /**
+     * 新增相似问答表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 结果
+     */
+    public int insertRobotOpsFaqSimilar(RobotOpsFaqSimilar robotOpsFaqSimilar);
+
+    /**
+     * 修改相似问答表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 结果
+     */
+    public int updateRobotOpsFaqSimilar(RobotOpsFaqSimilar robotOpsFaqSimilar);
+
+    /**
+     * 批量删除相似问答表
+     * 
+     * @param ids 需要删除的相似问答表主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqSimilarByIds(Long[] ids);
+
+    /**
+     * 删除相似问答表信息
+     * 
+     * @param id 相似问答表主键
+     * @return 结果
+     */
+    public int deleteRobotOpsFaqSimilarById(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsMediaAssetService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.service;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsMediaAsset;
+
+/**
+ * 素材资源Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-05-08
+ */
+public interface IRobotOpsMediaAssetService 
+{
+    /**
+     * 查询素材资源
+     * 
+     * @param id 素材资源主键
+     * @return 素材资源
+     */
+    public RobotOpsMediaAsset selectRobotOpsMediaAssetById(Long id);
+
+    /**
+     * 查询素材资源列表
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 素材资源集合
+     */
+    public List<RobotOpsMediaAsset> selectRobotOpsMediaAssetList(RobotOpsMediaAsset robotOpsMediaAsset);
+
+    /**
+     * 新增素材资源
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 结果
+     */
+    public int insertRobotOpsMediaAsset(RobotOpsMediaAsset robotOpsMediaAsset);
+
+    /**
+     * 修改素材资源
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 结果
+     */
+    public int updateRobotOpsMediaAsset(RobotOpsMediaAsset robotOpsMediaAsset);
+
+    /**
+     * 批量删除素材资源
+     * 
+     * @param ids 需要删除的素材资源主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsMediaAssetByIds(Long[] ids);
+
+    /**
+     * 删除素材资源信息
+     * 
+     * @param id 素材资源主键
+     * @return 结果
+     */
+    public int deleteRobotOpsMediaAssetById(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsVisitorRecordService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.service;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsVisitorRecord;
+
+/**
+ * 访客登记记录Service接口
+ *
+ * @author ruoyi
+ * @date 2026-04-30
+ */
+public interface IRobotOpsVisitorRecordService
+{
+    /**
+     * 查询访客登记记录
+     *
+     * @param id 访客登记记录主键
+     * @return 访客登记记录
+     */
+    public RobotOpsVisitorRecord selectRobotOpsVisitorRecordById(Long id);
+
+    /**
+     * 查询访客登记记录列表
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 访客登记记录集合
+     */
+    public List<RobotOpsVisitorRecord> selectRobotOpsVisitorRecordList(RobotOpsVisitorRecord robotOpsVisitorRecord);
+
+    /**
+     * 新增访客登记记录
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 结果
+     */
+    public int insertRobotOpsVisitorRecord(RobotOpsVisitorRecord robotOpsVisitorRecord);
+
+    /**
+     * 修改访客登记记录
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 结果
+     */
+    public int updateRobotOpsVisitorRecord(RobotOpsVisitorRecord robotOpsVisitorRecord);
+
+    /**
+     * 批量删除访客登记记录
+     *
+     * @param ids 需要删除的访客登记记录主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsVisitorRecordByIds(Long[] ids);
+
+    /**
+     * 删除访客登记记录信息
+     *
+     * @param id 访客登记记录主键
+     * @return 结果
+     */
+    public int deleteRobotOpsVisitorRecordById(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/IRobotOpsWhitelistService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.base.service;
+
+import java.util.List;
+import com.ruoyi.base.domain.RobotOpsWhitelist;
+
+/**
+ * 访客白名单Service接口
+ *
+ * @author ruoyi
+ * @date 2026-04-29
+ */
+public interface IRobotOpsWhitelistService
+{
+    /**
+     * 查询访客白名单
+     *
+     * @param id 访客白名单主键
+     * @return 访客白名单
+     */
+    public RobotOpsWhitelist selectRobotOpsWhitelistById(Long id);
+
+    /**
+     * 查询访客白名单列表
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 访客白名单集合
+     */
+    public List<RobotOpsWhitelist> selectRobotOpsWhitelistList(RobotOpsWhitelist robotOpsWhitelist);
+
+    /**
+     * 新增访客白名单
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 结果
+     */
+    public int insertRobotOpsWhitelist(RobotOpsWhitelist robotOpsWhitelist);
+
+    /**
+     * 修改访客白名单
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 结果
+     */
+    public int updateRobotOpsWhitelist(RobotOpsWhitelist robotOpsWhitelist);
+
+    /**
+     * 批量删除访客白名单
+     *
+     * @param ids 需要删除的访客白名单主键集合
+     * @return 结果
+     */
+    public int deleteRobotOpsWhitelistByIds(Long[] ids);
+
+    /**
+     * 删除访客白名单信息
+     *
+     * @param id 访客白名单主键
+     * @return 结果
+     */
+    public int deleteRobotOpsWhitelistById(Long id);
+}

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsAppointmentRecordServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.base.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.base.mapper.RobotOpsAppointmentRecordMapper;
+import com.ruoyi.base.domain.RobotOpsAppointmentRecord;
+import com.ruoyi.base.service.IRobotOpsAppointmentRecordService;
+
+/**
+ * 访客预约记录Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-04-28
+ */
+@Service
+public class RobotOpsAppointmentRecordServiceImpl implements IRobotOpsAppointmentRecordService 
+{
+    @Autowired
+    private RobotOpsAppointmentRecordMapper robotOpsAppointmentRecordMapper;
+
+    /**
+     * 查询访客预约记录
+     * 
+     * @param id 访客预约记录主键
+     * @return 访客预约记录
+     */
+    @Override
+    public RobotOpsAppointmentRecord selectRobotOpsAppointmentRecordById(Long id)
+    {
+        return robotOpsAppointmentRecordMapper.selectRobotOpsAppointmentRecordById(id);
+    }
+
+    /**
+     * 查询访客预约记录列表
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 访客预约记录
+     */
+    @Override
+    public List<RobotOpsAppointmentRecord> selectRobotOpsAppointmentRecordList(RobotOpsAppointmentRecord robotOpsAppointmentRecord)
+    {
+        return robotOpsAppointmentRecordMapper.selectRobotOpsAppointmentRecordList(robotOpsAppointmentRecord);
+    }
+
+    /**
+     * 新增访客预约记录
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 结果
+     */
+    @Override
+    public int insertRobotOpsAppointmentRecord(RobotOpsAppointmentRecord robotOpsAppointmentRecord)
+    {
+        robotOpsAppointmentRecord.setCreateTime(DateUtils.getNowDate());
+        return robotOpsAppointmentRecordMapper.insertRobotOpsAppointmentRecord(robotOpsAppointmentRecord);
+    }
+
+    /**
+     * 修改访客预约记录
+     * 
+     * @param robotOpsAppointmentRecord 访客预约记录
+     * @return 结果
+     */
+    @Override
+    public int updateRobotOpsAppointmentRecord(RobotOpsAppointmentRecord robotOpsAppointmentRecord)
+    {
+        robotOpsAppointmentRecord.setUpdateTime(DateUtils.getNowDate());
+        return robotOpsAppointmentRecordMapper.updateRobotOpsAppointmentRecord(robotOpsAppointmentRecord);
+    }
+
+    /**
+     * 批量删除访客预约记录
+     * 
+     * @param ids 需要删除的访客预约记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsAppointmentRecordByIds(Long[] ids)
+    {
+        return robotOpsAppointmentRecordMapper.deleteRobotOpsAppointmentRecordByIds(ids);
+    }
+
+    /**
+     * 删除访客预约记录信息
+     * 
+     * @param id 访客预约记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsAppointmentRecordById(Long id)
+    {
+        return robotOpsAppointmentRecordMapper.deleteRobotOpsAppointmentRecordById(id);
+    }
+}

+ 134 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsFaqServiceImpl.java

@@ -0,0 +1,134 @@
+package com.ruoyi.base.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import com.ruoyi.common.utils.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
+import com.ruoyi.base.domain.RobotOpsFaqSimilar;
+import com.ruoyi.base.mapper.RobotOpsFaqMapper;
+import com.ruoyi.base.domain.RobotOpsFaq;
+import com.ruoyi.base.service.IRobotOpsFaqService;
+
+/**
+ * 问答库管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+@Service
+public class RobotOpsFaqServiceImpl implements IRobotOpsFaqService 
+{
+    @Autowired
+    private RobotOpsFaqMapper robotOpsFaqMapper;
+
+    /**
+     * 查询问答库管理
+     * 
+     * @param id 问答库管理主键
+     * @return 问答库管理
+     */
+    @Override
+    public RobotOpsFaq selectRobotOpsFaqById(Long id)
+    {
+        return robotOpsFaqMapper.selectRobotOpsFaqById(id);
+    }
+
+    /**
+     * 查询问答库管理列表
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 问答库管理
+     */
+    @Override
+    public List<RobotOpsFaq> selectRobotOpsFaqList(RobotOpsFaq robotOpsFaq)
+    {
+        return robotOpsFaqMapper.selectRobotOpsFaqList(robotOpsFaq);
+    }
+
+    /**
+     * 新增问答库管理
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int insertRobotOpsFaq(RobotOpsFaq robotOpsFaq)
+    {
+        robotOpsFaq.setCreateTime(DateUtils.getNowDate());
+        int rows = robotOpsFaqMapper.insertRobotOpsFaq(robotOpsFaq);
+        insertRobotOpsFaqSimilar(robotOpsFaq);
+        return rows;
+    }
+
+    /**
+     * 修改问答库管理
+     * 
+     * @param robotOpsFaq 问答库管理
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int updateRobotOpsFaq(RobotOpsFaq robotOpsFaq)
+    {
+        robotOpsFaq.setUpdateTime(DateUtils.getNowDate());
+        robotOpsFaqMapper.deleteRobotOpsFaqSimilarByFaqId(robotOpsFaq.getId());
+        insertRobotOpsFaqSimilar(robotOpsFaq);
+        return robotOpsFaqMapper.updateRobotOpsFaq(robotOpsFaq);
+    }
+
+    /**
+     * 批量删除问答库管理
+     * 
+     * @param ids 需要删除的问答库管理主键
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int deleteRobotOpsFaqByIds(Long[] ids)
+    {
+        robotOpsFaqMapper.deleteRobotOpsFaqSimilarByFaqIds(ids);
+        return robotOpsFaqMapper.deleteRobotOpsFaqByIds(ids);
+    }
+
+    /**
+     * 删除问答库管理信息
+     * 
+     * @param id 问答库管理主键
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int deleteRobotOpsFaqById(Long id)
+    {
+        robotOpsFaqMapper.deleteRobotOpsFaqSimilarByFaqId(id);
+        return robotOpsFaqMapper.deleteRobotOpsFaqById(id);
+    }
+
+    /**
+     * 新增问答相似问信息
+     * 
+     * @param robotOpsFaq 问答库管理对象
+     */
+    public void insertRobotOpsFaqSimilar(RobotOpsFaq robotOpsFaq)
+    {
+        List<RobotOpsFaqSimilar> robotOpsFaqSimilarList = robotOpsFaq.getRobotOpsFaqSimilarList();
+        Long id = robotOpsFaq.getId();
+        if (StringUtils.isNotNull(robotOpsFaqSimilarList))
+        {
+            List<RobotOpsFaqSimilar> list = new ArrayList<RobotOpsFaqSimilar>();
+            for (RobotOpsFaqSimilar robotOpsFaqSimilar : robotOpsFaqSimilarList)
+            {
+                robotOpsFaqSimilar.setFaqId(id);
+                list.add(robotOpsFaqSimilar);
+            }
+            if (list.size() > 0)
+            {
+                robotOpsFaqMapper.batchRobotOpsFaqSimilar(list);
+            }
+        }
+    }
+}

+ 93 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsFaqSimilarServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.base.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.base.mapper.RobotOpsFaqSimilarMapper;
+import com.ruoyi.base.domain.RobotOpsFaqSimilar;
+import com.ruoyi.base.service.IRobotOpsFaqSimilarService;
+
+/**
+ * 相似问答表Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-05-07
+ */
+@Service
+public class RobotOpsFaqSimilarServiceImpl implements IRobotOpsFaqSimilarService 
+{
+    @Autowired
+    private RobotOpsFaqSimilarMapper robotOpsFaqSimilarMapper;
+
+    /**
+     * 查询相似问答表
+     * 
+     * @param id 相似问答表主键
+     * @return 相似问答表
+     */
+    @Override
+    public RobotOpsFaqSimilar selectRobotOpsFaqSimilarById(Long id)
+    {
+        return robotOpsFaqSimilarMapper.selectRobotOpsFaqSimilarById(id);
+    }
+
+    /**
+     * 查询相似问答表列表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 相似问答表
+     */
+    @Override
+    public List<RobotOpsFaqSimilar> selectRobotOpsFaqSimilarList(RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        return robotOpsFaqSimilarMapper.selectRobotOpsFaqSimilarList(robotOpsFaqSimilar);
+    }
+
+    /**
+     * 新增相似问答表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 结果
+     */
+    @Override
+    public int insertRobotOpsFaqSimilar(RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        return robotOpsFaqSimilarMapper.insertRobotOpsFaqSimilar(robotOpsFaqSimilar);
+    }
+
+    /**
+     * 修改相似问答表
+     * 
+     * @param robotOpsFaqSimilar 相似问答表
+     * @return 结果
+     */
+    @Override
+    public int updateRobotOpsFaqSimilar(RobotOpsFaqSimilar robotOpsFaqSimilar)
+    {
+        return robotOpsFaqSimilarMapper.updateRobotOpsFaqSimilar(robotOpsFaqSimilar);
+    }
+
+    /**
+     * 批量删除相似问答表
+     * 
+     * @param ids 需要删除的相似问答表主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsFaqSimilarByIds(Long[] ids)
+    {
+        return robotOpsFaqSimilarMapper.deleteRobotOpsFaqSimilarByIds(ids);
+    }
+
+    /**
+     * 删除相似问答表信息
+     * 
+     * @param id 相似问答表主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsFaqSimilarById(Long id)
+    {
+        return robotOpsFaqSimilarMapper.deleteRobotOpsFaqSimilarById(id);
+    }
+}

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsMediaAssetServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.base.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.base.mapper.RobotOpsMediaAssetMapper;
+import com.ruoyi.base.domain.RobotOpsMediaAsset;
+import com.ruoyi.base.service.IRobotOpsMediaAssetService;
+
+/**
+ * 素材资源Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-05-08
+ */
+@Service
+public class RobotOpsMediaAssetServiceImpl implements IRobotOpsMediaAssetService 
+{
+    @Autowired
+    private RobotOpsMediaAssetMapper robotOpsMediaAssetMapper;
+
+    /**
+     * 查询素材资源
+     * 
+     * @param id 素材资源主键
+     * @return 素材资源
+     */
+    @Override
+    public RobotOpsMediaAsset selectRobotOpsMediaAssetById(Long id)
+    {
+        return robotOpsMediaAssetMapper.selectRobotOpsMediaAssetById(id);
+    }
+
+    /**
+     * 查询素材资源列表
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 素材资源
+     */
+    @Override
+    public List<RobotOpsMediaAsset> selectRobotOpsMediaAssetList(RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        return robotOpsMediaAssetMapper.selectRobotOpsMediaAssetList(robotOpsMediaAsset);
+    }
+
+    /**
+     * 新增素材资源
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 结果
+     */
+    @Override
+    public int insertRobotOpsMediaAsset(RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        robotOpsMediaAsset.setCreateTime(DateUtils.getNowDate());
+        return robotOpsMediaAssetMapper.insertRobotOpsMediaAsset(robotOpsMediaAsset);
+    }
+
+    /**
+     * 修改素材资源
+     * 
+     * @param robotOpsMediaAsset 素材资源
+     * @return 结果
+     */
+    @Override
+    public int updateRobotOpsMediaAsset(RobotOpsMediaAsset robotOpsMediaAsset)
+    {
+        robotOpsMediaAsset.setUpdateTime(DateUtils.getNowDate());
+        return robotOpsMediaAssetMapper.updateRobotOpsMediaAsset(robotOpsMediaAsset);
+    }
+
+    /**
+     * 批量删除素材资源
+     * 
+     * @param ids 需要删除的素材资源主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsMediaAssetByIds(Long[] ids)
+    {
+        return robotOpsMediaAssetMapper.deleteRobotOpsMediaAssetByIds(ids);
+    }
+
+    /**
+     * 删除素材资源信息
+     * 
+     * @param id 素材资源主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsMediaAssetById(Long id)
+    {
+        return robotOpsMediaAssetMapper.deleteRobotOpsMediaAssetById(id);
+    }
+}

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsVisitorRecordServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.base.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.base.mapper.RobotOpsVisitorRecordMapper;
+import com.ruoyi.base.domain.RobotOpsVisitorRecord;
+import com.ruoyi.base.service.IRobotOpsVisitorRecordService;
+
+/**
+ * 访客登记记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-04-30
+ */
+@Service
+public class RobotOpsVisitorRecordServiceImpl implements IRobotOpsVisitorRecordService
+{
+    @Autowired
+    private RobotOpsVisitorRecordMapper robotOpsVisitorRecordMapper;
+
+    /**
+     * 查询访客登记记录
+     *
+     * @param id 访客登记记录主键
+     * @return 访客登记记录
+     */
+    @Override
+    public RobotOpsVisitorRecord selectRobotOpsVisitorRecordById(Long id)
+    {
+        return robotOpsVisitorRecordMapper.selectRobotOpsVisitorRecordById(id);
+    }
+
+    /**
+     * 查询访客登记记录列表
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 访客登记记录
+     */
+    @Override
+    public List<RobotOpsVisitorRecord> selectRobotOpsVisitorRecordList(RobotOpsVisitorRecord robotOpsVisitorRecord)
+    {
+        return robotOpsVisitorRecordMapper.selectRobotOpsVisitorRecordList(robotOpsVisitorRecord);
+    }
+
+    /**
+     * 新增访客登记记录
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 结果
+     */
+    @Override
+    public int insertRobotOpsVisitorRecord(RobotOpsVisitorRecord robotOpsVisitorRecord)
+    {
+        robotOpsVisitorRecord.setCreateTime(DateUtils.getNowDate());
+        return robotOpsVisitorRecordMapper.insertRobotOpsVisitorRecord(robotOpsVisitorRecord);
+    }
+
+    /**
+     * 修改访客登记记录
+     *
+     * @param robotOpsVisitorRecord 访客登记记录
+     * @return 结果
+     */
+    @Override
+    public int updateRobotOpsVisitorRecord(RobotOpsVisitorRecord robotOpsVisitorRecord)
+    {
+        robotOpsVisitorRecord.setUpdateTime(DateUtils.getNowDate());
+        return robotOpsVisitorRecordMapper.updateRobotOpsVisitorRecord(robotOpsVisitorRecord);
+    }
+
+    /**
+     * 批量删除访客登记记录
+     *
+     * @param ids 需要删除的访客登记记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsVisitorRecordByIds(Long[] ids)
+    {
+        return robotOpsVisitorRecordMapper.deleteRobotOpsVisitorRecordByIds(ids);
+    }
+
+    /**
+     * 删除访客登记记录信息
+     *
+     * @param id 访客登记记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsVisitorRecordById(Long id)
+    {
+        return robotOpsVisitorRecordMapper.deleteRobotOpsVisitorRecordById(id);
+    }
+}

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/base/service/impl/RobotOpsWhitelistServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.base.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.base.mapper.RobotOpsWhitelistMapper;
+import com.ruoyi.base.domain.RobotOpsWhitelist;
+import com.ruoyi.base.service.IRobotOpsWhitelistService;
+
+/**
+ * 访客白名单Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-04-29
+ */
+@Service
+public class RobotOpsWhitelistServiceImpl implements IRobotOpsWhitelistService
+{
+    @Autowired
+    private RobotOpsWhitelistMapper robotOpsWhitelistMapper;
+
+    /**
+     * 查询访客白名单
+     *
+     * @param id 访客白名单主键
+     * @return 访客白名单
+     */
+    @Override
+    public RobotOpsWhitelist selectRobotOpsWhitelistById(Long id)
+    {
+        return robotOpsWhitelistMapper.selectRobotOpsWhitelistById(id);
+    }
+
+    /**
+     * 查询访客白名单列表
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 访客白名单
+     */
+    @Override
+    public List<RobotOpsWhitelist> selectRobotOpsWhitelistList(RobotOpsWhitelist robotOpsWhitelist)
+    {
+        return robotOpsWhitelistMapper.selectRobotOpsWhitelistList(robotOpsWhitelist);
+    }
+
+    /**
+     * 新增访客白名单
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 结果
+     */
+    @Override
+    public int insertRobotOpsWhitelist(RobotOpsWhitelist robotOpsWhitelist)
+    {
+        robotOpsWhitelist.setCreateTime(DateUtils.getNowDate());
+        return robotOpsWhitelistMapper.insertRobotOpsWhitelist(robotOpsWhitelist);
+    }
+
+    /**
+     * 修改访客白名单
+     *
+     * @param robotOpsWhitelist 访客白名单
+     * @return 结果
+     */
+    @Override
+    public int updateRobotOpsWhitelist(RobotOpsWhitelist robotOpsWhitelist)
+    {
+        robotOpsWhitelist.setUpdateTime(DateUtils.getNowDate());
+        return robotOpsWhitelistMapper.updateRobotOpsWhitelist(robotOpsWhitelist);
+    }
+
+    /**
+     * 批量删除访客白名单
+     *
+     * @param ids 需要删除的访客白名单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsWhitelistByIds(Long[] ids)
+    {
+        return robotOpsWhitelistMapper.deleteRobotOpsWhitelistByIds(ids);
+    }
+
+    /**
+     * 删除访客白名单信息
+     *
+     * @param id 访客白名单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRobotOpsWhitelistById(Long id)
+    {
+        return robotOpsWhitelistMapper.deleteRobotOpsWhitelistById(id);
+    }
+}

+ 109 - 0
ruoyi-system/src/main/resources/mapper/base/RobotOpsAppointmentRecordMapper.xml

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.base.mapper.RobotOpsAppointmentRecordMapper">
+
+    <resultMap type="RobotOpsAppointmentRecord" id="RobotOpsAppointmentRecordResult">
+        <result property="id"    column="id"    />
+        <result property="appointmentNo"    column="appointment_no"    />
+        <result property="visitorName"    column="visitor_name"    />
+        <result property="mobile"    column="mobile"    />
+        <result property="visitedPerson"    column="visited_person"    />
+        <result property="appointmentTime"    column="appointment_time"    />
+        <result property="status"    column="status"    />
+        <result property="syncTime"    column="sync_time"    />
+        <result property="sourcePlatform"    column="source_platform"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRobotOpsAppointmentRecordVo">
+        select id, appointment_no, visitor_name, mobile, visited_person, appointment_time, status, sync_time, source_platform, remark, create_time, update_time from robot_ops_appointment_record
+    </sql>
+
+    <select id="selectRobotOpsAppointmentRecordList" parameterType="RobotOpsAppointmentRecord" resultMap="RobotOpsAppointmentRecordResult">
+        <include refid="selectRobotOpsAppointmentRecordVo"/>
+        <where>
+            <if test="appointmentNo != null  and appointmentNo != ''"> and appointment_no = #{appointmentNo}</if>
+            <if test="visitorName != null  and visitorName != ''"> and visitor_name like concat('%', #{visitorName}, '%')</if>
+            <if test="mobile != null  and mobile != ''"> and mobile = #{mobile}</if>
+            <if test="visitedPerson != null  and visitedPerson != ''"> and visited_person like concat('%', #{visitedPerson}, '%')</if>
+            <if test="appointmentTime != null "> and appointment_time = #{appointmentTime}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="syncTime != null "> and sync_time = #{syncTime}</if>
+            <if test="sourcePlatform != null  and sourcePlatform != ''"> and source_platform = #{sourcePlatform}</if>
+            <if test="params.beginTime != null and params.beginTime != ''">
+                and date_format(appointment_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
+            </if>
+            <if test="params.endTime != null and params.endTime != ''">
+                and date_format(appointment_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectRobotOpsAppointmentRecordById" parameterType="Long" resultMap="RobotOpsAppointmentRecordResult">
+        <include refid="selectRobotOpsAppointmentRecordVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRobotOpsAppointmentRecord" parameterType="RobotOpsAppointmentRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into robot_ops_appointment_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="appointmentNo != null and appointmentNo != ''">appointment_no,</if>
+            <if test="visitorName != null">visitor_name,</if>
+            <if test="mobile != null">mobile,</if>
+            <if test="visitedPerson != null">visited_person,</if>
+            <if test="appointmentTime != null">appointment_time,</if>
+            <if test="status != null">status,</if>
+            <if test="syncTime != null">sync_time,</if>
+            <if test="sourcePlatform != null">source_platform,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="appointmentNo != null and appointmentNo != ''">#{appointmentNo},</if>
+            <if test="visitorName != null">#{visitorName},</if>
+            <if test="mobile != null">#{mobile},</if>
+            <if test="visitedPerson != null">#{visitedPerson},</if>
+            <if test="appointmentTime != null">#{appointmentTime},</if>
+            <if test="status != null">#{status},</if>
+            <if test="syncTime != null">#{syncTime},</if>
+            <if test="sourcePlatform != null">#{sourcePlatform},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRobotOpsAppointmentRecord" parameterType="RobotOpsAppointmentRecord">
+        update robot_ops_appointment_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="appointmentNo != null and appointmentNo != ''">appointment_no = #{appointmentNo},</if>
+            <if test="visitorName != null">visitor_name = #{visitorName},</if>
+            <if test="mobile != null">mobile = #{mobile},</if>
+            <if test="visitedPerson != null">visited_person = #{visitedPerson},</if>
+            <if test="appointmentTime != null">appointment_time = #{appointmentTime},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="syncTime != null">sync_time = #{syncTime},</if>
+            <if test="sourcePlatform != null">source_platform = #{sourcePlatform},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRobotOpsAppointmentRecordById" parameterType="Long">
+        delete from robot_ops_appointment_record where id = #{id}
+    </delete>
+
+    <delete id="deleteRobotOpsAppointmentRecordByIds" parameterType="String">
+        delete from robot_ops_appointment_record where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 134 - 0
ruoyi-system/src/main/resources/mapper/base/RobotOpsFaqMapper.xml

@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.base.mapper.RobotOpsFaqMapper">
+
+    <resultMap type="RobotOpsFaq" id="RobotOpsFaqResult">
+        <result property="id"    column="id"    />
+        <result property="categoryType"    column="category_type"    />
+        <result property="question"    column="question"    />
+        <result property="answer"    column="answer"    />
+        <result property="sortNo"    column="sort_no"    />
+        <result property="status"    column="status"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <resultMap id="RobotOpsFaqRobotOpsFaqSimilarResult" type="RobotOpsFaq" extends="RobotOpsFaqResult">
+        <collection property="robotOpsFaqSimilarList" ofType="RobotOpsFaqSimilar" column="id" select="selectRobotOpsFaqSimilarList" />
+    </resultMap>
+
+    <resultMap type="RobotOpsFaqSimilar" id="RobotOpsFaqSimilarResult">
+        <result property="id"    column="id"    />
+        <result property="faqId"    column="faq_id"    />
+        <result property="similarQuestion"    column="similar_question"    />
+        <result property="sortNo"    column="sort_no"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectRobotOpsFaqVo">
+        select id, category_type, question, answer, sort_no, status, remark, create_time, update_time, create_by, update_by from robot_ops_faq
+    </sql>
+
+    <select id="selectRobotOpsFaqList" parameterType="RobotOpsFaq" resultMap="RobotOpsFaqResult">
+        <include refid="selectRobotOpsFaqVo"/>
+        <where>
+            <if test="categoryType != null  and categoryType != ''"> and category_type = #{categoryType}</if>
+            <if test="question != null  and question != ''"> and question like concat('%', #{question}, '%')</if>
+            <if test="answer != null  and answer != ''"> and answer = #{answer}</if>
+            <if test="sortNo != null "> and sort_no = #{sortNo}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+
+    <select id="selectRobotOpsFaqById" parameterType="Long" resultMap="RobotOpsFaqRobotOpsFaqSimilarResult">
+        select id, category_type, question, answer, sort_no, status, remark, create_time, update_time, create_by, update_by
+        from robot_ops_faq
+        where id = #{id}
+    </select>
+
+    <select id="selectRobotOpsFaqSimilarList" resultMap="RobotOpsFaqSimilarResult">
+        select id, faq_id, similar_question, sort_no, create_by, update_by
+        from robot_ops_faq_similar
+        where faq_id = #{faq_id}
+    </select>
+
+    <insert id="insertRobotOpsFaq" parameterType="RobotOpsFaq" useGeneratedKeys="true" keyProperty="id">
+        insert into robot_ops_faq
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="categoryType != null">category_type,</if>
+            <if test="question != null and question != ''">question,</if>
+            <if test="answer != null and answer != ''">answer,</if>
+            <if test="sortNo != null">sort_no,</if>
+            <if test="status != null and status != ''">status,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="categoryType != null">#{categoryType},</if>
+            <if test="question != null and question != ''">#{question},</if>
+            <if test="answer != null and answer != ''">#{answer},</if>
+            <if test="sortNo != null">#{sortNo},</if>
+            <if test="status != null and status != ''">#{status},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRobotOpsFaq" parameterType="RobotOpsFaq">
+        update robot_ops_faq
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="categoryType != null">category_type = #{categoryType},</if>
+            <if test="question != null and question != ''">question = #{question},</if>
+            <if test="answer != null and answer != ''">answer = #{answer},</if>
+            <if test="sortNo != null">sort_no = #{sortNo},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRobotOpsFaqById" parameterType="Long">
+        delete from robot_ops_faq where id = #{id}
+    </delete>
+
+    <delete id="deleteRobotOpsFaqByIds" parameterType="String">
+        delete from robot_ops_faq where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <delete id="deleteRobotOpsFaqSimilarByFaqIds" parameterType="String">
+        delete from robot_ops_faq_similar where faq_id in
+        <foreach item="faqId" collection="array" open="(" separator="," close=")">
+            #{faqId}
+        </foreach>
+    </delete>
+
+    <delete id="deleteRobotOpsFaqSimilarByFaqId" parameterType="Long">
+        delete from robot_ops_faq_similar where faq_id = #{faqId}
+    </delete>
+
+    <insert id="batchRobotOpsFaqSimilar">
+        insert into robot_ops_faq_similar( id, faq_id, similar_question, sort_no, create_by, update_by) values
+        <foreach item="item" index="index" collection="list" separator=",">
+            ( #{item.id}, #{item.faqId}, #{item.similarQuestion}, #{item.sortNo}, #{item.createBy}, #{item.updateBy})
+        </foreach>
+    </insert>
+</mapper>

+ 74 - 0
ruoyi-system/src/main/resources/mapper/base/RobotOpsFaqSimilarMapper.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.base.mapper.RobotOpsFaqSimilarMapper">
+    
+    <resultMap type="RobotOpsFaqSimilar" id="RobotOpsFaqSimilarResult">
+        <result property="id"    column="id"    />
+        <result property="faqId"    column="faq_id"    />
+        <result property="similarQuestion"    column="similar_question"    />
+        <result property="sortNo"    column="sort_no"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectRobotOpsFaqSimilarVo">
+        select id, faq_id, similar_question, sort_no, create_by, update_by from robot_ops_faq_similar
+    </sql>
+
+    <select id="selectRobotOpsFaqSimilarList" parameterType="RobotOpsFaqSimilar" resultMap="RobotOpsFaqSimilarResult">
+        <include refid="selectRobotOpsFaqSimilarVo"/>
+        <where>  
+            <if test="faqId != null "> and faq_id = #{faqId}</if>
+            <if test="similarQuestion != null  and similarQuestion != ''"> and similar_question = #{similarQuestion}</if>
+            <if test="sortNo != null "> and sort_no = #{sortNo}</if>
+        </where>
+    </select>
+    
+    <select id="selectRobotOpsFaqSimilarById" parameterType="Long" resultMap="RobotOpsFaqSimilarResult">
+        <include refid="selectRobotOpsFaqSimilarVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRobotOpsFaqSimilar" parameterType="RobotOpsFaqSimilar" useGeneratedKeys="true" keyProperty="id">
+        insert into robot_ops_faq_similar
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="faqId != null">faq_id,</if>
+            <if test="similarQuestion != null and similarQuestion != ''">similar_question,</if>
+            <if test="sortNo != null">sort_no,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="faqId != null">#{faqId},</if>
+            <if test="similarQuestion != null and similarQuestion != ''">#{similarQuestion},</if>
+            <if test="sortNo != null">#{sortNo},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRobotOpsFaqSimilar" parameterType="RobotOpsFaqSimilar">
+        update robot_ops_faq_similar
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="faqId != null">faq_id = #{faqId},</if>
+            <if test="similarQuestion != null and similarQuestion != ''">similar_question = #{similarQuestion},</if>
+            <if test="sortNo != null">sort_no = #{sortNo},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRobotOpsFaqSimilarById" parameterType="Long">
+        delete from robot_ops_faq_similar where id = #{id}
+    </delete>
+
+    <delete id="deleteRobotOpsFaqSimilarByIds" parameterType="String">
+        delete from robot_ops_faq_similar where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 120 - 0
ruoyi-system/src/main/resources/mapper/base/RobotOpsMediaAssetMapper.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.base.mapper.RobotOpsMediaAssetMapper">
+    
+    <resultMap type="RobotOpsMediaAsset" id="RobotOpsMediaAssetResult">
+        <result property="id"    column="id"    />
+        <result property="assetName"    column="asset_name"    />
+        <result property="assetType"    column="asset_type"    />
+        <result property="fileUrl"    column="file_url"    />
+        <result property="thumbnailUrl"    column="thumbnail_url"    />
+        <result property="fileSize"    column="file_size"    />
+        <result property="fileFormat"    column="file_format"    />
+        <result property="mimeType"    column="mime_type"    />
+        <result property="durationSeconds"    column="duration_seconds"    />
+        <result property="resolution"    column="resolution"    />
+        <result property="status"    column="status"    />
+        <result property="quotedFlag"    column="quoted_flag"    />
+        <result property="remark"    column="remark"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRobotOpsMediaAssetVo">
+        select id, asset_name, asset_type, file_url, thumbnail_url, file_size, file_format, mime_type, duration_seconds, resolution, status, quoted_flag, remark, create_by, create_time, update_by, update_time from robot_ops_media_asset
+    </sql>
+
+    <select id="selectRobotOpsMediaAssetList" parameterType="RobotOpsMediaAsset" resultMap="RobotOpsMediaAssetResult">
+        <include refid="selectRobotOpsMediaAssetVo"/>
+        <where>  
+            <if test="assetName != null  and assetName != ''"> and asset_name like concat('%', #{assetName}, '%')</if>
+            <if test="assetType != null  and assetType != ''"> and asset_type = #{assetType}</if>
+            <if test="mimeType != null  and mimeType != ''"> and mime_type = #{mimeType}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="quotedFlag != null  and quotedFlag != ''"> and quoted_flag = #{quotedFlag}</if>
+        </where>
+    </select>
+    
+    <select id="selectRobotOpsMediaAssetById" parameterType="Long" resultMap="RobotOpsMediaAssetResult">
+        <include refid="selectRobotOpsMediaAssetVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRobotOpsMediaAsset" parameterType="RobotOpsMediaAsset" useGeneratedKeys="true" keyProperty="id">
+        insert into robot_ops_media_asset
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="assetName != null and assetName != ''">asset_name,</if>
+            <if test="assetType != null and assetType != ''">asset_type,</if>
+            <if test="fileUrl != null and fileUrl != ''">file_url,</if>
+            <if test="thumbnailUrl != null">thumbnail_url,</if>
+            <if test="fileSize != null">file_size,</if>
+            <if test="fileFormat != null">file_format,</if>
+            <if test="mimeType != null">mime_type,</if>
+            <if test="durationSeconds != null">duration_seconds,</if>
+            <if test="resolution != null">resolution,</if>
+            <if test="status != null and status != ''">status,</if>
+            <if test="quotedFlag != null and quotedFlag != ''">quoted_flag,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="assetName != null and assetName != ''">#{assetName},</if>
+            <if test="assetType != null and assetType != ''">#{assetType},</if>
+            <if test="fileUrl != null and fileUrl != ''">#{fileUrl},</if>
+            <if test="thumbnailUrl != null">#{thumbnailUrl},</if>
+            <if test="fileSize != null">#{fileSize},</if>
+            <if test="fileFormat != null">#{fileFormat},</if>
+            <if test="mimeType != null">#{mimeType},</if>
+            <if test="durationSeconds != null">#{durationSeconds},</if>
+            <if test="resolution != null">#{resolution},</if>
+            <if test="status != null and status != ''">#{status},</if>
+            <if test="quotedFlag != null and quotedFlag != ''">#{quotedFlag},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRobotOpsMediaAsset" parameterType="RobotOpsMediaAsset">
+        update robot_ops_media_asset
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="assetName != null and assetName != ''">asset_name = #{assetName},</if>
+            <if test="assetType != null and assetType != ''">asset_type = #{assetType},</if>
+            <if test="fileUrl != null and fileUrl != ''">file_url = #{fileUrl},</if>
+            <if test="thumbnailUrl != null">thumbnail_url = #{thumbnailUrl},</if>
+            <if test="fileSize != null">file_size = #{fileSize},</if>
+            <if test="fileFormat != null">file_format = #{fileFormat},</if>
+            <if test="mimeType != null">mime_type = #{mimeType},</if>
+            <if test="durationSeconds != null">duration_seconds = #{durationSeconds},</if>
+            <if test="resolution != null">resolution = #{resolution},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="quotedFlag != null and quotedFlag != ''">quoted_flag = #{quotedFlag},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRobotOpsMediaAssetById" parameterType="Long">
+        delete from robot_ops_media_asset where id = #{id}
+    </delete>
+
+    <delete id="deleteRobotOpsMediaAssetByIds" parameterType="String">
+        delete from robot_ops_media_asset where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 124 - 0
ruoyi-system/src/main/resources/mapper/base/RobotOpsVisitorRecordMapper.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.base.mapper.RobotOpsVisitorRecordMapper">
+
+    <resultMap type="RobotOpsVisitorRecord" id="RobotOpsVisitorRecordResult">
+        <result property="id"    column="id"    />
+        <result property="visitorName"    column="visitor_name"    />
+        <result property="mobile"    column="mobile"    />
+        <result property="idCardNo"    column="id_card_no"    />
+        <result property="visitType"    column="visit_type"    />
+        <result property="visitorSource"    column="visitor_source"    />
+        <result property="visitReason"    column="visit_reason"    />
+        <result property="visitorPhoto"    column="visitor_photo"    />
+        <result property="appointmentNo"    column="appointment_no"    />
+        <result property="visitedPerson"    column="visited_person"    />
+        <result property="visitTime"    column="visit_time"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="registerType"    column="register_type"    />
+    </resultMap>
+
+    <sql id="selectRobotOpsVisitorRecordVo">
+        select id, visitor_name, mobile, id_card_no, visit_type, visitor_source, visit_reason, visitor_photo, appointment_no, visited_person, visit_time, remark, create_time, update_time, register_type from robot_ops_visitor_record
+    </sql>
+
+    <select id="selectRobotOpsVisitorRecordList" parameterType="RobotOpsVisitorRecord" resultMap="RobotOpsVisitorRecordResult">
+        <include refid="selectRobotOpsVisitorRecordVo"/>
+        <where>
+            <if test="visitorName != null  and visitorName != ''"> and visitor_name like concat('%', #{visitorName}, '%')</if>
+            <if test="mobile != null  and mobile != ''"> and mobile = #{mobile}</if>
+            <if test="idCardNo != null  and idCardNo != ''"> and id_card_no = #{idCardNo}</if>
+            <if test="visitType != null  and visitType != ''"> and visit_type = #{visitType}</if>
+            <if test="visitorSource != null  and visitorSource != ''"> and visitor_source = #{visitorSource}</if>
+            <if test="visitReason != null  and visitReason != ''"> and visit_reason = #{visitReason}</if>
+            <if test="visitorPhoto != null  and visitorPhoto != ''"> and visitor_photo = #{visitorPhoto}</if>
+            <if test="appointmentNo != null  and appointmentNo != ''"> and appointment_no = #{appointmentNo}</if>
+            <if test="visitedPerson != null  and visitedPerson != ''"> and visited_person like concat('%', #{visitedPerson}, '%')</if>
+            <if test="visitTime != null "> and visit_time = #{visitTime}</if>
+            <if test="registerType != null  and registerType != ''"> and register_type = #{registerType}</if>
+            <if test="params.beginTime != null and params.beginTime != ''">
+                and date_format(visit_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
+            </if>
+            <if test="params.endTime != null and params.endTime != ''">
+                and date_format(visit_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectRobotOpsVisitorRecordById" parameterType="Long" resultMap="RobotOpsVisitorRecordResult">
+        <include refid="selectRobotOpsVisitorRecordVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRobotOpsVisitorRecord" parameterType="RobotOpsVisitorRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into robot_ops_visitor_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="visitorName != null">visitor_name,</if>
+            <if test="mobile != null">mobile,</if>
+            <if test="idCardNo != null">id_card_no,</if>
+            <if test="visitType != null and visitType != ''">visit_type,</if>
+            <if test="visitorSource != null">visitor_source,</if>
+            <if test="visitReason != null">visit_reason,</if>
+            <if test="visitorPhoto != null">visitor_photo,</if>
+            <if test="appointmentNo != null">appointment_no,</if>
+            <if test="visitedPerson != null">visited_person,</if>
+            <if test="visitTime != null">visit_time,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="registerType != null and registerType != ''">register_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="visitorName != null">#{visitorName},</if>
+            <if test="mobile != null">#{mobile},</if>
+            <if test="idCardNo != null">#{idCardNo},</if>
+            <if test="visitType != null and visitType != ''">#{visitType},</if>
+            <if test="visitorSource != null">#{visitorSource},</if>
+            <if test="visitReason != null">#{visitReason},</if>
+            <if test="visitorPhoto != null">#{visitorPhoto},</if>
+            <if test="appointmentNo != null">#{appointmentNo},</if>
+            <if test="visitedPerson != null">#{visitedPerson},</if>
+            <if test="visitTime != null">#{visitTime},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="registerType != null and registerType != ''">#{registerType},</if>
+        </trim>
+    </insert>
+
+    <update id="updateRobotOpsVisitorRecord" parameterType="RobotOpsVisitorRecord">
+        update robot_ops_visitor_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="visitorName != null">visitor_name = #{visitorName},</if>
+            <if test="mobile != null">mobile = #{mobile},</if>
+            <if test="idCardNo != null">id_card_no = #{idCardNo},</if>
+            <if test="visitType != null and visitType != ''">visit_type = #{visitType},</if>
+            <if test="visitorSource != null">visitor_source = #{visitorSource},</if>
+            <if test="visitReason != null">visit_reason = #{visitReason},</if>
+            <if test="visitorPhoto != null">visitor_photo = #{visitorPhoto},</if>
+            <if test="appointmentNo != null">appointment_no = #{appointmentNo},</if>
+            <if test="visitedPerson != null">visited_person = #{visitedPerson},</if>
+            <if test="visitTime != null">visit_time = #{visitTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="registerType != null and registerType != ''">register_type = #{registerType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRobotOpsVisitorRecordById" parameterType="Long">
+        delete from robot_ops_visitor_record where id = #{id}
+    </delete>
+
+    <delete id="deleteRobotOpsVisitorRecordByIds" parameterType="String">
+        delete from robot_ops_visitor_record where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 108 - 0
ruoyi-system/src/main/resources/mapper/base/RobotOpsWhitelistMapper.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.base.mapper.RobotOpsWhitelistMapper">
+
+    <resultMap type="RobotOpsWhitelist" id="RobotOpsWhitelistResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="mobile"    column="mobile"    />
+        <result property="idCardNo"    column="id_card_no"    />
+        <result property="faceImageUrl"    column="face_image_url"    />
+        <result property="validStartTime"    column="valid_start_time"    />
+        <result property="validEndTime"    column="valid_end_time"    />
+        <result property="status"    column="status"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="whitelistType"    column="whitelist_type"    />
+        <result property="sourceType"    column="source_type"    />
+    </resultMap>
+
+    <sql id="selectRobotOpsWhitelistVo">
+        select id, name, mobile, id_card_no, face_image_url, valid_start_time, valid_end_time, status, remark, create_time, update_time, whitelist_type, source_type from robot_ops_whitelist
+    </sql>
+
+    <select id="selectRobotOpsWhitelistList" parameterType="RobotOpsWhitelist" resultMap="RobotOpsWhitelistResult">
+        <include refid="selectRobotOpsWhitelistVo"/>
+        <where>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="mobile != null  and mobile != ''"> and mobile = #{mobile}</if>
+            <if test="idCardNo != null  and idCardNo != ''"> and id_card_no = #{idCardNo}</if>
+            <if test="faceImageUrl != null  and faceImageUrl != ''"> and face_image_url = #{faceImageUrl}</if>
+            <if test="validStartTime != null "> and valid_start_time = #{validStartTime}</if>
+            <if test="validEndTime != null "> and valid_end_time = #{validEndTime}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="whitelistType != null "> and whitelist_type = #{whitelistType}</if>
+            <if test="sourceType != null "> and source_type = #{sourceType}</if>
+        </where>
+    </select>
+
+    <select id="selectRobotOpsWhitelistById" parameterType="Long" resultMap="RobotOpsWhitelistResult">
+        <include refid="selectRobotOpsWhitelistVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRobotOpsWhitelist" parameterType="RobotOpsWhitelist" useGeneratedKeys="true" keyProperty="id">
+        insert into robot_ops_whitelist
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">name,</if>
+            <if test="mobile != null">mobile,</if>
+            <if test="idCardNo != null">id_card_no,</if>
+            <if test="faceImageUrl != null">face_image_url,</if>
+            <if test="validStartTime != null">valid_start_time,</if>
+            <if test="validEndTime != null">valid_end_time,</if>
+            <if test="status != null and status != ''">status,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="whitelistType != null">whitelist_type,</if>
+            <if test="sourceType != null">source_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="mobile != null">#{mobile},</if>
+            <if test="idCardNo != null">#{idCardNo},</if>
+            <if test="faceImageUrl != null">#{faceImageUrl},</if>
+            <if test="validStartTime != null">#{validStartTime},</if>
+            <if test="validEndTime != null">#{validEndTime},</if>
+            <if test="status != null and status != ''">#{status},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="whitelistType != null">#{whitelistType},</if>
+            <if test="sourceType != null">#{sourceType},</if>
+        </trim>
+    </insert>
+
+    <update id="updateRobotOpsWhitelist" parameterType="RobotOpsWhitelist">
+        update robot_ops_whitelist
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="mobile != null">mobile = #{mobile},</if>
+            <if test="idCardNo != null">id_card_no = #{idCardNo},</if>
+            <if test="faceImageUrl != null">face_image_url = #{faceImageUrl},</if>
+            <if test="validStartTime != null">valid_start_time = #{validStartTime},</if>
+            <if test="validEndTime != null">valid_end_time = #{validEndTime},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="whitelistType != null">whitelist_type = #{whitelistType},</if>
+            <if test="sourceType != null">source_type = #{sourceType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRobotOpsWhitelistById" parameterType="Long">
+        delete from robot_ops_whitelist where id = #{id}
+    </delete>
+
+    <delete id="deleteRobotOpsWhitelistByIds" parameterType="String">
+        delete from robot_ops_whitelist where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>