From 0a8119461bea9b913819d302b8820f1dc2cf420c Mon Sep 17 00:00:00 2001
From: luodangjia <luodangjia>
Date: 星期二, 07 一月 2025 17:07:15 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarTrackVO.java                             |   19 +
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalInstitutionCollectListVO.java        |   22 +
 medicalWaste-system/src/main/java/com/sinata/system/service/ISysRoleService.java                          |    8 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java         |   17 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java            |   31 +
 medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserMapper.java                             |    3 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/screen/ScreenController.java                   |   67 +++
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwContractServiceImpl.java               |   15 
 medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java                       |   29 
 medicalWaste-system/src/main/java/com/sinata/system/domain/query/SysUserQuery.java                        |    3 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarCollectPointServiceImpl.java |   61 +++
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysUserServiceImpl.java                  |    4 
 medicalWaste-system/src/main/resources/mapper/system/MwMicroEquipmentRecordMapper.xml                     |    4 
 medicalWaste-system/src/main/java/com/sinata/system/utils/ImageToBase64.java                              |   31 +
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysRoleServiceImpl.java                  |   50 ++
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteCollectVO.java                  |   25 +
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java              |   14 
 medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java                       |    2 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysUserController.java          |    2 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java            |   16 
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningRecordStaticsVO.java               |   23 +
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java      |   16 
 medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysDictDataDTO.java                        |    3 
 medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarCollectPointService.java          |   18 +
 medicalWaste-system/src/main/java/com/sinata/system/mapper/xml/MwTransitCarCollectPointMapper.xml         |   33 +
 medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarCollectPointMapper.java            |   15 
 medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml                              |    7 
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCheckoutRecordVO.java                     |    3 
 medicalWaste-system/src/main/java/com/sinata/system/service/biz/ScreenService.java                        |  171 +++++++++
 medicalWaste-system/src/main/resources/mapper/system/SysUserMapper.xml                                    |   13 
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteProcessVO.java                  |    2 
 medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRecordQuery.java                |   11 
 medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java                    |   13 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwCheckoutRecordController.java        |    8 
 medicalWaste-system/src/main/java/com/sinata/system/domain/excel/MwCheckoutRecordExcel.java               |   50 ++
 medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java                    |    6 
 medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml                           |   24 
 medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysLoginController.java         |    9 
 medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java                  |    4 
 medicalWaste-system/src/main/java/com/sinata/system/domain/MwContract.java                                |   42 ++
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMicroEquipmentRecordVO.java               |    3 
 medicalWaste-system/src/main/resources/mapper/system/MwStaffMapper.xml                                    |    4 
 medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml                           |   28 +
 medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarDistributionVO.java                      |   54 +++
 medicalWaste-system/src/main/resources/mapper/system/MwBusinessDeviceMapper.xml                           |    5 
 45 files changed, 884 insertions(+), 104 deletions(-)

diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwCheckoutRecordController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwCheckoutRecordController.java
index 91729a7..5d36435 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwCheckoutRecordController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwCheckoutRecordController.java
@@ -71,13 +71,13 @@
     /**
      * 转运记录详情
      *
-     * @param departmentId
+     * @param id
      * @return
      */
     @ApiOperation(value = "转运记录详情")
