From ab96d801d6c5e2feea9677367c1b44c2e08b78ee Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 24 十二月 2024 19:02:21 +0800
Subject: [PATCH] 监控视频播放、短信、转运线路设置

---
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionEquipmentServiceImpl.java  |    4 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwTransitRouteController.java        |   84 +++
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java       |    7 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java          |   24 +
 medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitRouteService.java                  |   41 +
 medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml                            |   39 +
 medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarService.java                    |   10 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBusinessDeviceServiceImpl.java       |    4 
 medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRouteDTO.java                   |   41 +
 medicalWaste-system/src/main/resources/mapper/system/MwTransitCarMapper.xml                             |   25 +
 medicalWaste-system/src/main/resources/mapper/system/MwTransitRouteMapper.xml                           |   33 +
 medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwMonitorDeviceQuery.java              |    3 
 medicalWaste-system/src/main/java/com/sinata/system/mapper/MwMonitorDeviceMapper.java                   |   11 
 pom.xml                                                                                                 |    7 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java        |    4 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitRouteServiceImpl.java         |  135 ++++++
 medicalWaste-admin/src/main/resources/application-prod.yml                                              |   25 +
 medicalWaste-system/src/main/java/com/sinata/system/config/RestTemplateConfig.java                      |   25 +
 medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarMapper.java                      |   10 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java          |    6 
 medicalWaste-admin/src/main/resources/application-dev.yml                                               |   18 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionTaskServiceImpl.java       |    4 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarServiceImpl.java           |   31 +
 medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRouteQuery.java               |   22 +
 medicalWaste-system/src/main/java/com/sinata/system/service/biz/AliSmsService.java                      |  106 ++++
 medicalWaste-system/src/main/java/com/sinata/system/config/DeviceConfig.java                            |   18 
 medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRoutePointsDTO.java             |   20 
 medicalWaste-system/src/main/java/com/sinata/system/config/AliSmsConfig.java                            |   45 ++
 medicalWaste-system/src/main/java/com/sinata/system/service/MwMonitorDeviceService.java                 |    8 
 medicalWaste-system/src/main/java/com/sinata/system/service/biz/MonitorDeviceApiNewService.java         |  279 ++++++++++++
 medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoute.java                          |   12 
 medicalWaste-common/pom.xml                                                                             |    6 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwApplicationServiceImpl.java          |    9 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStaffServiceImpl.java                |    4 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java |    6 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwMonitorDeviceController.java       |   34 +
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMonitorDeviceVO.java                    |    2 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMonitorDeviceServiceImpl.java        |   22 +
 medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoutePoints.java                    |    4 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionRegulationServiceImpl.java |    4 
 medicalWaste-system/src/main/java/com/sinata/system/service/SysDepartmentService.java                   |    8 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysAgreementController.java   |    2 
 medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitRouteMapper.java                    |   18 
 medicalWaste-system/src/main/resources/mapper/system/MwMonitorDeviceMapper.xml                          |   34 +
 medicalWaste-system/src/main/java/com/sinata/system/mapper/SysDepartmentMapper.java                     |    8 
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwTransitRouteVO.java                     |   45 ++
 46 files changed, 1,279 insertions(+), 28 deletions(-)

diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwMonitorDeviceController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwMonitorDeviceController.java
index b9e10b7..fcbcd18 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwMonitorDeviceController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwMonitorDeviceController.java
@@ -6,7 +6,10 @@
 import com.sinata.system.domain.query.MwMonitorDeviceQuery;
 import com.sinata.system.domain.vo.MwMonitorDeviceVO;
 import com.sinata.system.service.MwMonitorDeviceService;
+import com.sinata.system.service.biz.MonitorDeviceApiNewService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
@@ -19,6 +22,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.Map;
 
 /**
  * <p>
@@ -35,6 +39,7 @@
 @RequestMapping("/backend/mwMonitorDevice")
 public class MwMonitorDeviceController {
     private final MwMonitorDeviceService mwMonitorDeviceService;
+    private final MonitorDeviceApiNewService monitorDeviceApiNewService;
 
     /**
      * 监控设备分页列表
@@ -98,4 +103,33 @@
         mwMonitorDeviceService.removeById(id);
         return R.ok();
     }
+
+    /**
+     * 实时监控列表
+     *
+     * @param query
+     * @return
+     */
+    @ApiOperation("实时监控列表")
+    @PostMapping("/monitor/page")
+    public R<PageDTO<MwMonitorDeviceVO>> monitorPageList(@Valid @RequestBody MwMonitorDeviceQuery query) {
+        return R.ok(mwMonitorDeviceService.pageMonitorPage(query));
+    }
+
+    /**
+     * 获取视频服务器设备播放路径
+     *
+     * @param id
+     * @param channelNum
+     * @return
+     */
+    @ApiOperation("获取视频服务器设备播放路径")
+    @GetMapping("/getDeviceUrl")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deviceNumber", value = "设备编号"),
+            @ApiImplicitParam(name = "channelNum", value = "通道号")
+    })
+    public R<Map<String, Object>> getDeviceUrl(String deviceNumber, Integer channelNum) {
+        return R.ok(monitorDeviceApiNewService.getDeviceUrl(deviceNumber, channelNum));
+    }
 }
diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwTransitRouteController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwTransitRouteController.java
index 267eb70..5b3886d 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwTransitRouteController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwTransitRouteController.java
@@ -1,7 +1,25 @@
 package com.sinata.web.controller.backend;
 
+import com.sinata.common.core.domain.R;
+import com.sinata.common.entity.PageDTO;
+import com.sinata.system.domain.dto.MwTransitRouteDTO;
+import com.sinata.system.domain.query.MwTransitRouteQuery;
+import com.sinata.system.domain.vo.MwTransitRouteVO;
+import com.sinata.system.service.MwTransitRouteService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
 
 /**
  * <p>
@@ -11,8 +29,74 @@
  * @author mitao
  * @since 2024-12-02
  */
+@Validated
 @RestController
