From 471f693ac87a6ed6a2b00e93472b025266c0271f Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Mon, 13 Nov 2023 09:27:19 +0800
Subject: [PATCH] Merge branch 'wb' of http://blit.7drlb.com:8888/r/moral into qa

---
 screen-api/src/main/resources/mapper/OrganizationMapper.xml                                   |   35 +
 screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java                 |   13 
 screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java                      |  150 +++++++-
 screen-common/src/main/java/com/moral/util/TokenUtils.java                                    |   11 
 screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java                |  107 ++++-
 screen-api/src/main/resources/mapper/ResponsibilityUnitMapper.xml                             |   10 
 screen-api/src/main/java/com/moral/api/config/Interceptor/SyncConfiguration.java              |   42 ++
 screen-api/pom.xml                                                                            |   22 +
 screen-api/src/main/java/com/moral/api/service/impl/DustldServiceImpl.java                    |   22 
 screen-api/src/main/java/com/moral/api/service/OrganizationService.java                       |    8 
 screen-api/src/main/java/com/moral/api/service/UserService.java                               |    6 
 screen-api/src/main/java/com/moral/api/controller/AppUserController.java                      |   55 ++
 screen-api/src/main/java/com/moral/api/mapper/OrganizationMapper.java                         |    6 
 screen-job/src/main/resources/application-cjl.yml                                             |    2 
 screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java             |    6 
 screen-api/src/main/java/com/moral/api/pojo/query/app/AppAllocationPushUserCond.java          |   49 ++
 screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml                        |   50 ++
 screen-api/src/main/resources/mapper/DeviceMapper.xml                                         |    2 
 screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserListDTO.java                |   35 +
 screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java          |   23 
 screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java       |    4 
 screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAuthority.java                          |   13 
 screen-api/src/main/java/com/moral/api/service/AllocationService.java                         |   13 
 screen-api/src/main/java/com/moral/api/controller/CruiserController.java                      |   99 +++--
 screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java                   |    8 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java             |    4 
 screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAllocationFindVo.java                   |   16 
 screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java                   |    7 
 screen-api/src/main/java/com/moral/api/utils/HttpClientUtil.java                              |   14 
 screen-api/src/main/java/com/moral/api/vo/WxMssVo.java                                        |    4 
 screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java     |    1 
 screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java |   46 +-
 screen-api/src/main/java/com/moral/api/controller/AppAllocationController.java                |    3 
 screen-api/src/main/java/com/moral/api/utils/WechatUtils.java                                 |   27 
 screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java              |    3 
 screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java   |  110 +----
 screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java              |    5 
 screen-manage/src/main/java/com/moral/api/service/impl/SysDictDataServiceImpl.java            |    1 
 screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java               |    2 
 screen-api/src/main/resources/word/尘负荷监测报告.docx                                               |    0 
 screen-manage/src/main/java/com/moral/api/service/impl/SysDictTypeServiceImpl.java            |    1 
 41 files changed, 763 insertions(+), 272 deletions(-)

diff --git a/screen-api/pom.xml b/screen-api/pom.xml
index 93aa181..ea3e1f9 100644
--- a/screen-api/pom.xml
+++ b/screen-api/pom.xml
@@ -78,11 +78,31 @@
             <artifactId>jfreechart</artifactId>
             <version>1.5.0</version>
         </dependency>
+        <!--  ���������������������-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.2</version>
+        </dependency>
         <dependency>
             <groupId>com.deepoove</groupId>
             <artifactId>poi-tl</artifactId>
-            <version>1.5.1</version>
+            <version>1.9.1</version>
         </dependency>
+
+
+
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
diff --git a/screen-api/src/main/java/com/moral/api/config/Interceptor/SyncConfiguration.java b/screen-api/src/main/java/com/moral/api/config/Interceptor/SyncConfiguration.java
new file mode 100644
index 0000000..ea9663f
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/config/Interceptor/SyncConfiguration.java
@@ -0,0 +1,42 @@
+package com.moral.api.config.Interceptor;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+//@Configuration
+@EnableAsync
+public class SyncConfiguration {
+
+    @Bean(name = "asyncPoolTaskExecutor")
+    public ThreadPoolTaskExecutor executor() {
+        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+        //���������������
+        taskExecutor.setCorePoolSize(10);
+        //������������������������������������,���������������������������������������������������������������������������
+        taskExecutor.setMaxPoolSize(20);
+        //������������
+        taskExecutor.setQueueCapacity(50);
+        //������������������,���������������������������������������������������������������������������������
+        taskExecutor.setKeepAliveSeconds(200);
+        //������������������������������
+        taskExecutor.setThreadNamePrefix("async-");
+        /**
+         * ������������������������������������������������������������������������������maximumPoolSize���������������������������������������������������������
+         * ������������������������������
+         * ThreadPoolExecutor.AbortPolicy:���������������������RejectedExecutionException���������
+         * ThreadPoolExecutor.DiscardPolicy������������������������������������������������
+         * ThreadPoolExecutor.DiscardOldestPolicy���������������������������������������������������������������������������������������
+         * ThreadPoolExecutor.CallerRunsPolicy��������������������������������������������������� execute() ���������������������
+         */
+        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        taskExecutor.initialize();
+        return taskExecutor;
+    }
+
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/controller/AppAllocationController.java b/screen-api/src/main/java/com/moral/api/controller/AppAllocationController.java
index e1d9d2f..ddec6d4 100644
--- a/screen-api/src/main/java/com/moral/api/controller/AppAllocationController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/AppAllocationController.java
@@ -6,6 +6,7 @@
 import com.moral.api.pojo.query.app.AppAllocationFileCond;
 import com.moral.api.pojo.query.app.AppAllocationPageCond;
 import com.moral.api.pojo.vo.app.AppAllocationFindVo;
+import com.moral.api.pojo.vo.app.AppAuthority;
 import com.moral.constant.PageResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -93,7 +94,7 @@
     @ApiOperation(value = "������������")
     public  ResultMessage  authority(@RequestParam @ApiParam(value = "allocationNum",name = "������") String allocationNum,
                                      @RequestParam @ApiParam(value = "userId",name = "������Id") Integer userId){
-        boolean authority = allocationService.authority(allocationNum,userId);
+        AppAuthority authority = allocationService.authority(allocationNum, userId);
         return ResultMessage.ok(authority);
     }
 
diff --git a/screen-api/src/main/java/com/moral/api/controller/AppUserController.java b/screen-api/src/main/java/com/moral/api/controller/AppUserController.java
index 444a080..c6157c1 100644
--- a/screen-api/src/main/java/com/moral/api/controller/AppUserController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/AppUserController.java
@@ -18,9 +18,15 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.validation.Valid;
+
+import com.alibaba.fastjson.JSON;
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.query.app.AppAllocationPushUserCond;
 import com.moral.api.service.UserService;
 
-import com.moral.api.utils.HttpClientUtil;
+
+import com.moral.api.utils.WechatUtils;
 import com.moral.api.vo.WxMssVo;
 import com.moral.constant.ResponseCodeEnum;
 import com.moral.constant.ResultMessage;
@@ -65,31 +71,50 @@
         return ResultMessage.ok();
     }
 
-    @GetMapping("pushOneUser")
+    @PostMapping("pushOneUser")
     @ApiOperation(value = "���������������������")
