wwh hace 1 año
padre
commit
08b0218f9a
Se han modificado 26 ficheros con 1198 adiciones y 22 borrados
  1. 3 1
      src/main/java/com/huimv/wine/entity/Advertise.java
  2. 3 1
      src/main/java/com/huimv/wine/entity/Refund.java
  3. 15 0
      src/main/java/com/huimv/wine/entity/vo/DevicesQueryVo.java
  4. 10 0
      src/main/java/com/huimv/wine/entity/vo/ParamsVo.java
  5. 51 0
      src/main/java/com/huimv/wine/entity/vo/TradeQueryVo.java
  6. 2 0
      src/main/java/com/huimv/wine/mapper/AdvertiseMapper.java
  7. 8 0
      src/main/java/com/huimv/wine/mapper/ChangeMapper.java
  8. 15 0
      src/main/java/com/huimv/wine/mapper/DeviceMapper.java
  9. 4 0
      src/main/java/com/huimv/wine/mapper/ManagerMapper.java
  10. 4 0
      src/main/java/com/huimv/wine/mapper/TradeMapper.java
  11. 7 0
      src/main/java/com/huimv/wine/mapper/WineMapper.java
  12. 49 0
      src/main/java/com/huimv/wine/utils/Base64ImageSaver.java
  13. 13 4
      src/main/java/com/huimv/wine/ws/ManagerController.java
  14. 1 1
      src/main/java/com/huimv/wine/ws/WorkerController.java
  15. 265 0
      src/main/java/com/huimv/wine/ws/admin/AdminDashboard.java
  16. 512 0
      src/main/java/com/huimv/wine/ws/su/SuperConfig.java
  17. 1 1
      src/main/java/com/huimv/wine/ws/su/SuperDashboard.java
  18. 121 6
      src/main/java/com/huimv/wine/ws/su/SuperOrder.java
  19. 19 0
      src/main/java/com/huimv/wine/ws/su/SuperRecord.java
  20. 4 0
      src/main/resources/com/huimv/wine/mapper/AdvertiseMapper.xml
  21. 15 0
      src/main/resources/com/huimv/wine/mapper/ChangeMapper.xml
  22. 37 0
      src/main/resources/com/huimv/wine/mapper/DeviceMapper.xml
  23. 4 0
      src/main/resources/com/huimv/wine/mapper/ManagerMapper.xml
  24. 12 0
      src/main/resources/com/huimv/wine/mapper/TradeMapper.xml
  25. 14 0
      src/main/resources/com/huimv/wine/mapper/WineMapper.xml
  26. 9 8
      src/main/resources/com/huimv/wine/mapper/WorkerMapper.xml

+ 3 - 1
src/main/java/com/huimv/wine/entity/Advertise.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
+import java.util.Date;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -36,7 +38,7 @@ public class Advertise implements Serializable {
     /**
      * 上线时间
      */
-    private LocalDateTime time;
+    private Date time;
 
     /**
      * 1图片,0视频

+ 3 - 1
src/main/java/com/huimv/wine/entity/Refund.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+import java.util.Date;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -39,7 +41,7 @@ public class Refund implements Serializable {
     /**
      * 时间
      */
-    private LocalDateTime time;
+    private Date time;
 
     /**
      * 金额

+ 15 - 0
src/main/java/com/huimv/wine/entity/vo/DevicesQueryVo.java

@@ -0,0 +1,15 @@
+package com.huimv.wine.entity.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class DevicesQueryVo {
+    private String id;
+    private String addr;
+    private Date first;
+    private Date last;
+    private String mark;
+    private ManagerVo managerVo;
+}

+ 10 - 0
src/main/java/com/huimv/wine/entity/vo/ParamsVo.java

@@ -0,0 +1,10 @@
+package com.huimv.wine.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class ParamsVo {
+    private Integer id;
+    private String name;
+    private Integer value;
+}

+ 51 - 0
src/main/java/com/huimv/wine/entity/vo/TradeQueryVo.java

@@ -0,0 +1,51 @@
+package com.huimv.wine.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+public class TradeQueryVo {
+    /**
+     * 订单id
+     */
+    private String id;
+
+    /**
+     * 设备
+     */
+    private String device;
+
+    /**
+     * 时间
+     */
+    private Date time;
+
+
+    /**
+     * 酒id
+     */
+    private Integer wine;
+
+    /**
+     * 单价
+     */
+    private Integer price;
+
+    /**
+     * 重量
+     */
+    private Integer weight;
+
+    /**
+     * 金额
+     */
+    private Integer cash;
+
+    private String reason;
+
+    private Integer refund;
+}

+ 2 - 0
src/main/java/com/huimv/wine/mapper/AdvertiseMapper.java

@@ -1,5 +1,6 @@
 package com.huimv.wine.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.wine.entity.Advertise;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
@@ -17,4 +18,5 @@ public interface AdvertiseMapper extends BaseMapper<Advertise> {
 
     List<Advertise> listAll();
 
+//    Page<Advertise> AdvertisesQuery(Page<Advertise> page,String desc,String type);
 }

+ 8 - 0
src/main/java/com/huimv/wine/mapper/ChangeMapper.java

@@ -7,6 +7,8 @@ import com.huimv.wine.entity.vo.QueryAdminVo;
 
 import java.util.List;
 import com.huimv.wine.entity.vo.ChangeQueryResult;
+import com.huimv.wine.entity.vo.RankAdminsVo;
+import com.huimv.wine.entity.vo.RankDevicesVo;
 
 /**
  * <p>
@@ -24,5 +26,11 @@ public interface ChangeMapper extends BaseMapper<Change> {
 
     List<QueryAdminVo> changeQueryWorker2(String id,Integer days,String type);
 
+    List<RankAdminsVo> ChangeRankWorkersForAdmin(String manager, String start, String end);
+
+    List<QueryAdminVo> ChangeQueryWorkerForAdmin(String managerId, String id);
+
+    List<QueryAdminVo> ChangeQueryWorkerForAdmin2(String managerId, String id, Integer days,String type);
+
     Page<ChangeQueryResult> changesQuery(Page<ChangeQueryResult> page, String managerId, String workerId, String like, Integer status);
 }

+ 15 - 0
src/main/java/com/huimv/wine/mapper/DeviceMapper.java

@@ -1,10 +1,15 @@
 package com.huimv.wine.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.wine.entity.Device;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huimv.wine.entity.vo.DeviceWithIdAddrVo;
+import com.huimv.wine.entity.vo.DevicesQueryVo;
+import com.huimv.wine.entity.vo.RankDevicesVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 设备 Mapper 接口
@@ -22,4 +27,14 @@ public interface DeviceMapper extends BaseMapper<Device> {
     void updateDeviceById(Device device);
 
     DeviceWithIdAddrVo getDeviceByDeviceId(@Param(value = "deviceId") String deviceId);
+
+    Page<DevicesQueryVo> devicesQuery(Page<DevicesQueryVo> page,String cond);
+
+    Page<DevicesQueryVo> devicesQuery2(Page<DevicesQueryVo> page,String cond);
+
+    Page<DevicesQueryVo> devicesQuery3(Page<DevicesQueryVo> page,String cond,String manager);
+
+    void DevicesAssignManager(@Param(value = "list")List<String> list, @Param(value = "manager")String manager);
+
+    List<RankDevicesVo> TradeRankDevicesForAdmin(String manager, String start, String end);
 }

+ 4 - 0
src/main/java/com/huimv/wine/mapper/ManagerMapper.java

@@ -4,6 +4,8 @@ import com.huimv.wine.entity.Manager;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huimv.wine.entity.vo.ManagerVo;
 
+import java.util.List;
+
 /**
  * <p>
  * 管理员 Mapper 接口
@@ -14,4 +16,6 @@ import com.huimv.wine.entity.vo.ManagerVo;
  */
 public interface ManagerMapper extends BaseMapper<Manager> {
     ManagerVo getManagerVo(String id);
+
+    List<ManagerVo> ManagerQuery(String name);
 }