+@RequiredArgsConstructor
+@Api(tags = {"转运线路设置相关接口"})
 @RequestMapping("/backend/mwTransitRoute")
 public class MwTransitRouteController {
+    private final MwTransitRouteService mwTransitRouteService;
 
+    /**
+     * 分页列表
+     *
+     * @param query
+     * @return
+     */
+    @ApiOperation("分页列表")
+    @PostMapping("/page")
+    public R<PageDTO<MwTransitRouteVO>> pageList(@Valid @RequestBody MwTransitRouteQuery query) {
+        return R.ok(mwTransitRouteService.pageList(query));
+    }
+
+    /**
+     * 详情
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation("详情")
+    @GetMapping("/{id}")
+    public R<MwTransitRouteVO> detail(@ApiParam(name = "id", value = "主键ID", required = true) @PathVariable Long id) {
+        return R.ok(mwTransitRouteService.detail(id));
+    }
+
+    /**
+     * 新增
+     *
+     * @param dto
+     * @return
+     */
+    @ApiOperation("新增")
+    @PostMapping("/add")
+    public R<?> add(@Valid @RequestBody MwTransitRouteDTO dto) {
+        mwTransitRouteService.add(dto);
+        return R.ok();
+    }
+
+    /**
+     * 编辑
+     *
+     * @param dto
+     * @return
+     */
+    @ApiOperation("编辑")
+    @PostMapping("/edit")
+    public R<?> edit(@Valid @RequestBody MwTransitRouteDTO dto) {
+        mwTransitRouteService.edit(dto);
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation("删除")
+    @DeleteMapping("/{id}")
+    public R<?> delete(@ApiParam(name = "id", value = "路线id", required = true) @PathVariable("id") Long id) {
+        mwTransitRouteService.delete(id);
+        return R.ok();
+    }
 }
diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysAgreementController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysAgreementController.java
index 10b525c..0a54c4a 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysAgreementController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysAgreementController.java
@@ -26,7 +26,7 @@
 @RequiredArgsConstructor
 @RequestMapping("/backend/sysAgreement")
 public class SysAgreementController {
-    private SysAgreementService sysAgreementService;
+    private final SysAgreementService sysAgreementService;
 
     /**
      * 保存用户注册协议
diff --git a/medicalWaste-admin/src/main/resources/application-dev.yml b/medicalWaste-admin/src/main/resources/application-dev.yml
index aa5efa4..df421b5 100644
--- a/medicalWaste-admin/src/main/resources/application-dev.yml
+++ b/medicalWaste-admin/src/main/resources/application-dev.yml
@@ -212,7 +212,7 @@
   excludes: /system/notice
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
-
+# 阿里云对象存储
 oss:
   accessKeyId: LTAI4FyQgM99x9JKDtcL3mp2
   accessKeySecret: 0qffirCRqugdtnKPvCXz36yvLmYLWX
@@ -220,3 +220,19 @@
   download-endpoint: https://ja-medical-service.oss-cn-chengdu.aliyuncs.com/
   bucketName: ja-medical-service
   folder: medical
+
+# 视频监控
+device:
+  baseUrl: https://video-1.scjakj.com
+  userName: scjakj
+  password: 123456
+
+sms:
+  accessKeyId: LTAI5t9Y3BxZj1gRDZvPjuo1
+  accessKeySecret: tBidUVHBfU7gYt09BbsvZjVPPcHMcx
+  signName: 医疗废物信息化
+  connectTimeout: 30000
+  readTimeout: 30000
+  debug: false
+  loginTemplateCode: SMS_246140477
+  auditTemplateCode: SMS_476730213
diff --git a/medicalWaste-admin/src/main/resources/application-prod.yml b/medicalWaste-admin/src/main/resources/application-prod.yml
index 70d3e5b..c9b317e 100644
--- a/medicalWaste-admin/src/main/resources/application-prod.yml
+++ b/medicalWaste-admin/src/main/resources/application-prod.yml
@@ -212,3 +212,28 @@
   excludes: /system/notice
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 阿里云对象存储
+oss:
+  accessKeyId: LTAI4FyQgM99x9JKDtcL3mp2
+  accessKeySecret: 0qffirCRqugdtnKPvCXz36yvLmYLWX
+  upload-endpoint: https://oss-cn-chengdu.aliyuncs.com
+  download-endpoint: https://ja-medical-service.oss-cn-chengdu.aliyuncs.com/
+  bucketName: ja-medical-service
+  folder: medical
+
+# 视频监控
+device:
+  baseUrl: https://video-1.scjakj.com
+  userName: scjakj
+  password: 123456
+
+sms:
+  accessKeyId: LTAI5t9Y3BxZj1gRDZvPjuo1
+  accessKeySecret: tBidUVHBfU7gYt09BbsvZjVPPcHMcx
+  signName: 医疗废物信息化
+  connectTimeout: 30000
+  readTimeout: 30000
+  debug: false
+  loginTemplateCode: SMS_246140477
+  auditTemplateCode: SMS_476730213
diff --git a/medicalWaste-common/pom.xml b/medicalWaste-common/pom.xml
index 0fd20c6..ca02754 100644
--- a/medicalWaste-common/pom.xml
+++ b/medicalWaste-common/pom.xml
@@ -152,7 +152,11 @@
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
         </dependency>
-
+        <!--sms-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/config/AliSmsConfig.java b/medicalWaste-system/src/main/java/com/sinata/system/config/AliSmsConfig.java
new file mode 100644
index 0000000..32994e2
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/config/AliSmsConfig.java
@@ -0,0 +1,45 @@
+package com.sinata.system.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "sms")
+@Data
+public class AliSmsConfig {
+
+    private String accessKeyId;
+
+    private String accessKeySecret;
+
+    /**
+     * 签名
+     */
+    private String signName;
+
+    /**
+     * 登录模板编码
+     */
+    private String loginTemplateCode;
+    /**
+     * 入驻审核通知模板编码
+     */
+    private String auditTemplateCode;
+
+    /**
+     * 连接超时ms
+     */
+    private String connectTimeout = "30000";
+
+    /**
+     * 读超时ms
+     */
+    private String readTimeout = "30000";
+
+    /**
+     * 调试状态
+     */
+    private boolean debug = false;
+
+}
\ No newline at end of file
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/config/DeviceConfig.java b/medicalWaste-system/src/main/java/com/sinata/system/config/DeviceConfig.java
new file mode 100644
index 0000000..c7c77e0
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/config/DeviceConfig.java
@@ -0,0 +1,18 @@
+package com.sinata.system.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "device")
+@Data
+public class DeviceConfig {
+
+    private String baseUrl;
+
+    private String userName;
+
+    private String password;
+
+}
\ No newline at end of file
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/config/RestTemplateConfig.java b/medicalWaste-system/src/main/java/com/sinata/system/config/RestTemplateConfig.java
new file mode 100644
index 0000000..fe3c340
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/config/RestTemplateConfig.java
@@ -0,0 +1,25 @@
+package com.sinata.system.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
+        return new RestTemplate(factory);
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setReadTimeout(150000); // ms
+        factory.setConnectTimeout(150000); // ms
+        return factory;
+    }
+}
+
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoute.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoute.java
index 101148e..19acb03 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoute.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoute.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.sinata.common.entity.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -21,7 +22,9 @@
 @Setter
 @TableName("MW_TRANSIT_ROUTE")
 @ApiModel(value = "MwTransitRoute对象", description = "转运线路")