-    public  ResultMessage pushOneUser(String openid){
-        String body = push("oOCWi6yfVapaK25Jnkk7jKSbMLyw");
-        return ResultMessage.ok(body);
+    public  ResultMessage pushOneUser(@Valid @RequestBody Allocation appAllocationPushUserCond){
+        userService.pushOneUser(appAllocationPushUserCond);
+//        String body = push("oOCWi6-_hnzSvrMT8HX5D7Dz7tEA");
+        return ResultMessage.ok();
     }
 
 
     public String push(String openid) {
         RestTemplate restTemplate = new RestTemplate();
         //������������������������������������������������access_token������������������������������access_token������������������������������
-        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + HttpClientUtil.getAccessToken();
+        //���������������
+        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + WechatUtils.getAccessToken();
+//        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + HttpClientUtil.getAccessToken();
+//        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=" + HttpClientUtil.getAccessToken();
+//        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + HttpClientUtil.getAccessToken();
+          //���������������
+//        String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + HttpClientUtil.getAccessToken();
+
+
         //���������������������
         WxMssVo wxMssVo = new WxMssVo();
         wxMssVo.setTouser(openid);//���������openid���������������������������������������������������������������������
-        wxMssVo.setTemplate_id("sClgB85aEG1hgaiXpnJBopo5LJX6r91DUsyikOmUgv8");//������������������id
-        wxMssVo.setPage("pages/index/index");
+        wxMssVo.setTemplate_id("YNqUZ1MgMvwY3G-NENVbcmIBR5dUotSdnwcz96CWrho");//������������������id
+        wxMssVo.setLang("zh_CN");
+        wxMssVo.setMiniprogramState("formal");
+//        wxMssVo.setPage("pages/index/index");
 
-        Map<String, String> m = new HashMap<>(3);
-        m.put("time2", "2023-10-23");
-        m.put("thing3", "������");
-        m.put("thing7", "������������������");
-        m.put("character_string8", "������������������");
-        m.put("phrase10", "������������������");
-        wxMssVo.setData(m);
+        Map<String, Object> m = new HashMap<>();
+        HashMap<String, Object> map1 = new HashMap<>();
+        HashMap<String, Object> map2 = new HashMap<>();
+        HashMap<String, Object> map3 = new HashMap<>();
+        HashMap<String, Object> map4 = new HashMap<>();
+        map1.put("value","���������2");
+        map2.put("value","ouyanglun");
+        map3.put("value","���������1");
+        map4.put("value","2023-10-16");
+        m.put("thing18", map1);
+        m.put("character_string1", map2);
+        m.put("thing2", map3);
+        m.put("date4", map4);
+        wxMssVo.setData(JSON.toJSON(m));
+
         ResponseEntity<String> responseEntity =
                 restTemplate.postForEntity(url, wxMssVo, String.class);
         return responseEntity.getBody();
diff --git a/screen-api/src/main/java/com/moral/api/controller/CruiserController.java b/screen-api/src/main/java/com/moral/api/controller/CruiserController.java
index 776c15c..31908f5 100644
--- a/screen-api/src/main/java/com/moral/api/controller/CruiserController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/CruiserController.java
@@ -2,12 +2,13 @@
 
 import cn.afterturn.easypoi.word.WordExportUtil;
 import cn.hutool.poi.word.WordUtil;
-import com.deepoove.poi.NiceXWPFDocument;
 import com.deepoove.poi.XWPFTemplate;
-import com.deepoove.poi.data.MiniTableRenderData;
+import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.data.RowRenderData;
 import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
 import com.moral.api.entity.Dustld;
+import com.moral.api.exception.BusinessException;
 import com.moral.api.pojo.bo.ExcelBO;
 import com.moral.api.pojo.dto.historySecondCruiser.HistorySecondCruiserResultDTO;
 import com.moral.api.pojo.dust.DustForm;
@@ -24,7 +25,6 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
-import org.apache.xmlbeans.impl.jam.provider.ResourcePath;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
@@ -236,23 +236,19 @@
      */
     @PostMapping("dailyDustlds")
     @Transactional
-    public ResultMessage  dailyDustlds(@RequestBody Map<String,Object> params, HttpServletResponse response) throws IOException {
+    public void dailyDustlds(@RequestBody Map<String,Object> params, HttpServletResponse response,HttpServletRequest request) throws IOException {
 
 //        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
         if (!params.containsKey("mac") || !params.containsKey("startTime") || !params.containsKey("endTime")){
-            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+            return;
         }
-        System.out.println(CruiserController.class.getResource("/word/���������������������.docx").getPath());
-        URL resource = getClass().getResource("/word/���������������������.docx");
-        String path = resource.getPath();
-        System.out.println(path);
         Map<String, Object> map = dustldService.dailyDustlds(params);
         if (ObjectUtils.isEmpty(map)){
-            return ResultMessage.fail(ResponseCodeEnum.TARGET_IS_NULL.getCode(), ResponseCodeEnum.TARGET_IS_NULL.getMsg());
+            throw new BusinessException("���������������������");
         }
-        test(map,response);
+        test(map,response,request);
 
-        return ResultMessage.ok();
+
     }
 
 
@@ -315,56 +311,87 @@
     }
 
 
-    public static void test( Map<String, Object> params,HttpServletResponse response) throws IOException {
-        InputStream  inputStream = WordUtil.class.getClassLoader().getResourceAsStream("word/���������������������.docx");
-        XWPFDocument compile = null;
+    public  void test( Map<String, Object> params,HttpServletResponse response,HttpServletRequest request) throws IOException {
+
         try {
+            //InputStream  inputStream = WordUtil.class.getClassLoader().getResourceAsStream("word/���������������������.docx");
+            InputStream stream = WordUtil.class.getClassLoader().getResourceAsStream("word/���������������������.docx");
+            //������������������
+            File file = new File("word/���������������������.docx");
+            //���������������������������������������������������������������������������������������������
+            FileUtils.copyInputStreamToFile(stream, file);
+            //��������������������������������������������� ������������������������
+            String filePath = file.getAbsolutePath();
+
+
+
             //������������������������������������������������������{{}}������������������������,map������������key������������������������������������������
             HashMap<String, Object> map = new HashMap<>();
             //������������������������
-            RowRenderData header1 = RowRenderData.build(new TextRenderData("6495ED", "������"), new TextRenderData("6495ED", "������"),new TextRenderData("6495ED", "���������������������/������������"));
+            //RowRenderData header1 = RowRenderData.build(new TextRenderData("6495ED", "������"), new TextRenderData("6495ED", "������"),new TextRenderData("6495ED", "���������������������/������������"));
 
             //���������������������������������������������������������list������������������������������foreach������������������
             List<DustForm> list1 = (List<DustForm>) params.get("list1");
 
-            ArrayList<Map<String, Object>> mapArrayList = (ArrayList<Map<String, Object>>) params.get("list3");
+            List<Map<String, Object>> mapArrayList = (ArrayList<Map<String, Object>>) params.get("list3");
             ArrayList<RowRenderData> rsList1 = new ArrayList<>();
             ArrayList<RowRenderData> rsList3 = new ArrayList<>();
-
+            List<Map> detailList = new ArrayList<>();
             for (int i = 0; i < list1.size(); i++) {
                 DustForm dustForm = list1.get(i);
-                RowRenderData row0 = RowRenderData.build(i+1+"",dustForm.getRoad(), dustForm.getValue()+"");
-                rsList1.add(row0);
+                Map maps = new HashMap();
+                maps.put("table1", i+1);
+                maps.put("table2", dustForm.getRoad());
+                maps.put("table3", dustForm.getValue());
+                detailList.add(maps);
             }
-
+            List<Map> detailList2 = new ArrayList<>();
+            Map maps = new HashMap();
+           /* maps.put("table4", "");
+            maps.put("table5", "");
+            maps.put("table6", "");
+            maps.put("table7", map.get("date1"));
+            maps.put("table8", map.get("date2"));
+            detailList2.add(maps);*/
             for (int i = 0; i < mapArrayList.size(); i++) {
                 Map<String, Object> map1 = mapArrayList.get(i);
-                RowRenderData row = RowRenderData.build(i + 1 + "", map1.get("road").toString(), map1.get("value1").toString(), map1.get("value2").toString(), map1.get("value3").toString());
-                rsList3.add(row);
+                maps = new HashMap();
+                maps.put("time4", i+1);
+                maps.put("time5", map1.get("road").toString());
+                maps.put("time6", map1.get("value1").toString());
+                maps.put("time7", map1.get("value2").toString());
+                maps.put("time8", map1.get("value3").toString());
+                detailList2.add(maps);
             }
-            if (!ObjectUtils.isEmpty(mapArrayList)){
-                map.put("table3", new MiniTableRenderData(rsList3));
-            }
-            map.put("table1", new MiniTableRenderData(header1, rsList1));
             String data = params.get("data").toString();
             map.put("data",data);
             map.put("time",params.get("time").toString());
             map.put("date1",params.get("date1").toString());
             map.put("date2",params.get("date2").toString());
-            File docxFile = new File("���������������������.docx");
-            FileUtils.copyToFile(inputStream,docxFile);
-            compile = WordExportUtil.exportWord07(docxFile.getPath(),map);
-            compile.write(response.getOutputStream());
+            HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
+            Configure config = Configure.newBuilder().bind("detailList", policy).bind("detailList2", policy).build();
+            XWPFTemplate compile = XWPFTemplate.compile(filePath,config).render(new HashMap<String, Object>(){{
+                put("time",map.get("time"));
+                put("data",map.get("data"));
+                put("time1",map.get("date1").toString());
+                put("time2",map.get("date2").toString());
+                put("detailList", detailList);
+                put("detailList2", detailList2);
+            }});
+
+            response.setContentType("multipart/form-data");
+            // ���������������
+            response.addHeader("Content-Disposition", "attachment;fileName=ce.docx" );
+            response.setCharacterEncoding("UTF-8");
+            OutputStream out = response.getOutputStream();
+            compile.write(out);
+            out.flush();
+            out.close();
             compile.close();
-            inputStream.close();
         } catch (IOException e) {
             log.error ("������������������������������������������", e);
         } catch (Exception e) {
             throw new RuntimeException(e);
-        }finally {
-            compile.close();
-            inputStream.close();
-
         }
 
     }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/OrganizationMapper.java b/screen-api/src/main/java/com/moral/api/mapper/OrganizationMapper.java
index 96f6f50..afedd98 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/OrganizationMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/OrganizationMapper.java
@@ -2,6 +2,9 @@
 
 import com.moral.api.entity.Organization;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,7 @@
  */
 public interface OrganizationMapper extends BaseMapper<Organization> {
 
+    List<Integer> orgIdList(@Param("organizationId") Integer organizationId);
+
+    List<Integer> orgIdSpecialDevList(@Param("organizationId") Integer organizationId,@Param("mac") String mac);
 }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java b/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
index 6dec41c..68b2dd7 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
@@ -22,4 +22,12 @@
      * ������������id
      */
     List<Integer> selectCodeList(@Param("code") String code,@Param("id") Integer id);
+
+    /**
+     * ������������������������
+     * @param code
+     * @param id
+     * @return
+     */
+    String selectName(@Param("code") String code,@Param("id") Integer id);
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java
index a0fca82..a5b3b7e 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java
@@ -1,5 +1,6 @@
 package com.moral.api.pojo.ext.allocation;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.moral.api.entity.Allocation;
 import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
 import com.moral.api.pojo.vo.file.FileVo;
@@ -34,4 +35,16 @@
 
     @ApiModelProperty(value = "������������")
     private List<ApproveTableListVo> approveList;
+
+    //������������������
+    @TableField(exist = false)
+    private String unitName;
+
+    //������������������
+    @TableField(exist = false)
+    private String escalationUnitName;
+    @TableField(exist = false)
+    //������������������
+    private String polluteTypeName;
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java
index 3b4b5d2..bedf4e4 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java
@@ -1,6 +1,7 @@
 package com.moral.api.pojo.ext.allocation;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.moral.api.entity.Allocation;
 import io.swagger.annotations.ApiModelProperty;
@@ -27,4 +28,7 @@
 
     @ApiModelProperty(value = "������������")
     private String stateName;
+
+    //������������������
+    private String escalationUnitName;
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/app/AppAllocationPushUserCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/app/AppAllocationPushUserCond.java
new file mode 100644
index 0000000..25e8813
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/app/AppAllocationPushUserCond.java
@@ -0,0 +1,49 @@
+package com.moral.api.pojo.query.app;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+import javax.validation.constraints.NotNull;
+
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AppAllocationPushUserCond - ������������������", description="AppAllocationPushUserCond - ������������������")
+public class AppAllocationPushUserCond {
+
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������������")
+    private Date escalationTime;
+
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer unitId;
+
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer escalationUnitId;
+
+
+    @ApiModelProperty(value = "������")
+    @NotNull(message = "���������������������")
+    private Integer state;
+    /**
+     *������������
+     */
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������")
+    private String allocationNum;
+
+
+}
+
+
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java
index 7aede07..a8c61e0 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java
@@ -109,7 +109,7 @@
     }
 
     public Integer getResidueDay() {
-        int day = this.changeDay;
+        int day = Objects.isNull(this.changeDay)?0:this.changeDay;
         if(AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(state)){
             Date date = new Date();
             int days = DateUtils.getDays(escalationTime, date);
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java
index ddf8f60..64c73f2 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java
@@ -139,6 +139,13 @@
     @TableField(exist = false)
     private String time;
 
+    @TableField(exist = false)
+    private String unitName;
+    @TableField(exist = false)
+    private String escalationUnitName;
+    @TableField(exist = false)
+    private String polluteTypeName;
+
 
     public static AllocationVo convert(AllocationExt allocationExt) {
         AllocationVo allocationVo = BeanConverts.convert(allocationExt, AllocationVo.class);
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAllocationFindVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAllocationFindVo.java
index b5fb539..00c0cbb 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAllocationFindVo.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAllocationFindVo.java
@@ -2,6 +2,7 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.moral.api.pojo.enums.AllocationApproveEnum;
+import com.moral.api.pojo.enums.ChangeEnum;
 import com.moral.api.pojo.ext.allocation.AllocationPageExt;
 import com.moral.api.pojo.vo.allocation.AllocationPageVo;
 import com.moral.api.utils.BeanConverts;
@@ -73,13 +74,18 @@
 
     @ApiModelProperty(value = "������������")
     private String stateName;
+    //������������������
+    private String escalationUnitName;
 
     public Integer getResidueDay() {
-        int day = this.changeDay;
-        if(AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(state)){
-            Date date = new Date();
-            int days = DateUtils.getDays(escalationTime, date);
-            return day-days;
+       int day=0;
+        if (this.changeType==ChangeEnum.DEADLINE.value){
+             day = this.changeDay;
+            if(AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(state)){
+                Date date = new Date();
+                int days = DateUtils.getDays(escalationTime, date);
+                return day-days;
+            }
         }
         return day;
     }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAuthority.java b/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAuthority.java
new file mode 100644
index 0000000..c7f4b95
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/app/AppAuthority.java
@@ -0,0 +1,13 @@
+package com.moral.api.pojo.vo.app;
+
+
+import lombok.Data;
+
+@Data
+public class AppAuthority {
+    //������������
+    private  Integer code;
+
+    //������������
+    private  String  name;
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/AllocationService.java b/screen-api/src/main/java/com/moral/api/service/AllocationService.java
index abdb545..218cbfc 100644
--- a/screen-api/src/main/java/com/moral/api/service/AllocationService.java
+++ b/screen-api/src/main/java/com/moral/api/service/AllocationService.java
@@ -12,13 +12,11 @@
 import com.moral.api.pojo.ext.allocation.AllocationListExt;
 import com.moral.api.pojo.ext.allocation.AllocationPageExt;
 import com.moral.api.pojo.query.allocation.*;
-import com.moral.api.pojo.dto.allocation.AllocationUnitDto;
 import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
 import com.moral.api.pojo.query.app.AppAllocationFileCond;
 import com.moral.api.pojo.query.app.AppAllocationPageCond;
 import com.moral.api.pojo.vo.allocation.AllocationFindVo;
-import com.moral.api.pojo.vo.allocation.AllocationPageVo;
-import com.moral.api.pojo.vo.app.AppAllocationFindVo;
+import com.moral.api.pojo.vo.app.AppAuthority;
 
 public interface AllocationService extends IService<Allocation> {
 
@@ -133,8 +131,13 @@
      */
     void checkSmallRoutine(AllocationCheckCond checkCond);
 
-
-    boolean authority(String allocationNum,Integer userId);
+    /**
+     * ������������ 1 ������������������  2.������������������ 3.���������
+     * @param allocationNum
+     * @param userId
+     * @return
+     */
+    AppAuthority authority(String allocationNum, Integer userId);
 
 
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/OrganizationService.java b/screen-api/src/main/java/com/moral/api/service/OrganizationService.java
index c27d8ef..2c3972c 100644
--- a/screen-api/src/main/java/com/moral/api/service/OrganizationService.java
+++ b/screen-api/src/main/java/com/moral/api/service/OrganizationService.java
@@ -2,6 +2,7 @@
 
 import com.moral.api.entity.Organization;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -34,6 +35,11 @@
     Organization getOrganizationById(Integer id);
 
 
-
+    /**
+     * ������������������������
+     * @param organizationId
+     * @return
+     */
+    List<Integer> orgIdList( Integer organizationId);
 
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/UserService.java b/screen-api/src/main/java/com/moral/api/service/UserService.java
index 9a27915..56ef3f0 100644
--- a/screen-api/src/main/java/com/moral/api/service/UserService.java
+++ b/screen-api/src/main/java/com/moral/api/service/UserService.java
@@ -5,11 +5,12 @@
 
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moral.api.entity.Allocation;
 import com.moral.api.entity.User;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import com.moral.api.pojo.bo.UserBO;
-import com.moral.api.pojo.query.AppUserCond;
+import com.moral.api.pojo.query.app.AppAllocationPushUserCond;
 
 /**
  * <p>
@@ -53,4 +54,7 @@
 
     boolean updateUserId(Integer userId);
 
+    // ���������������
+    void pushOneUser(Allocation appAllocationPushUserCond);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
index 235b1e7..0b9da91 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
@@ -25,6 +25,7 @@
 import com.moral.api.pojo.query.app.AppAllocationPageCond;
 import com.moral.api.pojo.vo.allocation.AllocationFindVo;
 import com.moral.api.pojo.vo.app.AppAllocationFindVo;
+import com.moral.api.pojo.vo.app.AppAuthority;
 import com.moral.api.pojo.vo.user.QxUser;
 import com.moral.api.service.*;
 import com.moral.constant.Constants;
@@ -70,6 +71,8 @@
     private ResponsibilityUnitService responsibilityUnitService;
     @Autowired
     private SysDictTypeService sysDictTypeService;
+    @Autowired
+    private UserService userService;
 
     /**
      * ������������������������������������
@@ -124,7 +127,7 @@
         //������
         String allocationNum = "JBD-" + dateString + String.format("%04d", i);
         allocation.setAllocationNum(allocationNum);
-        if(Objects.nonNull(allocationCond.getEscalationUnitId())&& escalationType(allocationCond.getEscalationUnitId())) {
+        if(Objects.nonNull(allocationCond.getEscalationUnitId())&& !allocationCond.getEscalationUnitId().equals(allocationCond.getUnitId()) && escalationType(allocationCond.getEscalationUnitId())) {
             allocation.setEscalationType(AllocationEscalationTypeEnum.CHECK.getValue());
         }
         if(NEW_BUILT.equals(allocationCond.getState())) {
@@ -132,8 +135,10 @@
         }
         //������������������
         allocationMapper.insert(allocation);
+        //������������
+        userService.pushOneUser(allocation);
         redisTemplate.opsForValue().set(RedisConstants.JBD_DATA,i);
-        if(NEW_BUILT.equals(allocationCond.getState())) {
+        if(NEW_BUILT.equals(allocationCond.getState())||AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(allocationCond.getState())) {
             //������������������
             ApproveTable approveTable = new ApproveTable();
             approveTable.setRelationId(allocation.getAllocationId());
@@ -503,6 +508,9 @@
         allocationExt.setFileChangeList(fileTableService.list(id,FileTableEnum.ALLOCATION_RECTIFICATION.value));
         allocationExt.setFileApproveList(fileTableService.list(id,FileTableEnum.ALLOCATION_APPROVE.value));
         allocationExt.setApproveList(approveTableService.listAll(id, FileTableEnum.ALLOCATION_FOUNDATION.value));
+        allocationExt.setUnitName(getUnitName(allocationExt.getUnitId()).getUnitName());
+        allocationExt.setEscalationUnitName(getUnitName(allocationExt.getEscalationUnitId()).getUnitName());
+        allocationExt.setPolluteTypeName(responsibilityUnitMapper.selectName(Constants.WU_RAN_LEI_XING,allocationExt.getPolluteType()));
         return allocationExt;
     }
 
@@ -526,6 +534,9 @@
         allocation.setState(changeCond.getState());
         allocation.setChangeTime(new Date());
         this.updateById(allocation);
+        //������������
+        Allocation allocation1 = this.getById(changeCond.getAllocationId());
+        userService.pushOneUser(allocation1);
         //������������������
         ApproveTable approveTable = new ApproveTable();
         approveTable.setRelationId(allocation.getAllocationId());
@@ -700,6 +711,8 @@
         Page<AllocationPageExt> extAppPage = this.baseMapper.extAppPage(allocationPageCond.getPage().convertPage(),allocationPageCond);
         extAppPage.getRecords().forEach(it->{
             Integer state = it.getState();
+            //������������������������
+            it.setEscalationUnitName(getUnitName(it.getEscalationUnitId()).getUnitName());
             if (state.equals(AllocationApproveEnum.DRAFT.value)||state.equals(AllocationApproveEnum.UNDER_RECTIFICATION.value)){
                 if(integer==0||integer==1){
                     it.setStateName(AppAllocationStateEnum.TO_BE_PROCESSED.name);
@@ -787,9 +800,12 @@
         //������������������
         ApproveTable approveTable = new ApproveTable();
         approveTable.setRelationId(allocation.getAllocationId());
+        approveTable.setApproveModule(FileTableEnum.ALLOCATION_FOUNDATION.value);
+       /* approveTable.setState(NEW_BUILT);
+        approveTable.setStateName("������");
+        approveTableService.saveResult(approveTable);*/
         approveTable.setState(AllocationApproveEnum.UNDER_RECTIFICATION.value);
         approveTable.setStateName(AllocationApproveEnum.UNDER_RECTIFICATION.name);
-        approveTable.setApproveModule(FileTableEnum.ALLOCATION_FOUNDATION.value);
         approveTableService.saveResult(approveTable);
         fileTableService.upDateResult(changeCond.getFileChangeList(),allocation.getAllocationId(), FileTableEnum.ALLOCATION_RECTIFICATION.value);
     }
@@ -835,30 +851,66 @@
     }
 
     @Override
-    public boolean authority(String allocationNum,Integer userId) {
+    public AppAuthority authority(String allocationNum,Integer userId) {
+        //������������
+        AppAuthority appAuthority = new AppAuthority();
         //������������������
         QxUser user = UserHelper.getCurrentUser();
+        //���������������������
+        LambdaQueryWrapper<Allocation> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Allocation::getAllocationNum,allocationNum);
+        wrapper.eq(Allocation::getIsDel,0);
+        wrapper.eq(Allocation::getIsInvalid,0);
+        Allocation allocation = allocationMapper.selectOne(wrapper);
+
         List<Integer> userList = responsibilityUnitMapper.selectCodeList(SysDictTypeEnum.SYS_JBD.getValue(),user.getUserId());
         if(CollectionUtils.isNotEmpty(userList)){
-            return true;
-        }
-        if(Objects.nonNull(user.getUnitId())){
-            LambdaQueryWrapper<Allocation> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(Allocation::getAllocationNum,allocationNum);
-            wrapper.eq(Allocation::getIsDel,0);
-            wrapper.eq(Allocation::getIsInvalid,0);
-            Allocation allocation = allocationMapper.selectOne(wrapper);
-            if (allocation.getUnitId().equals(user.getUnitId())){
-                return true;
-            }
-            String code = responsibilityUnitMapper.selectAreaCode(user.getUnitId());
-            if(code.length()>6){
-                return false;
+            //���������������������
+            if (allocation.getState()>30){
+                appAuthority.setCode(2);
+                appAuthority.setName(AppAllocationStateEnum.COMPLETED.name);
             }else {
-                return true;
+                appAuthority.setCode(1);
+                appAuthority.setName(AppAllocationStateEnum.COMPLETED.name);
+            }
+            return appAuthority;
+        }
+        if(Objects.nonNull(user.getUnitId())&&user.getUnitId()!=0){
+            String code = responsibilityUnitMapper.selectAreaCode(user.getUnitId());
+            if (code.length() > 6 && allocation.getUnitId().equals(user.getUnitId())) {
+                if (allocation.getState().equals(AllocationApproveEnum.UNDER_RECTIFICATION.value)){
+                    appAuthority.setCode(1);
+                    appAuthority.setName(AppAllocationStateEnum.TO_BE_PROCESSED.name);
+                    return appAuthority;
+                }else if (allocation.getState().equals(AllocationApproveEnum.IN_APPROVAL.value)){
+                    appAuthority.setCode(2);
+                    appAuthority.setName(AppAllocationStateEnum.TO_BE_COMPLETED.name);
+                    return appAuthority;
+                }else {
+                    appAuthority.setCode(2);
+                    appAuthority.setName(AppAllocationStateEnum.COMPLETED.name);
+                    return appAuthority;
+                }
+            } else if (code.length() <= 6){
+                if (allocation.getState().equals(AllocationApproveEnum.IN_APPROVAL.value)){
+                    appAuthority.setCode(1);
+                    appAuthority.setName(AppAllocationStateEnum.TO_BE_PROCESSED.name);
+                    return appAuthority;
+                }else if (allocation.getState().equals(AllocationApproveEnum.UNDER_RECTIFICATION.value)){
+                    appAuthority.setCode(2);
+                    appAuthority.setName(AppAllocationStateEnum.TO_BE_COMPLETED.name);
+                    return appAuthority;
+                }else {
+                    appAuthority.setCode(2);
+                    appAuthority.setName(AppAllocationStateEnum.COMPLETED.name);
+                    return appAuthority;
+                }
             }
         }
-        return true;
+        //���������������������
+        appAuthority.setCode(3);
+        appAuthority.setName("������������");
+        return appAuthority;
     }
 
     @Override
@@ -883,15 +935,15 @@
         if(CollectionUtils.isNotEmpty(userList)){
             return 1;
         }
-        if(Objects.nonNull(user.getUnitId())){
+        if(Objects.nonNull(user.getUnitId())&&user.getUnitId()!=0) {
             String code = responsibilityUnitMapper.selectAreaCode(user.getUnitId());
-            if(code.length()>6){
+            if (code.length() > 6) {
                 return 0;
-            }else {
+            } else {
                 return 2;
             }
         }
-        return 1;
+        return 0;
     }
     private boolean escalationType(Integer id){
         boolean f = false;
@@ -901,4 +953,11 @@
         }
         return f;
     }
+
+
+    private ResponsibilityUnit getUnitName(Integer unitId){
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(unitId);
+          return   responsibilityUnit;
+    }
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/DustldServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/DustldServiceImpl.java
index 1863fba..4ce7314 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/DustldServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/DustldServiceImpl.java
@@ -1,7 +1,10 @@
 package com.moral.api.service.impl;
 
 
+import com.moral.api.exception.BusinessException;
+import com.moral.api.mapper.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.system.ApplicationHome;
 import org.springframework.stereotype.Service;
@@ -36,10 +39,6 @@
 import com.moral.api.entity.Dustld;
 import com.moral.api.entity.ManageCoordinate;
 import com.moral.api.entity.MaxRoad;
-import com.moral.api.mapper.DustldMapper;
-import com.moral.api.mapper.HistorySecondCruiserMapper;
-import com.moral.api.mapper.ManageCoordinateMapper;
-import com.moral.api.mapper.MaxRoadMapper;
 import com.moral.api.pojo.dto.historySecondCruiser.DustldDTO;
 import com.moral.api.pojo.dust.DustForm;
 import com.moral.api.pojo.dust.TimeForm;
@@ -270,6 +269,8 @@
     private ManageCoordinateMapper manageCoordinateMapper;
     @Autowired
     private MaxRoadMapper maxRoadMapper;
+    @Autowired
+    private OrganizationMapper organizationMapper;
 
     @Override
     @Transactional
@@ -278,6 +279,11 @@
         Map<String, Object> userInfo = (Map<String, Object>) TokenUtils.getUserInfo();
         Map<String, Object> orgInfo = (Map<String, Object>) userInfo.get("organization");
         Integer orgId = (Integer) orgInfo.get("id");
+        String mac = params.get("mac").toString();
+        List<Integer> orgList = organizationMapper.orgIdSpecialDevList(orgId,mac);
+        if(CollectionUtils.isEmpty(orgList)){
+            throw new BusinessException("������������������������������������");
+        }
         String time1 = params.get("startTime").toString();
         String dateString1 = DateUtils.stringToDateString(time1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN, DateUtils.yyyy_MM_dd_HH_mm_CN);
         String rsTime1 = dateString1.substring(5, 14);
@@ -286,7 +292,7 @@
         String rsTime2 = dateString2.substring(5, 14);
         HashMap<String, Object> rsMap = new HashMap<>();
         List<Map<String, Object>> dusts = historySecondCruiserMapper.getDusts(params);
-        Map<String, List<DustldDTO>> collect = manageCoordinateMapper.CompareTo(orgId).stream().collect(Collectors.groupingBy(o -> o.getName()));
+        Map<String, List<DustldDTO>> collect = manageCoordinateMapper.CompareTo(orgList.get(0)).stream().collect(Collectors.groupingBy(o -> o.getName()));
         if (ObjectUtils.isEmpty(dusts) || ObjectUtils.isEmpty(collect)){
             return null;
         }
@@ -384,9 +390,9 @@
                 if (road.getName().equals(dustForm.getRoad())){
                     HashMap<String, Object> map = new HashMap<>();
                     map.put("road",road.getName());
-                    map.put("value1",road.getData());
-                    map.put("value2",dustForm.getValue());
-                    map.put("value3",road.getData()-dustForm.getValue());
+                    map.put("value1",String.format("%.2f",road.getData()));
+                    map.put("value2",String.format("%.2f",dustForm.getValue()));
+                    map.put("value3",String.format("%.2f",road.getData()-dustForm.getValue()));
                     list3.add(map);
                 }
             }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
index c290dc5..40b13b6 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
@@ -39,6 +39,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 
+import java.text.DecimalFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -292,6 +293,7 @@
 
             }
         }
+        String str = new DecimalFormat("#.######").format(Double.parseDouble(result.get("a21005").toString()));
         QueryFiveDataByMacVO queryFiveDataByMacVO = new QueryFiveDataByMacVO();
         queryFiveDataByMacVO.setName(device.getName());
         queryFiveDataByMacVO.setDataTime(datas.get("dataTime").toString());
@@ -299,7 +301,7 @@
         queryFiveDataByMacVO.setA34002(result.get("a34002").toString());
         queryFiveDataByMacVO.setA21026(result.get("a21026").toString());
         queryFiveDataByMacVO.setA21004(result.get("a21004").toString());
-        queryFiveDataByMacVO.setA21005(result.get("a21005").toString());
+        queryFiveDataByMacVO.setA21005(str);
         queryFiveDataByMacVO.setA05024(result.get("a05024").toString());
         queryFiveDataByMacVO.setA01008(result.get("a01008").toString());
         queryFiveDataByMacVO.setA01007(result.get("a01007").toString());
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
index db1785c..7287c00 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
@@ -27,6 +27,7 @@
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -59,28 +60,27 @@
     public List<Date> queryDate(Integer organizationId) {
         //������������������
         QueryWrapper<HistorySecondUav> queryWrapper = new QueryWrapper<>();
+        //List<Integer> childrenId = new ArrayList<>();
+        List<Integer> children = organizationService.orgIdList(organizationId);
         //���������������id
-        List<Organization> children = organizationService.getChildrenOrganizationsById(organizationId);
+        /*List<Organization> children = organizationService.getChildrenOrganizationsById(organizationId);
         List<Integer> childrenId = new ArrayList<>();
         for (Organization child : children) {
             childrenId.add(child.getId());
         }
-        childrenId.add(organizationId);
-        queryWrapper.in("organization_id", childrenId);
+        childrenId.add(organizationId);*/
+        queryWrapper.in("organization_id", children);
         //���������������������������180���
         Date endDate = new Date();
         Date startDate = DateUtils.addDays(endDate, -180);
         queryWrapper.between("batch", startDate, endDate);
         //������������������
-        queryWrapper.select("DISTINCT batch");
+        queryWrapper.select("DISTINCT DATE_FORMAT(batch,'%Y-%m-%d') batch ");
         queryWrapper.orderByDesc("batch");
         //������������
         List<HistorySecondUav> historySecondUavs = historySecondUavMapper.selectList(queryWrapper);
         //������������Date������
-        List<Date> result = new ArrayList<>();
-        for (HistorySecondUav historySecondUav : historySecondUavs) {
-            result.add(historySecondUav.getBatch());
-        }
+        List<Date> result = historySecondUavs.stream().map(HistorySecondUav::getBatch).collect(Collectors.toList());
         return result;
     }
 
@@ -94,12 +94,9 @@
         Date endDate = form.getEndDate();
         QueryWrapper<HistorySecondUav> wrapper = new QueryWrapper<>();
         //���������������id
-        List<Organization> children = organizationService.getChildrenOrganizationsById(organizationId);
+        List<Integer> children = organizationService.orgIdList(organizationId);
         List<Integer> childrenId = new ArrayList<>();
-        for (Organization child : children) {
-            childrenId.add(child.getId());
-        }
-        childrenId.add(organizationId);
+        childrenId.addAll(children);
         childrenId.addAll(integerList);
         wrapper.in("organization_id", childrenId);
         //������������batch������������������������������������������������
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
index 98ad2cd..9b03888 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
@@ -71,4 +71,9 @@
             return;
         }
     }
+
+    @Override
+    public List<Integer> orgIdList(Integer organizationId) {
+        return this.baseMapper.orgIdList(organizationId);
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
index 33c1ea6..2930b9a 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
@@ -210,7 +210,7 @@
                     });
                 }
             }else {
-                BigDecimal dataValue = Objects.nonNull(list.getDataValue())?BigDecimal.valueOf(Integer.parseInt(list.getDataValue())):BigDecimal.ZERO;
+                BigDecimal dataValue = Objects.nonNull(list.getDataValue())?BigDecimal.valueOf(Double.parseDouble(list.getDataValue())):BigDecimal.ZERO;
                 result.forEach(it->{
                     it.setAvgNum(it.getAvgNum().add(dataValue));
                 });
@@ -224,8 +224,8 @@
     private BigDecimal numAvg(List<String> list , BigDecimal num){
         int nums = 1;
         for (int i=0;i<list.size();i=i+2){
-            if(num.compareTo(BigDecimal.valueOf(Integer.parseInt(list.get(i))))>= 0 ){
-                return num.add(BigDecimal.valueOf(Integer.parseInt(list.get(nums))));
+            if(num.compareTo(BigDecimal.valueOf(Double.parseDouble(list.get(i))))>= 0 ){
+                return num.add(BigDecimal.valueOf(Double.parseDouble(list.get(i+1))));
             }
             nums+=2;
         }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
index b112317..cde7c7f 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
@@ -8,27 +8,38 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.config.Interceptor.UserHelper;
 import com.moral.api.entity.*;
 import com.moral.api.mapper.*;
 import com.moral.api.pojo.bo.UserBO;
+import com.moral.api.pojo.enums.AllocationApproveEnum;
 import com.moral.api.pojo.enums.FileTableEnum;
 import com.moral.api.pojo.enums.StateEnum;
 import com.moral.api.pojo.enums.SysDictTypeEnum;
+
 import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.pojo.vo.user.QxUser;
 import com.moral.api.service.FileTableService;
+import com.moral.api.service.ResponsibilityUnitService;
 import com.moral.api.service.UserService;
 import com.moral.api.utils.OperationLogUtils;
+import com.moral.api.utils.StringUtils;
 import com.moral.api.utils.WechatUtils;
+import com.moral.api.vo.WxMssVo;
 import com.moral.constant.Constants;
 import com.moral.constant.ResponseCodeEnum;
 import com.moral.util.*;
+
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
+import org.springframework.web.client.RestTemplate;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -69,6 +80,9 @@
     @Autowired
     private ResponsibilityUnitMapper responsibilityUnitMapper;
 
+    @Autowired
+    private ResponsibilityUnitService responsibilityUnitService;
+
 
     @Value("${AES.KEY}")
     private String AESKey;
@@ -103,6 +117,16 @@
         }
         ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(userBo.getUnitId());
         List<Integer> list = responsibilityUnitMapper.selectCodeList(SysDictTypeEnum.SYS_DEVICE.value, userBo.getId());
+        result.put("userName", userBo.getUserName());
+        result.put("unitId",userBo.getUnitId());
+        result.put("userId", userBo.getId());
+        result.put("account", userBo.getAccount());
+        List<FileVo> listFile =  fileTableService.list(userBo.getId(), FileTableEnum.APP_ALLOCATION.value);
+        result.put("file", CollectionUtils.isNotEmpty(listFile)?listFile.get(0):new FileVo());
+        result.put("unName",Objects.nonNull(responsibilityUnit)&&Objects.nonNull(responsibilityUnit.getUnitName())?responsibilityUnit.getUnitName():"���������������");
+        result.put("device",ObjectUtils.isEmpty(list)? StateEnum.NOT_EFFECTIVE.value :StateEnum.TAKE_EFFECT.value);
+        String userIdStr = new StringBuffer("00").append(userBo.getId().toString()).toString();
+        String tokenResult = TokenUtils.getTokenById(userIdStr);
         //������������������
         Map<String, Object> userInfo = new LinkedHashMap<>();
         userInfo.put("userId", userBo.getId());
@@ -117,19 +141,25 @@
         userInfo.put("isAdmin", userBo.getIsAdmin());
         userInfo.put("organizationId",userBo.getOrganizationId());
         userInfo.put("openid", openId);
+        if(StringUtils.isNotEmpty(tokenResult)){
+            result.put("token", tokenResult);
+            result.put("code", ResponseCodeEnum.SUCCESS.getCode());
+            result.put("msg", ResponseCodeEnum.SUCCESS.getMsg());
+            sysLog("������������������" + userBo.getAccount()+" ;openId:"+openId,userBo);
+            //������openId���user������
+            User user = userMapper.selectById(userBo.getId());
+            user.setOpenId(openId);
+            userMapper.updateById(user);
+            TokenUtils.getRefreshTokenApp(tokenResult,userInfo);
+            return result;
+        }
+
 
         try {
             //������token������������redis
             String token = TokenUtils.getTokenApp(new StringBuffer("00").append(userBo.getId().toString()).toString(),userInfo);
             result.put("token", token);
-            result.put("userName", userBo.getUserName());
-            result.put("unitId",userBo.getUnitId());
-            result.put("userId", userBo.getId());
-            result.put("account", userBo.getAccount());
-            List<FileVo> listFile =  fileTableService.list(userBo.getId(), FileTableEnum.APP_ALLOCATION.value);
-            result.put("file", CollectionUtils.isNotEmpty(listFile)?listFile.get(0):new FileVo());
-            result.put("unName",Objects.nonNull(responsibilityUnit)&&Objects.nonNull(responsibilityUnit.getUnitName())?responsibilityUnit.getUnitName():"���������������");
-            result.put("device",ObjectUtils.isEmpty(list)? StateEnum.NOT_EFFECTIVE.value :StateEnum.TAKE_EFFECT.value);
+
         } catch (Exception e) {
             log.error("token���������������" + e.getMessage());
             result.put("code", ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode());
@@ -178,7 +208,19 @@
 //            String nickName = rawDataJson.getString("nickName");
 //            String avatarUrl = rawDataJson.getString("avatarUrl");
         }
-
+        String userIdStr = new StringBuffer("00").append(user.getId().toString()).toString();
+        String tokenResult = TokenUtils.getTokenById(userIdStr);
+        result.put("userName", user.getUserName());
+        result.put("unitId",user.getUnitId());
+        List<FileVo> listFile =  fileTableService.list(user.getId(), FileTableEnum.APP_ALLOCATION.value);
+        result.put("file", CollectionUtils.isNotEmpty(listFile)?listFile.get(0):new FileVo());
+        result.put("userId", user.getId());
+        result.put("account", user.getAccount());
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(user.getUnitId());
+        List<Integer> list = responsibilityUnitMapper.selectCodeList(SysDictTypeEnum.SYS_DEVICE.value, user.getId());
+        result.put("device",ObjectUtils.isEmpty(list)? StateEnum.NOT_EFFECTIVE.value : StateEnum.TAKE_EFFECT.value);
+        result.put("unName",Objects.nonNull(responsibilityUnit)&&Objects.nonNull(responsibilityUnit.getUnitName())?responsibilityUnit.getUnitName():"���������������");
+        result.put("openId",openid);
         Map<String, Object> userInfo = new LinkedHashMap<>();
         userInfo.put("userId", user.getId());
         userInfo.put("account", user.getAccount());
@@ -186,26 +228,24 @@
         userInfo.put("email", user.getEmail());
         userInfo.put("mobile", user.getMobile());
         userInfo.put("unitId",user.getUnitId());
-//        userInfo.put("unName",user.getAreaName());
         userInfo.put("organizationId",user.getOrganizationId());
         userInfo.put("wechat", user.getWechat());
         userInfo.put("expireTime", DateUtils.dateToDateString(user.getExpireTime()));
         userInfo.put("isAdmin", user.getIsAdmin());
-        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(user.getUnitId());
-        List<Integer> list = responsibilityUnitMapper.selectCodeList(SysDictTypeEnum.SYS_DEVICE.value, user.getId());
+        if(StringUtils.isNotEmpty(tokenResult)){
+            result.put("token", tokenResult);
+            result.put("code", ResponseCodeEnum.SUCCESS.getCode());
+            result.put("msg", ResponseCodeEnum.SUCCESS.getMsg());
+            sysLog("������������������" + user.getAccount()+" ;openId:"+openid,user);
+            TokenUtils.getRefreshTokenApp(tokenResult,userInfo);
+            return result;
+        }
         try {
             //������token������������redis
             String token = TokenUtils.getTokenApp(new StringBuffer("00").append(user.getId().toString()).toString(),userInfo);
             result.put("token", token);
-            result.put("userName", user.getUserName());
-            result.put("unitId",user.getUnitId());
-            List<FileVo> listFile =  fileTableService.list(user.getId(), FileTableEnum.APP_ALLOCATION.value);
-            result.put("file", CollectionUtils.isNotEmpty(listFile)?listFile.get(0):new FileVo());
-            result.put("userId", user.getId());
-            result.put("account", user.getAccount());
-            result.put("device",ObjectUtils.isEmpty(list)? StateEnum.NOT_EFFECTIVE.value : StateEnum.TAKE_EFFECT.value);
-            result.put("unName",Objects.nonNull(responsibilityUnit)&&Objects.nonNull(responsibilityUnit.getUnitName())?responsibilityUnit.getUnitName():"���������������");
-            result.put("openId",openid);
+
+
         } catch (Exception e) {
             log.error("token���������������" + e.getMessage());
             result.put("code", ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode());
@@ -226,6 +266,74 @@
         sysLog(userId+"������������������",user);
         return true;
     }
+
+
+
+    /**
+     * ���������������
+     * @param appAllocationPushUserCond
+     */
+    @Override
+    @Async("asyncPoolTaskExecutor")
+    public void pushOneUser(Allocation appAllocationPushUserCond) {
+        QxUser currentUser = UserHelper.getCurrentUser();
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(appAllocationPushUserCond.getUnitId());
+        Integer areaCode = responsibilityUnit.getAreaCode();
+
+        List<ResponsibilityUnit> responsibilityUnits = responsibilityUnitService.selectAreaUnit(areaCode.toString().length()>6?responsibilityUnit.getParentCode():responsibilityUnit.getAreaCode());
+        //������unitid
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(User::getIsDelete,Constants.NOT_DELETE);
+        Integer state = appAllocationPushUserCond.getState();
+        if (state==20){
+            wrapper.eq(User::getUnitId,appAllocationPushUserCond.getUnitId());
+        }else {
+            wrapper.eq(User::getUnitId,ObjectUtils.isEmpty(responsibilityUnits)?0:responsibilityUnits.get(0).getUnitId());
+        }
+
+        List<User> users = userMapper.selectList(wrapper);
+        if (ObjectUtils.isEmpty(users)){
+            return;
+        }
+
+        String dateString = DateUtils.dateToDateString(appAllocationPushUserCond.getEscalationTime(),"MM���dd���");
+        //������������������������������������������������access_token������������������������������access_token������������������������������
+        //���������������
+        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + WechatUtils.getAccessToken();
+        //������������
+        for (User user : users) {
+            if (user.getId().equals(currentUser.getUserId())){
+                continue;
+            }
+            RestTemplate restTemplate = new RestTemplate();
+            //���������������������
+            WxMssVo wxMssVo = new WxMssVo();
+            wxMssVo.setTouser(user.getOpenId());//���������openid���������������������������������������������������������������������
+            wxMssVo.setTemplate_id("YNqUZ1MgMvwY3G-NENVbcmIBR5dUotSdnwcz96CWrho");//������������������id
+            wxMssVo.setLang("zh_CN");
+            wxMssVo.setMiniprogramState("formal");
+            wxMssVo.setPage("pages/index/index");
+            Map<String, Object> m = new HashMap<>();
+            HashMap<String, Object> map1 = new HashMap<>();
+            HashMap<String, Object> map2 = new HashMap<>();
+            HashMap<String, Object> map3 = new HashMap<>();
+            HashMap<String, Object> map4 = new HashMap<>();
+            map1.put("value",responsibilityUnit.getUnitName()+dateString+"������������");
+            map2.put("value",appAllocationPushUserCond.getAllocationNum());
+            map3.put("value",state==30? AllocationApproveEnum.IN_APPROVAL.name:AllocationApproveEnum.UNDER_RECTIFICATION.name);
+            map4.put("value",DateUtils.dateToDateString(new Date(),"yyyy���MM���dd���"));
+            m.put("thing18", map1);
+            m.put("character_string1", map2);
+            m.put("thing2", map3);
+            m.put("date4", map4);
+            wxMssVo.setData(JSON.toJSON(m));
+            ResponseEntity<String> responseEntity =
+                    restTemplate.postForEntity(url, wxMssVo, String.class);
+            String body = responseEntity.getBody();
+            log.info("������:"+body+"������:"+user.getAccount()+"openID"+user.getOpenId());
+        }
+    }
+
     private void sysLog(String cont,User user){
         //������
         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
diff --git a/screen-api/src/main/java/com/moral/api/utils/HttpClientUtil.java b/screen-api/src/main/java/com/moral/api/utils/HttpClientUtil.java
index 198c652..ac06c8c 100644
--- a/screen-api/src/main/java/com/moral/api/utils/HttpClientUtil.java
+++ b/screen-api/src/main/java/com/moral/api/utils/HttpClientUtil.java
@@ -140,18 +140,4 @@
         return resultString;
     }
 
-    public static String getAccessToken() {
-        RestTemplate restTemplate = new RestTemplate();
-        Map<String, String> params = new HashMap<>();
-        params.put("APPID", "wx7c54942dfc87f4d8");  //
-        params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49");  //
-        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
-                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
-        String body = responseEntity.getBody();
-        JSONObject object = JSON.parseObject(body);
-        String Access_Token = object.getString("access_token");
-        String expires_in = object.getString("expires_in");
-        System.out.println("������������expires_in���" + expires_in);
-        return Access_Token;
-    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/utils/WechatUtils.java b/screen-api/src/main/java/com/moral/api/utils/WechatUtils.java
index bdafa35..8471c56 100644
--- a/screen-api/src/main/java/com/moral/api/utils/WechatUtils.java
+++ b/screen-api/src/main/java/com/moral/api/utils/WechatUtils.java
@@ -3,16 +3,9 @@
 
 
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
+
 import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
-import org.springframework.stereotype.Service;
-import org.springframework.web.client.RestClientException;
+
 import org.springframework.web.client.RestTemplate;
 
 import java.util.HashMap;
@@ -20,7 +13,7 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.moral.api.service.UserLogService;
+
 
 public class WechatUtils {
 
@@ -46,4 +39,18 @@
 
         return jsonObject;
     }
+
+    public static String getAccessToken() {
+        RestTemplate restTemplate = new RestTemplate();
+        Map<String, String> params = new HashMap<>();
+        params.put("APPID", APPID);  //
+        params.put("APPSECRET", SECRET);  //
+        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
+                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
+        String body = responseEntity.getBody();
+        JSONObject object = JSON.parseObject(body);
+        String Access_Token = object.getString("access_token");
+//        String expires_in = object.getString("expires_in");
+        return Access_Token;
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/vo/WxMssVo.java b/screen-api/src/main/java/com/moral/api/vo/WxMssVo.java
index 706aa87..3ad7ea7 100644
--- a/screen-api/src/main/java/com/moral/api/vo/WxMssVo.java
+++ b/screen-api/src/main/java/com/moral/api/vo/WxMssVo.java
@@ -9,5 +9,7 @@
     private String touser;//������openid
     private String template_id;//������������������id
     private String page = "pages/index/index";//���������������������������
-    private Map<String, String> data;//������������
+    private Object data;//������������
+    private  String miniprogramState;
+    private  String lang;
 }
diff --git a/screen-api/src/main/resources/mapper/DeviceMapper.xml b/screen-api/src/main/resources/mapper/DeviceMapper.xml
index 238bf81..959ae30 100644
--- a/screen-api/src/main/resources/mapper/DeviceMapper.xml
+++ b/screen-api/src/main/resources/mapper/DeviceMapper.xml
@@ -199,7 +199,7 @@
         <if test="organizationId !=null">
             AND organization_id = #{organizationId}
         </if>
-           and mac LIKE "%"#{mac}"%" AND is_delete = 0
+           and mac LIKE "%"#{mac}"%" or `name` like "%"#{mac}"%" AND is_delete = 0
         union
         SELECT sd.id,sd.`name`,sd.mac,sd.special_type FROM special_device  as sd
         WHERE 1=1
diff --git a/screen-api/src/main/resources/mapper/OrganizationMapper.xml b/screen-api/src/main/resources/mapper/OrganizationMapper.xml
index e6490b9..7b47b80 100644
--- a/screen-api/src/main/resources/mapper/OrganizationMapper.xml
+++ b/screen-api/src/main/resources/mapper/OrganizationMapper.xml
@@ -26,4 +26,39 @@
         <result column="is_delete" property="isDelete"/>
     </resultMap>
 
+    <select id="orgIdList" resultType="java.lang.Integer">
+        SELECT id FROM (
+                           SELECT id, parent_id, name FROM organization  WHERE id = #{organizationId}
+                           UNION ALL
+                           SELECT i.id, i.parent_id, i.name
+                           FROM organization  i
+                                    INNER JOIN (
+                               SELECT * FROM (
+                                                 SELECT id, parent_id, name FROM organization  WHERE id = #{organizationId}
+                                                 UNION ALL
+                                                 SELECT id, parent_id, name FROM organization WHERE parent_id = #{organizationId}
+                                             ) t1
+                           ) t2 ON i.parent_id = t2.id
+                           where i.is_delete = 0
+                       ) t3
+    </select>
+    <select id="orgIdSpecialDevList" resultType="java.lang.Integer">
+        select organization_id from special_device where organization_id in (
+        SELECT id FROM (
+                           SELECT id, parent_id, name FROM organization  WHERE id = #{organizationId}
+                           UNION ALL
+                           SELECT i.id, i.parent_id, i.name
+                           FROM organization  i
+                                    INNER JOIN (
+                               SELECT * FROM (
+                                                 SELECT id, parent_id, name FROM organization  WHERE id = #{organizationId}
+                                                 UNION ALL
+                                                 SELECT id, parent_id, name FROM organization WHERE parent_id = #{organizationId}
+                                             ) t1
+                           ) t2 ON i.parent_id = t2.id
+                           where i.is_delete = 0
+                       ) t3 ) and mac = #{mac} and is_delete = 0
+
+
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/screen-api/src/main/resources/mapper/ResponsibilityUnitMapper.xml b/screen-api/src/main/resources/mapper/ResponsibilityUnitMapper.xml
index 522b283..b8efaa6 100644
--- a/screen-api/src/main/resources/mapper/ResponsibilityUnitMapper.xml
+++ b/screen-api/src/main/resources/mapper/ResponsibilityUnitMapper.xml
@@ -42,4 +42,14 @@
         select area_code from responsibility_unit t where unit_id = #{id}
     </select>
 
+
+    <select id="selectName" resultType="java.lang.String">
+        select t1.dataValue from sys_dict_type t
+                             left join sys_dict_data t1 on t1.dict_type_id = t.id
+
+        where t.is_delete = 0 and t.name = #{code} and t1.dataKey = #{id} and t1.is_delete = 0
+
+
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git "a/screen-api/src/main/resources/word/\345\260\230\350\264\237\350\215\267\347\233\221\346\265\213\346\212\245\345\221\212.docx" "b/screen-api/src/main/resources/word/\345\260\230\350\264\237\350\215\267\347\233\221\346\265\213\346\212\245\345\221\212.docx"
index 282bede..efbb72c 100644
--- "a/screen-api/src/main/resources/word/\345\260\230\350\264\237\350\215\267\347\233\221\346\265\213\346\212\245\345\221\212.docx"
+++ "b/screen-api/src/main/resources/word/\345\260\230\350\264\237\350\215\267\347\233\221\346\265\213\346\212\245\345\221\212.docx"
Binary files differ
diff --git a/screen-common/src/main/java/com/moral/util/TokenUtils.java b/screen-common/src/main/java/com/moral/util/TokenUtils.java
index e8ae947..e51b7c0 100644
--- a/screen-common/src/main/java/com/moral/util/TokenUtils.java
+++ b/screen-common/src/main/java/com/moral/util/TokenUtils.java
@@ -86,7 +86,7 @@
             if (oldToken != null)
                 redisTemplate.delete(oldToken);
             //���token���������value���
-            redisTemplate.opsForValue().set(token, userInfo);
+            getRefreshTokenApp(token,userInfo);
             //redisTemplate.expire(token, validity_time, TimeUnit.SECONDS);
             //���token���������Hash���
             redisTemplate.opsForHash().put("user_token", uid, token);
@@ -98,6 +98,9 @@
         }
     }
 
+    public static void getRefreshTokenApp(String token, Object userInfo) {
+        redisTemplate.opsForValue().set(token, userInfo);
+    }
 
     /**
      * @Description: ������token
@@ -197,7 +200,11 @@
      * @Date: 2021/5/21
      */
     public static String getTokenById(Integer id) {
-         return (String)redisTemplate.opsForHash().get("user_token", String.valueOf(id));
+         return (String) getTokenById(id.toString());
+    }
+
+    public static String getTokenById(String id) {
+        return (String)redisTemplate.opsForHash().get("user_token", String.valueOf(id));
     }
 
 
diff --git a/screen-job/src/main/resources/application-cjl.yml b/screen-job/src/main/resources/application-cjl.yml
index d731ad2..ac9d5f2 100644
--- a/screen-job/src/main/resources/application-cjl.yml
+++ b/screen-job/src/main/resources/application-cjl.yml
@@ -110,4 +110,4 @@
   date:
     changshu: P5DND7A0245358,P5DND7A0245364,P5DND7A0245413,P5DND7A0245355,P5DND7A0245416,P5DND7A0245426,P5DND7A0245398,P5DND7A0245441,P5DND7A0245429,P5DND7A0245435,P5DND7A0245372,P5DND7A0245397,P5DND7A0245415,P5DND7A0245411,P5DND7A0245407,P5DND7A0245418,P5DND7A0245430,P5DND7A0245493,P5DND7A0245414,P5DND7A0245366,P5DND7A0245442,P5DND7A0245386,P5DND7A0245431,P5DND7A0245394,P5DND7A0245380,P5DND7A0245420,P5DND7A0245440,P5DND7A0245432,P5DND7A0391974,P5DND7A0391989,P5DND7A0245481,P5DND7A0392001,P5DND7A0391991,P5DND7A0391978,P5DND7A0245499
   device:
-    list: p5dnd7a0245499,p5dnd7a0391962
+    list: p5dnd7a0245499,p5dnd7a0391962,HJS00002156B89
diff --git a/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
index 0cab33e..2c1b26a 100644
--- a/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
+++ b/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
@@ -6,6 +6,7 @@
 import com.moral.api.entity.HistorySecondCruiser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.moral.api.pojo.dto.cruiser.CruiserDTO;
+import com.moral.api.pojo.dto.cruiser.CruiserListDTO;
 
 /**
  * <p>
@@ -19,4 +20,6 @@
 
     List<CruiserDTO> getCruiserInfo(Map<String,Object> params);
 
+    List<CruiserListDTO> cruiserList(Map<String,Object> params);
+
 }
diff --git a/screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserListDTO.java b/screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserListDTO.java
new file mode 100644
index 0000000..a0b43ce
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserListDTO.java
@@ -0,0 +1,35 @@
+package com.moral.api.pojo.dto.cruiser;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Objects;
+
+@Data
+public class CruiserListDTO {
+
+    /**
+     * ������������
+     */
+    private String time;
+
+    /**
+     * ������
+     */
+    private Double flyLat;
+
+    /**
+     * ������
+     */
+    private Double flyLon;
+
+
+    private Integer coordinateId;
+
+    private Integer id;
+
+    private Integer state;
+
+
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
index 92da268..a6a1a4a 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.moral.api.entity.HistorySecondCruiser;
 import com.moral.api.entity.ManageCoordinateDetail;
 import com.moral.api.entity.Sensor;
@@ -10,28 +11,20 @@
 import com.moral.api.mapper.ManageCoordinateDetailMapper;
 import com.moral.api.mapper.SpecialDeviceMapper;
 import com.moral.api.pojo.dto.cruiser.CruiserDTO;
-import com.moral.api.service.DeviceService;
+import com.moral.api.pojo.dto.cruiser.CruiserListDTO;
 import com.moral.api.service.HistorySecondCruiserService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.moral.api.service.SpecialDeviceService;
 import com.moral.api.util.RoadUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.RedisConstants;
 import com.moral.util.DateUtils;
-
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
 
-import java.sql.Wrapper;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -172,82 +165,41 @@
     @Override
     public Map<String, Object> getCruiserCompare(Map<String, Object> params) {
         HashMap<String,Object> rsMap = new HashMap<>();
-        String mac = params.get("mac").toString();
-        String time1 = params.get("time1").toString();
+        List<CruiserListDTO> list = historySecondCruiserMapper.cruiserList(params);
+        List<CruiserDTO> cruiserInfo = new ArrayList<>();
         ArrayList<ManageCoordinateDetail> rsList1 = new ArrayList<>();
-        params.put("dateFormat", "%Y-%m-%d %H:%i:%s");
-        List<ManageCoordinateDetail> manageCoordinateDetails = manageCoordinateDetailMapper.selectList(null);
-        List<CruiserDTO> cruiserInfo = (List<CruiserDTO>) redisTemplate.opsForHash().get(RedisConstants.DATE_COORDINATE, mac + time1);
-
-        if (ObjectUtils.isEmpty(cruiserInfo)){
-            cruiserInfo = historySecondCruiserMapper.getCruiserInfo(params);
-            cruiserInfo = cruiserInfo.stream().distinct().collect(Collectors.toList());
-            cruiserInfo.removeIf(o->{
-                if (ObjectUtils.isEmpty(o.getFlyLon()) || ObjectUtils.isEmpty(o.getFlyLat())) {
-                    return true;
-                }
-                double lon = o.getFlyLon();
-                double lat = o.getFlyLat();
-                double[] doubles = RoadUtils.transformWGS84ToBD09(lon, lat);
-                Matcher matcher = Pattern.compile("\\d*\\.\\d{8}").matcher(""+doubles[0]);
-                matcher.find();
-                String s = matcher.group();
-                Matcher matcher1 = Pattern.compile("\\d*\\.\\d{8}").matcher(""+doubles[1]);
-                matcher1.find();
-                String s1 = matcher1.group();
-                o.setFlyLon(Double.parseDouble(s));
-                o.setFlyLat(Double.parseDouble(s1));
-                o.setData(lon+"_"+lat);
-//            o.setFlyLon(doubles[0]);
-//            o.setFlyLat(doubles[1]);
-                if (lon < 70 || lon > 150 || lat < 20 || lat > 60) {
-                    return true;
-                }
-                return false;
-            });
-
-            redisTemplate.opsForHash().put(RedisConstants.DATE_COORDINATE,mac+time1,cruiserInfo);
-            //������������������
-            redisTemplate.opsForHash().getOperations().expire(RedisConstants.DATE_COORDINATE,6000, TimeUnit.SECONDS);
-
-        }
-//        List<CruiserDTO> cruiserInfo = historySecondCruiserMapper.getCruiserInfo(params);
-        log.info(""+cruiserInfo.size());
-        if (ObjectUtils.isEmpty(manageCoordinateDetails)){
-            rsMap.put("rsData",cruiserInfo);
-            rsMap.put("data",rsList1);
-            return rsMap;
-        }
-        for (int i=cruiserInfo.size()-1;i>0;i--) {
-            CruiserDTO cruiserDTO = cruiserInfo.get(i);
-            String data = cruiserDTO.getData();
-            String[] rs = data.split("_");
-            String flyLon = rs[0];
-            String flyLat = rs[1];
-//            double lonDouble = Double.parseDouble(flyLon);
-//            double latDouble = Double.parseDouble(flyLat);
-            for (ManageCoordinateDetail manageCoordinateDetail : manageCoordinateDetails) {
-                String latitude = manageCoordinateDetail.getLatitude().toString();
-                String longitude = manageCoordinateDetail.getLongitude().toString();
-//                double lonDouble1 = Double.parseDouble(longitude);
-//                double latDouble1 = Double.parseDouble(latitude);
-//                if (latDouble1==latDouble && lonDouble==lonDouble1){
-                    if (flyLon.equals(longitude) && flyLat.equals(latitude)){
-                    manageCoordinateDetail.setCode(data);
-                    manageCoordinateDetail.setLongitude(cruiserDTO.getFlyLon());
-                    manageCoordinateDetail.setLatitude(cruiserDTO.getFlyLat());
-                    rsList1.add(manageCoordinateDetail);
-                    cruiserInfo.remove(i);
-                    break;
-                }
+        for(CruiserListDTO c : list){
+            if (ObjectUtils.isEmpty(c.getFlyLon()) || ObjectUtils.isEmpty(c.getFlyLat())) {
+                continue;
             }
-
+            double[] doubles = RoadUtils.transformWGS84ToBD09(c.getFlyLon(), c.getFlyLat());
+            if(doubles.length !=2){
+                continue;
+            }
+            String date = new StringBuilder().append(c.getFlyLon()).append("_").append(c.getFlyLat()).toString();
+            if(c.getState().equals(0)){
+                CruiserDTO cruiserDTO = new CruiserDTO();
+                cruiserDTO.setTime(c.getTime());
+                cruiserDTO.setFlyLat(doubles[1]);
+                cruiserDTO.setFlyLon(doubles[0]);
+                cruiserDTO.setData(date);
+                cruiserDTO.setState("1");
+                cruiserInfo.add(cruiserDTO);
+            }else {
+                ManageCoordinateDetail detail = new ManageCoordinateDetail();
+                detail.setId(c.getId());
+                detail.setCoordinateId(c.getCoordinateId());
+                detail.setLongitude(doubles[0]);
+                detail.setLatitude(doubles[1]);
+                detail.setState(c.getState().toString());
+                detail.setCode(date);
+                rsList1.add(detail);
+            }
         }
         rsMap.put("rsData",cruiserInfo);
         rsMap.put("data",rsList1);
         rsMap.put("message","���"+cruiserInfo.size()+"������������������"+"���������"+(cruiserInfo.size()+rsList1.size())+"���");
         return rsMap;
     }
-
 
 }
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java
index 095f733..d8c1d64 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java
@@ -19,6 +19,7 @@
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -226,35 +227,24 @@
                 log.info(j+"");
             }
         }else {
-            for (int i=cruiserInfo.size()-1;i>0;i--) {
-                CruiserDTO cruiserDTO = cruiserInfo.get(i);
-                Double flyLat = cruiserDTO.getFlyLat();
-                Double flyLon = cruiserDTO.getFlyLon();
-                for (ManageCoordinateDetail manageCoordinateDetail : manageCoordinateDetails) {
-                    String latitude = manageCoordinateDetail.getLatitude().toString();
-                    String longitude = manageCoordinateDetail.getLongitude().toString();
-//                    double lonDouble1 = Double.parseDouble(longitude);
-//                    double latDouble1 = Double.parseDouble(latitude);
-//                    if (lonDouble1==flyLon && flyLat==latDouble1 ){
-                    if (longitude.equals(flyLon+"") && latitude.equals(flyLat+"")){
-                        cruiserInfo.remove(i);
-                        break;
-                    }
-                }
-            }
+            Map<String,Integer> map = new HashMap<>(manageCoordinateDetails.size()+50);
+            manageCoordinateDetails.forEach(it->map.put(it.getLatitude()+"_"+it.getLongitude(),it.getId()));
+            List<ManageCoordinateDetail> result = new ArrayList<>();
             for (CruiserDTO cruiserDTO : cruiserInfo) {
-                Double flyLat = cruiserDTO.getFlyLat();
-                Double flyLon = cruiserDTO.getFlyLon();
-                ManageCoordinateDetail rsDTO = new ManageCoordinateDetail();
-                rsDTO.setLatitude(flyLat);
-                rsDTO.setLongitude(flyLon);
-                rsDTO.setState("2");
-                rsDTO.setCreateTime(new Date());
-                rsDTO.setUpdateTime(new Date());
-                rsDTO.setCoordinateId(coordinateId);
-                manageCoordinateDetailMapper.insert(rsDTO);
-                j++;
-                log.info(j+"");
+                String fly = cruiserDTO.getFlyLat()+"_"+cruiserDTO.getFlyLon();
+               if(!map.containsKey(fly)){
+                   ManageCoordinateDetail rsDTO = new ManageCoordinateDetail();
+                   rsDTO.setLatitude(cruiserDTO.getFlyLat());
+                   rsDTO.setLongitude(cruiserDTO.getFlyLon());
+                   rsDTO.setState("2");
+                   rsDTO.setCreateTime(new Date());
+                   rsDTO.setUpdateTime(new Date());
+                   rsDTO.setCoordinateId(coordinateId);
+                   result.add(rsDTO);
+               }
+            }
+            if(!CollectionUtils.isEmpty(result)){
+                this.saveBatch(result);
             }
         }
         return 200;
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
index 14fd4c3..cc9489c 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
@@ -79,6 +79,7 @@
     public Map<String, Object> selectUnit(Map<String, Object> parameters) {
         QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
         wrapper.eq("is_del",Constants.NOT_DELETE);
+        wrapper.eq("is_invalid",0);
         int page = Integer.parseInt(parameters.get("page").toString());
         int size = Integer.parseInt(parameters.get("size").toString());
         Object parentName1 = parameters.get("parentCode");
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/SysDictDataServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/SysDictDataServiceImpl.java
index 3e0da43..b709f21 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/SysDictDataServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/SysDictDataServiceImpl.java
@@ -219,6 +219,7 @@
             QueryWrapper<SysDictData> wrapper = new QueryWrapper<>();
             wrapper.eq("is_delete", Constants.NOT_DELETE);
             wrapper.eq("dict_type_id", type.getId());
+            wrapper.orderByAsc("id");
             List<SysDictData> datas = sysDictDataMapper.selectList(wrapper);
             result.put(type.getName(), datas);
         }
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/SysDictTypeServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/SysDictTypeServiceImpl.java
index fcdce43..b9bd60d 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/SysDictTypeServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/SysDictTypeServiceImpl.java
@@ -202,6 +202,7 @@
     private List<SysDictType> getAllDictTypeFromDB() {
         QueryWrapper<SysDictType> wrapper = new QueryWrapper<>();
         wrapper.eq("is_delete", Constants.NOT_DELETE);
+        wrapper.orderByAsc("id");
         List<SysDictType> sysDictTypes = sysDictTypeMapper.selectList(wrapper);
         return sysDictTypes;
     }
