瀏覽代碼

提交新版的模型分析语句

wanger 8 月之前
父節點
當前提交
6c988662ac

+ 8 - 8
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/controller/yzt/YztController.java

@@ -168,9 +168,9 @@ public class YztController extends BaseController {
      * @return
      */
     @RequestMapping("/modelsubdetails")
-    public RequestResult modelsubdetails(String subid) {
+    public RequestResult modelsubdetails(String subid, String type) {
         try {
-            return yztService.modelsubdetails(subid);
+            return yztService.modelsubdetails(subid, type);
         } catch (Exception e) {
             e.printStackTrace();
             return RequestResult.error("失败", null);
@@ -428,9 +428,9 @@ public class YztController extends BaseController {
      * @return
      */
     @RequestMapping("/overlapAnalysis")
-    public RequestResult overlapAnalysis(String modelname, String tablename) {
+    public RequestResult overlapAnalysis(String modelid, String tablename) {
         try {
-            return yztService.overlapAnalysis(modelname, tablename);
+            return yztService.overlapAnalysis(modelid, tablename);
         } catch (Exception e) {
             e.printStackTrace();
             return RequestResult.error("失败", null);
@@ -443,9 +443,9 @@ public class YztController extends BaseController {
      * @return
      */
     @RequestMapping("/exportReport")
-    public void exportReport(String modelname, String tablename, String layername, HttpServletRequest request, HttpServletResponse response) {
+    public void exportReport(String modelid, String tablename, String layername, HttpServletRequest request, HttpServletResponse response) {
         try {
-            yztService.exportReport(modelname, tablename, layername, request, response);
+            yztService.exportReport(modelid, tablename, layername, request, response);
         } catch (Exception e) {
             e.printStackTrace();
 //            return RequestResult.error("失败", null);
@@ -458,9 +458,9 @@ public class YztController extends BaseController {
      * @return
      */
     @RequestMapping("/exportAchievementPackage")
-    public void exportAchievementPackage(String tablename, String layername, HttpServletRequest request, HttpServletResponse response) {
+    public void exportAchievementPackage(String tablename, String layername, String modelid, HttpServletRequest request, HttpServletResponse response) {
         try {
-            yztService.exportAchievementPackage(tablename, layername, request, response);
+            yztService.exportAchievementPackage(tablename, layername, modelid, request, response);
         } catch (Exception e) {
             e.printStackTrace();
 //            return RequestResult.error("失败", null);

+ 31 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/AnalyseResult.java

@@ -0,0 +1,31 @@
+package com.onemap.spotoverlap.domain.yzt;
+
+public class AnalyseResult {
+    private String type;
+    private Integer count;
+    private Double area;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public Double getArea() {
+        return area;
+    }
+
+    public void setArea(Double area) {
+        this.area = area;
+    }
+}

+ 43 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/ModelDetails.java

@@ -0,0 +1,43 @@
+package com.onemap.spotoverlap.domain.yzt;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ModelDetails {
+    private String name ;
+    private String situationid ;
+    private String situationrelationship;
+    private List<tModelDetail> details = new ArrayList<>();
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSituationid() {
+        return situationid;
+    }
+
+    public void setSituationid(String situationid) {
+        this.situationid = situationid;
+    }
+
+    public String getSituationrelationship() {
+        return situationrelationship;
+    }
+
+    public void setSituationrelationship(String situationrelationship) {
+        this.situationrelationship = situationrelationship;
+    }
+
+    public List<tModelDetail> getDetails() {
+        return details;
+    }
+
+    public void setDetails(List<tModelDetail> details) {
+        this.details = details;
+    }
+}

+ 33 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/tModelDetail.java

@@ -1,8 +1,11 @@
 package com.onemap.spotoverlap.domain.yzt;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 @TableName("t_model_detail")
 public class tModelDetail {
@@ -21,6 +24,36 @@ public class tModelDetail {
     private String name;
     private String isvalid;
     private Date cjsj;
+    @TableField(exist = false)
+    private String tablename;
+    @TableField(exist = false)
+    private String decimalPlaces;
+    @TableField(exist = false)
+    private String selfwhere;
+
+    public String getSelfwhere() {
+        return selfwhere;
+    }
+
+    public void setSelfwhere(String selfwhere) {
+        this.selfwhere = selfwhere;
+    }
+
+    public String getDecimalPlaces() {
+        return decimalPlaces;
+    }
+
+    public void setDecimalPlaces(String decimalPlaces) {
+        this.decimalPlaces = decimalPlaces;
+    }
+
+    public String getTablename() {
+        return tablename;
+    }
+
+    public void setTablename(String tablename) {
+        this.tablename = tablename;
+    }
 
     public String getRelationshipkey() {
         return relationshipkey;

+ 26 - 1
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/mapper/yzt/YztMapper.java

@@ -41,7 +41,7 @@ public interface YztMapper {
 
     List<Map<String, Object>> getTableDetailBySwids(@Param("fields") String fields, @Param("tablename") String tablename, @Param("swids") String swids);
 
-    List<analyseModel> getAnalyseModel(String tablename);
+    List<AnalyseResult> getAnalyseModel(@Param("tablename") String tablename, @Param("modelid") String modelid);
 
     List<yswfDto> getYswfList(String tablename);
 
@@ -54,6 +54,8 @@ public interface YztMapper {
                         @Param("querywhere") String querywhere
     );
 
+    void executeAnalyseByEntity(tModelDetail detail);
+
 
     void executeAnalyseNb(@Param("tablename") String tablename,
                           @Param("analyseTablename") String analyseTablename,
@@ -67,4 +69,27 @@ public interface YztMapper {
     List<String> getDistinctValueByField(@Param("tablename") String tablename, @Param("field") String field);
 
     List<analyseSituationResource> getAnalyseSituationResource();
+
+    List<tModelDetail> getDetailsByModelid(String modelid);
+
+    List<tModelDetail> getDetails(@Param("situationid") String situationid, @Param("type") String type);
+
+    List<ModelDetails> getDetailsParent(@Param("subid") String subid, @Param("type") String type);
+
+    String getSelfwhereBySituationid(String situationid);
+
+    void insertAnalyseResult(@Param("tablename") String tablename,
+                             @Param("situationid") String situationid,
+                             @Param("situationtype") String situationtype,
+                             @Param("situationrelationship") String situationrelationship,
+                             @Param("detailid") String detailid,
+                             @Param("decimalPlaces") String decimalPlaces);
+
+    //更新合法性说明字段
+    void updateHfxsm(String tablename);
+
+    //更新合法性判断字段
+    void updateHfxpd(String tablename);
+
+    List<analyseModel> getAnalyseModel2(@Param("tablename") String tablename, @Param("modelid") String modelid);
 }

+ 44 - 60
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/service/impl/yzt/YztServiceImpl.java

@@ -10,6 +10,7 @@ import com.onemap.spotoverlap.service.yzt.IYztService;
 import com.onemap.common.core.web.domain.RequestResult;
 import com.onemap.common.security.utils.SecurityUtils;
 import com.onemap.spotoverlap.utils.*;
+import org.apache.ibatis.annotations.Param;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -466,12 +467,12 @@ public class YztServiceImpl implements IYztService {
     }
 
     @Override
-    public RequestResult modelsubdetails(String subid) {
+    public RequestResult modelsubdetails(String subid, String type) {
         try {
-            QueryWrapper<tModelDetail> wrapper = new QueryWrapper();
-            wrapper.eq("subid", subid);
-            wrapper.orderByAsc("cjsj");
-            List<tModelDetail> res = tModelDetailMapper.selectList(wrapper);
+            List<ModelDetails> res = yztMapper.getDetailsParent(subid, type);
+            for (ModelDetails cur : res) {
+                cur.setDetails(yztMapper.getDetails(cur.getSituationid(), type));
+            }
             return RequestResult.success("查询成功!", res);
         } catch (Exception e) {
             e.printStackTrace();
@@ -719,7 +720,7 @@ public class YztServiceImpl implements IYztService {
                 Map cur = new HashMap();
                 for (Map.Entry<String, Object> entry : thisdata.entrySet()) {
                     String key = entry.getKey();
-                    if (!"geom".equals(key)) {
+                    if (!"geom".equals(key) && !key.contains("面积") && !key.contains("编号集合")) {
                         cur.put(key, entry.getValue());
                     }
                 }
@@ -901,65 +902,66 @@ public class YztServiceImpl implements IYztService {
     }
 
     @Override
-    public RequestResult overlapAnalysis(String modelname, String tablename) {
+    public RequestResult overlapAnalysis(String modelid, String tablename) {
         try {
+            //TODO 删除分析结果表
+            yztMapper.executeSQL("delete from t_analyse_result where tablename =  '" + tablename + "'");
             //TODO wanger 修改数据的分析状态和开始时间
-            String updateSql = "update t_analyse_vector set fxzt = '1' , fxkssj = CURRENT_TIMESTAMP, fxmodel= '" + modelname + "' where tablename = '" + tablename + "'";
+            String updateSql = "update t_analyse_vector set fxzt = '1' , fxkssj = CURRENT_TIMESTAMP, fxmodel= '" + modelid + "' where tablename = '" + tablename + "'";
             yztMapper.executeSQL(updateSql);
             try {
                 //TODO wanger 对分析数据新增研判结果字段
                 yztMapper.executeSQL("ALTER TABLE " + tablename + " ADD COLUMN 合法性判断 TEXT");
                 yztMapper.executeSQL("ALTER TABLE " + tablename + " ADD COLUMN 合法性说明 TEXT");
                 yztMapper.executeSQL("ALTER TABLE " + tablename + " ADD COLUMN 面积 TEXT");
+                yztMapper.executeSQL("ALTER TABLE " + tablename + " ADD COLUMN 面积比 TEXT");
                 yztMapper.executeSQL("ALTER TABLE " + tablename + " ADD COLUMN 面积集合 TEXT");
                 yztMapper.executeSQL("ALTER TABLE " + tablename + " ADD COLUMN 编号集合 TEXT");
             } catch (Exception e) {
                 System.out.println("分析图斑数据已存在附加字段,请忽略!");
             }
             //TODO wanger 重置附加字段为空字符串
-            String resetSql = "update " + tablename + " set 合法性判断 = '' , 合法性说明 = '' , 面积 = '' , 编号集合 = '', 面积集合 = ''";
+            String resetSql = "update " + tablename + " set 合法性判断 = '' , 合法性说明 = '' , 面积 = '' , 编号集合 = '', 面积集合 = '', 面积比 = ''";
             yztMapper.executeSQL(resetSql);
-            // 查询分析模型因子
-            List<analyseModel> analyseModels = yztMapper.getAnalyseModel(tablename);
-            List<String> sqlOverlap = new ArrayList<>();
-            for (analyseModel curModel : analyseModels) {
-                String layerName = curModel.getLayername();
-                String tableName = curModel.getTablename();
-                String type = curModel.getType();
-                //TODO wanger 执行分析模型因子叠加分析
-                if (type.equals("外部")) {
-                    yztMapper.executeAnalyse(tablename, tableName, layerName, decimalPlaces, null);
-                } else if (type.equals("内部")) {
-                    yztMapper.executeAnalyseNb(tablename, tableName, layerName, decimalPlaces, null);
-//                    String updateInside = String.format("update  " + tablename + "  as c set " +
-//                            "合法性说明 = case when c.合法性说明 is null then '' else c.合法性说明 || ';' end || '符合%s用地'," +
-//                            "面积 = case when 面积 is null then '' else 面积  end || round(cast( ST_Area(ST_Intersection(c.geom,d.geom)) as numeric), 2) || ';' " +
-//                            "from %s d where ST_Covers ( c.geom, d.geom )", layerName, tableName);
-//                    sqlOverlap.add(updateInside);
+            //TODO wanger  查询所有分析情形 isvalid='1'
+            List<tModelDetail> details = yztMapper.getDetailsByModelid(modelid);
+            if (details == null || details.size() == 0) {
+                return RequestResult.error("当前分析模型没有可用的分析情形!");
+            }
+            //TODO wanger 根据分析情形id分组执行分析语句 分析图斑(self)的分析条件组装到管控数据的分析条件中
+            for (tModelDetail curDetail : details) {
+                //TODO 分析图斑(self)的分析条件组装到管控数据的分析条件中
+                if ("self".equals(curDetail.getSourcelayer())) {
+                    continue;
                 }
+                String selfwhere = yztMapper.getSelfwhereBySituationid(curDetail.getSituationid());
+                //TODO 执行管控数据的分析条件
+                curDetail.setDecimalPlaces(decimalPlaces);
+                curDetail.setTablename(tablename);
+                curDetail.setSelfwhere(selfwhere);
+                //TODO wanger 执行分析sql语句
+                yztMapper.executeAnalyseByEntity(curDetail);
+                //TODO wanger 插入分析结果   挨个图斑   挨个分析情形  挨个结果
+                yztMapper.insertAnalyseResult(tablename, curDetail.getSituationid(), curDetail.getSituationtype(), curDetail.getSituationrelationship(), curDetail.getId(), decimalPlaces);
             }
-            String updateInlegal = "update " + tablename + "  set 合法性判断 = '疑似违法'  where 合法性说明 like '%疑似%'";
-            yztMapper.executeSQL(updateInlegal);
-            String updateLegal = "update " + tablename + " set 合法性判断 = '合法用地'  where 合法性判断 is null or 合法性判断 = ''";
-            yztMapper.executeSQL(updateLegal);
+            //TODO wanger 更新合法性说明字段
+            yztMapper.updateHfxsm(tablename);
+            //TODO wanger 更新合法性判断字段
+            yztMapper.updateHfxpd(tablename);
             //TODO wanger 修改数据的分析状态和结束时间
             updateSql = "update t_analyse_vector set fxzt = '2' , fxjssj = CURRENT_TIMESTAMP, fxrz = '分析正常结束' where tablename = '" + tablename + "'";
             yztMapper.executeSQL(updateSql);
             return RequestResult.success("分析完成!", 1);
         } catch (Exception e) {
             e.printStackTrace();
-            try {
-                String updateSql = "update t_analyse_vector set fxzt = '3' , fxjssj = CURRENT_TIMESTAMP, fxrz = '" + e.toString() + "' where tablename = '" + tablename + "'";
-                yztMapper.executeSQL(updateSql);
-            } catch (Exception exception) {
-                exception.printStackTrace();
-            }
+            String updateSql = "update t_analyse_vector set fxzt = '3' , fxjssj = CURRENT_TIMESTAMP, fxrz = '" + e.toString() + "' where tablename = '" + tablename + "'";
+            yztMapper.executeSQL(updateSql);
         }
         return RequestResult.error("分析失败!", 0);
     }
 
     @Override
-    public void exportReport(String modelname, String tablename, String layername, HttpServletRequest request, HttpServletResponse response) {
+    public void exportReport(String modelid, String tablename, String layername, HttpServletRequest request, HttpServletResponse response) {
         String folderPath = localFilePath + "" + layername + "\\" + "report";
         File folder = new File(folderPath);
         String zippath = localFilePath + "" + layername + "\\report.zip";
@@ -967,11 +969,9 @@ public class YztServiceImpl implements IYztService {
             // TODO 如果已存在则打开系统文件夹
             try {
                 FileToZipDownload.downloadLocalZipBuffered(response, zippath);
-//                Runtime.getRuntime().exec("explorer.exe " + folderPath);
             } catch (IOException e) {
                 e.printStackTrace();
             }
-//            return RequestResult.success("导出成功", 1);
         } else {
             folder.mkdirs();
             String excelpath = folderPath + "/" + layername + "report.xlsx";
@@ -986,31 +986,21 @@ public class YztServiceImpl implements IYztService {
                 //TODO 第三步:导出shape
                 List<hfxjg> Hfxpd = yztMapper.getHfxpd(tablename);
                 //TODO 第一步:查询数据的分析模型数据源列表   仅查询状态为可用的管控数据列表
-                List<analyseModel> analyseModels = yztMapper.getAnalyseModel(tablename);
-                ExcelExport.export(fields, excelpath, tableDetail, modelname, exportField);
-                WordExport.export(fields, wordpath, tableDetail, modelname, exportField, layername, Hfxpd, analyseModels);
+                List<AnalyseResult> analyseModels = yztMapper.getAnalyseModel(tablename, modelid);
+                ExcelExport.export(fields, excelpath, tableDetail, modelid, exportField);
+                WordExport.export(fields, wordpath, tableDetail, modelid, exportField, layername, Hfxpd, analyseModels);
                 SpatiaLiteToShapefile.execute(fields, shppath, shpWkid, tableDetail);
                 //TODO 压缩包数据流下载
                 zipDirectory(folderPath, zippath);
                 FileToZipDownload.downloadLocalZipBuffered(response, zippath);
-//                String[] filelist = {excelpath, wordpath};
-//                FileToZipDownload.download(filelist, request, response);
             } catch (Exception e) {
                 e.printStackTrace();
-//                return RequestResult.error("导出失败", e.toString());
             }
-            // TODO 系统打开文件夹
-//            try {
-//                Runtime.getRuntime().exec("explorer.exe " + folderPath);
-//            } catch (IOException e) {
-//                e.printStackTrace();
-//            }
         }
-//        return RequestResult.success("导出成功", 1);
     }
 
     @Override
-    public void exportAchievementPackage(String tablename, String layername, HttpServletRequest request, HttpServletResponse response) {
+    public void exportAchievementPackage(String tablename, String layername, String modelid, HttpServletRequest request, HttpServletResponse response) {
         String folderPath = localFilePath + "" + layername + "\\" + "package";
         String zippath = localFilePath + "" + layername + "\\package.zip";
         File folder = new File(folderPath);
@@ -1021,12 +1011,9 @@ public class YztServiceImpl implements IYztService {
             // TODO 系统打开文件夹
             try {
                 FileToZipDownload.downloadLocalZipBuffered(response, zippath);
-//                Runtime.getRuntime().exec("explorer.exe " + folderPath);
-//                return null;
             } catch (IOException e) {
                 e.printStackTrace();
             }
-//            return RequestResult.success("导出成功", 1);
         } else {
             String excelpath = folderPath + "/" + layername + ".xlsx";
             String shppath = folderPath + "/" + layername + ".shp";
@@ -1047,16 +1034,13 @@ public class YztServiceImpl implements IYztService {
                 //第二步:导出shape
                 SpatiaLiteToShapefile.execute(fields, shppath, shpWkid, tableDetail);
                 //TODO wanger 第二:导出excel和矢量数据压覆图
-                AchievementPackage.exportAttributes(tablename, excelpath, "EPSG:" + shpWkid, mapExportFixed, mapExportSize, geoserverurl);
+                AchievementPackage.exportAttributes(tablename, modelid, excelpath, "EPSG:" + shpWkid, mapExportFixed, mapExportSize, geoserverurl);
                 zipDirectory(folderPath, zippath);
                 FileToZipDownload.downloadLocalZipBuffered(response, zippath);
                 // TODO 系统打开文件夹
-//            Runtime.getRuntime().exec("explorer.exe " + folderPath);
             } catch (Exception e) {
                 e.printStackTrace();
-//                return RequestResult.error("导出失败", e.toString());
             }
-//            return RequestResult.success("导出成功", 1);
         }
     }
 

+ 4 - 4
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/service/yzt/IYztService.java

@@ -45,15 +45,15 @@ public interface IYztService {
 
     RequestResult updateMapConfig(HttpServletRequest request);
 
-    RequestResult overlapAnalysis(String modelname, String tablename);
+    RequestResult overlapAnalysis(String modelid, String tablename);
 
-    void exportReport(String modelname, String tablename, String layername, HttpServletRequest request, HttpServletResponse response);
+    void exportReport(String modelid, String tablename, String layername, HttpServletRequest request, HttpServletResponse response);
 
     RequestResult getGeoServerStyles();
 
     RequestResult analysevectordelete(String tablename);
 
-    void exportAchievementPackage(String tablename, String layername, HttpServletRequest request, HttpServletResponse response);
+    void exportAchievementPackage(String tablename, String layername, String modelid, HttpServletRequest request, HttpServletResponse response);
 
     RequestResult getServerConfig(String key);
 
@@ -87,7 +87,7 @@ public interface IYztService {
 
     RequestResult modelsublist(String modelid);
 
-    RequestResult modelsubdetails(String subid);
+    RequestResult modelsubdetails(String subid, String type);
 
     RequestResult modelsubdelete(String subid);
 

+ 9 - 6
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/utils/AchievementPackage.java

@@ -106,17 +106,17 @@ public class AchievementPackage {
      * @param filepath
      * @return
      */
-    public static Boolean exportAttributes(String tablename, String filepath,
+    public static Boolean exportAttributes(String tablename, String modelid, String filepath,
                                            String proj, String fixed, Integer imageSize, String geoserverurl) {
         try {
             //第一步:查询数据的分析模型数据源列表   仅查询状态为可用的管控数据列表
-            List<analyseModel> analyseModels = yztMapper.getAnalyseModel(tablename);
+            List<analyseModel> analyseModels = yztMapper.getAnalyseModel2(tablename, modelid);
             //第二步:疑似违法图斑数据查询
             List<yswfDto> yswfDtos = yztMapper.getYswfList(tablename);
             //TODO 查询当前数据表叠加的管控数据swid集合
             List<String> gkdataswids = new ArrayList<>();
             List<GeometryParams> geometrys = new ArrayList<>();
-            for(yswfDto cur : yswfDtos) {
+            for (yswfDto cur : yswfDtos) {
                 gkdataswids.add(cur.getSwids());
                 GeometryParams geometry = new GeometryParams();
                 geometry.setSwid(cur.getSwid());
@@ -135,7 +135,7 @@ public class AchievementPackage {
             for (int i = 0; i < analyseModels.size(); i++) {
                 String curtablename = analyseModels.get(i).getTablename();
                 String curlayername = analyseModels.get(i).getLayername();
-                String curservicename =  analyseModels.get(i).getServicename();
+                String curservicename = analyseModels.get(i).getServicename();
 
                 //TODO 导入地图压覆图片 存储到本地指定位置
                 for (int m = 0; m < geometrys.size(); m++) {
@@ -195,9 +195,12 @@ public class AchievementPackage {
                 }
                 String swids = String.join(",", gkdataswid);
                 List<String> fields = yztMapper.getTableField(dbschema, curtablename);
+                if(StringUtils.isEmpty(swids)){
+                    continue;
+                }
                 //第二步:查询数据库表详情  附带geomstr
                 List<Map<String, Object>> tableDetail = yztMapper.getTableDetailBySwids(String.join(",", fields), curtablename, swids);
-                if(tableDetail == null || tableDetail.size() == 0){
+                if (tableDetail == null || tableDetail.size() == 0) {
                     continue;
                 }
                 // 写入标题行
@@ -212,7 +215,7 @@ public class AchievementPackage {
                 }
                 // 写入数据行
                 int rowCount = 1;
-                for(Map<String, Object> creMap : tableDetail) {
+                for (Map<String, Object> creMap : tableDetail) {
                     Row row = sheet.createRow(rowCount++);
                     for (int r = 0; r < curfields.size(); r++) {
                         String field = curfields.get(r);

+ 8 - 22
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/utils/WordExport.java

@@ -1,5 +1,6 @@
 package com.onemap.spotoverlap.utils;
 
+import com.onemap.spotoverlap.domain.yzt.AnalyseResult;
 import com.onemap.spotoverlap.domain.yzt.analyseModel;
 import com.onemap.spotoverlap.domain.yzt.hfxjg;
 import org.apache.poi.xwpf.usermodel.*;
@@ -12,7 +13,9 @@ import java.util.List;
 import java.util.Map;
 
 public class WordExport {
-    public static Boolean export(List<String> fields, String filepath, List<Map<String, Object>> tableDetail, String modelname, String[] exportField, String layername, List<hfxjg> Hfxpd, List<analyseModel> analyseModels) {
+    public static Boolean export(List<String> fields, String filepath, List<Map<String, Object>> tableDetail,
+                                 String modelname, String[] exportField, String layername,
+                                 List<hfxjg> Hfxpd, List<AnalyseResult> analyseModels) {
         try {
             // 创建一个空的Word文档
             XWPFDocument document = new XWPFDocument();
@@ -26,7 +29,7 @@ public class WordExport {
             // 分析总览段落
             Integer totalcount = 0;
             String str = "";
-            for(hfxjg cur : Hfxpd) {
+            for (hfxjg cur : Hfxpd) {
                 Integer count = cur.getCount();
                 String type = cur.getType();
                 totalcount += count;
@@ -38,28 +41,11 @@ public class WordExport {
             XWPFRun textRun = textParagraph.createRun();
             textRun.setText(totalstr);
             // 分析图斑详情介绍
-            List<String> sqlOverlap = new ArrayList<>();
-            for(analyseModel cur: analyseModels) {
-                sqlOverlap.add(cur.getLayername());
-            }
             String details = "其中";
             // 根据每一项数据进行汇总分析
-            for (int i = 0; i < sqlOverlap.size(); i++) {
-                String curLayer = sqlOverlap.get(i);
-                Integer count = 0;
-                Double totalMj = 0.0;
-                for (int u = 0; u < tableDetail.size(); u++) {
-                    Map<String, Object> curMap = tableDetail.get(u);
-                    String hfxsm = String.valueOf(curMap.get("合法性说明"));
-                    String mj = String.valueOf(curMap.get("面积"));
-                    if (hfxsm.contains(curLayer)) {
-                        count += 1;
-                        totalMj += Double.valueOf(mj.split(";")[i]);
-                    }
-                }
-                totalMj = totalMj / 667;
-                String formattedValue = String.format("%.2f", totalMj);
-                details += curLayer + "内疑似违法图斑" + count + "个,疑似违法面积" + formattedValue + "亩。";
+            for (AnalyseResult cur : analyseModels) {
+                String formattedValue = String.format("%.2f", cur.getArea() / 667);
+                details += cur.getType() + "" + cur.getCount() + "个,涉及面积" + formattedValue + "亩。";
             }
             XWPFParagraph textParagraph2 = document.createParagraph();
             textParagraph2.setIndentationFirstLine(480); // 2个字符的首行缩进(1个字符约240的单位,480表示2个字符)

+ 168 - 8
onemap-modules/onemap-spotoverlap/src/main/resources/mapper/postgresql/yzt/YztMapper.xml

@@ -68,15 +68,49 @@
     </select>
 
     <select id="getTableDetailBySwids" parameterType="java.lang.String" resultType="java.util.Map">
-        select ${fields} from ${tablename} t where swid in ( ${swids})
+        select ${fields} from ${tablename} t
+        <if test="swids != null and swids != ''">
+            where swid in ( ${swids})
+        </if>
     </select>
 
     <select id="getAnalyseModel" parameterType="java.lang.String"
+            resultType="com.onemap.spotoverlap.domain.yzt.AnalyseResult">
+        SELECT
+ttt."result" as "type",
+	count(distinct(ttt.swid)) as count,
+	round(sum(cast(sss.swarea as numeric)), 2) as area
+FROM
+	t_analyse_result ttt
+	LEFT JOIN (
+	SELECT
+		situationtype AS curtype,
+		STRING_AGG ( "id", ',' ) AS curdetailid
+	FROM
+		t_model_detail T
+	WHERE
+		T.subid IN ( SELECT ID FROM t_model_sub WHERE modelid = #{modelid} )
+	GROUP BY
+		situationtype
+	) ddd ON ddd.curdetailid LIKE'%' || ttt.detailid || '%'
+	left join ${tablename} sss on sss.swid = ttt.swid
+WHERE
+	tablename = #{tablename}
+	AND "result" = ddd.curtype
+	group by ttt."result"
+    </select>
+
+    <select id="getAnalyseModel2" parameterType="java.lang.String"
             resultType="com.onemap.spotoverlap.domain.yzt.analyseModel">
-        SELECT t.type, t.layername, b.tablename, b.servicename FROM t_model t
-        LEFT JOIN t_base_vector b ON b.layername = t.layername
-        WHERE t.modelname =  (select fxmodel from  t_analyse_vector v where tablename = #{tablename}) AND t.isvalid = '有效'
-        ORDER BY t.layername
+        select layername,tablename,servicename   from t_base_vector tt
+where tt.tablename in (
+SELECT
+	distinct(sourcelayer)
+FROM
+	t_model_detail T
+WHERE
+	T.subid IN ( SELECT ID FROM t_model_sub WHERE modelid = #{modelid})
+	and t.sourcelayer != 'self')
     </select>
 
     <select id="getYswfList" parameterType="java.lang.String" resultType="com.onemap.spotoverlap.domain.yzt.yswfDto">
@@ -95,7 +129,8 @@
         面积 = C.面积 || ( CASE WHEN eee.a_id IS NULL THEN ';' ELSE eee.totalarea || ';' END ),
         编号集合 = C.编号集合 || ( CASE WHEN eee.a_id IS NULL THEN ';' ELSE eee.targetid || ';' END ),
         面积集合 = C.面积集合 || ( CASE WHEN eee.a_id IS NULL THEN ';' ELSE eee.targetarea || ';' END )
-        FROM ( SELECT ccc.swid, bbb.* FROM ${tablename} ccc
+        FROM (
+        SELECT ccc.swid, bbb.* FROM ${tablename} ccc
         LEFT JOIN ( SELECT a_id, STRING_AGG ( CAST ( b_id AS VARCHAR ), ',' ) AS targetid,
         STRING_AGG ( CAST ( round( CAST ( intersection_area AS NUMERIC ), cast(#{decimalPlaces} as int) ) AS VARCHAR ),
         ',' ) AS targetarea,
@@ -104,7 +139,7 @@
         intersection_area
         FROM ${tablename} A JOIN
 
-        --分析管控数据需要添加sql过滤条件的  看这里
+        --分析管控数据需要添加sql过滤条件的 看这里
         (select * from ${analyseTablename} where 1 = 1 )
 
         b ON st_intersects ( A.geom, b.geom )
@@ -148,7 +183,7 @@
     </update>
 
     <select id="getAssessmentType" resultType="java.lang.String" parameterType="java.lang.String">
-        select distinct("type") from t_assessment_config
+        select distinct("type") from t_assessment_config order by "type"
     </select>
 
     <select id="getAnalyseSituationResource" resultType="com.onemap.spotoverlap.domain.yzt.analyseSituationResource">
@@ -157,4 +192,129 @@
         select '分析图斑' "layername", 'self' "tablename",'self' as "type"
     </select>
 
+    <select id="getDetailsByModelid" resultType="com.onemap.spotoverlap.domain.yzt.tModelDetail"
+            parameterType="java.lang.String">
+        select d.* from t_model_detail d where subid in (
+            select id from t_model_sub where modelid = #{modelid}
+        ) and isvalid = '1' order by d.cjsj asc , d.situationid
+    </select>
+
+    <select id="getDetails" resultType="com.onemap.spotoverlap.domain.yzt.tModelDetail"
+            parameterType="java.lang.String">
+        select d.* from t_model_detail d where situationid = #{situationid}
+        order by d.cjsj asc , d.situationid
+    </select>
+
+    <select id="getDetailsParent" resultType="com.onemap.spotoverlap.domain.yzt.ModelDetails"
+            parameterType="java.lang.String">
+        select distinct("situationid") "situationid", "name" ,
+        case when situationrelationship = 'and' then '且' else '或' end as "situationrelationship"
+        from t_model_detail d where subid = #{subid}
+        <if test="type != null and type != ''">
+            and situationtype in (select "name" from t_assessment_config where "type" = #{type})
+        </if>
+        order by d.name asc
+    </select>
+
+    <update id="executeAnalyseByEntity" parameterType="com.onemap.spotoverlap.domain.yzt.tModelDetail">
+        UPDATE ${tablename} AS C
+        SET 合法性说明 = ( CASE WHEN (1 = 1
+        <if test="relationshipwhere != null and relationshipwhere != ''">
+            and ${relationshipwhere}
+        </if>
+        <if test="selfwhere != null and selfwhere != ''">
+            and ${selfwhere}
+        </if>
+        ) THEN #{situationtype}||'' ELSE '' END ),
+        面积 = eee.totalarea ,
+        编号集合 = eee.targetid,
+        面积集合 = eee.targetarea ,
+        面积比 = eee.areazb
+        FROM (
+        SELECT ccc.swid, bbb.*, ccc.swtype, ccc.swarea, round( (cast(bbb.totalarea as numeric) / cast(ccc.swarea as
+        numeric) * 100) , cast(#{decimalPlaces} as int)) as areazb
+        FROM ${tablename} ccc
+        LEFT JOIN ( SELECT a_id, STRING_AGG ( CAST ( b_id AS VARCHAR ), ',' ) AS targetid,
+        STRING_AGG ( CAST ( round( CAST ( intersection_area AS NUMERIC ), cast(#{decimalPlaces} as int) ) AS VARCHAR ),
+        ',' ) AS targetarea,
+        round( SUM ( CAST ( intersection_area AS NUMERIC ) ), cast(#{decimalPlaces} as int) ) AS totalarea
+        FROM ( SELECT A.swid AS a_id, b.swid AS b_id, st_area ( ST_Intersection ( A.geom, b.geom ) ) AS
+        intersection_area
+        FROM ${tablename} A JOIN
+        (select * from ${sourcelayer} where 1 = 1
+        <if test="sourcewhere != null and sourcewhere != ''">
+            and ${sourcewhere}
+        </if>
+        )
+        b ON st_intersects ( A.geom, b.geom )
+        WHERE
+        1 = 1
+
+        ) aaa
+        GROUP BY a_id ORDER BY a_id
+        ) bbb ON bbb.a_id = ccc.swid
+        ) eee
+        WHERE eee.swid = C.swid
+    </update>
+
+    <insert id="insertAnalyseResult" parameterType="java.lang.String">
+        insert into t_analyse_result (situationid, situationtype, situationrelationship, tablename, swid ,detailid,result, overlaparea, overlapzb)
+        select #{situationid}, #{situationtype}, #{situationrelationship}, #{tablename}, a.swid, #{detailid}, case when a.合法性说明 = '' then '#' else a.合法性说明 end, a.面积,a.面积比
+          from ${tablename}  a
+    </insert>
+
+    <select id="getSelfwhereBySituationid" resultType="java.lang.String" parameterType="java.lang.String">
+        select STRING_AGG ( CAST ( relationshipwhere AS VARCHAR ), ' and ' ) from t_model_detail
+         where situationid = #{situationid} and sourcelayer = 'self'
+    </select>
+
+    <update id="updateHfxsm" parameterType="java.lang.String">
+        update ${tablename} C set "合法性说明" = str from (
+        SELECT
+            swid,
+            STRING_AGG ( CAST ( get_first_non_empty ( str ) AS VARCHAR ), ';' ) AS str
+        FROM
+            (
+            SELECT
+                *,
+            CASE
+                    WHEN ( situationrelationship = 'and' AND resultstr LIKE'%#%' ) THEN
+                    ''
+                    WHEN ( situationrelationship = 'and' AND resultstr NOT LIKE'%#%' ) THEN
+                    resultstr
+                    WHEN situationrelationship = 'or' THEN
+                    REPLACE ( resultstr, '#', '' ) ELSE''
+                END AS str
+            FROM
+                (
+                SELECT
+                    swid,
+                    situationid,
+                    situationrelationship,
+                    STRING_AGG ( CAST ( RESULT AS VARCHAR ), ';' ) AS resultstr
+                FROM
+                    t_analyse_result T
+                WHERE
+                    tablename = #{tablename}
+                GROUP BY
+                    swid,
+                    situationid,
+                    situationrelationship
+                ) aaa
+            ) bbb
+        GROUP BY
+            swid ) ccc where ccc.swid = C.swid
+    </update>
+
+    <update id="updateHfxpd" parameterType="java.lang.String">
+        update ${tablename} C set "合法性判断" =
+        (case when ( str is null or str = '') then '其他'
+        when str like '%合法%' then '合法'
+        else '疑似违法' end)
+        from (
+        select swid, (select STRING_AGG(distinct("type"),';') as str from t_assessment_config where "name" =  (SELECT unnest(string_to_array("合法性说明", ';')) FROM
+        ${tablename} where swid = rr.swid) ) as str from ${tablename} rr) aaa
+        where aaa.swid = C.swid
+    </update>
+
 </mapper>