-public class MwTransitRoute {
+public class MwTransitRoute extends BaseModel {
+
+    private static final long serialVersionUID = -4601079739505977022L;
 
     @ApiModelProperty("转运线路id")
     @TableId(value = "ID", type = IdType.AUTO)
@@ -35,5 +38,12 @@
     @TableField("ROUTE_NAME")
     private String routeName;
 
+    @ApiModelProperty("医院数量")
+    @TableField("HOSPITAL_QUANTITY")
+    private Integer hospitalQuantity;
+
+    @ApiModelProperty("备注")
+    @TableField("REMARK")
+    private String remark;
 
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoutePoints.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoutePoints.java
index 6b11d64..962be88 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoutePoints.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/MwTransitRoutePoints.java
@@ -28,6 +28,10 @@
     @TableId(value = "ID", type = IdType.AUTO)
     private Long id;
 
+    @ApiModelProperty("转运线路id")
+    @TableField("ROUTE_ID")
+    private Long routeId;
+
     @ApiModelProperty("区域id(医院id)")
     @TableField("DEPARTMENT_ID")
     private Long departmentId;
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRouteDTO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRouteDTO.java
new file mode 100644
index 0000000..f5235fc
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRouteDTO.java
@@ -0,0 +1,41 @@
+package com.sinata.system.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/12/24
+ */
+@Data
+@ApiModel("线路数据传输对象")
+public class MwTransitRouteDTO {
+
+    @ApiModelProperty("转运线路id")
+    private Long id;
+
+    @ApiModelProperty("区域id(处置单位id)")
+    @NotNull(message = "处置单位id不能为空")
+    private Long departmentId;
+
+    @ApiModelProperty("线路名称")
+    @NotBlank(message = "线路名称不能为空")
+    private String routeName;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("途经点")
+    @NotEmpty(message = "途经点不能为空")
+    private List<MwTransitRoutePointsDTO> hostpitalList;
+
+    @ApiModelProperty("关联车辆")
+    @NotEmpty(message = "关联车辆不能为空")
+    private List<Long> carIdList;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRoutePointsDTO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRoutePointsDTO.java
new file mode 100644
index 0000000..42f33a0
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwTransitRoutePointsDTO.java
@@ -0,0 +1,20 @@
+package com.sinata.system.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/12/24
+ */
+@Data
+@ApiModel("线路途经点数据传输对象")
+public class MwTransitRoutePointsDTO {
+    
+    @ApiModelProperty("区域id(医院id)")
+    private Long departmentId;
+
+    @ApiModelProperty("排序")
+    private Integer sortOrder;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwMonitorDeviceQuery.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwMonitorDeviceQuery.java
index 3da39b9..06b3d63 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwMonitorDeviceQuery.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwMonitorDeviceQuery.java
@@ -22,4 +22,7 @@
     @ApiModelProperty("设备名称")
     private String deviceName;
 
+    @ApiModelProperty("设备状态 1:在线 0:离线")
+    private Integer status;
+
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRouteQuery.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRouteQuery.java
new file mode 100644
index 0000000..7eaabaf
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRouteQuery.java
@@ -0,0 +1,22 @@
+package com.sinata.system.domain.query;
+
+import com.sinata.common.entity.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/12/24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("转运路线查询数据传输对象")
+public class MwTransitRouteQuery extends BasePage {
+    
+    private static final long serialVersionUID = 1085929057879439197L;
+
+    @ApiModelProperty("区域id")
+    private Long departmentId;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMonitorDeviceVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMonitorDeviceVO.java
index 443eb9f..f88b5b6 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMonitorDeviceVO.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMonitorDeviceVO.java
@@ -37,6 +37,6 @@
     private String remark;
 
     @ApiModelProperty("在线状态 1:在线 0:离线")
-    public Integer onlineStatus = 0;
+    public Integer status = 0;
 
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwTransitRouteVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwTransitRouteVO.java
new file mode 100644
index 0000000..15106f2
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwTransitRouteVO.java
@@ -0,0 +1,45 @@
+package com.sinata.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/12/24
+ */
+@Data
+@ApiModel("转运路线视图对象")
+public class MwTransitRouteVO {
+
+    @ApiModelProperty("转运线路id")
+    private Long id;
+
+    @ApiModelProperty("区域id(处置单位id)")
+    private Long departmentId;
+
+    @ApiModelProperty("处置单位")
+    private String departmentName;
+
+    @ApiModelProperty("线路名称")
+    private String routeName;
+
+    @ApiModelProperty("医院数量")
+    private Integer hospitalQuantity;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("添加时间")
+    private Date createTime;
+
+    @ApiModelProperty("途经点")
+    private List<MedicalInstitutionVO> hostpitalList;
+
+    @ApiModelProperty("关联车辆")
+    private List<MwTransitCarVO> carList;
+}
+
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwMonitorDeviceMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwMonitorDeviceMapper.java
index 4ec9bb2..ec29a86 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwMonitorDeviceMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwMonitorDeviceMapper.java
@@ -8,6 +8,8 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 监控设备 Mapper 接口
@@ -27,4 +29,13 @@
      * @return
      */
     Page<MwMonitorDeviceVO> pageList(Page<MwMonitorDeviceVO> page, @Param("query") MwMonitorDeviceQuery query, @Param("treeCode") String treeCode);
+
+    /**
+     * 实时监控列表
+     *
+     * @param page
+     * @param deviceList
+     * @return
+     */
+    Page<MwMonitorDeviceVO> pageMonitorPage(Page<MwMonitorDeviceVO> page, @Param("status") Integer status, @Param("treeCode") String treeCode, @Param("deviceList") List<String> deviceList);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarMapper.java
index fc4795b..eaf384b 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarMapper.java
@@ -8,6 +8,8 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 运输车辆 Mapper 接口
@@ -35,4 +37,12 @@
      * @return
      */
     MwTransitCarVO detail(Long id);
+
+    /**
+     * 关联车辆列表
+     *
+     * @param id
+     * @return
+     */
+    List<MwTransitCarVO> getCarListByRouteId(@Param("id") Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitRouteMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitRouteMapper.java
index 1344e9a..54994a4 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitRouteMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitRouteMapper.java
@@ -1,8 +1,11 @@
 package com.sinata.system.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sinata.system.domain.MwTransitRoute;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sinata.system.domain.vo.MwTransitRouteVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -14,5 +17,20 @@
  */
 @Mapper
 public interface MwTransitRouteMapper extends BaseMapper<MwTransitRoute> {
+    /**
+     * 分页列表
+     *
+     * @param page
+     * @param treeCode
+     * @return
+     */
+    Page<MwTransitRouteVO> pageList(Page<MwTransitRouteVO> page, @Param("treeCode") String treeCode);
 
+    /**
+     * 详情
+     *
+     * @param id
+     * @return
+     */
+    MwTransitRouteVO detail(@Param("id") Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysDepartmentMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysDepartmentMapper.java
index 047336f..efd72b8 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysDepartmentMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysDepartmentMapper.java
@@ -74,4 +74,12 @@
      * @return
      */
     DisposalUnitVO getDisposalUnitDetailById(@Param("id") Long id);
+
+    /**
+     * 路线关联医院列表
+     *
+     * @param id
+     * @return
+     */
+    List<MedicalInstitutionVO> getHospitalListByRouteId(@Param("id") Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/MwMonitorDeviceService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/MwMonitorDeviceService.java
index efef39e..790bb27 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/MwMonitorDeviceService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/MwMonitorDeviceService.java
@@ -47,4 +47,12 @@
      * @return
      */
     void edit(MwMonitorDeviceDTO dto);
+
+    /**
+     * 实时监控列表
+     *
+     * @param query
+     * @return
+     */
+    PageDTO<MwMonitorDeviceVO> pageMonitorPage(MwMonitorDeviceQuery query);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarService.java
index dae3696..381930d 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarService.java
@@ -7,6 +7,8 @@
 import com.sinata.system.domain.query.TransitCarQuery;
 import com.sinata.system.domain.vo.MwTransitCarVO;
 
+import java.util.List;
+
 /**
  * <p>
  * 运输车辆 服务类
@@ -48,5 +50,11 @@
      */
     void edit(MwTransitCarDTO dto);
 
-
+    /**
+     * 关联车辆列表
+     *
+     * @param id
+     * @return
+     */
+    List<MwTransitCarVO> getCarListByRouteId(Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitRouteService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitRouteService.java
index ff7cad2..218b173 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitRouteService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitRouteService.java
@@ -1,7 +1,11 @@
 package com.sinata.system.service;
 
+import com.sinata.common.entity.PageDTO;
 import com.sinata.system.domain.MwTransitRoute;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.sinata.system.domain.dto.MwTransitRouteDTO;
+import com.sinata.system.domain.query.MwTransitRouteQuery;
+import com.sinata.system.domain.vo.MwTransitRouteVO;
 
 /**
  * <p>
@@ -12,5 +16,42 @@
  * @since 2024-12-02
  */
 public interface MwTransitRouteService extends IService<MwTransitRoute> {
+    /**
+     * 分页列表
+     *
+     * @param query
+     * @return
+     */
+    PageDTO<MwTransitRouteVO> pageList(MwTransitRouteQuery query);
 
+    /**
+     * 详情
+     *
+     * @param id
+     * @return
+     */
+    MwTransitRouteVO detail(Long id);
+
+    /**
+     * 新增
+     *
+     * @param dto
+     * @return
+     */
+    void add(MwTransitRouteDTO dto);
+
+    /**
+     * 编辑
+     *
+     * @param dto
+     * @return
+     */
+    void edit(MwTransitRouteDTO dto);
+
+    /**
+     * 删除
+     *
+     * @param id
+     */
+    void delete(Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/SysDepartmentService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/SysDepartmentService.java
index 7e76bc2..e88b4a2 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/SysDepartmentService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/SysDepartmentService.java
@@ -222,4 +222,12 @@
      * @return
      */
     String getTreeCodeByDepartmentId(Long departmentId);
+
+    /**
+     * 路线关联医院列表
+     *
+     * @param id
+     * @return
+     */
+    List<MedicalInstitutionVO> getHospitalListByRouteId(Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/AliSmsService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/AliSmsService.java
new file mode 100644
index 0000000..58ebb24
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/AliSmsService.java
@@ -0,0 +1,106 @@
+package com.sinata.system.service.biz;
+
+import com.alibaba.fastjson2.JSON;
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import com.sinata.system.config.AliSmsConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Service
+@Slf4j
+public class AliSmsService {
+    @Resource
+    private AliSmsConfig aliSmsConfig;
+
+    /**
+     * 发送验证码短信
+     *
+     * @param phone 手机号
+     * @param code  验证码
+     * @return
+     */
+    public boolean sendLoginCode(String phone, String code) {
+
+        Map<String, String> param = new HashMap<>(3);
+        param.put("code", code);
+        return sendSms(phone, aliSmsConfig.getSignName(), aliSmsConfig.getLoginTemplateCode(), param);
+    }
+
+    /**
+     * 审核结果通知短信
+     *
+     * @param phone  手机号
+     * @param result 已通过 未通过
+     * @return
+     */
+    public boolean sendAuditResult(String phone, String result) {
+
+        Map<String, String> param = new HashMap<>(3);
+        param.put("code", result);
+        return sendSms(phone, aliSmsConfig.getSignName(), aliSmsConfig.getAuditTemplateCode(), param);
+    }
+    
+    /**
+     * 阿里发送短信
+     *
+     * @param phone
+     * @param signName
+     * @param templateCode
+     * @param param
+     * @return
+     */
+    private boolean sendSms(String phone, String signName, String templateCode, Map<String, String> param) {
+        // 可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", aliSmsConfig.getConnectTimeout());
+        System.setProperty("sun.net.client.defaultReadTimeout", aliSmsConfig.getReadTimeout());
+        try {
+
+            // 初始化请求客户端
+            Client client = createClient();
+
+            // 构造请求对象,请填入请求参数值
+            SendSmsRequest sendSmsRequest = new SendSmsRequest()
+                    .setPhoneNumbers(phone)
+                    .setSignName(signName)
+                    .setTemplateCode(templateCode)
+                    .setTemplateParam(JSON.toJSONString(param));
+            if (aliSmsConfig.isDebug()) {
+                log.info("短信 DEBUG code= {}", param);
+                return true;
+            }
+            // 获取响应对象
+            SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
+            // hint 此处可能会抛出异常,注意catch
+            if (StringUtils.equalsIgnoreCase("ok", sendSmsResponse.getBody().getCode())) {
+                return true;
+            } else {
+                log.error("{}短信发送失败:{}", phone, sendSmsResponse.getBody().getMessage());
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("短信发送失败", e);
+        }
+        return false;
+    }
+
+    public Client createClient() throws Exception {
+        Config config = new Config()
+                // 配置 AccessKey ID
+                .setAccessKeyId(aliSmsConfig.getAccessKeyId())
+                // 配置 AccessKey Secret
+                .setAccessKeySecret(aliSmsConfig.getAccessKeySecret());
+
+        // 配置 Endpoint
+        config.endpoint = "dysmsapi.aliyuncs.com";
+
+        return new Client(config);
+    }
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/MonitorDeviceApiNewService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/MonitorDeviceApiNewService.java
new file mode 100644
index 0000000..3dd748f
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/MonitorDeviceApiNewService.java
@@ -0,0 +1,279 @@
+package com.sinata.system.service.biz;
+
+import cn.hutool.crypto.digest.DigestUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.sinata.common.exception.ServiceException;
+import com.sinata.system.config.DeviceConfig;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class MonitorDeviceApiNewService {
+
+    @Autowired
+    private DeviceConfig deviceConfig;
+
+    //登录
+    private final String LOGIN_URL = "/api/v1/login?username=%s&password=%s&url_token_only=%s";
+    //根据状态获取视频列表
+    private final String LIST_URL = "/api/v1/device/list?online=%s";
+    //查询设备通道列表接口(新)
+    private final String channellist_URL = "/api/v1/device/channellist?serial=%s";
+    //根据设备号获取视频链接
+    private final String STREAM_URL = "/api/v1/stream/start?serial=%s&channel=%s";
+    //查询通道录像列表接口(新)
+    private final String recordlist_URL = "/api/v1/playback/recordlist?serial=%s&channel=%s&starttime=%s&endtime=%s";
+    //开始回放接口(新)
+    private final String playbackStart_URL = "/api/v1/playback/start?serial=%s&channel=%s&starttime=%s&endtime=%s";
+    //回放流停止接口(新)
+    private final String playbackStop_URL = "/api/v1/playback/stop?streamid=%s";
+
+    //在线数据
+    Boolean url_token_only = true;
+    //获取视频列表参数
+    Boolean online = true;//设备是否在线
+
+    private final RedisTemplate<Object, Object> redisTemplate;
+    private final RestTemplate restTemplate;
+
+    /**
+     * 登录
+     * type==1 重新调起登录
+     *
+     * @return
+     */
+    public String getJSession(Integer type) {
+        String key = "monitor:device:jsession:now";
+        String jsession = redisTemplate.opsForValue().get(key).toString();
+        Long timeOut = 604800L;
+        if (jsession == null || type == 1) {
+            String loginUrl = String.format(
+                    deviceConfig.getBaseUrl() + LOGIN_URL, deviceConfig.getUserName(), DigestUtil.md5Hex(deviceConfig.getPassword()), url_token_only);
+            log.info("视频服务器:登录接口传参数据:{}", loginUrl);
+            JSONObject result = restTemplate.getForObject(loginUrl, JSONObject.class);
+            log.info("视频服务器:登录接口返回数据:{}", result);
+            if (result == null) {
+                throw new ServiceException("视频服务器连接失败");
+            }
+            if (result != null) {
+                timeOut = result.getLong("TokenTimeout");//缓存过期时间
+                jsession = result.getString("URLToken");//token
+            } else {
+                throw new ServiceException("视频服务器连接失败");
+            }
+        }
+        redisTemplate.opsForValue().set(key, jsession, timeOut);
+        return jsession;
+    }
+
+    /**
+     * 获取设备列表
+     *
+     * @return
+     */
+    public List<String> getDeviceList() {
+        String token = getJSession(0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("token", token);
+        HttpEntity request = new HttpEntity(httpHeaders);
+        String completeUrl = String.format(deviceConfig.getBaseUrl() + LIST_URL, online);
+        try {
+            ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(completeUrl, HttpMethod.GET, request, JSONObject.class, "");
+
+            if (resultEntity == null) {
+                throw new ServiceException("视频服务器连接失败");
+            }
+            List<String> list = new ArrayList<>();
+            JSONObject jsonBody = resultEntity.getBody();
+            //log.info("视频服务器:获取设备状态接口返回数据:{}", jsonBody);
+            JSONArray jsonArray = jsonBody.getJSONArray("DeviceList");
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                String ID = jsonObject.getString("ID");
+                list.add(ID);
+            }
+            return list;
+        } catch (Exception e) {
+            getJSession(1);
+            return getDeviceList();
+        }
+    }
+
+    /**
+     * 获取通道列表
+     *
+     * @return
+     */
+    public List<Map<String, String>> getChannelList(String serial) {
+        String token = getJSession(0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("token", token);
+        HttpEntity request = new HttpEntity(httpHeaders);
+        String completeUrl = String.format(deviceConfig.getBaseUrl() + channellist_URL, serial);
+        try {
+            ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(completeUrl, HttpMethod.GET, request, JSONObject.class, "");
+
+            if (resultEntity == null) {
+                throw new ServiceException("视频服务器连接失败");
+            }
+            List<Map<String, String>> list = new ArrayList<>();
+            JSONObject jsonBody = resultEntity.getBody();
+            //log.info("视频服务器:获取设备状态接口返回数据:{}", jsonBody);
+            JSONArray jsonArray = jsonBody.getJSONArray("ChannelList");
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                String channel = jsonObject.getString("Channel");
+                Map<String, String> map = new HashMap<>();
+                map.put("channel", channel);
+                list.add(map);
+            }
+            return list;
+        } catch (Exception e) {
+            getJSession(1);
+            return getChannelList(serial);
+        }
+    }
+
+    /**
+     * 获取设备播放路径
+     *
+     * @param devIdno
+     * @return
+     */
+    public Map<String, Object> getDeviceUrl(String devIdno, Integer channelNum) {
+        String token = getJSession(0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("token", token);
+        HttpEntity request = new HttpEntity(httpHeaders);
+        if (channelNum == null) {
+            channelNum = 1;
+        }
+        String completeUrl = String.format(deviceConfig.getBaseUrl() + STREAM_URL, devIdno, channelNum);
+        System.out.println(completeUrl);
+        ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(completeUrl, HttpMethod.GET, request, JSONObject.class, "");
+
+        if (resultEntity == null) {
+            throw new ServiceException("视频服务器连接失败");
+        }
+        JSONObject jsonBody = resultEntity.getBody();
+        //log.info("视频服务器:获取设备状态接口返回数据:{}", jsonBody);
+        String flv = jsonBody.getString("FLV");
+        String snapURL = jsonBody.getString("SnapURL");
+        Map<String, Object> reMap = new HashMap<>();
+        reMap.put("flv", flv);
+        reMap.put("snapURL", deviceConfig.getBaseUrl() + snapURL);
+        return reMap;
+    }
+
+    /**
+     * 查询通道录像列表
+     *
+     * @return
+     */
+    public List<Map<String, String>> getPlaybackRecordlist(String serial, Integer channel, String starttime, String endtime) {
+        String token = getJSession(0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("token", token);
+        HttpEntity request = new HttpEntity(httpHeaders);
+        String completeUrl = String.format(deviceConfig.getBaseUrl() + recordlist_URL, serial, channel, starttime, endtime);
+        try {
+            ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(completeUrl, HttpMethod.GET, request, JSONObject.class, "");
+
+            if (resultEntity == null) {
+                throw new ServiceException("视频服务器连接失败");
+            }
+            List<Map<String, String>> list = new ArrayList<>();
+            JSONObject jsonBody = resultEntity.getBody();
+            //log.info("视频服务器:获取设备状态接口返回数据:{}", jsonBody);
+            JSONArray jsonArray = jsonBody.getJSONArray("RecordList");
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                Map<String, String> map = JSON.parseObject(jsonObject.toJSONString(), Map.class);
+                list.add(map);
+            }
+            return list;
+        } catch (Exception e) {
+            getJSession(1);
+            return null;
+            //return getPlaybackRecordlist(serial,channel,starttime,endtime);
+        }
+    }
+
+    /**
+     * 开始回放接口
+     *
+     * @param serial
+     * @return
+     */
+    public Map<String, Object> playbackStart(String serial, Integer channel, String starttime, String endtime) {
+        String token = getJSession(0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("token", token);
+        HttpEntity request = new HttpEntity(httpHeaders);
+        if (channel == null) {
+            channel = 1;
+        }
+        String completeUrl = String.format(deviceConfig.getBaseUrl() + playbackStart_URL, serial, channel, starttime, endtime);
+        System.out.println(completeUrl);
+        ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(completeUrl, HttpMethod.GET, request, JSONObject.class, "");
+
+        if (resultEntity == null) {
+            throw new ServiceException("视频服务器连接失败");
+        }
+        JSONObject jsonBody = resultEntity.getBody();
+        //log.info("视频服务器:获取设备状态接口返回数据:{}", jsonBody);
+        String flv = jsonBody.getString("FLV");
+        String snapURL = jsonBody.getString("SnapURL");
+        String streamID = jsonBody.getString("StreamID");
+        Map<String, Object> reMap = new HashMap<>();
+        reMap.put("flv", flv);
+        reMap.put("snapURL", deviceConfig.getBaseUrl() + snapURL);
+        reMap.put("streamID", streamID);
+        return reMap;
+    }
+
+    /**
+     * 回放流停止接口
+     *
+     * @param streamID
+     * @return
+     */
+    public Map<String, Object> playbackStop(String streamID) {
+        String token = getJSession(0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("token", token);
+        HttpEntity request = new HttpEntity(httpHeaders);
+        String completeUrl = String.format(deviceConfig.getBaseUrl() + playbackStop_URL, streamID);
+        System.out.println(completeUrl);
+        ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(completeUrl, HttpMethod.GET, request, JSONObject.class, "");
+
+        if (resultEntity == null) {
+            throw new ServiceException("视频服务器连接失败");
+        }
+        JSONObject jsonBody = resultEntity.getBody();
+        //log.info("视频服务器:获取设备状态接口返回数据:{}", jsonBody);
+        String playbackFileURL = jsonBody.getString("PlaybackFileURL");
+        Map<String, Object> reMap = new HashMap<>();
+        reMap.put("playbackFileURL", playbackFileURL);
+        return reMap;
+    }
+
+
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwApplicationServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwApplicationServiceImpl.java
index 18b020e..8ccee14 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwApplicationServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwApplicationServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sinata.common.entity.PageDTO;
 import com.sinata.common.exception.ServiceException;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwApplication;
 import com.sinata.system.domain.dto.MwApplicationDTO;
 import com.sinata.system.domain.query.MwApplicationQuery;
@@ -11,6 +12,7 @@
 import com.sinata.system.mapper.MwApplicationMapper;
 import com.sinata.system.service.MwApplicationService;
 import com.sinata.system.service.SysDepartmentService;
+import com.sinata.system.service.biz.AliSmsService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -28,6 +30,7 @@
 @RequiredArgsConstructor
 public class MwApplicationServiceImpl extends ServiceImpl<MwApplicationMapper, MwApplication> implements MwApplicationService {
     private final SysDepartmentService sysDepartmentService;
+    private final AliSmsService aliSmsService;
 
     /**
      * 分页列表
@@ -38,6 +41,9 @@
     @Override
     public PageDTO<MwApplicationVO> pageList(MwApplicationQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwApplicationVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
@@ -68,6 +74,7 @@
         mwApplication.setAuditStatus(dto.getAuditStatus() == 1 ? 2 : 3);
         mwApplication.setAuditOpinion(dto.getAuditOpinion());
         updateById(mwApplication);
-        //TODO 发送短信通知
+        //发送短信通知
+        aliSmsService.sendAuditResult(mwApplication.getPhone(), dto.getAuditStatus() == 1 ? "已通过" : "未通过");
     }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBusinessDeviceServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBusinessDeviceServiceImpl.java
index 563757a..6a13cf4 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBusinessDeviceServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBusinessDeviceServiceImpl.java
@@ -5,6 +5,7 @@
 import com.sinata.common.entity.PageDTO;
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwBusinessDevice;
 import com.sinata.system.domain.dto.MwBusinessDeviceDTO;
 import com.sinata.system.domain.query.MwBusinessDeviceQuery;
@@ -39,6 +40,9 @@
     @Override
     public PageDTO<MwBusinessDeviceVO> pageList(MwBusinessDeviceQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwBusinessDeviceVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java
index 8ea4805..1a34578 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java
@@ -1,6 +1,6 @@
 package com.sinata.system.service.impl;
 
-import cn.idev.excel.EasyExcel;
+import cn.idev.excel.FastExcel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sinata.common.entity.PageDTO;
@@ -74,7 +74,7 @@
         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
         String fileName = URLEncoder.encode("转运记录", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), MwCheckoutRecordExcelVO.class).sheet("转运记录").doWrite(mwCheckoutRecordExcelVOS);
+        FastExcel.write(response.getOutputStream(), MwCheckoutRecordExcelVO.class).sheet("转运记录").doWrite(mwCheckoutRecordExcelVOS);
     }
 
     /**
@@ -109,6 +109,9 @@
     @Override
     public PageDTO<MwTransitRecordVO> transitPageList(MwTransitRecordQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwTransitRecordVO> page = baseMapper.transitPageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java
index 07b8a98..d8e0d40 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java
@@ -1,6 +1,6 @@
 package com.sinata.system.service.impl;
 
-import cn.idev.excel.EasyExcel;
+import cn.idev.excel.FastExcel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sinata.common.entity.PageDTO;
@@ -100,6 +100,6 @@
         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
         String fileName = URLEncoder.encode("医废收集记录", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), MwCollectRecordVO.class).sheet("医废收集记录").doWrite(vo);
+        FastExcel.write(response.getOutputStream(), MwCollectRecordVO.class).sheet("医废收集记录").doWrite(vo);
     }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java
index 3c33577..d0a20f7 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java
@@ -1,6 +1,6 @@
 package com.sinata.system.service.impl;
 
-import cn.idev.excel.EasyExcel;
+import cn.idev.excel.FastExcel;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -92,7 +92,7 @@
         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
         String fileName = URLEncoder.encode("微波设备使用记录", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), MwCollectRecordVO.class).sheet("微波设备使用记录").doWrite(list);
+        FastExcel.write(response.getOutputStream(), MwCollectRecordVO.class).sheet("微波设备使用记录").doWrite(list);
     }
 
     /**
@@ -223,7 +223,7 @@
         String fileName = URLEncoder.encode("处置分析报表", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
         // 这里需要设置不关闭流
-        EasyExcel.write(response.getOutputStream())
+        FastExcel.write(response.getOutputStream())
                 .head(head)
                 .autoCloseStream(Boolean.TRUE)
                 .sheet("处置分析报表")
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMonitorDeviceServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMonitorDeviceServiceImpl.java
index e8d10c9..ee26ef9 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMonitorDeviceServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMonitorDeviceServiceImpl.java
@@ -5,6 +5,7 @@
 import com.sinata.common.entity.PageDTO;
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwMonitorDevice;
 import com.sinata.system.domain.SysDepartment;
 import com.sinata.system.domain.dto.MwMonitorDeviceDTO;
@@ -13,9 +14,11 @@
 import com.sinata.system.mapper.MwMonitorDeviceMapper;
 import com.sinata.system.service.MwMonitorDeviceService;
 import com.sinata.system.service.SysDepartmentService;
+import com.sinata.system.service.biz.MonitorDeviceApiNewService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -30,6 +33,7 @@
 @RequiredArgsConstructor
 public class MwMonitorDeviceServiceImpl extends ServiceImpl<MwMonitorDeviceMapper, MwMonitorDevice> implements MwMonitorDeviceService {
     private final SysDepartmentService sysDepartmentService;
+    private final MonitorDeviceApiNewService monitorDeviceApiNewService;
 
     /**
      * 监控设备分页列表
@@ -40,6 +44,9 @@
     @Override
     public PageDTO<MwMonitorDeviceVO> pageList(MwMonitorDeviceQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwMonitorDeviceVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
@@ -94,4 +101,19 @@
         MwMonitorDevice mwMonitorDevice = BeanUtils.copyBean(dto, MwMonitorDevice.class);
         updateById(mwMonitorDevice);
     }
+
+    @Override
+    public PageDTO<MwMonitorDeviceVO> pageMonitorPage(MwMonitorDeviceQuery query) {
+        //获取视频服务器中的在线设备列表
+        List<String> deviceList = monitorDeviceApiNewService.getDeviceList();
+        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
+        Page<MwMonitorDeviceVO> page = baseMapper.pageMonitorPage(new Page<>(query.getPageCurr(), query.getPageSize()), query.getStatus(), treeCode, deviceList);
+        page.getRecords().stream().filter(item -> deviceList.contains(item.getDeviceNumber())).peek(item -> {
+            item.setStatus(1);
+        });
+        return PageDTO.of(page);
+    }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionEquipmentServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionEquipmentServiceImpl.java
index 828b14d..2c2eb6d 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionEquipmentServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionEquipmentServiceImpl.java
@@ -7,6 +7,7 @@
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
 import com.sinata.common.utils.CollUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwAttachment;
 import com.sinata.system.domain.MwProtectionEquipment;
 import com.sinata.system.domain.MwProtectionEquipmentRecord;
@@ -56,6 +57,9 @@
     @Override
     public PageDTO<MwProtectionEquipmentVO> pageList(MwProtectionEquipmentQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwProtectionEquipmentVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionRegulationServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionRegulationServiceImpl.java
index 18a9be4..113921a 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionRegulationServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionRegulationServiceImpl.java
@@ -7,6 +7,7 @@
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
 import com.sinata.common.utils.CollUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwAttachment;
 import com.sinata.system.domain.MwProtectionRegulation;
 import com.sinata.system.domain.dto.MwProtectionRegulationDTO;
@@ -50,6 +51,9 @@
     @Override
     public PageDTO<MwProtectionRegulationVO> pageList(MwProtectionRegulationQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwProtectionRegulationVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionTaskServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionTaskServiceImpl.java
index 273776c..c136f29 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionTaskServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwProtectionTaskServiceImpl.java
@@ -7,6 +7,7 @@
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
 import com.sinata.common.utils.CollUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwAttachment;
 import com.sinata.system.domain.MwProtectionTask;
 import com.sinata.system.domain.MwProtectionTaskEquipment;
@@ -54,6 +55,9 @@
     @Override
     public PageDTO<MwProtectionTaskVO> pageList(MwProtectionTaskQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwProtectionTaskVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStaffServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStaffServiceImpl.java
index de82e89..d038313 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStaffServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStaffServiceImpl.java
@@ -5,6 +5,7 @@
 import com.sinata.common.entity.PageDTO;
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwStaff;
 import com.sinata.system.domain.SysDepartment;
 import com.sinata.system.domain.dto.MwStaffDTO;
@@ -40,6 +41,9 @@
     @Override
     public PageDTO<MwStaffVO> pageList(MwStaffQuery query) {
         String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwStaffVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java
index 6aac02c..f9c2742 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java
@@ -1,6 +1,6 @@
 package com.sinata.system.service.impl;
 
-import cn.idev.excel.EasyExcel;
+import cn.idev.excel.FastExcel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sinata.common.entity.PageDTO;
@@ -132,7 +132,7 @@
         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
         String fileName = URLEncoder.encode("暂存间入库记录", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), MwStorageRecordVO.class).sheet("暂存间入库记录").doWrite(list);
+        FastExcel.write(response.getOutputStream(), MwStorageRecordVO.class).sheet("暂存间入库记录").doWrite(list);
     }
 
     /**
@@ -170,6 +170,6 @@
         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
         String fileName = URLEncoder.encode("暂存间出库记录", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), MwCheckoutRecordVO.class).sheet("暂存间出库记录").doWrite(list);
+        FastExcel.write(response.getOutputStream(), MwCheckoutRecordVO.class).sheet("暂存间出库记录").doWrite(list);
     }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarServiceImpl.java
index 2abb700..8ecf276 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarServiceImpl.java
@@ -5,16 +5,20 @@
 import com.sinata.common.entity.PageDTO;
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwTransitCar;
+import com.sinata.system.domain.SysDepartment;
 import com.sinata.system.domain.dto.MwTransitCarDTO;
 import com.sinata.system.domain.query.TransitCarQuery;
 import com.sinata.system.domain.vo.MwTransitCarVO;
+import com.sinata.system.enums.DepartmentEnum;
 import com.sinata.system.mapper.MwTransitCarMapper;
 import com.sinata.system.service.MwTransitCarService;
 import com.sinata.system.service.SysDepartmentService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -38,7 +42,21 @@
      */
     @Override
     public PageDTO<MwTransitCarVO> pageList(TransitCarQuery query) {
-        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        String treeCode;
+        if (Objects.isNull(query.getDepartmentId())) {
+            SysDepartment department = sysDepartmentService.getMyDepartment();
+            treeCode = department.getTreeCode();
+        } else {
+            SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
+            //如果是处置单位,则获取父级部门
+            if (department.getOrgType().equals(DepartmentEnum.DISPOSAL_UNIT.getCode())) {
+                department = sysDepartmentService.getDepartmentByParentId(department.getParentId());
+            }
+            treeCode = department.getTreeCode();
+        }
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
         Page<MwTransitCarVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query, treeCode);
         return PageDTO.of(page);
     }
@@ -84,4 +102,15 @@
         MwTransitCar mwTransitCar = BeanUtils.copyBean(dto, MwTransitCar.class);
         updateById(mwTransitCar);
     }
+
+    /**
+     * 关联车辆列表
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public List<MwTransitCarVO> getCarListByRouteId(Long id) {
+        return baseMapper.getCarListByRouteId(id);
+    }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitRouteServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitRouteServiceImpl.java
index adb7119..7962370 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitRouteServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitRouteServiceImpl.java
@@ -1,10 +1,30 @@
 package com.sinata.system.service.impl;
 
-import com.sinata.system.domain.MwTransitRoute;
-import com.sinata.system.mapper.MwTransitRouteMapper;
-import com.sinata.system.service.MwTransitRouteService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sinata.common.entity.PageDTO;
+import com.sinata.common.exception.ServiceException;
+import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.StringUtils;
+import com.sinata.system.domain.MwTransitRoute;
+import com.sinata.system.domain.MwTransitRouteCar;
+import com.sinata.system.domain.MwTransitRoutePoints;
+import com.sinata.system.domain.dto.MwTransitRouteDTO;
+import com.sinata.system.domain.query.MwTransitRouteQuery;
+import com.sinata.system.domain.vo.MwTransitRouteVO;
+import com.sinata.system.mapper.MwTransitRouteMapper;
+import com.sinata.system.service.MwTransitCarService;
+import com.sinata.system.service.MwTransitRouteCarService;
+import com.sinata.system.service.MwTransitRoutePointsService;
+import com.sinata.system.service.MwTransitRouteService;
+import com.sinata.system.service.SysDepartmentService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +35,115 @@
  * @since 2024-12-02
  */
 @Service
+@RequiredArgsConstructor
 public class MwTransitRouteServiceImpl extends ServiceImpl<MwTransitRouteMapper, MwTransitRoute> implements MwTransitRouteService {
+    private final SysDepartmentService sysDepartmentService;
+    private final MwTransitCarService mwTransitCarService;
+    private final MwTransitRoutePointsService mwTransitRoutePointsService;
+    private final MwTransitRouteCarService mwTransitRouteCarService;
 
+    /**
+     * 分页列表
+     *
+     * @param query
+     * @return
+     */
+    @Override
+    public PageDTO<MwTransitRouteVO> pageList(MwTransitRouteQuery query) {
+        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
+        if (StringUtils.isBlank(treeCode)) {
+            return PageDTO.empty(0L, 0L);
+        }
+        Page<MwTransitRouteVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), treeCode);
+        return PageDTO.of(page);
+    }
+
+    /**
+     * 详情
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public MwTransitRouteVO detail(Long id) {
+        MwTransitRouteVO vo = baseMapper.detail(id);
+        //关联医院
+        vo.setHostpitalList(sysDepartmentService.getHospitalListByRouteId(vo.getId()));
+        //关联车辆列表
+        vo.setCarList(mwTransitCarService.getCarListByRouteId(vo.getId()));
+        return vo;
+    }
+
+    /**
+     * 新增
+     *
+     * @param dto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(MwTransitRouteDTO dto) {
+        MwTransitRoute mwTransitRoute = BeanUtils.copyBean(dto, MwTransitRoute.class);
+        mwTransitRoute.setHospitalQuantity(dto.getHostpitalList().size());
+        save(mwTransitRoute);
+        //关联医院
+        List<MwTransitRoutePoints> mwTransitRoutePoints = BeanUtils.copyToList(dto.getHostpitalList(), MwTransitRoutePoints.class);
+        mwTransitRoutePoints.forEach(points -> points.setRouteId(mwTransitRoute.getId()));
+        mwTransitRoutePointsService.saveBatch(mwTransitRoutePoints);
+        //关联车辆
+        List<MwTransitRouteCar> mwTransitRouteCars = dto.getCarIdList().stream().map(carId -> {
+            MwTransitRouteCar routeCar = new MwTransitRouteCar();
+            routeCar.setRouteId(mwTransitRoute.getId());
+            routeCar.setCarId(carId);
+            return routeCar;
+        }).collect(Collectors.toList());
+        mwTransitRouteCarService.saveBatch(mwTransitRouteCars);
+    }
+
+    /**
+     * 编辑
+     *
+     * @param dto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void edit(MwTransitRouteDTO dto) {
+        if (Objects.isNull(dto.getId())) {
+            throw new ServiceException("线路id不能为空");
+        }
+        MwTransitRoute mwTransitRoute = BeanUtils.copyBean(dto, MwTransitRoute.class);
+        mwTransitRoute.setHospitalQuantity(dto.getHostpitalList().size());
+        updateById(mwTransitRoute);
+        //移除关联医院
+        mwTransitRoutePointsService.lambdaUpdate().eq(MwTransitRoutePoints::getRouteId, dto.getId()).remove();
+        //关联医院
+        List<MwTransitRoutePoints> mwTransitRoutePoints = BeanUtils.copyToList(dto.getHostpitalList(), MwTransitRoutePoints.class);
+        mwTransitRoutePoints.forEach(points -> points.setRouteId(mwTransitRoute.getId()));
+        mwTransitRoutePointsService.saveBatch(mwTransitRoutePoints);
+        //移除关联车辆
+        mwTransitRouteCarService.lambdaUpdate().eq(MwTransitRouteCar::getRouteId, dto.getId()).remove();
+        //关联车辆
+        List<MwTransitRouteCar> mwTransitRouteCars = dto.getCarIdList().stream().map(carId -> {
+            MwTransitRouteCar routeCar = new MwTransitRouteCar();
+            routeCar.setRouteId(mwTransitRoute.getId());
+            routeCar.setCarId(carId);
+            return routeCar;
+        }).collect(Collectors.toList());
+        mwTransitRouteCarService.saveBatch(mwTransitRouteCars);
+    }
+
+    /**
+     * 删除
+     *
+     * @param id
+     */
+    @Override
+    public void delete(Long id) {
+        //移除关联医院
+        mwTransitRoutePointsService.lambdaUpdate().eq(MwTransitRoutePoints::getRouteId, id).remove();
+        //移除关联车辆
+        mwTransitRouteCarService.lambdaUpdate().eq(MwTransitRouteCar::getRouteId, id).remove();
+        removeById(id);
+    }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java
index b796fc1..bd1c738 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java
@@ -363,7 +363,18 @@
      */
     @Override
     public PageDTO<MedicalInstitutionVO> pageMedicalList(DepartmentQuery query) {
-        String treeCode = getTreeCodeByDepartmentId(query.getDepartmentId());
+        String treeCode;
+        if (Objects.isNull(query.getDepartmentId())) {
+            SysDepartment department = getMyDepartment();
+            treeCode = department.getTreeCode();
+        } else {
+            SysDepartment department = getById(query.getDepartmentId());
+            //如果是处置单位,则获取父级部门
+            if (department.getOrgType().equals(DepartmentEnum.DISPOSAL_UNIT.getCode())) {
+                department = getDepartmentByParentId(department.getParentId());
+            }
+            treeCode = department.getTreeCode();
+        }
         if (StringUtils.isBlank(treeCode)) {
             return PageDTO.empty(0L, 0L);
         }
@@ -786,4 +797,15 @@
         }
         return null;
     }
+
+    /**
+     * 路线关联医院列表
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public List<MedicalInstitutionVO> getHospitalListByRouteId(Long id) {
+        return baseMapper.getHospitalListByRouteId(id);
+    }
 }
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwMonitorDeviceMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwMonitorDeviceMapper.xml
index a4bbccf..42b8606 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwMonitorDeviceMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwMonitorDeviceMapper.xml
@@ -47,6 +47,40 @@
                 AND MMD.DEVICE_NAME LIKE CONCAT('%',#{query.deviceName},'%')
             </if>
         </where>
+        ORDER BY MMD.CREATE_TIME DESC
+    </select>
+    <select id="pageMonitorPage" resultType="com.sinata.system.domain.vo.MwMonitorDeviceVO">
+        SELECT MMD.ID,
+        MMD.DEPARTMENT_ID,
+        MMD.DEVICE_NAME,
+        MMD.DEVICE_NUMBER,
+        MMD.CHANNEL_NUMBER,
+        MMD.AUTO_SHUTDOWN_TIME,
+        MMD.REMARK,
+        SD.DEPARTMENT_NAME
+        FROM MW_MONITOR_DEVICE MMD
+        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MMD.DEPARTMENT_ID
+        <where>
+            MMD.DEL_FLAG = 0
+            <if test="treeCode != null and treeCode != ''">
+                AND SD.TREE_CODE LIKE CONCAT(#{treeCode},'%')
+            </if>
+            <if test="deviceList != null and deviceList.size() > 0">
+                <if test="status != null and status == 1">
+                    AND MMD.DEVICE_NUMBER IN
+                    <foreach collection="deviceList" item="item" open="(" separator="," close=")">
+                        #{item}
+                    </foreach>
+                </if>
+                <if test="status != null and status == 0">
+                    AND MMD.DEVICE_NUMBER NOT IN
+                    <foreach collection="deviceList" item="item" open="(" separator="," close=")">
+                        #{item}
+                    </foreach>
+                </if>
+            </if>
+        </where>
+        ORDER BY MMD.CREATE_TIME DESC
     </select>
 
 </mapper>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwTransitCarMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwTransitCarMapper.xml
index e830dc3..4babfe6 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwTransitCarMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwTransitCarMapper.xml
@@ -92,5 +92,30 @@
             MTC.ID = #{id}
         </where>
     </select>
+    <select id="getCarListByRouteId" resultType="com.sinata.system.domain.vo.MwTransitCarVO">
+        SELECT MTC.ID,
+        MTC.DEPARTMENT_ID,
+        MTC.IMAGE_URL,
+        MTC.LICENSE_PLATE_NUMBER,
+        MTC.PERSON_IN_CHARGE,
+        MTC.PHONE_NUMBER,
+        MTC.BRAND,
+        MTC.COLOR,
+        MTC.CODE,
+        MTC.MAXIMUM_LOAD,
+        MTC.REMARK,
+        MTC.DEL_FLAG,
+        MTC.CREATE_BY,
+        MTC.CREATE_TIME,
+        MTC.UPDATE_BY,
+        MTC.UPDATE_TIME,
+        SD.DEPARTMENT_NAME
+        FROM MW_TRANSIT_ROUTE_CAR MTRC
+        INNER JOIN MW_TRANSIT_CAR MTC ON MTC.ID = MTRC.CAR_ID
+        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MTC.DEPARTMENT_ID
+        <where>
+            MTRC.ROUTE_ID = #{id}
+        </where>
+    </select>
 
 </mapper>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwTransitRouteMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwTransitRouteMapper.xml
index 5bacf24..484a0b5 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwTransitRouteMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwTransitRouteMapper.xml
@@ -23,5 +23,38 @@
         UPDATE_TIME,
         ID, DEPARTMENT_ID, ROUTE_NAME
     </sql>
+    <select id="pageList" resultType="com.sinata.system.domain.vo.MwTransitRouteVO">
+        SELECT MTR.ID,
+        MTR.DEPARTMENT_ID,
+        MTR.ROUTE_NAME,
+        MTR.DEL_FLAG,
+        MTR.CREATE_TIME,
+        MTR.HOSPITAL_QUANTITY,
+        MTR.REMARK,
+        SD.DEPARTMENT_NAME
+        FROM MW_TRANSIT_ROUTE MTR
+        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MTR.DEPARTMENT_ID
+        <where>
+            MTR.DEL_FLAG = 0
+            <if test="treeCode != null and treeCode != ''">
+                AND SD.TREE_CODE LIKE CONCAT(#{treeCode}, '%')
+            </if>
+        </where>
+    </select>
+    <select id="detail" resultType="com.sinata.system.domain.vo.MwTransitRouteVO">
+        SELECT MTR.ID,
+        MTR.DEPARTMENT_ID,
+        MTR.ROUTE_NAME,
+        MTR.DEL_FLAG,
+        MTR.CREATE_TIME,
+        MTR.HOSPITAL_QUANTITY,
+        MTR.REMARK,
+        SD.DEPARTMENT_NAME
+        FROM MW_TRANSIT_ROUTE MTR
+        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MTR.DEPARTMENT_ID
+        <where>
+            MTR.ID = #{id}
+        </where>
+    </select>
 
 </mapper>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml
index 08f61ec..850d7da 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml
@@ -59,7 +59,7 @@
         sdd.DICT_LABEL AS INSTITUTION_LEVEL_STR,sdd2.DICT_LABEL AS INSTITUTION_TYPE_STR
         FROM SYS_DEPARTMENT sd
         LEFT JOIN SYS_DEPARTMENT_INFO sdi
-        ON sd.id = sdi.DEPARTMENT_ID
+        ON sd.ID = sdi.DEPARTMENT_ID
         LEFT JOIN SYS_DICT_DATA sdd
         ON sdi.INSTITUTION_LEVEL = sdd.DICT_CODE
         LEFT JOIN SYS_DICT_DATA sdd2
@@ -100,7 +100,7 @@
         sdd.DICT_LABEL AS INSTITUTION_LEVEL_STR,sdd2.DICT_LABEL AS INSTITUTION_TYPE_STR
         FROM SYS_DEPARTMENT sd
         LEFT JOIN SYS_DEPARTMENT_INFO sdi
-        ON sd.id = sdi.DEPARTMENT_ID
+        ON sd.ID = sdi.DEPARTMENT_ID
         LEFT JOIN SYS_DICT_DATA sdd
         ON sdi.INSTITUTION_LEVEL = sdd.DICT_CODE
         LEFT JOIN SYS_DICT_DATA sdd2
@@ -127,7 +127,7 @@
         sdi.MAXIMUM_STORAGE_CAPACITY
         FROM SYS_DEPARTMENT sd
         LEFT JOIN SYS_DEPARTMENT_INFO sdi
-        ON sd.id = sdi.DEPARTMENT_ID
+        ON sd.ID = sdi.DEPARTMENT_ID
         <where>
             sd.ORG_TYPE = 3 AND sd.TREE_CODE LIKE CONCAT(#{treeCode}, '%')
         </where>
@@ -149,7 +149,7 @@
         sdi.MAXIMUM_STORAGE_CAPACITY
         FROM SYS_DEPARTMENT sd
         LEFT JOIN SYS_DEPARTMENT_INFO sdi
-        ON sd.id = sdi.DEPARTMENT_ID
+        ON sd.ID = sdi.DEPARTMENT_ID
         <where>
             sd.ORG_TYPE = 3
             <if test="departmentId != null">
@@ -188,9 +188,36 @@
         sdi.MAXIMUM_STORAGE_CAPACITY
         FROM SYS_DEPARTMENT sd
         LEFT JOIN SYS_DEPARTMENT_INFO sdi
-        ON sd.id = sdi.DEPARTMENT_ID
+        ON sd.ID = sdi.DEPARTMENT_ID
         <where>
-            sd.id = #{id}
+            sd.ID = #{id}
+        </where>
+    </select>
+    <select id="getHospitalListByRouteId" resultType="com.sinata.system.domain.vo.MedicalInstitutionVO">
+        SELECT SD.ID,
+        DEPARTMENT_NAME,
+        PARENT_ID,
+        TREE_CODE,
+        ORG_TYPE,
+        ORG_CODE,
+        ADDRESS,
+        LONGITUDE,
+        LATITUDE,
+        CONTACT_PERSON,
+        CONTACT_PHONE,
+        REMARK,
+        LEGAL_PERSON,
+        UNIFIED_SOCIAL_CREDIT_CODE,
+        DEL_FLAG,
+        CREATE_BY,
+        CREATE_TIME,
+        UPDATE_BY,
+        UPDATE_TIME,
+        REGION
+        FROM MW_TRANSIT_ROUTE_POINTS MTRP
+        INNER JOIN SYS_DEPARTMENT SD ON MTRP.DEPARTMENT_ID = SD.ID
+        <where>
+            SD.ORG_TYPE = 2 AND MTRP.ID = #{id}
         </where>
     </select>
 
diff --git a/pom.xml b/pom.xml
index f69f146..56e7c2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,6 +36,7 @@
         <hutool.version>5.7.17</hutool.version>
         <fastexcel.version>1.0.0</fastexcel.version>
         <aliyun-oss.version>3.17.4</aliyun-oss.version>
+        <dysmsapi.version>3.1.0</dysmsapi.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -221,6 +222,12 @@
                 <artifactId>aliyun-sdk-oss</artifactId>
                 <version>${aliyun-oss.version}</version>
             </dependency>
+            <!--sms-->
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>dysmsapi20170525</artifactId>
+                <version>${dysmsapi.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

--
Gitblit v1.7.1