+ 4 - 0
src/main/java/com/huimv/wine/mapper/TradeMapper.java

@@ -9,6 +9,7 @@ import com.huimv.wine.entity.vo.QueryAdminVo;
 import com.huimv.wine.entity.vo.RankAdminsVo;
 import com.huimv.wine.entity.vo.RankDevicesVo;
 import com.huimv.wine.entity.vo.TradeQueryForAdminResult;
+import com.huimv.wine.entity.vo.TradeQueryVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -38,4 +39,7 @@ public interface TradeMapper extends BaseMapper<Trade> {
     List<QueryAdminVo> queryAdmins4(String id, Integer days,String type);
 
     Page<TradeQueryForAdminResult> tradeQueryForAdmin(Page<TradeQueryForAdminResult> page, String managerId, String like, String uid);
+    List<TradeQueryVo> tradeQuery(Page<TradeQueryVo> page, String uid, String cond);
+
+    List<RankAdminsVo> TradeRankWinesForAdmin(String manager, String start, String end);
 }

+ 7 - 0
src/main/java/com/huimv/wine/mapper/WineMapper.java

@@ -1,5 +1,6 @@
 package com.huimv.wine.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.wine.entity.Wine;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huimv.wine.entity.vo.WineWithIdNameVo;
@@ -19,5 +20,11 @@ public interface WineMapper extends BaseMapper<Wine> {
 
     Wine selectWineById(@Param(value = "id")Integer id);
 
+    Page<Wine> WinesQuery(Page<Wine> page, String cond);
+
+    Page<Wine> WinesQuery2(Page<Wine> page, String cond);
+
+    void WinesDelete(@Param(value = "ids") List<Integer> ids);
+
     List<WineWithIdNameVo> WinesQueryByIdOrName(String like);
 }

+ 49 - 0
src/main/java/com/huimv/wine/utils/Base64ImageSaver.java

@@ -0,0 +1,49 @@
+package com.huimv.wine.utils;
+
+import java.io.IOException;
+import java.nio.file.Files;  
+import java.nio.file.Path;  
+import java.nio.file.Paths;  
+import java.util.Base64;  
+  
+public class Base64ImageSaver {  
+  
+    public static String saveBase64(String base64Image, String filePath) {  
+        // 分割Base64字符串为两部分:头部信息和编码数据  
+        String[] parts = base64Image.split(",", 2);  
+        if (parts.length != 2) {  
+            throw new IllegalArgumentException("Invalid Base64 image string format");  
+        }  
+        String contentType = parts[0];  
+        String base64Data = parts[1];  
+  
+        // 解码Base64数据  
+        byte[] decodedBytes = Base64.getDecoder().decode(base64Data);  
+  
+        // 提取文件扩展名  
+        String ext = contentType.split("/")[1].split(";")[0];  
+  
+        // 拼接完整的文件路径,包括扩展名  
+        Path filePathWithExt = Paths.get(filePath).resolve(filePath + "." + ext);  
+  
+        try {  
+            // 将解码后的数据写入文件  
+            Files.write(filePathWithExt, decodedBytes);  
+        } catch (IOException e) {  
+            // 处理文件写入错误  
+            e.printStackTrace();  
+            return "文件存储失败: " + e.getMessage();  
+        }  
+  
+        // 如果一切顺利,返回保存的文件路径  
+        return filePathWithExt.toString();  
+    }  
+  
+    public static void main(String[] args) {  
+        String base64Image = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAUDBAQEAwUEBAQFBgcGBggHBwcICxIB..."; // 示例Base64编码的图像字符串  
+        String filePath = "path/to/save/image"; // 不包括扩展名的文件路径  
+  
+        String result = saveBase64(base64Image, filePath);  
+        System.out.println(result); // 打印保存的文件路径或错误信息  
+    }  
+}

+ 13 - 4
src/main/java/com/huimv/wine/ws/ManagerController.java

@@ -6,11 +6,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.huimv.wine.entity.Manager;
-import com.huimv.wine.entity.Worker;
+
 import com.huimv.wine.entity.vo.WsEvent;
-import com.huimv.wine.mapper.DeviceMapper;
+
 import com.huimv.wine.mapper.ManagerMapper;
-import com.huimv.wine.mapper.WorkerMapper;
+
 import com.huimv.wine.utils.*;
 import com.huimv.wine.ws.admin.AdminTrade;
 import com.huimv.wine.ws.admin.AdminWine;
@@ -18,9 +18,12 @@ import com.huimv.wine.ws.admin.AdminWorker;
 import com.huimv.wine.ws.su.SuperDashboard;
 import com.huimv.wine.ws.su.SuperOrder;
 import com.huimv.wine.ws.su.SuperRole;
+import com.huimv.wine.ws.admin.AdminDashboard;
+import com.huimv.wine.ws.su.*;
+
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
-import org.springframework.util.ObjectUtils;
+
 import org.springframework.web.socket.handler.TextWebSocketHandler;
 
 import javax.websocket.*;