diff --git a/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml b/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
index 553e496..ec050c7 100644
--- a/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
+++ b/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
@@ -20,4 +20,54 @@
         order by time
     </select>
 
+    <select id="cruiserList" resultType="com.moral.api.pojo.dto.cruiser.CruiserListDTO">
+        WITH zb AS (
+        SELECT
+        DATE_FORMAT( `time`, '%Y-%m-%d %H:%i:%s' ) AS time,VALUE->> '$.flylat' AS flyLat,VALUE->> '$.flylon' AS flyLon
+        FROM
+        history_second_cruiser
+        WHERE
+        mac =  #{mac}
+        AND `time` <![CDATA[>=]]> #{time1}
+        AND `time` <![CDATA[<=]]> #{time2}
+        ORDER BY
+        time
+        ),
+        resultList AS (
+        SELECT
+        t1.time,
+        t1.flyLat,
+        t1.flyLon
+        FROM
+        zb t1
+        INNER JOIN ( SELECT flyLon, flyLat, MAX( time ) AS max_time FROM zb GROUP BY flyLat, flyLon ) t2 ON t1.flyLon = t2.flyLon
+        AND t1.flyLat = t2.flyLat
+        AND t1.time = t2.max_time
+        ),
+        mx AS (
+        SELECT t2.latitude,
+            t2.longitude,
+            t2.state,
+            t2.coordinate_id ,max(t2.id) id
+        FROM
+        manage_coordinate t1
+        LEFT JOIN manage_coordinate_detail t2 ON t1.coordinate_id = t2.coordinate_id
+        LEFT JOIN special_device t3 ON t1.organization_id = t3.organization_id
+        WHERE
+        t1.is_del = 0
+        AND t3.mac = #{mac} group by t2.latitude,
+            t2.longitude,
+            t2.state,
+            t2.coordinate_id
+        ) SELECT
+        tt.time,
+        tt.flyLat,
+        tt.flyLon,
+        COALESCE ( tt1.state, 0 ) AS state ,tt1.coordinate_id,tt1.id as id
+        FROM
+        resultList tt
+        LEFT JOIN mx tt1 ON tt.flyLat = tt1.latitude
+        AND tt.flyLon = tt1.longitude
+    </select>
+
 </mapper>
\ No newline at end of file

--
Gitblit v1.8.0