-    @GetMapping("/hospital/detail/{departmentId}")
-    public R<MwCheckoutRecordVO> hospitalDetail(@ApiParam(name = "id", value = "医院id", required = true) @PathVariable("departmentId") Long departmentId) {
-        return R.ok(mwCheckoutRecordService.hospitalDetail(departmentId));
+    @GetMapping("/hospital/detail/{id}")
+    public R<MwCheckoutRecordVO> hospitalDetail(@ApiParam(name = "id", value = "医院id", required = true) @PathVariable("id") Long id) {
+        return R.ok(mwCheckoutRecordService.hospitalDetail(id));
     }
 
     /**
diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java
index 95b4abf..a11ac2c 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java
@@ -226,12 +226,12 @@
     /**
      * 删除字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
-    @Log(title = "字典类型", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictCodes}")
-    public AjaxResult remove(@PathVariable Long[] dictCodes)
-    {
-        dictDataService.deleteDictDataByIds(dictCodes);
-        return success();
-    }
+    //@PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    //@Log(title = "字典类型", businessType = BusinessType.DELETE)
+    //@DeleteMapping("/{dictCodes}")
+    //public AjaxResult remove(@PathVariable Long[] dictCodes)
+    //{
+    //    dictDataService.deleteDictDataByIds(dictCodes);
+    //    return success();
+    //}
 }
diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysLoginController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysLoginController.java
index ba386c5..d184e4f 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysLoginController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysLoginController.java
@@ -24,6 +24,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -70,11 +71,15 @@
         if (CollectionUtils.isEmpty(roles)) {
             return AjaxResult.error("请关联角色!");
         }
-
+        Optional<SysRole> any = roles.stream().filter(role -> role.getAppletFlag().equals(1)).findAny();
+        if (any.isPresent()) {
+            return AjaxResult.error("小程序用户不能登录管理后台!");
+        }
         List<SysMenu> menus = roleService.roleInfoFromUserId(loginUser.getUserId());
-
+        Set<Long> permissions = roleService.getMenuIdSets(loginUser.getUserId());
         ajax.put("menus", menus);
         ajax.put("userInfo", loginUser);
+        ajax.put("permissions", permissions);
         return ajax;
     }
 
diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysUserController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysUserController.java
index 58751d2..8d1ed1e 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysUserController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysUserController.java
@@ -137,7 +137,7 @@
      * @return
      */
     @ApiOperation("批量删除")
-    @PostMapping("/delBatch")
+    @DeleteMapping("/delBatch")
     @ApiImplicitParam(name = "userIdStr", value = "用户id字符串列表", required = true)
     public R<?> delBatch(@RequestParam String userIdStr) {
         List<Long> userIds = Arrays.stream(userIdStr.split(",")).map(Long::valueOf).collect(Collectors.toList());
diff --git a/medicalWaste-admin/src/main/java/com/sinata/web/controller/screen/ScreenController.java b/medicalWaste-admin/src/main/java/com/sinata/web/controller/screen/ScreenController.java
index b1af872..df5f548 100644
--- a/medicalWaste-admin/src/main/java/com/sinata/web/controller/screen/ScreenController.java
+++ b/medicalWaste-admin/src/main/java/com/sinata/web/controller/screen/ScreenController.java
@@ -2,7 +2,11 @@
 
 import com.sinata.common.core.domain.R;
 import com.sinata.system.domain.MedicalWasteStaticsVO;
+import com.sinata.system.domain.vo.CarDistributionVO;
 import com.sinata.system.domain.vo.DepartmentTagInfoVO;
+import com.sinata.system.domain.vo.MedicalInstitutionCollectListVO;
+import com.sinata.system.domain.vo.MwWarningRecordStaticsVO;
+import com.sinata.system.domain.vo.MwWarningRecordVO;
 import com.sinata.system.domain.vo.ScreenDepartmentVO;
 import com.sinata.system.domain.vo.TodayMedicalWastePieVO;
 import com.sinata.system.domain.vo.TotalCollectWeightByTypeVO;
@@ -29,7 +33,9 @@
 @RequiredArgsConstructor
 @RequestMapping("/backend/screen")
 public class ScreenController {
+
     private final ScreenService screenService;
+
 
     /**
      * 获取单位列表
@@ -87,10 +93,59 @@
     public R<TotalCollectWeightByTypeVO> totalCollectWeightByType(@ApiParam(name = "type", value = "统计类型 1:按周统计 2:按月统计") @PathVariable("type") Integer type) {
         return R.ok(screenService.totalCollectWeightByType(type));
     }
-//    /**
-//     * 医疗机构收集情况
-//     */
-//    @ApiOperation("医疗机构收集情况")
-//    @GetMapping("/medicalInstitutionCollectList")
-//    public R<List<MedicalInstitutionCollectListVO>>
+    /**
+     * 医疗机构收集情况 
+     */
+    @ApiOperation("医疗机构收集情况")
+    @GetMapping("/medicalInstitutionCollectList")
+    public R<List<MedicalInstitutionCollectListVO>> medicalInstitutionCollectList() {
+        return R.ok(screenService.medicalInstitutionCollectList());
+    }
+
+    /**
+     * 预警记录统计
+     *
+     * @return
+     */
+    @ApiOperation("预警记录统计")
+    @GetMapping("/warningRecordStaticsList")
+    public R<List<MwWarningRecordStaticsVO>> warningRecordStaticsList() {
+        return R.ok(screenService.warningRecordStaticsList());
+    }
+
+    /**
+     * 根据预警类型查询预警详情
+     *
+     * @param type
+     * @return
+     */
+    @ApiOperation("根据预警类型查询预警详情")
+    @GetMapping("/warningRecordDetailByType/{type}")
+    public R<List<MwWarningRecordVO>> queryWarningRecordDetailByType(@ApiParam(name = "type", value = "预警类型", required = true) @PathVariable("type") Integer type) {
+        return R.ok(screenService.queryWarningRecordDetailByType(type));
+    }
+
+    /**
+     * 车辆分布
+     *
+     * @return
+     */
+    @ApiOperation("车辆分布")
+    @GetMapping("/carDistribution")
+    public R<List<CarDistributionVO>> queryCarDistribution() {
+        return R.ok(screenService.queryCarDistribution());
+    }
+
+    /**
+     * 车辆分布详情
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation("车辆分布详情")
+    @GetMapping("/carDistributionDetail/{id}")
+    public R<CarDistributionVO> queryCarDistributionDetail(@ApiParam(name = "id", value = "车辆id", required = true) @PathVariable("id") Long id) {
+        return R.ok(screenService.queryCarDistributionDetail(id));
+    }
 }
+
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/MwContract.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/MwContract.java
index 503fc9b..f008304 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/MwContract.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/MwContract.java
@@ -1,15 +1,17 @@
 package com.sinata.system.domain;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 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;
 import lombok.Setter;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -25,7 +27,7 @@
 @Setter
 @TableName("MW_CONTRACT")
 @ApiModel(value = "MwContract对象", description = "合同")
-public class MwContract extends BaseModel {
+public class MwContract implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -88,4 +90,40 @@
     @ApiModelProperty("层级关系")
     @TableField("RELATION")
     private String relation;
+
+    /**
+     * 创建者
+     */
+    @ApiModelProperty(value = "记录创建人,前端忽略")
+    @TableField(value = "create_by", fill = FieldFill.INSERT)
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "记录创建时间,前端忽略")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ApiModelProperty(value = "记录修改人,前端忽略")
+    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "记录修改时间,前端忽略")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    /**
+     * 是否删除 0未删除 1已删除
+     */
+    @TableField("del_flag")
+    @ApiModelProperty(value = "是否删除 0未删除 1已删除")
+    @TableLogic(value = "0", delval = "NULL")
+    private Integer delFlag;
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysDictDataDTO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysDictDataDTO.java
index bc9fca8..2284725 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysDictDataDTO.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysDictDataDTO.java
@@ -23,4 +23,7 @@
 
     @ApiModelProperty("备注")
     private String remark;
+    
+    @ApiModelProperty("大屏统计颜色")
+    private String cssClass;
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/excel/MwCheckoutRecordExcel.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/excel/MwCheckoutRecordExcel.java
new file mode 100644
index 0000000..08c4f68
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/excel/MwCheckoutRecordExcel.java
@@ -0,0 +1,50 @@
+package com.sinata.system.domain.excel;
+
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.net.URL;
+import java.util.Date;
+
+/**
+ * @author mitao
+ * @date 2025/1/2
+ */
+@Data
+public class MwCheckoutRecordExcel {
+    
+    @ApiModelProperty("出库时间")
+    @ExcelProperty(value = "出库时间", index = 1)
+    private Date checkoutTime;
+
+    @ExcelProperty(value = "医院", index = 2)
+    private String hospitalName;
+
+    @ExcelProperty(value = "暂存间", index = 3)
+    private String roomName;
+
+    @ExcelProperty(value = "箱数", index = 4)
+    private Integer boxNum;
+
+    @ExcelProperty(value = "袋数", index = 5)
+    private Integer bagNum;
+
+    @ExcelProperty(value = "总重量", index = 6)
+    private BigDecimal totalWeight;
+
+    @ExcelProperty(value = "医院签名", index = 7)
+    private URL hospitalSignature;
+
+    @ExcelProperty(value = "司机姓名", index = 8)
+    private String driverName;
+
+    @ExcelProperty(value = "车牌号", index = 9)
+    private String licensePlateNumber;
+
+    @ApiModelProperty("记录id")
+    @ExcelIgnore
+    private Long id;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRecordQuery.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRecordQuery.java
index fba963f..e7970f2 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRecordQuery.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwTransitRecordQuery.java
@@ -7,6 +7,7 @@
 import lombok.EqualsAndHashCode;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author mitao
@@ -16,6 +17,7 @@
 @EqualsAndHashCode(callSuper = true)
 @ApiModel("运输记录查询数据传输对象")
 public class MwTransitRecordQuery extends BasePage {
+
     private static final long serialVersionUID = 3585169031300259198L;
     
     @ApiModelProperty("路线id")
@@ -31,8 +33,13 @@
     private Integer status;
 
     @ApiModelProperty("运输开始时间")
-    private Date startTime;
+    private List<String> startTime;
 
     @ApiModelProperty("运输结束时间")
-    private Date endTime;
+    private List<String> endTime;
+    
+    private Date startTimeStart;
+    private Date startTimeEnd;
+    private Date endTimeStart;
+    private Date endTimeEnd;
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/SysUserQuery.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/SysUserQuery.java
index 5d90a06..6fbe6c4 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/query/SysUserQuery.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/query/SysUserQuery.java
@@ -21,6 +21,9 @@
 
     @ApiModelProperty("姓名")
     private String nickName;
+    
+    @ApiModelProperty("用户名")
+    private String userName;
 
     @ApiModelProperty("角色id")
     private Long roleId;
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarDistributionVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarDistributionVO.java
new file mode 100644
index 0000000..aed86c6
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarDistributionVO.java
@@ -0,0 +1,54 @@
+package com.sinata.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Set;
+
+/**
+ * @author mitao
+ * @date 2025/1/2
+ */
+@Data
+@ApiModel("车辆分布视图对象")
+public class CarDistributionVO {
+
+    @ApiModelProperty("车辆id")
+    private Long id;
+
+    @ApiModelProperty("车牌号")
+    private String licensePlateNumber;
+
+    @ApiModelProperty("已装载")
+    private BigDecimal currentLoad;
+
+    @ApiModelProperty("当前所在位置-经度")
+    private Double longitude;
+
+    @ApiModelProperty("当前所在位置-纬度")
+    private Double latitude;
+
+    @ApiModelProperty("车辆图片")
+    private String imageUrl;
+
+    @ApiModelProperty("所属单位")
+    private String departmentName;
+
+    @ApiModelProperty("负责人")
+    private String personInCharge;
+
+    @ApiModelProperty("负责人联系方式")
+    private String phoneNumber;
+
+    @ApiModelProperty("最大载重")
+    private BigDecimal maximumLoad;
+    /**
+     * 单位列表
+     */
+    private String pointList;
+
+    @ApiModelProperty("线路轨迹经纬度列表")
+    private Set<CarTrackVO> lineSet;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarTrackVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarTrackVO.java
new file mode 100644
index 0000000..03f18f0
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/CarTrackVO.java
@@ -0,0 +1,19 @@
+package com.sinata.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2025/1/2
+ */
+@Data
+@ApiModel("车辆轨迹经纬度视图对象")
+public class CarTrackVO {
+    @ApiModelProperty("经度")
+    private Double longitude;
+
+    @ApiModelProperty("纬度")
+    private Double latitude;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalInstitutionCollectListVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalInstitutionCollectListVO.java
new file mode 100644
index 0000000..1f32775
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalInstitutionCollectListVO.java
@@ -0,0 +1,22 @@
+package com.sinata.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2025/1/2
+ */
+@Data
+@ApiModel("医疗机构收集情况视图对象")
+public class MedicalInstitutionCollectListVO {
+
+    @ApiModelProperty("医院名称")
+    private String hospitalName;
+
+    @ApiModelProperty("医废列表")
+    private List<MedicalWasteCollectVO> medicalWasteList;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteCollectVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteCollectVO.java
new file mode 100644
index 0000000..a8bf7d4
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteCollectVO.java
@@ -0,0 +1,25 @@
+package com.sinata.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author mitao
+ * @date 2025/1/2
+ */
+@Data
+@ApiModel("医废收集统计视图对象")
+public class MedicalWasteCollectVO {
+
+    @ApiModelProperty("医废类型")
+    private String wasteTypeStr;
+
+    @ApiModelProperty("袋数")
+    private Integer bagNum;
+
+    @ApiModelProperty("重量")
+    private BigDecimal weight;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteProcessVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteProcessVO.java
index c207d1e..ee3fca2 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteProcessVO.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MedicalWasteProcessVO.java
@@ -37,7 +37,7 @@
     private BigDecimal weight;
 
     @ApiModelProperty("收集-收集人姓名")
-    private Long collectUserName;
+    private String collectUserName;
 
     @ApiModelProperty("运输-装车时间")
     private Date checkoutTime;
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCheckoutRecordVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCheckoutRecordVO.java
index 77bbfe1..1e827eb 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCheckoutRecordVO.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCheckoutRecordVO.java
@@ -2,6 +2,7 @@
 
 import cn.idev.excel.annotation.ExcelIgnore;
 import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.converters.string.StringImageConverter;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -53,7 +54,7 @@
     private BigDecimal totalWeight;
     
     @ApiModelProperty("医院签名")
-    @ExcelProperty(value = "医院签名", index = 7)
+    @ExcelProperty(value = "医院签名", index = 7, converter = StringImageConverter.class)
     private String hospitalSignature;
 
     @ApiModelProperty("司机姓名")
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMicroEquipmentRecordVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMicroEquipmentRecordVO.java
index feed138..5c46858 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMicroEquipmentRecordVO.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMicroEquipmentRecordVO.java
@@ -25,6 +25,9 @@
     @ApiModelProperty("设备名称")
     private String equipmentName;
 
+    @ApiModelProperty("设备id")
+    private Long equipmentId;
+
     @ApiModelProperty("使用时间")
     private Date useTime;
 
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningRecordStaticsVO.java b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningRecordStaticsVO.java
new file mode 100644
index 0000000..44c76e2
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningRecordStaticsVO.java
@@ -0,0 +1,23 @@
+package com.sinata.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2025/1/2
+ */
+@Data
+@ApiModel("预警记录统计视图对象")
+public class MwWarningRecordStaticsVO {
+
+    @ApiModelProperty("预警类型 1:出库超时预警;2:暂存间使用率预警;3:合同到期预警;4:健康记录预警;5:疫苗记录预警;6:防护用品使用预警;7:医疗机构产废日预警;8:医疗机构产废月预警;9:医疗机构存储量预警;10:车辆转运异常预警;11:处置单位存储量预警")
+    private Integer type;
+
+    @ApiModelProperty("预警类型名称")
+    private String typeName;
+
+    @ApiModelProperty("预警数量")
+    private Long count;
+}
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java
index 9f7c6d2..0eb0152 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java
@@ -44,10 +44,10 @@
     /**
      * 转运记录详情
      *
-     * @param departmentId
+     * @param id
      * @return
      */
-    MwCheckoutRecordVO hospitalDetail(Long departmentId);
+    MwCheckoutRecordVO hospitalDetail(Long id);
 
     /**
      * 转运记录医废详情分页列表
@@ -83,7 +83,7 @@
      * @param id
      * @return
      */
-    Page<MwMedicalWasteBoxVO> transitDetailPageList(Page<MwMedicalWasteBoxVO> objectPage, Long id);
+    Page<MwMedicalWasteBoxVO> transitDetailPageList(Page<MwMedicalWasteBoxVO> page, @Param("id") Long id);
 
     /**
      * 转运记录导出
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java
index 87e0db0..82d9a99 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java
@@ -82,7 +82,7 @@
      * @param query
      * @return
      */
-    Page<MwStorageRecordVO> temporarilyStoredMedicalWaste(StorageRecordQuery query);
+    Page<MwStorageRecordVO> temporarilyStoredMedicalWaste(Page<MwStorageRecordVO> page, @Param("query") StorageRecordQuery query);
 
     /**
      * 根据医废查询使用列表
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarCollectPointMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarCollectPointMapper.java
index 47a6643..33fd98a 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarCollectPointMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/MwTransitCarCollectPointMapper.java
@@ -2,7 +2,10 @@
 
 import com.sinata.system.domain.MwTransitCarCollectPoint;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sinata.system.domain.vo.CarDistributionVO;
 import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,5 +17,17 @@
  */
 @Mapper
 public interface MwTransitCarCollectPointMapper extends BaseMapper<MwTransitCarCollectPoint> {
+    /**
+     * 查询车辆分布列表
+     *
+     * @param treeCode
+     * @return
+     */
+    List<CarDistributionVO> queryCarListByTreeCode(String treeCode);
 
+    /**
+     * @param id
+     * @return
+     */
+    CarDistributionVO queryCarDistributionDetail(Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserMapper.java b/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserMapper.java
index 0384d59..b4113bb 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserMapper.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserMapper.java
@@ -135,7 +135,8 @@
      * @param sysUserVOPage
      * @param nickName
      * @param roleId
+     * @param userName
      * @return
      */
-    Page<SysUserVO> pageList(Page<SysUserVO> sysUserVOPage, @Param("nickName") String nickName, @Param("roleId") Long roleId, @Param("treeCode") String treeCode);
+    Page<SysUserVO> pageList(Page<SysUserVO> sysUserVOPage, @Param("nickName") String nickName, @Param("roleId") Long roleId, @Param("userName") String userName, @Param("treeCode") String treeCode);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/mapper/xml/MwTransitCarCollectPointMapper.xml b/medicalWaste-system/src/main/java/com/sinata/system/mapper/xml/MwTransitCarCollectPointMapper.xml
index bd6ed4e..797b502 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/mapper/xml/MwTransitCarCollectPointMapper.xml
+++ b/medicalWaste-system/src/main/java/com/sinata/system/mapper/xml/MwTransitCarCollectPointMapper.xml
@@ -19,5 +19,38 @@
         UPDATE_TIME,
         ID, CAR_ID, ROUTE_ID, POINT_LIST, TRANSIT_DATE
     </sql>
+    <select id="queryCarListByTreeCode" resultType="com.sinata.system.domain.vo.CarDistributionVO"
+            parameterType="java.lang.String">
+        SELECT MTC.ID,
+        MTC.LICENSE_PLATE_NUMBER,
+        SD.DEPARTMENT_NAME,
+        SUM(MCR.TOTAL_WEIGHT) AS currentLoad
+        FROM MW_TRANSIT_CAR_COLLECT_POINT MTCCP
+        LEFT JOIN MW_TRANSIT_CAR MTC ON MTC.ID = MTCCP.CAR_ID
+        LEFT JOIN SYS_DEPARTMENT SD ON MTC.DEPARTMENT_ID
+        LEFT JOIN MW_CHECKOUT_RECORD MCR ON MCR.CAR_ID = MTCCP.CAR_ID
+        <where>
+            SD.ORG_TYPE = 3 AND MTCCP.TRANSIT_DATE = CURDATE() AND SD.TREE_CODE LIKE CONCAT(#{treeCode}, '%') AND
+            MCR.DEL_FLAG = 0
+        </where>
+        ORDER BY MTC.ID
+    </select>
+    <select id="queryCarDistributionDetail" resultType="com.sinata.system.domain.vo.CarDistributionVO"
+            parameterType="java.lang.Long">
+        SELECT MTC.ID,
+        SD.DEPARTMENT_NAME,
+        MTC.LICENSE_PLATE_NUMBER,MTC.PERSON_IN_CHARGE,MTC.PHONE_NUMBER,MTC.MAXIMUM_LOAD,
+        SUM(MCR.TOTAL_WEIGHT) AS currentLoad,
+        MTCCP.POINT_LIST
+        FROM MW_TRANSIT_CAR_COLLECT_POINT MTCCP
+        LEFT JOIN MW_TRANSIT_CAR MTC ON MTC.ID = MTCCP.CAR_ID
+        LEFT JOIN SYS_DEPARTMENT SD ON MTC.DEPARTMENT_ID
+        LEFT JOIN MW_CHECKOUT_RECORD MCR ON MCR.CAR_ID = MTCCP.CAR_ID
+        <where>
+            SD.ORG_TYPE = 3 AND MTCCP.TRANSIT_DATE = CURDATE() AND
+            MCR.DEL_FLAG = 0 AND MTCCP.CAR_ID = #{carId}
+        </where>
+        ORDER BY MTC.ID
+    </select>
 
 </mapper>
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/ISysRoleService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/ISysRoleService.java
index 0d0f536..5687863 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/ISysRoleService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/ISysRoleService.java
@@ -231,4 +231,12 @@
      * @return
      */
     List<SysRoleVO> queryList();
+
+    /**
+     * 用户菜单权限集合
+     *
+     * @param userId
+     * @return
+     */
+    Set<Long> getMenuIdSets(Long userId);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java
index f9fac72..8f00d1a 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java
@@ -42,10 +42,10 @@
     /**
      * 转运记录详情
      *
-     * @param departmentId
+     * @param id
      * @return
      */
-    MwCheckoutRecordVO hospitalDetail(Long departmentId);
+    MwCheckoutRecordVO hospitalDetail(Long id);
 
     /**
      * 转运记录医废详情分页列表
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarCollectPointService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarCollectPointService.java
index 2c71c67..c51b51b 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarCollectPointService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/MwTransitCarCollectPointService.java
@@ -2,6 +2,9 @@
 
 import com.sinata.system.domain.MwTransitCarCollectPoint;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.sinata.system.domain.vo.CarDistributionVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,19 @@
  */
 public interface MwTransitCarCollectPointService extends IService<MwTransitCarCollectPoint> {
 
+    /**
+     * 查询车辆分布列表
+     *
+     * @param treeCode
+     * @return
+     */
+    List<CarDistributionVO> queryCarListByTreeCode(String treeCode);
+
+    /**
+     * 车辆分布详情
+     *
+     * @param id
+     * @return
+     */
+    CarDistributionVO queryCarDistributionDetail(Long id);
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/ScreenService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/ScreenService.java
index 8e57d4b..f4878b3 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/ScreenService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/ScreenService.java
@@ -7,16 +7,25 @@
 import com.sinata.common.utils.DateUtils;
 import com.sinata.system.domain.MedicalWasteStaticsVO;
 import com.sinata.system.domain.MwCollectRecord;
+import com.sinata.system.domain.MwWarningRecord;
 import com.sinata.system.domain.SysDepartment;
+import com.sinata.system.domain.vo.CarDistributionVO;
 import com.sinata.system.domain.vo.DepartmentTagInfoVO;
+import com.sinata.system.domain.vo.MedicalInstitutionCollectListVO;
+import com.sinata.system.domain.vo.MedicalWasteCollectVO;
+import com.sinata.system.domain.vo.MwWarningRecordStaticsVO;
+import com.sinata.system.domain.vo.MwWarningRecordVO;
 import com.sinata.system.domain.vo.ScreenDepartmentVO;
 import com.sinata.system.domain.vo.SysDictDataVO;
 import com.sinata.system.domain.vo.TodayMedicalWastePieVO;
 import com.sinata.system.domain.vo.TotalCollectWeightByTypeVO;
 import com.sinata.system.enums.DepartmentEnum;
+import com.sinata.system.enums.WarningTypeEnum;
 import com.sinata.system.service.ISysDictDataService;
 import com.sinata.system.service.MwCollectRecordService;
 import com.sinata.system.service.MwDisposalRecordService;
+import com.sinata.system.service.MwTransitCarCollectPointService;
+import com.sinata.system.service.MwWarningRecordService;
 import com.sinata.system.service.SysDepartmentService;
 import lombok.RequiredArgsConstructor;
 import org.jetbrains.annotations.NotNull;
@@ -25,6 +34,7 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -42,6 +52,8 @@
     private final MwCollectRecordService mwCollectRecordService;
     private final ISysDictDataService sysDictDataService;
     private final MwDisposalRecordService mwDisposalRecordService;
+    private final MwWarningRecordService mwWarningRecordService;
+    private final MwTransitCarCollectPointService mwTransitCarCollectPointService;
 
     /**
      * 机构分布-获取机构列表
@@ -103,11 +115,8 @@
      * @return
      */
     public List<TodayMedicalWastePieVO> todayMedicalWastePie() {
-        SysDepartment nanNingDepartment = getNanNingDepartment();
-        //查询南宁市下面的医疗机构
-        List<SysDepartment> list = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, nanNingDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list();
-        List<Long> departmentIdList = list.stream().map(SysDepartment::getId).collect(Collectors.toList());
         List<TodayMedicalWastePieVO> todayMedicalWastePieVOList = new ArrayList<>();
+        List<Long> departmentIdList = getNanNingMedicalInsitutionIdList();
         if (CollUtils.isEmpty(departmentIdList)) {
             return todayMedicalWastePieVOList;
         }
@@ -133,6 +142,16 @@
         return todayMedicalWastePieVOList;
     }
 
+    /**
+     * 南宁市医疗单位id列表
+     *
+     * @return
+     */
+    public List<Long> getNanNingMedicalInsitutionIdList() {
+        SysDepartment nanNingDepartment = getNanNingDepartment();
+        List<SysDepartment> list = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, nanNingDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list();
+        return list.stream().map(SysDepartment::getId).collect(Collectors.toList());
+    }
     /**
      * 各类型医废收集总量
      *
@@ -183,5 +202,149 @@
         return vo;
     }
 
+    /**
+     * 医疗机构收集情况
+     *
+     * @return
+     */
+    public List<MedicalInstitutionCollectListVO> medicalInstitutionCollectList() {
+        // 获取南宁市医疗机构ID列表
+        List<Long> nanNingMedicalInstitutionIdList = getNanNingMedicalInsitutionIdList();
+        if (CollUtils.isEmpty(nanNingMedicalInstitutionIdList)) {
+            return CollUtils.emptyList();
+        }
 
+        // 查询收集记录
+        List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery()
+                .in(MwCollectRecord::getDepartmentId, nanNingMedicalInstitutionIdList)
+                .list();
+        if (CollUtils.isEmpty(collectRecordList)) {
+            return CollUtils.emptyList();
+        }
+
+        // 查询医废类型
+        List<SysDictDataVO> medicalWasteTypeList = sysDictDataService.medicalWasteTypeList();
+
+        // 根据医院分组
+        Map<String, List<MwCollectRecord>> recordGroupByDepartment = collectRecordList.stream()
+                .collect(Collectors.groupingBy(MwCollectRecord::getHospitalName));
+
+        // 构建结果列表
+        return recordGroupByDepartment.entrySet().stream()
+                .map(entry -> buildMedicalInstitutionCollectVO(entry.getKey(), entry.getValue(), medicalWasteTypeList))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 构建医疗机构收集情况视图对象
+     *
+     * @param hospitalName
+     * @param records
+     * @param medicalWasteTypeList
+     * @return
+     */
+    private MedicalInstitutionCollectListVO buildMedicalInstitutionCollectVO(String hospitalName, List<MwCollectRecord> records, List<SysDictDataVO> medicalWasteTypeList) {
+        // 医院基础信息
+        MedicalInstitutionCollectListVO vo = new MedicalInstitutionCollectListVO();
+        vo.setHospitalName(hospitalName);
+
+        // 根据医废类型分组
+        Map<Long, List<MwCollectRecord>> collectRecordGroupByWasteType = records.stream()
+                .collect(Collectors.groupingBy(MwCollectRecord::getWasteType));
+
+        // 构建医废类型统计信息
+        List<MedicalWasteCollectVO> medicalWasteList = medicalWasteTypeList.stream()
+                .map(sysDictDataVO -> buildMedicalWasteCollectVO(sysDictDataVO, collectRecordGroupByWasteType))
+                .collect(Collectors.toList());
+        vo.setMedicalWasteList(medicalWasteList);
+
+        return vo;
+    }
+
+    /**
+     * 封装医废类型统计信息
+     *
+     * @param sysDictDataVO
+     * @param collectRecordGroupByWasteType
+     * @return
+     */
+    private MedicalWasteCollectVO buildMedicalWasteCollectVO(SysDictDataVO sysDictDataVO, Map<Long, List<MwCollectRecord>> collectRecordGroupByWasteType) {
+        MedicalWasteCollectVO medicalWasteCollectVO = new MedicalWasteCollectVO();
+        medicalWasteCollectVO.setWasteTypeStr(sysDictDataVO.getDictLabel());
+
+        // 获取当前类型的医废记录
+        List<MwCollectRecord> mwCollectRecords = collectRecordGroupByWasteType.get(sysDictDataVO.getDictCode());
+        if (CollUtils.isNotEmpty(mwCollectRecords)) {
+            medicalWasteCollectVO.setBagNum(mwCollectRecords.size());
+            medicalWasteCollectVO.setWeight(mwCollectRecords.stream()
+                    .map(MwCollectRecord::getWeight)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add));
+        } else {
+            medicalWasteCollectVO.setBagNum(0);
+            medicalWasteCollectVO.setWeight(BigDecimal.ZERO);
+        }
+        return medicalWasteCollectVO;
+    }
+
+    /**
+     * 预警记录统计
+     *
+     * @return
+     */
+    public List<MwWarningRecordStaticsVO> warningRecordStaticsList() {
+        SysDepartment nanNingDepartment = getNanNingDepartment();
+        List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().eq(MwWarningRecord::getDepartmentId, nanNingDepartment.getId()).list();
+        if (CollUtils.isEmpty(warningRecordList)) {
+            return CollUtils.emptyList();
+        }
+        return Arrays.stream(WarningTypeEnum.values()).map(item -> buildWarningRecordStaticsVO(item, warningRecordList)).collect(Collectors.toList());
+    }
+
+    /**
+     * 构建预警记录统计视图对象
+     *
+     * @param item
+     * @param warningRecordList
+     * @return
+     */
+    private MwWarningRecordStaticsVO buildWarningRecordStaticsVO(WarningTypeEnum item, List<MwWarningRecord> warningRecordList) {
+        MwWarningRecordStaticsVO vo = new MwWarningRecordStaticsVO();
+        vo.setType(item.getCode());
+        vo.setTypeName(item.getDesc());
+        vo.setCount(warningRecordList.stream().filter(record -> record.getType().equals(item.getCode())).count());
+        return vo;
+    }
+
+    /**
+     * 根据预警类型查询预警详情
+     *
+     * @param type
+     * @return
+     */
+    public List<MwWarningRecordVO> queryWarningRecordDetailByType(Integer type) {
+        SysDepartment nanNingDepartment = getNanNingDepartment();
+        List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().eq(MwWarningRecord::getDepartmentId, nanNingDepartment.getId()).eq(MwWarningRecord::getType, type).list();
+        return BeanUtils.copyToList(warningRecordList, MwWarningRecordVO.class);
+    }
+
+    /**
+     * 车辆分布
+     *
+     * @return
+     */
+    public List<CarDistributionVO> queryCarDistribution() {
+        SysDepartment nanNingDepartment = getNanNingDepartment();
+        //查询车辆分布列表
+        return mwTransitCarCollectPointService.queryCarListByTreeCode(nanNingDepartment.getTreeCode());
+    }
+
+    /**
+     * 车辆分布详情
+     *
+     * @param id
+     * @return
+     */
+    public CarDistributionVO queryCarDistributionDetail(Long id) {
+        return mwTransitCarCollectPointService.queryCarDistributionDetail(id);
+    }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java
index 39f6517..a088eab 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java
@@ -6,7 +6,6 @@
 import com.sinata.common.core.domain.entity.SysDictData;
 import com.sinata.common.utils.CollUtils;
 import com.sinata.common.utils.DateUtils;
-import com.sinata.system.domain.MedicalWasteStaticsVO;
 import com.sinata.system.domain.MwCollectRecord;
 import com.sinata.system.domain.MwWarningRecord;
 import com.sinata.system.domain.SysDepartment;
@@ -29,6 +28,7 @@
 import com.sinata.system.service.MwDisposalRecordService;
 import com.sinata.system.service.MwWarningRecordService;
 import com.sinata.system.service.SysDepartmentService;
+import com.sinata.system.utils.ImageToBase64;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -234,6 +234,7 @@
                 if (CollUtils.isNotEmpty(wasteTypeList)) {
                     vo.setLegend(wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList()));
                     vo.getLegend().add("小计");
+                    List<DepartmentReportItemVO> list = new ArrayList<>();
                     for (TransformVO transformVO : checkoutRecordVOList) {
                         BigDecimal totalCount = BigDecimal.ZERO;
                         BigDecimal totalWeight = BigDecimal.ZERO;
@@ -241,7 +242,7 @@
                         departmentReportItemVO.setName(transformVO.getHospitalName());
                         departmentReportItemVO.setData(new ArrayList<>());
                         departmentReportItemVO.setDriverName(transformVO.getDriverName());
-                        departmentReportItemVO.setHospitalSignature(transformVO.getHospitalSignature());
+                        departmentReportItemVO.setHospitalSignature(ImageToBase64.convertImageToBase64(transformVO.getHospitalSignature()));
                         departmentReportItemVO.setHandoverTime(transformVO.getCheckoutTime());
                         for (SysDictData sysDictData : wasteTypeList) {
                             BigDecimal count = BigDecimal.valueOf(transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).count());
@@ -253,7 +254,9 @@
                         }
                         departmentReportItemVO.getData().add(totalCount);
                         departmentReportItemVO.getData().add(totalWeight);
+                        list.add(departmentReportItemVO);
                     }
+                    vo.setList(list);
                 }
             }
         }
@@ -368,23 +371,17 @@
                 SimpleDateFormat finalSdf = sdf;
                 //接收
                 for (SysDictData sysDictData : wasteTypeList) {
-                    departmentReportItemVO.getData().add(BigDecimal.ZERO);
-                    if (CollUtils.isNotEmpty(receivedList)) {
-                        BigDecimal totalWeight = receivedList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
-                                        finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
-                                .reduce(BigDecimal.ZERO, BigDecimal::add);
-                        departmentReportItemVO.getData().add(totalWeight);
-                    }
+                    BigDecimal totalWeight = receivedList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
+                                    finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+                    departmentReportItemVO.getData().add(totalWeight);
                 }
                 //处置
                 for (SysDictData sysDictData : wasteTypeList) {
-                    departmentReportItemVO.getData().add(BigDecimal.ZERO);
-                    if (CollUtils.isNotEmpty(disposaledList)) {
-                        BigDecimal totalWeight = disposaledList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
-                                        finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
-                                .reduce(BigDecimal.ZERO, BigDecimal::add);
-                        departmentReportItemVO.getData().add(totalWeight);
-                    }
+                    BigDecimal totalWeight = disposaledList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
+                                    finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+                    departmentReportItemVO.getData().add(totalWeight);
                 }
                 list.add(departmentReportItemVO);
             }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java
index faa6752..8e8a9b5 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java
@@ -87,10 +87,10 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void add(String boxNumberStart, String boxNumberEnd) {
-        String regx = "\\d+";
-        if (boxNumberStart.length() != 11 || boxNumberEnd.length() != 11 || !boxNumberStart.matches(regx) || !boxNumberEnd.matches(regx)) {
-            throw new ServiceException("请输入有效的11位数字编号!");
-        }
+        //String regx = "\\d+";
+        //if (boxNumberStart.length() != 11 || boxNumberEnd.length() != 11 || !boxNumberStart.matches(regx) || !boxNumberEnd.matches(regx)) {
+        //    throw new ServiceException("请输入有效的11位数字编号!");
+        //}
         BigDecimal start = new BigDecimal(boxNumberStart);
         BigDecimal end = new BigDecimal(boxNumberEnd);
         if (start.compareTo(end) > 0) {
@@ -99,7 +99,9 @@
         List<MwBox> boxList = new ArrayList<>();
         for (BigDecimal i = start; i.compareTo(end) <= 0; i = i.add(BigDecimal.ONE)) {
             MwBox mwBox = new MwBox();
-            mwBox.setBoxNumber(i.toString());
+            // 每次生成编号时,确保其为11位
+            String formattedBoxNumber = String.format("%011d", i.longValue());
+            mwBox.setBoxNumber(formattedBoxNumber);
             mwBox.setStatus(BoxStatusEnum.NORMAL.getCode());
             boxList.add(mwBox);
         }
@@ -122,6 +124,7 @@
         List<Long> idList = dto.getIdList();
         List<MwBox> boxList = idList.stream().map(id -> {
             MwBox mwBox = new MwBox();
+            mwBox.setId(id);
             mwBox.setStatus(dto.getStatus());
             mwBox.setRemark(dto.getRemark());
             return mwBox;
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 b189014..92e6def 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,10 +1,13 @@
 package com.sinata.system.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 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;
 import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.CollUtils;
+import com.sinata.common.utils.DateUtils;
 import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwCheckoutRecord;
 import com.sinata.system.domain.dto.CollectTotalUpDto;
@@ -117,12 +120,12 @@
     /**
      * 转运记录详情
      *
-     * @param departmentId
+     * @param id
      * @return
      */
     @Override
-    public MwCheckoutRecordVO hospitalDetail(Long departmentId) {
-        return baseMapper.hospitalDetail(departmentId);
+    public MwCheckoutRecordVO hospitalDetail(Long id) {
+        return baseMapper.hospitalDetail(id);
     }
 
     /**
@@ -149,6 +152,14 @@
         if (StringUtils.isBlank(treeCode)) {
             return PageDTO.empty(0L, 0L);
         }
+        if (CollUtils.isNotEmpty(query.getStartTime())) {
+            query.setStartTimeStart(DateUtil.parse(query.getStartTime().get(0), DateUtils.YYYY_MM_DD_HH_MM_SS));
+            query.setStartTimeEnd(DateUtil.parse(query.getStartTime().get(1), DateUtils.YYYY_MM_DD_HH_MM_SS));
+        }
+        if (CollUtils.isNotEmpty(query.getEndTime())) {
+            query.setEndTimeStart(DateUtil.parse(query.getEndTime().get(0), DateUtils.YYYY_MM_DD_HH_MM_SS));
+            query.setEndTimeEnd(DateUtil.parse(query.getEndTime().get(1), DateUtils.YYYY_MM_DD_HH_MM_SS));
+        }
         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/MwContractServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwContractServiceImpl.java
index ea835fe..deab3c7 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwContractServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwContractServiceImpl.java
@@ -19,6 +19,7 @@
 import com.sinata.system.service.MwContractService;
 import com.sinata.system.service.SysDepartmentService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -82,7 +83,12 @@
     @Transactional(rollbackFor = Exception.class)
     public void add(MwContractDTO dto) {
         MwContract mwContract = BeanUtils.copyBean(dto, MwContract.class);
-        save(mwContract);
+        try {
+            save(mwContract);
+        } catch (DuplicateKeyException e) {
+            throw new ServiceException("合同编号重复");
+        }
+
         if (CollUtils.isNotEmpty(dto.getAttachmentList())) {
             List<MwAttachment> mwAttachments = BeanUtils.copyToList(dto.getAttachmentList(), MwAttachment.class);
             mwAttachments.forEach(attachment -> {
@@ -105,7 +111,12 @@
             throw new ServiceException("合同id不能为空");
         }
         MwContract mwContract = BeanUtils.copyBean(dto, MwContract.class);
-        updateById(mwContract);
+
+        try {
+            updateById(mwContract);
+        } catch (DuplicateKeyException e) {
+            throw new ServiceException("合同编号重复");
+        }
         if (CollUtils.isNotEmpty(dto.getAttachmentList())) {
             //删除原来的附件
             mwAttachmentService.lambdaUpdate().eq(MwAttachment::getType, AttachmentTypeEnum.CONTRACT.getCode()).eq(MwAttachment::getTargetId, dto.getId()).remove();
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 61e047f..0856fe6 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
@@ -9,6 +9,7 @@
 import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwStagingRoom;
 import com.sinata.system.domain.dto.MwStagingRoomDTO;
+import com.sinata.system.domain.excel.MwCheckoutRecordExcel;
 import com.sinata.system.domain.query.CheckoutRecordQuery;
 import com.sinata.system.domain.query.MwStagingRoomQuery;
 import com.sinata.system.domain.query.StorageRecordQuery;
@@ -23,6 +24,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.net.URL;
 import java.net.URLEncoder;
 import java.util.List;
 import java.util.Objects;
@@ -166,13 +168,19 @@
             return;
         }
         List<MwCheckoutRecordVO> list = baseMapper.checkoutRecordList(query, treeCode);
-        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
+        List<MwCheckoutRecordExcel> mwCheckoutRecordExcels = BeanUtils.copyToList(list, MwCheckoutRecordExcel.class);
+        for (MwCheckoutRecordExcel mwCheckoutRecordExcel : mwCheckoutRecordExcels) {
+            for (MwCheckoutRecordVO mwCheckoutRecordVO : list) {
+                if (mwCheckoutRecordVO.getId().equals(mwCheckoutRecordExcel.getId())) {
+                    mwCheckoutRecordExcel.setHospitalSignature(new URL(mwCheckoutRecordVO.getHospitalSignature()));
+                }
+            }
+        }
         response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
         response.setCharacterEncoding("utf-8");
-        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
         String fileName = URLEncoder.encode("暂存间出库记录", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        FastExcel.write(response.getOutputStream(), MwCheckoutRecordVO.class).sheet("暂存间出库记录").doWrite(list);
+        FastExcel.write(response.getOutputStream(), MwCheckoutRecordExcel.class).sheet("暂存间出库记录").doWrite(mwCheckoutRecordExcels);
     }
 
     @Override
@@ -188,7 +196,7 @@
      */
     @Override
     public PageDTO<MwStorageRecordVO> temporarilyStoredMedicalWaste(StorageRecordQuery query) {
-        return PageDTO.of(baseMapper.temporarilyStoredMedicalWaste(query));
+        return PageDTO.of(baseMapper.temporarilyStoredMedicalWaste(new Page<MwStorageRecordVO>(query.getPageCurr(), query.getPageSize()), query));
     }
 
     /**
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarCollectPointServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarCollectPointServiceImpl.java
index 34cac05..835eb73 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarCollectPointServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitCarCollectPointServiceImpl.java
@@ -1,10 +1,22 @@
 package com.sinata.system.service.impl;
 
+import com.alibaba.fastjson2.JSONArray;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sinata.common.utils.StringUtils;
 import com.sinata.system.domain.MwTransitCarCollectPoint;
+import com.sinata.system.domain.SysDepartment;
+import com.sinata.system.domain.vo.CarDistributionVO;
+import com.sinata.system.domain.vo.CarTrackVO;
 import com.sinata.system.mapper.MwTransitCarCollectPointMapper;
 import com.sinata.system.service.MwTransitCarCollectPointService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sinata.system.service.SysDepartmentService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +27,51 @@
  * @since 2025-01-01
  */
 @Service
+@RequiredArgsConstructor
 public class MwTransitCarCollectPointServiceImpl extends ServiceImpl<MwTransitCarCollectPointMapper, MwTransitCarCollectPoint> implements MwTransitCarCollectPointService {
-    
+    private final SysDepartmentService sysDepartmentService;
+
+    /**
+     * 查询车辆分布列表
+     *
+     * @param treeCode
+     * @return
+     */
+    @Override
+    public List<CarDistributionVO> queryCarListByTreeCode(String treeCode) {
+        return baseMapper.queryCarListByTreeCode(treeCode);
+    }
+
+    /**
+     * 车辆分布详情
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public CarDistributionVO queryCarDistributionDetail(Long id) {
+        CarDistributionVO carDistributionVO = baseMapper.queryCarDistributionDetail(id);
+        String pointList = carDistributionVO.getPointList();
+        if (StringUtils.isNotBlank(pointList)) {
+            List<Long> departmentIdList = JSONArray.parseArray(pointList, Long.class);
+            // 查询部门数据
+            List<SysDepartment> list = sysDepartmentService.lambdaQuery()
+                    .in(SysDepartment::getId, departmentIdList)
+                    .list();
+            // 重新排序
+            Map<Long, SysDepartment> departmentMap = list.stream()
+                    .collect(Collectors.toMap(SysDepartment::getId, dept -> dept));
+            List<SysDepartment> sortedList = departmentIdList.stream()
+                    .map(departmentMap::get)
+                    .collect(Collectors.toList());
+            Set<CarTrackVO> carTrackVOSet = sortedList.stream().map(item -> {
+                CarTrackVO vo = new CarTrackVO();
+                vo.setLatitude(item.getLatitude());
+                vo.setLongitude(item.getLongitude());
+                return vo;
+            }).collect(Collectors.toSet());
+            carDistributionVO.setLineSet(carTrackVOSet);
+        }
+        return carDistributionVO;
+    }
 }
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 dbb9d57..5a457eb 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
@@ -92,11 +92,42 @@
                 childrenMap = getChildrenDepartmentByOrgType(myDepartment, null);
         }
         SysDepartmentVO sysDepartmentVO = fillChildrenTreeModel(myDepartment, childrenMap);
+        switch (type) {
+            case 2:
+            case 3:
+            case 4:
+                filterEmptyChildren(sysDepartmentVO.getChildren());
+                break;
+        }
         root.add(sysDepartmentVO);
         return root;
     }
 
     /**
+     * 移除子节点为空的区域
+     *
+     * @param departments
+     */
+    private void filterEmptyChildren(List<SysDepartmentVO> departments) {
+        if (departments == null) {
+            return;
+        }
+
+        Iterator<SysDepartmentVO> iterator = departments.iterator();
+        while (iterator.hasNext()) {
+            SysDepartmentVO department = iterator.next();
+
+            // 递归过滤子节点
+            filterEmptyChildren(department.getChildren());
+
+            // 如果 orgType == 1 且 children 为空,则移除当前节点
+            if (department.getOrgType() == 1 && department.getChildren().isEmpty()) {
+                iterator.remove();
+            }
+        }
+    }
+
+    /**
      * @param myDepartment
      * @param orgTypes     查询区域类型列表
      * @return
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java
index 952eecf..cda9e1c 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java
@@ -1,6 +1,7 @@
 package com.sinata.system.service.impl;
 
 import cn.idev.excel.util.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sinata.common.core.domain.entity.SysDictData;
@@ -8,6 +9,7 @@
 import com.sinata.common.entity.PageDTO;
 import com.sinata.common.exception.ServiceException;
 import com.sinata.common.utils.BeanUtils;
+import com.sinata.common.utils.CollUtils;
 import com.sinata.common.utils.DictUtils;
 import com.sinata.system.domain.dto.SysDictDataDTO;
 import com.sinata.system.domain.query.KeyWordQuery;
@@ -21,6 +23,7 @@
 
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 字典 业务层处理
@@ -128,6 +131,17 @@
     @Override
     public PageDTO<SysDictDataVO> pageList(KeyWordQuery query) {
         Page<SysDictData> result = this.lambdaQuery().like(StringUtils.isNotBlank(query.getKeyword()), SysDictData::getDictLabel, query.getKeyword()).page(new Page<>(query.getPageCurr(), query.getPageSize()));
+        List<String> dictTypeList = result.getRecords().stream().map(SysDictData::getDictType).distinct().collect(Collectors.toList());
+        if (CollUtils.isNotEmpty(dictTypeList)) {
+            List<SysDictType> sysDictTypes = dictTypeMapper.selectList(new LambdaQueryWrapper<SysDictType>().in(SysDictType::getDictType, dictTypeList));
+            result.getRecords().forEach(sysDictData -> {
+                sysDictTypes.forEach(sysDictType -> {
+                    if (sysDictType.getDictType().equals(sysDictData.getDictType())) {
+                        sysDictData.setDictType(sysDictType.getDictName());
+                    }
+                });
+            });
+        }
         return PageDTO.of(result, SysDictDataVO.class);
     }
 
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysRoleServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysRoleServiceImpl.java
index a531559..96ba621 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysRoleServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysRoleServiceImpl.java
@@ -38,6 +38,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -526,7 +527,7 @@
         return res;
     }
 
-    @Override
+    /*@Override
     public List<SysMenu> getMenuLevelList(List<Long> menusId) {
         //获取当前的权限菜单
         List<SysMenu> all = menuMapper.getAllInIds(menusId);
@@ -553,6 +554,39 @@
             menu.setChildren(collect);
         }
         return s1;
+    }*/
+    @Override
+    public List<SysMenu> getMenuLevelList(List<Long> menusId) {
+        //获取当前的权限菜单
+        List<SysMenu> all = menuMapper.getAllInIds(menusId);
+
+        // 第一级
+        List<SysMenu> s1 = all.stream().filter(e -> e.getMenuType().equals("M"))
+                .collect(Collectors.toList());
+        // 构建以 parentId 为键的 Map
+        Map<Long, List<SysMenu>> menuMap = all.stream()
+                .collect(Collectors.groupingBy(SysMenu::getParentId));
+        //封装树形层级
+        buildMenuTree(menuMap, s1);
+        return s1;
+    }
+
+    /**
+     * 封装树形层级
+     *
+     * @param menuMap
+     * @param s1
+     */
+    public void buildMenuTree(Map<Long, List<SysMenu>> menuMap, List<SysMenu> s1) {
+        for (SysMenu sysMenu : s1) {
+            // 获取当前菜单的子级
+            List<SysMenu> children = menuMap.getOrDefault(sysMenu.getMenuId(), new ArrayList<>());
+            sysMenu.setChildren(children);
+            //移除当前菜单
+            menuMap.remove(sysMenu.getMenuId());
+            // 递归设置子级菜单
+            buildMenuTree(menuMap, children);
+        }
     }
 
     @Override
@@ -578,4 +612,18 @@
         List<SysRole> list = list();
         return BeanUtils.copyToList(list, SysRoleVO.class);
     }
+
+    /**
+     * 用户菜单权限集合
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public Set<Long> getMenuIdSets(Long userId) {
+        SysRole sysRole = roleMapper.selectRoleByUserId(userId);
+        // 获取当前角色的菜单列表
+        List<SysMenu> menus = menuMapper.selectListByRoleId(sysRole.getRoleId());
+        return menus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet());
+    }
 }
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysUserServiceImpl.java b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysUserServiceImpl.java
index e3afc94..e448565 100644
--- a/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysUserServiceImpl.java
+++ b/medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysUserServiceImpl.java
@@ -576,7 +576,7 @@
         if (StringUtils.isBlank(treeCode)) {
             return PageDTO.empty(0L, 0L);
         }
-        Page<SysUserVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()),  query.getNickName(), query.getRoleId(), treeCode);
+        Page<SysUserVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query.getNickName(), query.getRoleId(), query.getUserName(), treeCode);
         return PageDTO.of(page);
     }
 
@@ -641,6 +641,8 @@
      */
     @Override
     public SysUserVO getDetailInfo(Long userId) {
+        System.out.println("-------------------------------");
+        System.out.println(SecurityUtils.getLoginUser().getUser());
         SysUser sysUser = this.getById(userId);
         SysUserVO sysUserVO = null;
         if (Objects.nonNull(sysUser)) {
diff --git a/medicalWaste-system/src/main/java/com/sinata/system/utils/ImageToBase64.java b/medicalWaste-system/src/main/java/com/sinata/system/utils/ImageToBase64.java
new file mode 100644
index 0000000..cf8c555
--- /dev/null
+++ b/medicalWaste-system/src/main/java/com/sinata/system/utils/ImageToBase64.java
@@ -0,0 +1,31 @@
+package com.sinata.system.utils;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Base64;
+
+public class ImageToBase64 {
+    /**
+     * 网络图片转Base64
+     *
+     * @param imageUrl
+     * @return
+     * @throws IOException
+     */
+    public static String convertImageToBase64(String imageUrl) {
+        try {
+            return Base64.getEncoder().encodeToString(IOUtils.toByteArray(new URL(imageUrl)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public static void main(String[] args) {
+        String imageUrl = "https://ja-medical-service.oss-cn-chengdu.aliyuncs.com/medical/tmp_8d18f8502484db9141a627d807dccb7c20250103015938.png";
+        String base64Image = convertImageToBase64(imageUrl);
+        System.out.println("Base64 Image: " + base64Image);
+    }
+}
\ No newline at end of file
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwBusinessDeviceMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwBusinessDeviceMapper.xml
index e138e2a..e559ce3 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwBusinessDeviceMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwBusinessDeviceMapper.xml
@@ -49,7 +49,10 @@
                 AND MBD.DEVICE_NUMBER LIKE CONCAT('%',#{query.deviceNumber},'%')
             </if>
             <if test="query.deviceName != null and query.deviceName != ''">
-                AND MBD.DEVICE_NAME LIKECONCAT('%',#{query.deviceName},'%')
+                AND MBD.DEVICE_NAME LIKE CONCAT('%',#{query.deviceName},'%')
+            </if>
+            <if test="query.deviceStatus != null">
+                AND MBD.DEVICE_STATUS = #{query.deviceStatus}
             </if>
         </where>
     </select>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml
index 95a25dd..172c993 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml
@@ -87,7 +87,7 @@
         LEFT JOIN SYS_DEPARTMENT sd
         ON mcr.DEPARTMENT_ID = sd.ID
         <where>
-            mcr.DEPARTMENT_ID = #{id}
+            mcr.ID = #{id}
         </where>
     </select>
     <select id="hospitalDetailPage" resultType="com.sinata.system.domain.vo.MwMedicalWasteBoxVO">
@@ -116,13 +116,14 @@
     <select id="transitPageList" resultType="com.sinata.system.domain.vo.MwTransitRecordVO">
         SELECT
         MTRC.ROUTE_ID AS id,
-        MDR.DISPOSAL_UNIT_NAME,
+        SD.DEPARTMENT_NAME,
         MTC.LICENSE_PLATE_NUMBER,
         SU.NICK_NAME,
         SUM(MCR.BOX_NUM) AS boxNum,
         SUM(MCR.TOTAL_WEIGHT) AS weight,
         MIN(MCR2.BOX_TIME) AS startTime,
-        MDR.RECEIVE_TIME AS endTime
+        MDR.RECEIVE_TIME AS endTime,
+        MCR2.STATUS
         FROM MW_CHECKOUT_RECORD MCR
         LEFT JOIN MW_CHECKOUT_RECORD_ITEM MCRI ON MCRI.CHECKOUT_RECORD_ID = MCR.ID
         LEFT JOIN MW_DISPOSAL_RECORD_ITEM MDRI ON MDRI.COLLECT_RECORD_ID = MCRI.COLLECT_RECORD_ID
@@ -143,8 +144,11 @@
             <if test="query.status != null">
                 AND MCR2.STATUS = #{query.status}
             </if>
-            <if test="query.startTime != null and query.endTime != null">
-                AND MDR.RECEIVE_TIME BETWEEN #{query.startTime} AND #{query.endTime}
+            <if test="query.startTimeStart != null and query.startTimeEnd != null">
+                AND MCR2.BOX_TIME BETWEEN #{query.startTimeStart} AND #{query.startTimeEnd}
+            </if>
+            <if test="query.endTimeStart != null and query.endTimeEnd != null">
+                AND MDR.RECEIVE_TIME BETWEEN #{query.endTimeStart} AND #{query.endTimeEnd}
             </if>
         </where>
         GROUP BY MTRC.ROUTE_ID
@@ -182,11 +186,11 @@
                SUM(MCR2.WEIGHT)       AS totalWeight,
                MAX(MCR.CHECKOUT_TIME) AS latestCheckoutTime
         FROM MW_TRANSIT_ROUTE_CAR MTRC
-                 LEFT JOIN MW_CHECKOUT_RECORD MCR on MTRC.CAR_ID = MCR.CAR_ID
+        INNER JOIN MW_CHECKOUT_RECORD MCR on MTRC.CAR_ID = MCR.CAR_ID
                  LEFT JOIN MW_CHECKOUT_RECORD_ITEM MCRI on MCR.ID = MCRI.CHECKOUT_RECORD_ID
                  LEFT JOIN MW_COLLECT_RECORD MCR2 ON MCR2.ID = MCRI.COLLECT_RECORD_ID
         <where>
-            MTRC.DEL_FLAG = 0 AND MTRC.ROUTE_ID = #{id}
+            MTRC.ROUTE_ID = #{id}
         </where>
         GROUP BY MCR2.BOX_ID
         ORDER BY latestCheckoutTime DESC
@@ -308,16 +312,18 @@
         LEFT JOIN MW_COLLECT_RECORD MCR2 ON MCR2.ID = MCRI.COLLECT_RECORD_ID
         LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MCR.DEPARTMENT_ID
         LEFT JOIN SYS_USER SU ON SU.USER_ID = MCR.DRIVER_ID
+        LEFT JOIN MW_DISPOSAL_RECORD_ITEM MDRI ON MDRI.COLLECT_RECORD_ID = MCR.ID
+        LEFT JOIN MW_DISPOSAL_RECORD MDR ON MDR.ID = MDRI.DISPOSAL_RECORD_ID
         <where>
-            <if test="treeCode != null and treeCode != ''">
-                AND SD.TREE_CODE LIKE CONCAT(#{treeCode},'%')
+            <if test="query.departmentId != null">
+                AND MDR.DEPARTMENT_ID = #{query.departmentId}
             </if>
             <if test="query.startTime != null and query.endTime != null">
                 AND MCR.CHECKOUT_TIME BETWEEN #{query.startTime} AND #{query.endTime}
             </if>
-            <if test="query.wasteTypeList != null and query.wasteTypeList.size()>0">
+            <if test="query.wasteTypeCodeList != null and query.wasteTypeCodeList.size()>0">
                 AND MCR2.WASTE_TYPE IN
-                <foreach collection="query.wasteTypeList" item="wasteType" separator="," open="(" close=")">
+                <foreach collection="query.wasteTypeCodeList" item="wasteType" separator="," open="(" close=")">
                     #{wasteType}
                 </foreach>
             </if>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml
index 19af9fd..a90a70f 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml
@@ -35,16 +35,16 @@
         ID, DEPARTMENT_ID, DISPOSAL_UNIT_NAME, RECEIVE_QUANTITY, RECEIVE_TIME, RECEIVE_WEIGHT, RECEIVER_ID, UNLOAD_QUANTITY, UNLOAD_WEIGHT, TOTAL_HANDLED_QUANTITY, DISPOSAL_FLAG, TOTAL_HANDLED_WEIGHT, DISPOSAL_TIME, DISPOSAL_USER_ID
     </sql>
     <select id="getStaticsData" resultType="com.sinata.system.domain.vo.DisposalRecordStaticsVO">
-        SELECT SUM(MDR.RECEIVE_QUANTITY) AS receivedQuantity,
-        SUM(MDR.RECEIVE_WEIGHT) AS receivedWeight,
-        SUM(MDR.RECEIVE_QUANTITY) AS unloadQuantity,
-        SUM(MDR.RECEIVE_WEIGHT) AS unloadWeight,
-        SUM(MCR.WEIGHT) AS totalHandledWeight,
-        COUNT(DISTINCT MCR.BOX_NUMBER) AS totalHandledQuantity
+        SELECT COALESCE(SUM(MDR.RECEIVE_QUANTITY),0) AS receivedQuantity,
+        COALESCE(SUM(MDR.RECEIVE_WEIGHT),0) AS receivedWeight,
+        COALESCE(SUM(MDR.RECEIVE_QUANTITY),0) AS unloadQuantity,
+        COALESCE(SUM(MDR.RECEIVE_WEIGHT),0) AS unloadWeight,
+        COALESCE(SUM(MCR.WEIGHT),0) AS totalHandledWeight,
+        COALESCE(COUNT(DISTINCT MCR.BOX_NUMBER),0) AS totalHandledQuantity
         FROM MW_DISPOSAL_RECORD MDR
         LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MDR.DEPARTMENT_ID
-        LEFT JOIN MW_DISPOSAL_HANDLE_RECORD MDHR ON MDHR.DISPOSAL_RECORD_ID = MDR.ID
-        LEFT JOIN MW_COLLECT_RECORD MCR ON MCR.DISPOSAL_HANDLE_RECORD_ID = MDHR.ID
+        LEFT JOIN MW_DISPOSAL_HANDLE_RECORD_ITEM MDHRI ON MDHRI.DISPOSAL_RECORD_ID = MDR.ID
+        LEFT JOIN MW_COLLECT_RECORD MCR ON MCR.DISPOSAL_HANDLE_RECORD_ID = MDHRI.DISPOSAL_HANDLE_RECORD_ID
         <where>
             MDR.DEL_FLAG = 0
             <if test="treeCode != null and treeCode !=''">
@@ -78,6 +78,7 @@
         FROM MW_DISPOSAL_RECORD MDR
         LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MDR.DEPARTMENT_ID
         LEFT JOIN MW_DISPOSAL_HANDLE_RECORD_ITEM MDHRI ON MDHRI.DISPOSAL_RECORD_ID = MDR.ID
+        LEFT JOIN MW_COLLECT_RECORD MCR ON MCR.ID = MDHRI.COLLECT_RECORD_ID
         <where>
             MDR.DEL_FLAG = 0
             <if test="treeCode != null and treeCode !=''">
@@ -87,22 +88,23 @@
                 AND MDR.RECEIVE_TIME BETWEEN #{query.receiveTimeStart} AND #{query.receiveTimeEnd}
             </if>
         </where>
+        GROUP BY MDR.ID
         ORDER BY MDR.RECEIVE_TIME DESC
     </select>
     <select id="pageDetail" resultType="com.sinata.system.domain.vo.MwDisposalRecordItemVO">
         SELECT MCR.BOX_NUMBER,
         COUNT(MCR.ID) AS bagNum,
-        IFNULL(SUM(MCR.WEIGHT), 0) AS weight,
+        IFNULL(SUM(MCR.WEIGHT),0) AS weight,
         MDHR.DISPOSAL_TIME
         FROM MW_DISPOSAL_HANDLE_RECORD_ITEM MDHRI
         LEFT JOIN MW_COLLECT_RECORD MCR ON MCR.ID = MDHRI.COLLECT_RECORD_ID
         LEFT JOIN MW_DISPOSAL_HANDLE_RECORD MDHR ON MDHR.ID= MDHRI.DISPOSAL_HANDLE_RECORD_ID
         <where>
             <if test="disposalRecordId != null">
-                AND MDHR.DISPOSAL_RECORD_ID = #{disposalRecordId}
+                AND MDHRI.DISPOSAL_RECORD_ID = #{disposalRecordId}
             </if>
         </where>
-        GROUP BY MCR.BOX_NUMBER
+        GROUP BY MCR.BOX_NUMBER,MDHRI.DISPOSAL_RECORD_ID
     </select>
     <select id="disposalReceiveReport" resultType="com.sinata.system.domain.vo.MwDisposalRecordReportVO">
         SELECT MCR.ID, MDR.RECEIVE_TIME, MDR.DISPOSAL_TIME, MCR.WASTE_TYPE, MCR.WEIGHT, MCR.STATUS
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwMicroEquipmentRecordMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwMicroEquipmentRecordMapper.xml
index 62e3bc1..da9d167 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwMicroEquipmentRecordMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwMicroEquipmentRecordMapper.xml
@@ -103,9 +103,6 @@
         LEFT JOIN SYS_DEPARTMENT sd ON sd.ID = mme.DEPARTMENT_ID
         <where>
             mmer.DEL_FLAG = 0
-            <if test="treeCode != null and treeCode != ''">
-                AND sd.TREE_CODE like concat(#{treeCode},'%')
-            </if>
             <if test="query.equipmentId != null">
                 AND mmer.EQUIPMENT_ID = #{query.equipmentId}
             </if>
@@ -113,6 +110,7 @@
                 AND mmer.USE_TIME BETWEEN #{query.startTime} AND #{query.endTime}
             </if>
         </where>
+        GROUP BY mmer.ID
     </select>
 
 </mapper>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwStaffMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwStaffMapper.xml
index 18f49ff..24eb5fc 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwStaffMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwStaffMapper.xml
@@ -50,13 +50,13 @@
             <if test="query.healthCertificateFlag != null and query.healthCertificateFlag == 1">
                 AND MS.HEALTH_CERTIFICATE IS NOT NULL
             </if>
-            <if test="query.healthCertificateFlag != null and query.healthCertificateFlag != 1">
+            <if test="query.healthCertificateFlag != null and query.healthCertificateFlag == 0">
                 AND MS.HEALTH_CERTIFICATE IS NULL
             </if>
             <if test="query.vaccineCertificateFlag != null and query.vaccineCertificateFlag == 1">
                 AND MS.VACCINE_CERTIFICATE IS NOT NULL
             </if>
-            <if test="query.vaccineCertificateFlag != null and query.vaccineCertificateFlag != 1">
+            <if test="query.vaccineCertificateFlag != null and query.vaccineCertificateFlag == 0">
                 AND MS.VACCINE_CERTIFICATE IS NULL
             </if>
         </where>
diff --git a/medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml
index 407ad4d..8e395d4 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml
@@ -35,8 +35,8 @@
         (msr.MAX_CAPACITY - COUNT(mr.ID)) AS unUsedNum,
         sd.DEPARTMENT_NAME AS hospitalName
         FROM MW_STAGING_ROOM msr
-        LEFT JOIN (SELECT ID, BOX_ID, STAGING_ROOM_ID FROM MW_COLLECT_RECORD WHERE STATUS = 1 GROUP BY BOX_ID) mr
-        ON msr.ID = mr.STAGING_ROOM_ID
+        LEFT JOIN (SELECT MAX(ID) AS ID, BOX_ID, STAGING_ROOM_ID
+        FROM MW_COLLECT_RECORD WHERE STATUS = 1 GROUP BY BOX_ID, STAGING_ROOM_ID ) mr ON msr.ID = mr.STAGING_ROOM_ID
         LEFT JOIN SYS_DEPARTMENT sd ON msr.DEPARTMENT_ID = sd.ID
         <where>
             msr.DEL_FLAG = 0
@@ -44,6 +44,7 @@
                 AND sd.TREE_CODE LIKE CONCAT(#{treeCode}, '%')
             </if>
         </where>
+        GROUP BY msr.ID
         ORDER BY msr.CREATE_TIME DESC
     </select>
     <select id="storageRecordPage" resultType="com.sinata.system.domain.vo.MwStorageRecordVO">
@@ -73,7 +74,7 @@
         FROM MW_COLLECT_RECORD mcr
         LEFT JOIN SYS_USER su
         ON mcr.COLLECT_USER_ID = su.USER_ID
-        LEFT JOIN SYS_DEPARTMENT sd ON su.DEPARTMENT_ID = sd.ID
+        LEFT JOIN SYS_DEPARTMENT sd ON mcr.DEPARTMENT_ID = sd.ID
         LEFT JOIN MW_STAGING_ROOM msr ON msr.ID = mcr.STAGING_ROOM_ID
         <where>
             mcr.DEL_FLAG = 0
diff --git a/medicalWaste-system/src/main/resources/mapper/system/SysUserMapper.xml b/medicalWaste-system/src/main/resources/mapper/system/SysUserMapper.xml
index 616079a..83b6fa3 100644
--- a/medicalWaste-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/medicalWaste-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -44,12 +44,19 @@
         <result property="roleSort"     column="role_sort"      />
         <result property="dataScope"    column="data_scope"     />
         <result property="status"       column="role_status"    />
+		<result property="appletFlag" column="applet_flag"/>
     </resultMap>
 	
 	<sql id="selectUserVo">
         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, 
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
-        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
+			   r.role_id,
+			   r.role_name,
+			   r.role_key,
+			   r.role_sort,
+			   r.data_scope,
+			   r.status as role_status,
+			   r.applet_flag
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.dept_id
 		    left join sys_user_role ur on u.user_id = ur.user_id
@@ -161,6 +168,9 @@
 			<if test="nickName != null and nickName != ''">
 				AND su.NICK_NAME LIKE CONCAT('%',#{nickName},'%')
 			</if>
+			<if test="userName != null and userName != ''">
+				AND su.USER_NAME LIKE CONCAT('%',#{userName},'%')
+			</if>
 			<if test="roleId != null and roleId != ''">
 				AND sur.ROLE_ID = #{roleId}
 			</if>
@@ -168,6 +178,7 @@
 				AND sd.TREE_CODE LIKE CONCAT(#{treeCode},'%')
 			</if>
 		</where>
+		ORDER BY su.CREATE_TIME DESC
 	</select>
 
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">

--
Gitblit v1.7.1