@@ -120,8 +123,14 @@ public class ManagerController extends TextWebSocketHandler {
                 SuperOrder superOrder = new SuperOrder();
                 superOrder.handle(event, data, session, manager);
             } else if (event.startsWith("superConfig")) {
+                SuperConfig superConfig = new SuperConfig();
+                superConfig.handle(event, data, session, manager);
             } else if (event.startsWith("superRecord")) {
+                SuperRecord superRecord = new SuperRecord();
+                superRecord.handle(event, data, session, manager);
             } else if (event.startsWith("adminDashboard")) {
+                AdminDashboard adminDashboard = new AdminDashboard();
+                adminDashboard.handle(event, data, session, manager);
             } else if (event.startsWith("adminWorker")) {
                 AdminWorker adminWorker = SpringContextUtil.getBean(AdminWorker.class);
                 adminWorker.handle(jsonObject, session, manager);

+ 1 - 1
src/main/java/com/huimv/wine/ws/WorkerController.java

@@ -23,7 +23,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.socket.WebSocketMessage;
 import org.springframework.web.socket.handler.TextWebSocketHandler;
-import sun.nio.cs.ext.MacArabic;
+
 
 import javax.websocket.*;
 import javax.websocket.server.PathParam;

+ 265 - 0
src/main/java/com/huimv/wine/ws/admin/AdminDashboard.java

@@ -0,0 +1,265 @@
+package com.huimv.wine.ws.admin;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.huimv.wine.common.EventWsErrUtil;
+import com.huimv.wine.entity.Manager;
+import com.huimv.wine.entity.Trade;
+import com.huimv.wine.entity.vo.QueryAdminVo;
+import com.huimv.wine.entity.vo.RankAdminsVo;
+import com.huimv.wine.entity.vo.RankDevicesVo;
+import com.huimv.wine.entity.vo.WsEvent;
+import com.huimv.wine.mapper.ChangeMapper;
+import com.huimv.wine.mapper.DeviceMapper;
+import com.huimv.wine.mapper.TradeMapper;
+import com.huimv.wine.utils.Result;
+import com.huimv.wine.utils.WebsocketManagerUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.Session;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class AdminDashboard {
+    @Autowired
+    private TradeMapper tradeMapper;
+    @Autowired
+    private DeviceMapper deviceMapper;
+    @Autowired
+    private ChangeMapper changeMapper;
+
+    public void handle(String event, JSONObject data, Session session, Manager manager) {
+        switch (event) {
+            case "adminDashboardRankDevices":
+                rankDevices(session, manager, data);
+                break;
+            case "adminDashboardRankWines":
+                rankWines(session, manager, data);
+                break;
+            case "adminDashboardRankWorkers":
+                rankWorkers(session, manager, data);
+                break;
+            case "adminDashboardQuerySelf":
+                querySelf(session, manager, data);
+                break;
+            case "adminDashboardQueryDevice":
+                queryDevice(session, manager, data);
+                break;
+            case "adminDashboardQueryWine":
+                queryWine(session, manager, data);
+                break;
+            case "adminDashboardQueryWorker":
+                queryWorker(session, manager, data);
+                break;
+            default:
+                WsEvent wsEvent = EventWsErrUtil.getWsErr("unrecognized event");
+                WebsocketManagerUtil.sendMessage(session, wsEvent);
+                break;
+        }
+    }
+
+    public void rankDevices(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("start")) || StringUtils.isBlank(data.getString("end"))) {
+            WsEvent wsEvent = new WsEvent("adminDashboardRankDevicesRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        List<RankDevicesVo> rankDevicesVos = deviceMapper.TradeRankDevicesForAdmin(manager.getId(), data.getString("start"), data.getString("end"));
+        WsEvent wsEvent = new WsEvent("adminDashboardRankDevicesRes", Result.success(rankDevicesVos));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void rankWines(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("start")) || StringUtils.isBlank(data.getString("end"))) {
+            WsEvent wsEvent = new WsEvent("adminDashboardRankWinesRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        List<RankAdminsVo> rankAdminsVos = tradeMapper.TradeRankWinesForAdmin(manager.getId(), data.getString("start"), data.getString("end"));
+        WsEvent wsEvent = new WsEvent("adminDashboardRankWinesRes", Result.success(rankAdminsVos));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void rankWorkers(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("start")) || StringUtils.isBlank(data.getString("end"))) {
+            WsEvent wsEvent = new WsEvent("adminDashboardRankWorkersRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        List<RankAdminsVo> rankAdminsVos = changeMapper.ChangeRankWorkersForAdmin(manager.getId(), data.getString("start"), data.getString("end"));
+        WsEvent wsEvent = new WsEvent("adminDashboardRankWorkersRes", Result.success(rankAdminsVos));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void querySelf(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("id")) || data.getInteger("type") == null) {
+            WsEvent wsEvent = new WsEvent("adminDashboardQuerySelfRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer type = data.getInteger("type");
+        if (0 == type) {
+            QueryWrapper<Trade> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("manager", data.getString("id"));
+            List<QueryAdminVo> queryAdmins = tradeMapper.queryAdmins(queryWrapper);
+            WsEvent wsEvent = new WsEvent("adminDashboardQuerySelfRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+        } else {
+            List<QueryAdminVo> queryAdmins = new ArrayList<>();
+            switch (type) {
+                case 1:
+                    queryAdmins = tradeMapper.queryAdmins2(data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+                case 2:
+                    queryAdmins = tradeMapper.queryAdmins2(data.getString("id"), 30, "%Y-%m-%d");
+                    break;
+                case 3:
+                    queryAdmins = tradeMapper.queryAdmins2(data.getString("id"), 120, "%Y-%m");
+                    break;
+                case 4:
+                    queryAdmins = tradeMapper.queryAdmins2(data.getString("id"), 180, "%Y-%m");
+                    break;
+                case 5:
+                    queryAdmins = tradeMapper.queryAdmins2(data.getString("id"), 360, "%Y-%m");
+                    break;
+                default:
+                    queryAdmins = tradeMapper.queryAdmins2(data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+            }
+            WsEvent wsEvent = new WsEvent("adminDashboardQuerySelfRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+    }
+
+    public void queryDevice(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("id")) || data.getInteger("type") == null) {
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryDeviceRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer type = data.getInteger("type");
+        if (0 == type) {
+            QueryWrapper<Trade> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("manager", manager.getId());
+            queryWrapper.eq("device", data.getString("id"));
+            List<QueryAdminVo> queryAdmins = tradeMapper.queryAdmins(queryWrapper);
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryDeviceRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+        } else {
+            List<QueryAdminVo> queryAdmins = new ArrayList<>();
+            switch (type) {
+                case 1:
+                    queryAdmins = tradeMapper.queryAdmins3(data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+                case 2:
+                    queryAdmins = tradeMapper.queryAdmins3(data.getString("id"), 30, "%Y-%m-%d");
+                    break;
+                case 3:
+                    queryAdmins = tradeMapper.queryAdmins3(data.getString("id"), 120, "%Y-%m");
+                    break;
+                case 4:
+                    queryAdmins = tradeMapper.queryAdmins3(data.getString("id"), 180, "%Y-%m");
+                    break;
+                case 5:
+                    queryAdmins = tradeMapper.queryAdmins3(data.getString("id"), 360, "%Y-%m");
+                    break;
+                default:
+                    queryAdmins = tradeMapper.queryAdmins3(data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+            }
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryDeviceRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+    }
+
+    public void queryWine(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("id")) || data.getInteger("type") == null) {
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryWineRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer type = data.getInteger("type");
+        if (0 == type) {
+            QueryWrapper<Trade> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("manager", manager.getId());
+            queryWrapper.eq("wine", data.getString("id"));
+            List<QueryAdminVo> queryAdmins = tradeMapper.queryAdmins(queryWrapper);
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryWineRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+        } else {
+            List<QueryAdminVo> queryAdmins = new ArrayList<>();
+            switch (type) {
+                case 1:
+                    queryAdmins = tradeMapper.queryAdmins4(data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+                case 2:
+                    queryAdmins = tradeMapper.queryAdmins4(data.getString("id"), 30, "%Y-%m-%d");
+                    break;
+                case 3:
+                    queryAdmins = tradeMapper.queryAdmins4(data.getString("id"), 120, "%Y-%m");
+                    break;
+                case 4:
+                    queryAdmins = tradeMapper.queryAdmins4(data.getString("id"), 180, "%Y-%m");
+                    break;
+                case 5:
+                    queryAdmins = tradeMapper.queryAdmins4(data.getString("id"), 360, "%Y-%m");
+                    break;
+                default:
+                    queryAdmins = tradeMapper.queryAdmins4(data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+            }
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryWineRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+    }
+
+    public void queryWorker(Session session, Manager manager, JSONObject data) {
+        if (StringUtils.isBlank(data.getString("id")) || data.getInteger("type") == null) {
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryWorkerRes", Result.fail("参数错误"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer type = data.getInteger("type");
+        if (data.getInteger("type") == 0) {
+            List<QueryAdminVo> adminVos = changeMapper.ChangeQueryWorkerForAdmin(manager.getId(), data.getString("id"));
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryWorkerRes", Result.success(adminVos));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        } else {
+            List<QueryAdminVo> queryAdmins = new ArrayList<>();
+            switch (type) {
+                case 1:
+                    queryAdmins = changeMapper.ChangeQueryWorkerForAdmin2(manager.getId(),data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+                case 2:
+                    queryAdmins = changeMapper.ChangeQueryWorkerForAdmin2(manager.getId(),data.getString("id"), 30, "%Y-%m-%d");
+                    break;
+                case 3:
+                    queryAdmins = changeMapper.ChangeQueryWorkerForAdmin2(manager.getId(),data.getString("id"), 120, "%Y-%m");
+                    break;
+                case 4:
+                    queryAdmins = changeMapper.ChangeQueryWorkerForAdmin2(manager.getId(),data.getString("id"), 180, "%Y-%m");
+                    break;
+                case 5:
+                    queryAdmins = changeMapper.ChangeQueryWorkerForAdmin2(manager.getId(),data.getString("id"), 360, "%Y-%m");
+                    break;
+                default:
+                    queryAdmins = changeMapper.ChangeQueryWorkerForAdmin2(manager.getId(),data.getString("id"), 7, "%Y-%m-%d");
+                    break;
+            }
+            WsEvent wsEvent = new WsEvent("adminDashboardQueryWorkerRes", Result.success(queryAdmins));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+    }
+}

+ 512 - 0
src/main/java/com/huimv/wine/ws/su/SuperConfig.java

@@ -0,0 +1,512 @@
+package com.huimv.wine.ws.su;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huimv.wine.common.EventWsErrUtil;
+import com.huimv.wine.entity.*;
+import com.huimv.wine.entity.vo.DevicesQueryVo;
+import com.huimv.wine.entity.vo.ManagerVo;
+import com.huimv.wine.entity.vo.ParamsVo;
+import com.huimv.wine.entity.vo.WsEvent;
+import com.huimv.wine.mapper.*;
+import com.huimv.wine.utils.Base64ImageSaver;
+import com.huimv.wine.utils.Result;
+import com.huimv.wine.utils.WebsocketManagerUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.Session;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class SuperConfig {
+    @Autowired
+    private ManagerMapper managerMapper;
+    @Autowired
+    private DeviceMapper deviceMapper;
+    @Autowired
+    private OperationMapper operationMapper;
+    @Autowired
+    private WineMapper wineMapper;
+    @Autowired
+    private AdvertiseMapper advertiseMapper;
+    @Autowired
+    private ParamsMapper paramsMapper;
+
+    public void handle(String event, JSONObject data, Session session, Manager manager) {
+        switch (event) {
+            case "superConfigDeviceQueryManager":
+                QueryManager(session, manager, data);
+                break;
+            case "superConfigDeviceQuery":
+                Query(session, manager, data);
+                break;
+            case "superConfigDeviceUpdate":
+                Update(session, manager, data);
+                break;
+            case "superConfigDeviceAssign":
+                Assign(session, manager, data);
+                break;
+            case "superConfigWineQuery":
+                wineQuery(session, manager, data);
+                break;
+            case "superConfigWineDelete":
+                JSONArray array = data.getJSONArray("data");
+                List<Integer> list = new ArrayList<>();
+                for (int i = 0; i < array.size(); i++) {
+                    list.add(array.getInteger(i));
+                }
+                wineDelete(session, manager,list);
+                break;
+            case "superConfigWineAdd":
+                wineAdd(session, manager, data);
+                break;
+            case "superConfigWineUpdate":
+                wineUpdate(session, manager, data);
+                break;
+            case "superConfigAdvertiseQuery":
+                advertiseQuery(session, manager, data);
+                break;
+            case "superConfigAdvertiseDelete":
+                JSONArray array1 = data.getJSONArray("data");
+                List<Integer> list1 = new ArrayList<>();
+                for (int i = 0; i < array1.size(); i++) {
+                    list1.add(array1.getInteger(i));
+                }
+                advertiseDelete(session, manager, list1);
+                break;
+            case "superConfigAdvertiseUpdate":
+                advertiseUpdate(session, manager, data);
+                break;
+            case "superConfigAdvertiseAdd":
+                advertiseAdd(session, manager, data);
+                break;
+            case "superConfigParamList":
+                paramList(session, manager, data);
+                break;
+            case "superConfigParamUpdate":
+                JSONArray array2 = data.getJSONArray("data");
+                paramsUpdate(session, manager, array2);
+                break;
+            default:
+                WsEvent wsEvent = EventWsErrUtil.getWsErr("unrecognized event");
+                WebsocketManagerUtil.sendMessage(session, wsEvent);
+                break;
+        }
+    }
+
+    public void QueryManager(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        List<ManagerVo> managerVos = managerMapper.ManagerQuery(data.toString());
+        WsEvent wsEvent = new WsEvent("superConfigDeviceQueryManagerRes",managerVos);
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void Query(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        String manager1 = data.getString("manager");
+        String cond = data.getString("cond");
+        Integer pageNum = data.getInteger("page");
+        Integer pageSize = data.getInteger("limit");
+        Page<DevicesQueryVo> page = new Page<>(pageNum, pageSize);
+        if (manager1 == null) {
+            Page<DevicesQueryVo> devicesQuery = deviceMapper.devicesQuery(page, cond);
+            WsEvent wsEvent = new WsEvent("superConfigDeviceQueryRes", devicesQuery);
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        } else if (manager1.equals("*")) {
+            Page<DevicesQueryVo> devicesQuery = deviceMapper.devicesQuery2(page, cond);
+            WsEvent wsEvent = new WsEvent("superConfigDeviceQueryRes", devicesQuery);
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        } else {
+            Page<DevicesQueryVo> devicesQuery = deviceMapper.devicesQuery3(page, cond,manager1);
+            WsEvent wsEvent = new WsEvent("superConfigDeviceQueryRes", devicesQuery);
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+    }
+
+    public void Update(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        String did = data.getString("Did");
+        Device device = deviceMapper.selectById(did);
+        if (ObjectUtil.isEmpty(device)) {
+            WsEvent wsEvent = new WsEvent("superConfigDeviceUpdateRes","no such device");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        device.setManager(data.getString("mid"));
+        device.setAddr(data.getString("addr"));
+        device.setMark(data.getString("mark"));
+        deviceMapper.updateById(device);
+        WsEvent wsEvent = new WsEvent("superConfigDeviceUpdateRes", null);
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(1);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe("修改设备信息");
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void Assign(Session session, Manager manager1, JSONObject data) {
+        if (!manager1.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        List<String> list = new ArrayList<>();
+        String manager = data.getString("manager");
+        JSONArray devices = data.getJSONArray("devices");
+        for (int i = 0; i < devices.size(); i++) {
+            list.add(devices.getString(i));
+        }
+        deviceMapper.DevicesAssignManager(list,manager);
+        WsEvent wsEvent = new WsEvent("superConfigDeviceAssignRes",Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager1.getId());
+        operation.setOpType(1);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe("修改设备管理员");
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void wineQuery(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer pageNum = data.getInteger("page");
+        Integer pageSize = data.getInteger("limit");
+        Page<Wine> page = new Page<>(pageNum, pageSize);
+        if (pageNum == 1) {
+            Page<Wine> winesQuery = wineMapper.WinesQuery(page, data.getString("cond"));
+            WsEvent wsEvent = new WsEvent("superConfigWineQueryRes",winesQuery);
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        } else {
+            Page<Wine> winePage = wineMapper.WinesQuery2(page, data.getString("cond"));
+            WsEvent wsEvent = new WsEvent("superConfigWineQueryRes",winePage);
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+    }
+
+    public void wineDelete(Session session, Manager manager, List<Integer> data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        wineMapper.WinesDelete(data);
+        WsEvent wsEvent = new WsEvent("superConfigWineDeleteRes",Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(2);
+        operation.setLevel(1);
+        operation.setTime(new Date());
+        String format = "";
+        for (Integer integer : data) {
+            format = format+String.format("[%s]", integer);
+        }
+        operation.setDescribe("删除酒品:"+format);
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void wineAdd(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        if (data.getString("image").equals("")) {
+            WsEvent wsEvent =new WsEvent("superConfigWineAddRes",Result.fail("图片数据不可为空"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        QueryWrapper<Wine> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("id").last(" limit 1");
+        Wine wine = wineMapper.selectOne(queryWrapper);
+        String image = Base64ImageSaver.saveBase64(data.getString("image"), String.format("static/wine/%d", wine.getId() + 1));
+        if (image.contains("文件存储失败")) {
+            WsEvent wsEvent =new WsEvent("superConfigWineAddRes",Result.fail(image));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Wine wine1 = new Wine();
+        wine1.setPicture(String.format("static/wine/%d.%s", "http://192.168.1.10:3080", wine.getId() + 1, image));
+        wine1.setId(wine.getId() + 1);
+        wine1.setName(data.getString("name"));
+        wine1.setPrice(data.getInteger("price"));
+        wine1.setDegree(data.getInteger("degree"));
+        wine1.setDensity(data.getInteger("density"));
+        wine1.setDescribe(data.getString("describe"));
+        wineMapper.insert(wine1);
+        WsEvent wsEvent =new WsEvent("superConfigWineAddRes",Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(0);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe(String.format("新增酒品:%s[%d]", data.getString("name"),wine.getId() + 1));
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void wineUpdate(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer id = data.getInteger("id");
+        Wine wine = wineMapper.selectById(id);
+        if (ObjectUtil.isEmpty(wine)) {
+            WsEvent wsEvent = new WsEvent("superConfigWineUpdateRes",Result.fail("no such wine"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        String image = Base64ImageSaver.saveBase64(data.getString("image"), String.format("static/wine/%d",id));
+        if (image.contains("文件存储失败")) {
+            WsEvent wsEvent =new WsEvent("superConfigWineUpdateRes",Result.fail(image));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        wine.setPicture(String.format("static/wine/%d.%s", "http://192.168.1.10:3080", id, image));
+        wine.setName(data.getString("name"));
+        wine.setDescribe(data.getString("describe"));
+        wine.setPrice(data.getInteger("price"));
+        wine.setDegree(data.getInteger("degree"));
+        wine.setDensity(data.getInteger("density"));
+        wineMapper.updateById(wine);
+        WsEvent wsEvent =new WsEvent("superConfigWineUpdateRes",Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(1);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe(String.format("修改酒品[%d]信息",id));
+        operationMapper.insert(operation);
+    }
+
+    public void advertiseQuery(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer pageNum = data.getInteger("page");
+        Integer pageSize = data.getInteger("limit");
+        String desc = data.getString("desc");
+        Integer type = data.getInteger("type");
+        Page<Advertise> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<Advertise> queryWrapper = new QueryWrapper<>();
+        if (type == -1) {
+            queryWrapper.like("describe", desc);
+        } else {
+            queryWrapper.eq("type", type).like("describe", desc);
+        }
+        Page<Advertise> advertisePage = advertiseMapper.selectPage(page, queryWrapper);
+        for (Advertise record : advertisePage.getRecords()) {
+            record.setSrc(String.format("%s/%s", "http://192.168.1.10:3080", record.getSrc()));
+        }
+        WsEvent wsEvent = new WsEvent("superConfigAdvertiseQueryRes",advertisePage);
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void advertiseDelete(Session session, Manager manager, List<Integer> ids) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        advertiseMapper.deleteBatchIds(ids);
+        WsEvent wsEvent = new WsEvent("superConfigAdvertiseDeleteRes",Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(2);
+        operation.setLevel(1);
+        operation.setTime(new Date());
+        String format = "";
+        for (Integer integer : ids) {
+            format = format+String.format("[%s]", integer);
+        }
+        operation.setDescribe("删除广告:" + format);
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void advertiseUpdate(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer id = data.getInteger("id");
+        Advertise advertise = advertiseMapper.selectById(id);
+        String image = Base64ImageSaver.saveBase64(data.getString("base64"), String.format("static/adv/%d",id));
+        if (image.contains("文件存储失败")) {
+            WsEvent wsEvent =new WsEvent("superConfigAdvertiseUpdateRes",Result.fail(image));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        advertise.setSrc(String.format("static/adv/%d.%s", "http://192.168.1.10:3080", id, image));
+        advertise.setOrder(data.getInteger("order"));
+        advertise.setType(data.getBoolean("type"));
+        advertise.setTime(new Date());
+        advertise.setDuration(data.getInteger("duration"));
+        advertise.setDescribe(data.getString("describe"));
+        advertiseMapper.updateById(advertise);
+        WsEvent wsEvent = new WsEvent("superConfigAdvertiseUpdateRes", Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(1);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe(String.format("更新广告:%d", id));
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void advertiseAdd(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        if (data.getString("base64").equals("")) {
+            WsEvent wsEvent = new WsEvent("superConfigAdvertiseAddRes", Result.fail("资源不可为空"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        QueryWrapper<Advertise> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("id").last(" limit 1");
+        Advertise advertise = advertiseMapper.selectOne(queryWrapper);
+        Integer id = advertise.getId();
+        id++;
+        if (ObjectUtil.isEmpty(advertise)) {
+            WsEvent wsEvent = new WsEvent("superConfigAdvertiseAddRes", Result.fail("添加失败 01"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        String image = Base64ImageSaver.saveBase64(data.getString("base64"), String.format("static/adv/%d",id));
+        if (image.contains("文件存储失败")) {
+            WsEvent wsEvent =new WsEvent("superConfigAdvertiseUpdateRes",Result.fail(image));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Advertise advertise1 = new Advertise();
+        advertise1.setId(id);
+        advertise1.setOrder(data.getInteger("order"));
+        advertise1.setType(data.getBoolean("type"));
+        advertise1.setDuration(data.getInteger("duration"));
+        advertise1.setDescribe(data.getString("describe"));
+        advertise1.setSrc(String.format("static/adv/%d.%s", "http://192.168.1.10:3080", id, image));
+        advertiseMapper.insert(advertise1);
+        WsEvent wsEvent = new WsEvent("superConfigAdvertiseAddRes", Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(0);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe(String.format("新增广告:%d",id));
+        operationMapper.insert(operation);
+        return;
+    }
+
+    public void paramList(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        List<ParamsVo> list = new ArrayList<>();
+        List<Params> params = paramsMapper.selectList(null);
+        for (Params param : params) {
+            ParamsVo paramsVo = new ParamsVo();
+            paramsVo.setId(param.getId());
+            paramsVo.setName(param.getDescribe());
+            paramsVo.setValue(param.getValue());
+            list.add(paramsVo);
+        }
+        WsEvent wsEvent = new WsEvent("superConfigParamListRes", Result.success(list));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void paramsUpdate(Session session, Manager manager, JSONArray data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = EventWsErrUtil.getWsErr("auth failed.");
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        for (int i = 0; i < data.size(); i++) {
+            if (data.getJSONObject(i).getString("name").equals("")) {
+                WsEvent wsEvent = new WsEvent("superConfigParamUpdateRes",Result.fail("参数名不可为空"));
+                WebsocketManagerUtil.sendMessage(session, wsEvent);
+                return;
+            }
+            Params params = paramsMapper.selectById(data.getJSONObject(i).getInteger("id"));
+            if (ObjectUtil.isEmpty(params)) {
+                WsEvent wsEvent = new WsEvent("superConfigParamUpdateRes",Result.fail("no such param"));
+                WebsocketManagerUtil.sendMessage(session, wsEvent);
+                return;
+            }
+            params.setDescribe(data.getJSONObject(i).getString("name"));
+            params.setValue(data.getJSONObject(i).getInteger("value"));
+            paramsMapper.updateById(params);
+        }
+        WsEvent wsEvent = new WsEvent("superConfigParamUpdateRes",Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(1);
+        operation.setLevel(0);
+        operation.setTime(new Date());
+        operation.setDescribe("修改系统运行参数");
+        operationMapper.insert(operation);
+        return;
+    }
+}

+ 1 - 1
src/main/java/com/huimv/wine/ws/su/SuperDashboard.java

@@ -287,7 +287,7 @@ public class SuperDashboard {
         Integer type = data.getInteger("type");
         if (0 == type) {
             List<QueryAdminVo> queryAdmins = changeMapper.changeQueryWorker(data.getString("id"));
-            WsEvent wsEvent = new WsEvent("superDashboardQueryAdminRes", Result.success(queryAdmins));
+            WsEvent wsEvent = new WsEvent("superDashboardQueryWorkerRes", Result.success(queryAdmins));
             WebsocketManagerUtil.sendMessage(session, wsEvent);
         } else {
             List<QueryAdminVo> queryAdmins = new ArrayList<>();

+ 121 - 6
src/main/java/com/huimv/wine/ws/su/SuperOrder.java

@@ -1,36 +1,56 @@
 package com.huimv.wine.ws.su;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.wine.common.EventWsErrUtil;
-import com.huimv.wine.entity.Manager;
+import com.huimv.wine.entity.*;
+import com.huimv.wine.entity.vo.TradeQueryVo;
 import com.huimv.wine.entity.vo.WsEvent;
+import com.huimv.wine.mapper.OperationMapper;
+import com.huimv.wine.mapper.RefundMapper;
+import com.huimv.wine.mapper.TradeMapper;
+import com.huimv.wine.mapper.UserMapper;
+import com.huimv.wine.utils.Result;
 import com.huimv.wine.utils.WebsocketManagerUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.websocket.Session;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 @Component
 public class SuperOrder {
 
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private TradeMapper tradeMapper;
+    @Autowired
+    private RefundMapper refundMapper;
+    @Autowired
+    private OperationMapper operationMapper;
     public void handle(String event, JSONObject data, Session session, Manager manager) {
         switch (event) {
             case "superOrderTradeQueryUser":
-
+                QueryUser(session, manager, data);
                 break;
             case "superOrderTradeQueryTrade":
-
+                QueryTrade(session, manager, data);
                 break;
             case "superOrderTradeRefund":
-
+                Refund(session, manager, data);
                 break;
             case "superOrderChangeQueryWorker":
-
+                QueryWorker(session, manager, data);
                 break;
             case "superOrderChangeQueryOrder":
-
+                QueryOrder(session, manager, data);
                 break;
             default:
                 WsEvent wsEvent = EventWsErrUtil.getWsErr("unrecognized event");
@@ -40,6 +60,101 @@ public class SuperOrder {
     }
 
     public void QueryUser(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = new WsEvent("superOrderTradeQueryUserRes", Result.fail("权限不足"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer page = data.getInteger("page");
+        Integer limit = data.getInteger("limit");
+        Page<User> userPage = new Page(page, limit);
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        if (data.getInteger("vip") == -1) {
+            queryWrapper.like("id", data.getString("id"));
+        } else {
+            queryWrapper.eq("vip", data.getInteger("vip")).like("id", data.getString("id"));
+        }
+        Page<User> selectPage = userMapper.selectPage(userPage, queryWrapper);
+        WsEvent wsEvent = new WsEvent("superOrderTradeQueryUserRes", Result.success(selectPage));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
+
+    public void QueryTrade(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = new WsEvent("superOrderTradeQueryTradeRes", Result.fail("权限不足"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Integer page = data.getInteger("page");
+        Integer limit = data.getInteger("limit");
+        Page<TradeQueryVo> userPage = new Page(page, limit);
+        List<TradeQueryVo> queryVos = tradeMapper.tradeQuery(userPage, data.getString("uid"), data.getString("cond"));
+        WsEvent wsEvent = new WsEvent("superOrderTradeQueryTradeRes", Result.success(queryVos));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        return;
+    }
 
+    public void Refund(Session session, Manager manager, JSONObject data) {
+        if (!manager.getIsSuper()) {
+            WsEvent wsEvent = new WsEvent("superOrderTradeRefundRes", Result.fail("权限不足"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        Trade trade = tradeMapper.selectById(data.getString("tid"));
+        if (ObjectUtil.isEmpty(trade)) {
+            WsEvent wsEvent = new WsEvent("superOrderTradeRefundRes", Result.fail("订单查询失败"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        if (trade.getCash() < data.getInteger("cash")) {
+            WsEvent wsEvent = new WsEvent("superOrderTradeRefundRes", Result.fail("超出原订单金额"));
+            WebsocketManagerUtil.sendMessage(session, wsEvent);
+            return;
+        }
+        QueryWrapper<Refund> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("tid", data.getString("tid"));
+        Refund one = refundMapper.selectOne(queryWrapper);
+        if (ObjectUtil.isEmpty(one)) {
+            Refund refund = new Refund();
+            refund.setTid(data.getString("tid"));
+            refund.setManager(manager.getId());
+            refund.setCash(data.getInteger("cash"));
+            refund.setReason(data.getString("reason"));
+            refund.setTime(new Date());
+            refundMapper.insert(refund);
+        } else {
+            one.setTid(data.getString("tid"));
+            one.setManager(manager.getId());
+            one.setCash(data.getInteger("cash"));
+            one.setReason(data.getString("reason"));
+            one.setTime(new Date());
+            refundMapper.updateById(one);
+        }
+        WsEvent wsEvent = new WsEvent("superOrderTradeRefundRes", Result.success(null));
+        WebsocketManagerUtil.sendMessage(session, wsEvent);
+        User user = userMapper.selectById(trade.getPayer());
+        user.setRefundCount(user.getRefundCount() + 1);
+        user.setBuyCost(user.getBuyCost() - data.getInteger("cash"));
+        user.setRefundCost(user.getRefundCost() + data.getInteger("cash"));
+        userMapper.updateById(user);
+        Operation operation = new Operation();
+        operation.setUserType(0);
+        operation.setUserId(manager.getId());
+        operation.setOpType(5);
+        operation.setLevel(2);
+        operation.setTime(new Date());
+        operation.setDescribe(String.format("订单号:%s,用户:%s,退款金额:%d",
+                data.getString("tid"), trade.getPayer(), data.getInteger("cash")));
+        operationMapper.insert(operation);
     }
+
+    public void QueryWorker(Session session, Manager manager, JSONObject data) {
+
+    }
+
+    public void QueryOrder(Session session, Manager manager, JSONObject data) {
+
+    }
+
 }

+ 19 - 0
src/main/java/com/huimv/wine/ws/su/SuperRecord.java

@@ -0,0 +1,19 @@
+package com.huimv.wine.ws.su;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.wine.entity.Manager;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.Session;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class SuperRecord {
+    public void handle(String event, JSONObject data, Session session, Manager manager) {
+        switch (event) {
+
+        }
+    }
+}

+ 4 - 0
src/main/resources/com/huimv/wine/mapper/AdvertiseMapper.xml

@@ -16,4 +16,8 @@
         SELECT `id`,`order`,`time`,`src`,`type`,`duration`,`describe` FROM `advertise` ORDER BY `order`
     </select>
 
+<!--    <select id="AdvertisesQuery" resultType="com.huimv.wine.entity.Advertise">-->
+<!--        SELECT `id`,`order`,`time`,`type`,`src`,`duration`,`describe` FROM `advertise` -->
+<!--		WHERE `describe` LIKE '%%%s%%' -->
+<!--    </select>-->
 </mapper>

+ 15 - 0
src/main/resources/com/huimv/wine/mapper/ChangeMapper.xml

@@ -72,4 +72,19 @@
             AND c.`status`= #{status}
         </if>
     </select>
+    <select id="ChangeRankWorkersForAdmin" resultType="com.huimv.wine.entity.vo.RankAdminsVo">
+        SELECT w.`id` AS 'id',w.`name` as 'name',COUNT(c.`id`) AS 'total' FROM `change` AS c
+		LEFT JOIN `worker` AS w ON c.`worker`=w.`id`  WHERE c.`status`=2 AND c.`manager`=#{manager}
+		AND (c.`finish` BETWEEN TIMESTAMP(#{start}) AND TIMESTAMP(#{end})) GROUP BY 'id' ORDER BY `total` DESC
+    </select>
+
+    <select id="ChangeQueryWorkerForAdmin" resultType="com.huimv.wine.entity.vo.QueryAdminVo">
+        SELECT DATE_FORMAT(`finish`,'%Y-%m') as 'time',COUNT(`id`) as 'total' FROM `change` " +
+			"WHERE `status`=2 AND `manager`=#{managerId} AND `worker`=#{id} GROUP BY `time`
+    </select>
+    <select id="ChangeQueryWorkerForAdmin2" resultType="com.huimv.wine.entity.vo.QueryAdminVo">
+       SELECT DATE_FORMAT(`finish`,#{type}) as 'time',COUNT(`tt`) as 'total' FROM `change` WHERE `status`=2 AND `manager`=#{managerId}
+       AND `worker`=#{id} AND (`finish` BETWEEN DATE_SUB(CURRENT_TIMESTAMP,INTERVAL #{days} DAY) AND CURRENT_TIMESTAMP)
+       GROUP BY 'time'
+    </select>
 </mapper>

+ 37 - 0
src/main/resources/com/huimv/wine/mapper/DeviceMapper.xml

@@ -25,6 +25,16 @@
         <result column="order" property="order" />
         <result column="income" property="income" />
     </resultMap>
+
+    <resultMap id="getManagerMap" type="com.huimv.wine.entity.vo.DevicesQueryVo">
+        <id column="id" property="id" />
+        <result column="addr" property="addr" />
+        <result column="first" property="first" />
+        <result column="last" property="last" />
+        <result column="mark" property="mark" />
+        <association property="managerVo" javaType="com.huimv.wine.entity.vo.ManagerVo" select="com.huimv.wine.mapper.ManagerMapper.getManagerVo" column="managerId"></association>
+    </resultMap>
+
     <select id="getByDeviceId" resultType="com.huimv.wine.entity.Device">
 
       SELECT `id`,`addr`,`first`,`last`,`wine1`,`remain1`,`vpp1`,`wine2`,`remain2`,`vpp2`,
@@ -41,4 +51,31 @@
          `wine3`=#{wine3},`remain3`=#{remain3},`vpp3`=#{vpp3},`wine4`=#{wine4},`remain4`=#{remain4},`vpp4`=#{vpp4},`manager`=#{manager},`mark`=#{mark},`order`=#{order},
 		`income`=#{income} WHERE `id`=#{id};
     </update>
+
+    <select id="devicesQuery" resultMap="getManagerMap">
+        SELECT d.`id`,d.`addr`,d.`first`,d.`last`,d.`mark`,m.`id` as 'managerId' FROM `device` AS d LEFT JOIN `manager` AS m
+        ON d.`manager`=m.`id` WHERE d.`manager`='' AND (d.`id` LIKE #{cond} OR d.`addr` LIKE #{cond} OR d.`mark` LIKE #{cond})
+    </select>
+
+    <select id="devicesQuery2" resultMap="getManagerMap">
+      SELECT d.`id`,d.`addr`,d.`first`,d.`last`,d.`mark`,m.`id` as 'managerId' FROM `device` AS d LEFT JOIN `manager` AS m
+      ON d.`manager`=m.`id` WHERE d.`id` LIKE #{cond} OR d.`addr` LIKE #{cond} OR d.`mark` LIKE #{cond}
+    </select>
+
+    <select id="devicesQuery3" resultMap="getManagerMap">
+      SELECT d.`id`,d.`addr`,d.`first`,d.`last`,d.`mark`,m.`id` as 'managerId' FROM `device` AS d LEFT JOIN `manager` AS m
+      ON d.`manager`=m.`id` WHERE d.`manager`=#{manager} AND (d.`id` LIKE #{cond} OR d.`addr` LIKE #{cond} OR d.`mark` LIKE #{cond})
+    </select>
+
+    <update id="DevicesAssignManager" parameterType="com.huimv.wine.entity.Device">
+        UPDATE `device` SET `manager`=#{manager} WHERE `id` IN
+        <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <select id="TradeRankDevicesForAdmin" resultType="com.huimv.wine.entity.vo.RankDevicesVo">
+        SELECT `device` as 'id',SUM(`cash`) AS 'total' FROM `trade` WHERE `manager`=#{manager}
+		AND (`time` BETWEEN TIMESTAMP(#{start}) AND TIMESTAMP(#{end})) GROUP BY `device` ORDER BY `total` DESC
+    </select>
 </mapper>

+ 4 - 0
src/main/resources/com/huimv/wine/mapper/ManagerMapper.xml

@@ -18,4 +18,8 @@
     <select id="getManagerVo" resultType="com.huimv.wine.entity.vo.ManagerVo">
         select id as 'id',name as 'name' from manager where id=#{id}
     </select>
+
+    <select id="ManagerQuery" resultType="com.huimv.wine.entity.vo.ManagerVo">
+        SELECT `id` as 'id',`name` as 'name'  FROM `manager` WHERE `super`=0 AND `name` LIKE #{name} LIMIT 10;
+    </select>
 </mapper>

+ 12 - 0
src/main/resources/com/huimv/wine/mapper/TradeMapper.xml

@@ -54,6 +54,18 @@
          WHERE `wine`=#{id} AND (`time` BETWEEN DATE_SUB(CURRENT_TIMESTAMP,INTERVAL #{days} DAY) AND CURRENT_TIMESTAMP)
          GROUP BY 'time'
     </select>
+
+    <select id="tradeQuery" resultType="com.huimv.wine.entity.vo.TradeQueryVo">
+        SELECT t.`id` as 'id',t.`device` as 'device',t.`time` as 'time',w.`name` as 'name',t.`price` as 'price',t.`weight` as 'weight'
+        ,t.`cash` as 'cash',r.`cash` as 'refund',r.`reason` as 'reason'
+		FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` LEFT JOIN `refund` AS r ON t.`id`=r.`tid`
+		WHERE t.`payer`=#{uid} AND (t.`id` LIKE #{cond} OR w.`name` LIKE #{cond}) ORDER BY t.`time` DESC
+    </select>
+    <select id="TradeRankWinesForAdmin" resultType="com.huimv.wine.entity.vo.RankAdminsVo">
+        SELECT w.`id` as 'id',w.`name` as 'name',SUM(t.`cash`) AS 'total' FROM `trade` AS t
+        LEFT JOIN `wine` AS w ON t.`wine`=w.`id` WHERE t.`manager`=#{manager}
+        AND (t.`time` BETWEEN TIMESTAMP(#{start}) AND TIMESTAMP(#{end})) GROUP BY t.`wine` ORDER BY `total` DESC
+    </select>
     <select id="tradeQueryForAdmin" resultType="com.huimv.wine.entity.vo.TradeQueryForAdminResult">
         SELECT t.`id`,t.`device`,t.`time`,w.`name` as 'wine',t.`price`,t.`weight`,t.`cash`,r.`cash` as 'refund',r.`reason`
         FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` LEFT JOIN `refund` AS r ON t.`id`=r.`tid`

+ 14 - 0
src/main/resources/com/huimv/wine/mapper/WineMapper.xml

@@ -23,4 +23,18 @@
         SELECT `id`,`name` FROM `wine` WHERE `id`!= '10100' AND (`id` LIKE #{like} OR `name` LIKE #{like}) LIMIT 10;
     </select>
 
+    <select id="WinesQuery" resultType="com.huimv.wine.entity.Wine">
+        SELECT `id`,`name`,`time`,`price`,`degree`,`density`,`picture`,`describe` FROM `wine`
+		WHERE (`id`=10100 OR `deleted`=FALSE) AND (`name` LIKE #{cond} OR `describe` LIKE #{cond})
+    </select>
+    <select id="WinesQuery2" resultType="com.huimv.wine.entity.Wine">
+        SELECT `id`,`name`,`time`,`price`,`degree`,`density`,`picture`,`describe` FROM `wine`
+		WHERE `deleted`=FALSE AND (`name` LIKE #{cond} OR `describe` LIKE #{cond})
+    </select>
+    <update id="WinesDelete" parameterType="com.huimv.wine.entity.Wine">
+        UPDATE `wine` SET `deleted`=TRUE WHERE `id` IN
+        <foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
 </mapper>

+ 9 - 8
src/main/resources/com/huimv/wine/mapper/WorkerMapper.xml

@@ -10,7 +10,7 @@
         <association property="device" javaType="com.huimv.wine.entity.vo.DeviceWithIdAddrVo" select="com.huimv.wine.mapper.DeviceMapper.getDeviceByDeviceId" column="deviceId"/>
     </resultMap>
 
-    <resultMap id="getManagerVo" type="com.huimv.wine.entity.vo.workQueryResVo">
+    <resultMap id="getManager" type="com.huimv.wine.entity.vo.workQueryResVo">
         <id column="id" property="id" />
         <result column="name" property="name" />
         <result column="phone" property="phone"/>
@@ -18,32 +18,33 @@
         <result column="cost" property="cost"/>
         <result column="first" property="first"/>
         <result column="last" property="last"/>
-        <association property="managerVo" javaType="com.huimv.wine.entity.vo.ManagerVo" select="com.huimv.wine.mapper.ManagerMapper" column="mangerId"></association>
+        <association property="managerVo" javaType="com.huimv.wine.entity.vo.ManagerVo" select="com.huimv.wine.mapper.ManagerMapper.getManagerVo" column="mangerId"></association>
     </resultMap>
+
+    <select id="login" resultType="com.huimv.wine.entity.Worker">
+        select *  FROM `worker` WHERE phone=#{account} AND password = #{password}
+    </select>
+
     <select id="ChangesQueryForWorker" resultMap="WorkerQueryResultMap">
         SELECT c.`id` as 'id',d.`id` as 'deviceId',c.`status` as 'status',c.`publish` as 'publish',c.`finish` as 'finish'
                 FROM `change` AS c LEFT JOIN `device` AS d ON c.`device`=d.`id`
 				WHERE c.`status`=#{status} AND c.`worker`=#{worker} AND (d.`id` LIKE #{like} OR d.`addr` LIKE #{like})
     </select>
 
-    <select id="login" resultType="com.huimv.wine.entity.Worker">
-        select *  FROM `worker` WHERE phone=#{account} AND password = #{password}
-    </select>
-
     <select id="changeRankWorkers" resultType="com.huimv.wine.entity.vo.RankAdminsVo">
        SELECT w.`id` AS `id`,w.`name` as 'name' ,COUNT(c.`id`) AS `total` FROM `change` AS c
 		LEFT JOIN `worker` AS w ON c.`worker`=w.`id`  WHERE c.`status`=2
 		AND (c.`finish` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY `id` ORDER BY `total` DESC
     </select>
 
-    <select id="WorkerQuery" resultMap="getManagerVo">
+    <select id="WorkerQuery" resultMap="getManager">
         SELECT w.`id` as 'id',w.`first` as 'first',w.`last` as 'last',w.`name` as 'name',w.`phone` as 'phone',w.`count` as 'count'
         ,w.`avg_cost` as 'cost',m.`id` as 'mangerId'
         FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id`
         WHERE w.`name` LIKE #{cond} OR w.`phone` LIKE #{cond}
     </select>
 
-    <select id="WorkerQuery2" resultMap="getManagerVo">
+    <select id="WorkerQuery2" resultMap="getManager">
         SELECT w.`id` as 'id',w.`first` as 'first',w.`last` as 'last',w.`name` as 'name',w.`phone` as 'phone',w.`count` as 'count',w.`avg_cost` as 'cost',m.`id` as 'mangerId'
 		FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id`
 		WHERE w.`manager`=#{manager} AND (w.`name` LIKE #{cond} OR w.`phone` LIKE #{cond})