Browse Source

Merge remote-tracking branch 'origin/master'

周壕 1 year ago
parent
commit
056d389eff
30 changed files with 714 additions and 257 deletions
  1. 1 0
      src/main/java/com/bowintek/practice/config/CorsConfig.java
  2. 1 1
      src/main/java/com/bowintek/practice/config/WebConfiguration.java
  3. 11 9
      src/main/java/com/bowintek/practice/controller/WellInfoController.java
  4. 4 2
      src/main/java/com/bowintek/practice/controller/system/LogController.java
  5. 2 1
      src/main/java/com/bowintek/practice/mapper/cquery/SysLogCQuery.java
  6. 2 2
      src/main/java/com/bowintek/practice/services/impl/system/LogServiceImpl.java
  7. 2 1
      src/main/java/com/bowintek/practice/services/service/system/LogService.java
  8. 7 0
      src/main/java/com/bowintek/practice/vo/query/WellInfoParams.java
  9. 1 1
      src/main/resources/application.yml
  10. 7 1
      src/main/resources/mapping/cquery/SysLogCQuery.xml
  11. 22 1
      src/main/resources/mapping/cquery/WellInfoCQuery.xml
  12. 1 1
      target/classes/application.yml
  13. BIN
      target/classes/com/bowintek/practice/config/CorsConfig.class
  14. BIN
      target/classes/com/bowintek/practice/controller/system/LogController.class
  15. BIN
      target/classes/com/bowintek/practice/mapper/cquery/SysLogCQuery.class
  16. BIN
      target/classes/com/bowintek/practice/services/impl/system/LogServiceImpl.class
  17. BIN
      target/classes/com/bowintek/practice/services/service/system/LogService.class
  18. 7 1
      target/classes/mapping/cquery/SysLogCQuery.xml
  19. 24 14
      vue/package-lock.json
  20. 4 1
      vue/package.json
  21. 2 3
      vue/public/appconfig.json
  22. 91 0
      vue/src/components/basic/file-preview/index.vue
  23. 2 2
      vue/src/components/basic/transfer/Transfer.vue
  24. 32 2
      vue/src/utils/downloadFile.ts
  25. 43 11
      vue/src/views/position/test.vue
  26. 7 6
      vue/src/views/system/log/index.vue
  27. 188 128
      vue/src/views/wellinfo/detail.vue
  28. 128 65
      vue/src/views/wellinfo/index.vue
  29. 9 3
      vue/src/views/wellinfo/table.ts
  30. 116 1
      web-types-npm-loader.xml

+ 1 - 0
src/main/java/com/bowintek/practice/config/CorsConfig.java

@@ -27,6 +27,7 @@ public class CorsConfig implements WebMvcConfigurer {
     @Override
     public void addCorsMappings(CorsRegistry registry) {
 
+
         registry.addMapping("/appApi/**")
                 .allowedOrigins("*")
                 .allowCredentials(true)

+ 1 - 1
src/main/java/com/bowintek/practice/config/WebConfiguration.java

@@ -66,7 +66,7 @@ public class WebConfiguration implements WebMvcConfigurer {
         excludePath.add("/doc/**");  //静态资源
         excludePath.add("/a4gis/**");  //地图
         excludePath.add("/");  //首页跳转
-        excludePath.add("/api/account/testpost");//单点登录
+        excludePath.add("/api/account/testpost");
         registry.addInterceptor(tokenInterceptor)
                 .addPathPatterns("/**")
                 .excludePathPatterns(excludePath);

+ 11 - 9
src/main/java/com/bowintek/practice/controller/WellInfoController.java

@@ -40,11 +40,10 @@ public class WellInfoController {
     private AppConfig appConfig;
 
     @ResponseBody
-    @GetMapping("/getList")
-    public BaseResponse<PageInfo<HashMap<String, Object>>> getList(@RequestParam("page") int page, @RequestParam("rows") int rows,
-                                                                   WellInfoParams params) throws Exception {
+    @PostMapping("/getList")
+    public BaseResponse<PageInfo<HashMap<String, Object>>> getList(@RequestBody WellInfoParams params) throws Exception {
 
-        PageInfo<HashMap<String, Object>> result = wellInfoService.getList(page, rows, params);
+        PageInfo<HashMap<String, Object>> result = wellInfoService.getList(params.getPage(), params.getRows(), params);
 
         return RespGenerstor.success(result);
     }
@@ -124,22 +123,25 @@ public class WellInfoController {
     }
 
     @GetMapping("/downFile")
-    public void downFile(HttpServletResponse response, String well_id, String fileName) throws IOException {
+    public void downFile(HttpServletResponse response, Integer isShow, String filePath, String fileName) throws IOException {
         Map<String, String> getParams = new HashMap<>();
-        getParams.put("path", "1");
+        getParams.put("fileName", fileName);
+        getParams.put("filePath", filePath);
 
         String reData = remoteHelper.getJson(getParams, appConfig.hdfshelperurl + "read", "UTF-8");
-        byte[] bytes = Base64.getDecoder().decode(reData);
+        byte[] bytes = Base64.getMimeDecoder().decode(reData);
         OutputStream os = response.getOutputStream();
 
-        response.setContentType("application/force-download");// 设置强制下载不打开
+        /*if (isShow == null || 1 != isShow) {
+            response.setContentType("application/force-download");// 设置强制下载不打开
+        }*/
         response.setContentType("multipart/form-data;charset=UTF-8");
         response.setHeader("Content-Length", String.valueOf(bytes.length));
         response.addHeader("Content-Disposition",
                 "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));// 设置文件名
 
         //os.write(reData.getBytes(StandardCharsets.UTF_8));
-        os.write(Base64.getDecoder().decode(reData));
+        os.write(bytes);
         if (null != os) {
             os.flush();
             os.close();

+ 4 - 2
src/main/java/com/bowintek/practice/controller/system/LogController.java

@@ -37,7 +37,7 @@ public class LogController {
             , @RequestParam(required = false) String userName, @RequestParam(required = false) Date startDate,
                                                     @RequestParam(required = false) Date endDate) {
 
-        return RespGenerstor.success(logService.getList(page, rows, loginID, userName,startDate,endDate));
+        return RespGenerstor.success(logService.getList(page, rows, loginID, userName,startDate,endDate,null));
     }
 
     @PostMapping("/save")
@@ -50,8 +50,10 @@ public class LogController {
     public void exportSubject(HttpServletResponse response,
                               @RequestParam(required = false) String loginID
             , @RequestParam(required = false) String userName, @RequestParam(required = false) Date startDate,
+                              String selectedRowKeys,
                               @RequestParam(required = false) Date endDate) throws Exception {
-        List<LogModel> dataList = logService.getList(1, 9999,  loginID, userName,startDate,endDate).getList();
+        List<String> idList= selectedRowKeys==null?new ArrayList<>(): Arrays.stream(selectedRowKeys.split(",")).toList();
+        List<LogModel> dataList = logService.getList(1, 9999,  loginID, userName,startDate,endDate,idList).getList();
 
         ExcelHelper excelHelper = new ExcelHelper();
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();

+ 2 - 1
src/main/java/com/bowintek/practice/mapper/cquery/SysLogCQuery.java

@@ -7,5 +7,6 @@ import java.util.Date;
 import java.util.List;
 
 public interface SysLogCQuery {
-    List<LogModel> selectLogList(@Param("loginID") String loginID, @Param("userName") String userName, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
+    List<LogModel> selectLogList(@Param("loginID") String loginID, @Param("userName") String userName,
+                                 @Param("startDate") Date startDate, @Param("endDate") Date endDate,  @Param("idList")List<String> idList);
 }

+ 2 - 2
src/main/java/com/bowintek/practice/services/impl/system/LogServiceImpl.java

@@ -24,10 +24,10 @@ public class LogServiceImpl implements LogService {
     private SysLogCQuery sysLogCQuery;
 
     @Override
-    public PageInfo<LogModel> getList(Integer page, Integer rows, String loginID, String userName, Date startDate, Date endDate){
+    public PageInfo<LogModel> getList(Integer page, Integer rows, String loginID, String userName, Date startDate, Date endDate,List<String> idList){
         PageHelper.startPage(page, rows);
 
-        List<LogModel> dataList = sysLogCQuery.selectLogList(loginID, userName, startDate,endDate);
+        List<LogModel> dataList = sysLogCQuery.selectLogList(loginID, userName, startDate,endDate,idList);
 
         PageInfo<LogModel> result = new PageInfo(dataList);
         return result;

+ 2 - 1
src/main/java/com/bowintek/practice/services/service/system/LogService.java

@@ -4,10 +4,11 @@ import com.bowintek.practice.vo.system.LogModel;
 import com.github.pagehelper.PageInfo;
 
 import java.util.Date;
+import java.util.List;
 
 public interface LogService {
 
-    PageInfo<LogModel> getList(Integer page, Integer rows, String loginID, String userName, Date startDate, Date endDate);
+    PageInfo<LogModel> getList(Integer page, Integer rows, String loginID, String userName, Date startDate, Date endDate, List<String> idList);
 
     Integer save(String pageName,String pageUrl,String actionName, String userID);
 

+ 7 - 0
src/main/java/com/bowintek/practice/vo/query/WellInfoParams.java

@@ -2,11 +2,16 @@ package com.bowintek.practice.vo.query;
 
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class WellInfoParams {
+    private  int page;
+    private  int rows;
     private String well_common_name;
     private String well_id;
     private String well_type;
+    private String well_purpose;
     private String spud_date_begin;
     private String spud_date_end;
     private String completion_date_begin;
@@ -17,4 +22,6 @@ public class WellInfoParams {
     private String oil_prod_recent_date_end;
     private String org_id_a1;
     private String project_id;
+    private List<String> orgList;
+    private List<String> unitList;
 }

+ 1 - 1
src/main/resources/application.yml

@@ -144,4 +144,4 @@ appconfig:
     client_id: 2d4a5b3c-dc6c-4231-914c-ca1a4d3a134b
     client_secret: e2afdc026c4e745714d2f3b2a2e393686c11f66f
 
-  hdfshelperurl: http://10.73.178.206:8078/hdfshelper/
+  hdfshelperurl: http://localhost:8078/hdfshelper/

+ 7 - 1
src/main/resources/mapping/cquery/SysLogCQuery.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.bowintek.practice.mapper.cquery.SysLogCQuery">
     <select id="selectLogList" resultType="com.bowintek.practice.vo.system.LogModel">
-        select l.logID,l.logID,l.pageUrl,l.actionName,l.userID,l.logTime,us.name as userName,us.loginID,l.pageName
+        select l.logID,l.pageUrl,l.actionName,l.userID,l.logTime,us.name as userName,us.loginID,l.pageName
         from sys_log l
         inner join sys_user us on l.userID = us.userID
         where 1=1
@@ -18,6 +18,12 @@
         <if test="startDate != null ">
             and l.logTime <![CDATA[ < ]]> date_add(#{startDate}, interval 1 day)
         </if>
+        <if test="idList!=null and idList.size>0">
+            and l.logID in
+            <foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
         order by l.logTime desc
     </select>
 </mapper>

+ 22 - 1
src/main/resources/mapping/cquery/WellInfoCQuery.xml

@@ -33,6 +33,7 @@
                      inner join(
                 select well_id, max(prod_date) prod_date from by_dwr.fact_dwr_pc_pro_well_vol_d group by well_id
             ) maxdaily on daily.well_id = maxdaily.well_id and daily.prod_date = maxdaily.prod_date
+            limit  1
         ) fact_daily on well.well_id = fact_daily.well_id
                  left join (
             select intr.*
@@ -42,6 +43,7 @@
                 from by_dwr.fact_dwr_well_history_introduction
                 group by well_id
             ) maxintr on intr.well_id = maxintr.well_id and intr.start_prod_date = maxintr.start_prod_date
+            limit  1
         ) fact_intr on well.well_id = fact_intr.well_id
         where well.well_id = #{well_id}
     </select>
@@ -51,7 +53,7 @@
         well.*,
         TO_CHAR(fact_daily.oil_prod_begin_date , 'YYYY-MM-dd') oil_prod_begin_date,
         TO_CHAR(fact_daily.oil_prod_recent_date , 'YYYY-MM-dd') oil_prod_recent_date,
-               fact_daily.current_state,fact_daily.water_cut,
+        fact_daily.current_state,fact_daily.water_cut,
         fact_mon.oil_prod_mon,fact_mon.gas_prod_mon,fact_mon.gas_prod_year,fact_mon.oil_prod_year
         ,fact_mon.water_prod_mon,fact_mon.water_prod_year,
         well_stt.well_coordinates_x x,
@@ -62,12 +64,14 @@
         inner join(
         select well_id, max(prod_date) prod_date from by_dwr.fact_dwr_pc_pro_well_vol_d group by well_id
         ) maxdaily on daily.well_id=maxdaily.well_id and daily.prod_date=maxdaily.prod_date
+        limit  1
         )fact_daily on well.well_id= fact_daily.well_id
         left join (
         select mon.* from by_dwr.fact_dwr_pc_pro_well_vol_m mon
         inner join(
         select well_id, max(prod_date) prod_date from by_dwr.fact_dwr_pc_pro_well_vol_m group by well_id
         ) maxmon on mon.well_id=maxmon.well_id and mon.prod_date=maxmon.prod_date
+        limit  1
         )fact_mon on well.well_id= fact_mon.well_id
         left join by_dwr.fact_dwr_well_structure well_stt on well.well_id = well_stt.well_id
         where 1=1
@@ -80,6 +84,9 @@
         <if test="well_type!='' and well_type!=null">
             and well.well_type like Concat('%',#{well_type},'%')
         </if>
+        <if test="well_purpose!='' and well_purpose!=null">
+            and well.well_purpose like Concat('%',#{well_purpose},'%')
+        </if>
         <if test="spud_date_begin!='' and spud_date_begin!=null">
             and well.spud_date <![CDATA[ >= ]]> CAST(#{spud_date_begin} AS DATE)
         </if>
@@ -112,6 +119,19 @@
         <if test="project_id!='' and project_id!=null">
             and well.project_id =#{project_id}
         </if>
+        <if test="orgList!=null and orgList.size>0">
+            and well.org_id_a1 in
+            <foreach collection="orgList" item="orgId" index="index" open="(" close=")" separator=",">
+                #{orgId}
+            </foreach>
+        </if>
+        <if test="unitList!=null and unitList.size>0">
+            and well.project_id in
+            <foreach collection="unitList" item="unitId" index="index" open="(" close=")" separator=",">
+                #{unitId}
+            </foreach>
+        </if>
+        order by well.well_common_name
     </select>
 
     <select id="getWellMapList" parameterType="com.bowintek.practice.vo.query.WellInfoParams"
@@ -151,6 +171,7 @@
         <if test="project_id!='' and project_id!=null">
             and well.project_id =#{project_id}
         </if>
+        order by well.well_common_name
     </select>
 
     <select id="selectBoreholeInterList" resultType="java.util.HashMap">

+ 1 - 1
target/classes/application.yml

@@ -144,4 +144,4 @@ appconfig:
     client_id: 2d4a5b3c-dc6c-4231-914c-ca1a4d3a134b
     client_secret: e2afdc026c4e745714d2f3b2a2e393686c11f66f
 
-  hdfshelperurl: http://10.73.178.206:8078/hdfshelper/
+  hdfshelperurl: http://localhost:8078/hdfshelper/

BIN
target/classes/com/bowintek/practice/config/CorsConfig.class


BIN
target/classes/com/bowintek/practice/controller/system/LogController.class


BIN
target/classes/com/bowintek/practice/mapper/cquery/SysLogCQuery.class


BIN
target/classes/com/bowintek/practice/services/impl/system/LogServiceImpl.class


BIN
target/classes/com/bowintek/practice/services/service/system/LogService.class


+ 7 - 1
target/classes/mapping/cquery/SysLogCQuery.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.bowintek.practice.mapper.cquery.SysLogCQuery">
     <select id="selectLogList" resultType="com.bowintek.practice.vo.system.LogModel">
-        select l.logID,l.logID,l.pageUrl,l.actionName,l.userID,l.logTime,us.name as userName,us.loginID,l.pageName
+        select l.logID,l.pageUrl,l.actionName,l.userID,l.logTime,us.name as userName,us.loginID,l.pageName
         from sys_log l
         inner join sys_user us on l.userID = us.userID
         where 1=1
@@ -18,6 +18,12 @@
         <if test="startDate != null ">
             and l.logTime <![CDATA[ < ]]> date_add(#{startDate}, interval 1 day)
         </if>
+        <if test="idList!=null and idList.size>0">
+            and l.logID in
+            <foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
         order by l.logTime desc
     </select>
 </mapper>

+ 24 - 14
vue/package-lock.json

@@ -2414,6 +2414,21 @@
         "@volar/vue-language-core": "0.40.1"
       }
     },
+    "@vue-office/docx": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/@vue-office/docx/-/docx-1.6.0.tgz",
+      "integrity": "sha512-OKEapOPq223uszA8mRSOWPhdfBchJa6sIqP46eMrMMe5RSUrG9m3QE/o0JBIaMgxDrtNd7aI9CvF2kDvb7G2hw=="
+    },
+    "@vue-office/excel": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/@vue-office/excel/-/excel-1.6.0.tgz",
+      "integrity": "sha512-LE/TqciTQxFLHOdlaE8Z1kBEAH6JOE1EShmkKDEv+tDAzrI3Zn+65jqb0dsSRx72L6TXuCx+zLQwDCmDx+bxxQ=="
+    },
+    "@vue-office/pdf": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/@vue-office/pdf/-/pdf-1.6.0.tgz",
+      "integrity": "sha512-SRv+gOhHlk2J+SdivvVvum93FuI4sU3XIh6u1jFkNr3+cXxRjMT2PTSxQO9b/1NmGB50oc+p+C+DrgNmMW4/vQ=="
+    },
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz",
@@ -13554,6 +13569,11 @@
         "@codemirror/view": "6.x"
       }
     },
+    "vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w=="
+    },
     "vue-eslint-parser": {
       "version": "9.0.3",
       "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.0.3.tgz",
@@ -13685,20 +13705,10 @@
         "is-plain-object": "5.0.0"
       }
     },
-    "vuedraggable": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz",
-      "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
-      "requires": {
-        "sortablejs": "1.14.0"
-      },
-      "dependencies": {
-        "sortablejs": {
-          "version": "1.14.0",
-          "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
-          "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
-        }
-      }
+    "vue3-pdf-app": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/vue3-pdf-app/-/vue3-pdf-app-1.0.3.tgz",
+      "integrity": "sha512-qegWTIF4wYKiocZ3KreB70wRXhqSdXWbdERDyyKzT7d5PbjKbS9tD6vaKkCqh3PzTM84NyKPYrQ3iuwJb60YPQ=="
     },
     "w3c-keyname": {
       "version": "2.2.8",

+ 4 - 1
vue/package.json

@@ -36,6 +36,9 @@
     "@codemirror/lang-sql": "^6.x",
     "@codemirror/language": "^6.x",
     "@codemirror/theme-one-dark": "^6.x",
+    "@vue-office/docx": "^1.6.0",
+    "@vue-office/excel": "^1.6.0",
+    "@vue-office/pdf": "^1.6.0",
     "@vueuse/core": "~9.1.0",
     "@wangeditor/editor": "^5.1.23",
     "@wangeditor/editor-for-vue": "^5.1.12",
@@ -61,10 +64,10 @@
     "uuid": "^9.0.1",
     "vue": "3.2.47",
     "vue-codemirror": "^6.1.1",
+    "vue-demi": "^0.14.6",
     "vue-i18n": "9.2.2",
     "vue-router": "^4.1.6",
     "vue-types": "~4.2.1",
-    "vuedraggable": "^4.1.0",
     "xlsx": "~0.18.5"
   },
   "devDependencies": {

+ 2 - 3
vue/public/appconfig.json

@@ -1,6 +1,5 @@
 {
   "isDev": true,
-  "SSOLoginUrl": "http://www.baidu.com",
- /* //"huabeiHost": "http://10.73.178.206:8077/"*/
-  "huabeiHost": "http://192.168.0.68:8077/"
+  "SSOLoginUrl": "",
+  "huabeiHost": "http://10.73.178.206:8077"
 }

+ 91 - 0
vue/src/components/basic/file-preview/index.vue

@@ -0,0 +1,91 @@
+<template>
+  <a-button type="link" size="small" @click="loadFile">预览</a-button>
+  <a-modal :visible="visible" :ok-button-props="{ style: { display: 'none' } }"
+           wrap-class-name="full-modal" style="text-align: center"
+           cancel-text="关闭" @cancel="visible = !visible">
+    <a-spin tip="加载中..." size="small" :spinning="spinning">
+      <vue-office-excel v-if="fileSuffix=='xlsx'||fileSuffix=='xls'" :src="previewUrl" style="height: 90vh;"
+                        @rendered="rendered" @error="renderedError"/>
+      <vue-office-docx v-else-if="fileSuffix=='docx'||fileSuffix=='doc'" :src="previewUrl" @rendered="rendered"
+                      @error="renderedError"
+                      style="width: 100%; height: 90vh;"/>
+       <vue-office-pdf v-else  :src="previewUrl" class="docx-calss" @rendered="rendered"
+                        @error="renderedError" style="height: 90vh;"/>
+    </a-spin>
+  </a-modal>
+</template>
+<script lang="ts">
+import {defineComponent, ref} from 'vue';
+import {message as $message} from "ant-design-vue/lib/components";
+//引入VueOfficeDocx组件
+import VueOfficeDocx from '@vue-office/docx'
+import '@vue-office/docx/lib/index.css'
+import VueOfficePdf from '@vue-office/pdf'
+//引入VueOfficeExcel组件
+import VueOfficeExcel from '@vue-office/excel'
+import '@vue-office/excel/lib/index.css'
+import {handleloadByGet} from "@/utils/downloadFile";
+
+export default defineComponent({
+  name: 'b-file-preview',
+  components: {
+    VueOfficeDocx, VueOfficePdf, VueOfficeExcel
+  },
+  props: {
+    fileName: {type: String, default: ""},
+    filePath: {type: String, default: ""},
+    accept: {
+      type: String,
+      default: '.docx,.xlsx,.pdf',
+    },
+  },
+  setup(props) {
+    const visible = ref<boolean>(false);
+    const spinning = ref<boolean>(false);
+    const previewUrl = ref<Blob>();
+    const fileSuffix = props.fileName?.substring(props.fileName?.lastIndexOf('.') + 1).toLowerCase();
+
+    function loadFile() {
+      if (props.accept?.indexOf(fileSuffix) < 0) {
+        $message.error("不支持预览的文件格式!");
+        return;
+      }
+      spinning.value =true;
+      handleloadByGet("/api/wellInfo/downFile", {
+        isShow: 1,
+        fileName: props.fileName,
+        filePath: props.filePath
+      }, "获取文件失败!").then(res => {
+        previewUrl.value=res.data;
+        if (previewUrl.value == undefined) {
+          $message.error("文件加载失败!");
+          return;
+        }
+        visible.value = true;
+      })
+    }
+
+    function rendered() {
+      console.log("渲染完成");
+      spinning.value = false;
+    }
+
+    function renderedError(ex) {
+      console.log("渲染出错", ex);
+      spinning.value = false;
+    }
+
+    return {
+      visible, fileSuffix,
+      previewUrl,
+      loadFile,
+      rendered, renderedError,
+      spinning,
+    };
+  }
+})
+</script>
+<style lang="less">
+
+</style>
+

+ 2 - 2
vue/src/components/basic/transfer/Transfer.vue

@@ -1,7 +1,7 @@
 <template>
-  <templat v-for="it in selectData">
+  <template v-for="it in selectData">
     <a-tag closable @close="removeItem(it)">{{ it.title }}</a-tag>
-  </templat>
+  </template>
   <a-button type="link" @click="visible=!visible">选择</a-button>
   <a-modal
     title="选择"

+ 32 - 2
vue/src/utils/downloadFile.ts

@@ -95,8 +95,8 @@ export function downloadByUrl({
   });
 }
 
-export function download(well_id, fileName) {
-  return handleDownloadByGet("/api/wellInfo/downFile", {well_id: well_id,fileName:fileName}, fileName, "下载失败!");
+export function download(filePath, fileName) {
+  return handleDownloadByGet("/api/wellInfo/downFile", {filePath: filePath,fileName:fileName}, fileName, "下载失败!");
 };
 
 export function downloadTempFile(fileName) {
@@ -203,3 +203,33 @@ const downloadFile = (res, fileName, errorMsg) => {
 
 }
 
+
+export const  handleloadByGet = async <T = any>(url, params, errorMsg): Promise<T> => {
+  try {
+    const token = Storage.get(ACCESS_TOKEN_KEY);
+    const res = await axios.get(url, {
+      params: params,
+      responseType: 'blob',//设置返回类型
+      //设置token
+      headers: {
+        Authorization: token,
+      },
+    },).then((res) => {
+      if(res.status==200) {
+       // const url = window.URL || window.webkitURL;
+        //let link = url.createObjectURL(res.data);
+        return Promise.resolve({data: res.data, success: true});
+      }else{
+        return Promise.resolve({success: false});
+      }
+    }, (error: any) => {
+      $message.error((errorMsg || "") + error.message);
+      return Promise.resolve({success: false, ...error});
+    });
+
+    return Promise.resolve(res);
+  } catch (e: any) {
+    $message.error((errorMsg || "") + e.message);
+    return Promise.resolve({success: false, ...e});
+  }
+};

+ 43 - 11
vue/src/views/position/test.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="card-search">
-    <a-divider orientation="left">历史搜索使用方式</a-divider>
+<!--    <a-divider orientation="left">历史搜索使用方式</a-divider>
     <a-form ref="formRef" name="advanced_search" class="ant-advanced-search-form"
             :model="formState"
             @finish="onFinish">
@@ -10,7 +10,7 @@
             name="keyString"
             label="关键字"
             :label-col="{span:3}">
-            <!--AutoComplete继承至vue-->
+            &lt;!&ndash;AutoComplete继承至vue&ndash;&gt;
             <QueryHistoryComplete ref="queryHistoryComplete" v-model:value="formState.keyString"></QueryHistoryComplete>
           </a-form-item>
         </a-col>
@@ -22,7 +22,7 @@
 
     <a-divider orientation="left">热门搜索使用方式,实际应用改样式即可</a-divider>
     <div style="width: 600px;">
-      <!--热门搜索历史使用示例,实际应用改样式即可-->
+      &lt;!&ndash;热门搜索历史使用示例,实际应用改样式即可&ndash;&gt;
       <QueryHistoryList ref="queryHistoryList" :maxRows="20"></QueryHistoryList>
     </div>
 
@@ -32,9 +32,9 @@
         <template #bodyCell="{ column, text }">
           <template v-if="column.dataIndex === 'chart'">
             <div style="height:40px">
-              <!--列表单元格中显示曲线图,数据需要根据业务库整理-->
-              <!--timeType day month year-->
-              <!--dataType gas oil-->
+              &lt;!&ndash;列表单元格中显示曲线图,数据需要根据业务库整理&ndash;&gt;
+              &lt;!&ndash;timeType day month year&ndash;&gt;
+              &lt;!&ndash;dataType gas oil&ndash;&gt;
               <ChartCell :timeType="('month')" :dataType="('oil')" :wellId="('吉45-144(A2)')" :lineColor="('#FF0000')"></ChartCell>
             </div>
           </template>
@@ -50,7 +50,11 @@
     <a-divider orientation="left">地图</a-divider>
     <div style="width:1000px;height: 400px">
       <ChartMap :wellId="('吉45-144(A2)')"></ChartMap>
-    </div>
+    </div>-->
+    <vue-office-excel src="https://501351981.github.io/vue-office/examples/dist/static/test-files/test.xlsx" style="height: 100vh;" @error="rendered"/>
+    <vue-office-pdf src="https://501351981.github.io/vue-office/examples/dist/static/test-files/test.pdf" @error="rendered" style="width: 100%; height: 100%"/>
+<!--    <vue-office-docx src="https://501351981.github.io/vue-office/examples/dist/static/test-files/test.docx" class="docx-calss" />
+    <vue-pdf-app :config="config" style="height: 100vh;" pdf="/api/wellInfo/downFile?isShow=1&fileName=1.pdf"></vue-pdf-app>-->
   </div>
 </template>
 
@@ -62,17 +66,42 @@ import QueryHistoryComplete from '@/components/basic/querylog/history-complete.v
 import ChartCell from '@/components/basic/chart/chart-cell.vue'
 import ChartProdDynmics from '@/components/basic/chart/chart-prod-dynamics.vue'
 import ChartMap from '@/components/basic/chart/chart-map.vue'
+//import VuePdfApp from "vue3-pdf-app";
+// import this to use default icons for buttons
+//import "vue3-pdf-app/dist/icons/main.css";
+import {handleloadByGet} from "@/utils/downloadFile";
+//引入VueOfficeDocx组件
+import VueOfficeDocx from '@vue-office/docx'
+//引入相关样式
+import '@vue-office/docx/lib/index.css'
+
+import VueOfficePdf from '@vue-office/pdf'
+//引入VueOfficeExcel组件
+import VueOfficeExcel from '@vue-office/excel'
+//引入相关样式
+import '@vue-office/excel/lib/index.css'
 
 export default defineComponent({
   name: 'QueryTest',
-  components: {QueryHistoryList, QueryHistoryComplete, ChartCell, ChartProdDynmics, ChartMap},
+  components: {QueryHistoryList, QueryHistoryComplete, ChartCell,
+    ChartProdDynmics,ChartMap,VueOfficeDocx,VueOfficePdf,VueOfficeExcel},
   setup() {
     const route = useRoute();
     const queryHistoryComplete = ref<typeof QueryHistoryComplete>();
     const formState = ref({
       keyString: ""
     });
+    const config = {
+      sidebar: false,
+      secondaryToolbar: false,
+      toolbar: false,
+      errorWrapper: false,
+    };
+    const fileUrl=ref('');
 
+    handleloadByGet( "/api/wellInfo/downFile", {fileId: 'fileId'}, "下载失败!").then(res=>{
+      fileUrl.value=res.link;
+    })
     console.log(route, formState);
 
     watch(formState.value, async (newQuestion) => {
@@ -97,14 +126,17 @@ export default defineComponent({
       { key: '2', name: 'Jim Green', age: 42, address: 'London No. 2 Lake Park, London No. 2 Lake Park', tags: ['loser']},
       { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park, Sidney No. 1 Lake Park', tags: ['cool', 'teacher']},
     ];
-
+    const rendered=(ex)=>
+    {
+      console.log("渲染完成",ex);
+    }
     return {
       formState,
       onFinish,
       queryHistoryComplete,
-
+      rendered,
       columns,
-      data
+      data,fileUrl,config
     };
   }
 });

+ 7 - 6
vue/src/views/system/log/index.vue

@@ -30,7 +30,7 @@
       <a-row class="edit-operation">
         <a-col :span="24" style="text-align: right">
           <BExportExcel :title="'导出'" :filename="'日志信息'" :url="'system/log/exportLog'"
-                        :params="{...formState}"></BExportExcel>
+                        :params="{selectedRowKeys: selectedRowKeys.join(','),...formState}"></BExportExcel>
         </a-col>
       </a-row>
     </a-form>
@@ -38,7 +38,7 @@
       <a-table :columns="columns" :data-source="dataList" :scroll="{ x:'100%', y: 500 }" :pagination="pagination"
                :loading="formState.loading"
                @change="handleTableChange"
-               :row-selection="{ selectedRowKeys: formState.selectedRowKeys, onChange: onSelectChange}"
+               :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
                :row-key="record=>record.logID"
                bordered>
       </a-table>
@@ -67,9 +67,9 @@ export default defineComponent({
     const searchParamsState = reactive({page: 1, rows: 20, loginID: '', userName: '', startDate: '',endDate:''});
     const formState = reactive({
       total: 0,
-      selectedRowKeys: [],
       loading: false
     });
+    const selectedRowKeys=ref([]);
     const columns: TableColumnsType = [
       {
         title: '序号',
@@ -107,9 +107,9 @@ export default defineComponent({
       loadData();
     };
 
-    const onSelectChange = (selectedRowKeys: any) => {
-      console.log('selectedRowKeys changed: ', selectedRowKeys);
-      formState.selectedRowKeys = selectedRowKeys;
+    const onSelectChange = (keys: any) => {
+      console.log('selectedRowKeys changed: ', keys);
+      selectedRowKeys.value = keys;
     };
 
     const onRangeChange = (dateString: [string, string]) => {
@@ -145,6 +145,7 @@ export default defineComponent({
       onSelectChange,
       onFinish,
       loadData,
+      selectedRowKeys,
       onRangeChange
     };
   },

+ 188 - 128
vue/src/views/wellinfo/detail.vue

@@ -18,13 +18,13 @@
             dataModel.structure_pos
           }}</span>
           <template v-if="dataModel.spud_date">
-          ,于<span>{{ dataModel.spud_date }}</span>开钻
+            ,于<span>{{ dataModel.spud_date }}</span>开钻
           </template>
           <template v-if="dataModel.end_drilling_date">
-          ,<span>{{ dataModel.end_drilling_date }}</span>完钻
+            ,<span>{{ dataModel.end_drilling_date }}</span>完钻
           </template>
           <template v-if="dataModel.completion_method">
-            ,采取<span>{{dataModel.completion_method}}</span>方式完井。
+            ,采取<span>{{ dataModel.completion_method }}</span>方式完井。
           </template>
         </p>
 
@@ -44,14 +44,14 @@
           <template v-if="dataModel.recent_prod_date">
             ,最近一次产油时间<span>{{ dataModel.recent_prod_date }}</span>
           </template>
-            ,油嘴<span>{{ dataModel.oil_nozzle??0 }}</span>mm
-            ,油压<span>{{ dataModel.tubing_pres??0 }}</span>MPa
-            ,套压<span>{{ dataModel.casing_pres??0 }}</span>MPa
-            ,日产液量<span>{{ dataModel.fluid_prod_daily??0 }}</span>t/d
-            ,日产油量<span>{{ dataModel.oil_prod_daily??0 }}</span>t/d
-            ,含水<span>{{ dataModel.water_cut??0 }}</span>%
-            ,动液面<span>{{ dataModel.start_pump_liq_level??0 }}</span>m
-            ,截止目前累产油<span>{{ dataModel.oil_prod_cum??0}}</span>吨。
+          ,油嘴<span>{{ dataModel.oil_nozzle ?? 0 }}</span>mm
+          ,油压<span>{{ dataModel.tubing_pres ?? 0 }}</span>MPa
+          ,套压<span>{{ dataModel.casing_pres ?? 0 }}</span>MPa
+          ,日产液量<span>{{ dataModel.fluid_prod_daily ?? 0 }}</span>t/d
+          ,日产油量<span>{{ dataModel.oil_prod_daily ?? 0 }}</span>t/d
+          ,含水<span>{{ dataModel.water_cut ?? 0 }}</span>%
+          ,动液面<span>{{ dataModel.start_pump_liq_level ?? 0 }}</span>m
+          ,截止目前累产油<span>{{ dataModel.oil_prod_cum ?? 0 }}</span>吨。
         </p>
       </div>
     </a-card>
@@ -82,95 +82,138 @@
         <DownSquareOutlined v-else @click="cardSettings.cardBaseInfo.expand=true"
                             :style="cardSettings.buttonStyle"/>
       </template>
-      <div v-if="cardSettings.cardBaseInfo.expand">
-        <a-divider type="vertical" class="info-title" style="margin-top: 0px" dashed>井身结构</a-divider>
-        <a-descriptions bordered>
-          <a-descriptions-item :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}" label="井id:">
-            {{ dataModel.well_id }}
-          </a-descriptions-item>
-          <a-descriptions-item label="井名:">{{ dataModel.well_common_name }}</a-descriptions-item>
-          <a-descriptions-item label="井别:">{{ dataModel.well_purpose }}</a-descriptions-item>
-          <a-descriptions-item label="井型:">{{ dataModel.well_type }}</a-descriptions-item>
-          <a-descriptions-item label="开钻日期:">{{ dataModel.spud_date }}</a-descriptions-item>
-          <a-descriptions-item label="完钻日期:">{{ dataModel.end_drilling_date }}</a-descriptions-item>
-          <a-descriptions-item label="设计井深:">{{
-              dataModel.budgeted_md == null ? "" : (dataModel.budgeted_md + "m")
-            }}
-          </a-descriptions-item>
-          <a-descriptions-item label="完钻层位:">{{ dataModel.completion_formation }}</a-descriptions-item>
-          <a-descriptions-item label="完井方式:">{{ dataModel.completion_method }}</a-descriptions-item>
-          <a-descriptions-item label="生产井段:">{{ dataModel.well_production_sections }}</a-descriptions-item>
-          <a-descriptions-item label="T₇⁴顶深:">{{
-              dataModel.t74_top_depth == null ? "" : (dataModel.t74_top_depth + "m")
-            }}
-          </a-descriptions-item>
-          <a-descriptions-item label="造斜点:">{{
-              dataModel.ko_azimuth == null ? "" : (dataModel.ko_azimuth + "m")
-            }}
-          </a-descriptions-item>
-          <a-descriptions-item label="水平位移:">
-            {{ dataModel.ko_horizontal_dislocation == null ? "" : (dataModel.ko_horizontal_dislocation + "m") }}
-          </a-descriptions-item>
-          <a-descriptions-item label="方位角:">{{
-              dataModel.azimuth_angle == null ? "" : (dataModel.azimuth_angle + "°")
-            }}
-          </a-descriptions-item>
-          <a-descriptions-item label="井位坐标X:">{{ dataModel.well_coordinates_x }}</a-descriptions-item>
-          <a-descriptions-item label="井位坐标y:">{{ dataModel.well_coordinates_y }}</a-descriptions-item>
-        </a-descriptions>
-        <a-divider type="vertical" class="info-title" dashed>井A1信息</a-divider>
-        <a-descriptions bordered>
-          <a-descriptions-item :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}" label="采油厂机构:">
-            {{ dataModel.org_name_a1 }}
-          </a-descriptions-item>
-          <a-descriptions-item label="单位名称:">{{ dataModel.org_name_a2 }}</a-descriptions-item>
-          <a-descriptions-item label="标准井名:">{{ dataModel.well_legal_name }}</a-descriptions-item>
-          <a-descriptions-item label="地理位置描述:" :span="3">{{ dataModel.geo_description }}</a-descriptions-item>
-          <a-descriptions-item label="构造位置描述:" :span="3">{{ dataModel.structure_pos }}</a-descriptions-item>
-          <a-descriptions-item label="创建/更新日期:">
-            {{ dataModel.update_date == null ? dataModel.create_date : dataModel.update_date }}
-          </a-descriptions-item>
-          <a-descriptions-item label="井筒生命阶段:">{{ dataModel.phase }}</a-descriptions-item>
-          <a-descriptions-item label="通用井筒名:">{{ dataModel.wellbore_common_name }}</a-descriptions-item>
-          <a-descriptions-item label="目的层:">{{ dataModel.target_formation }}</a-descriptions-item>
-          <a-descriptions-item label="审定测量深度:">
-            {{ dataModel.authorized_md }}
-            <template v-if="dataModel.authorized_md">m</template>
-          </a-descriptions-item>
-          <a-descriptions-item label="审定真垂直深度:">{{ dataModel.authorized_tvd }}
-            <template v-if="dataModel.authorized_tvd">m</template>
-          </a-descriptions-item>
+      <div v-if="cardSettings.cardBaseInfo.expand" style="display: flex">
+        <div style="width:70%">
+          <a-divider type="vertical" class="info-title" style="margin-top: 0px" dashed>井身结构</a-divider>
+          <a-descriptions bordered>
+            <a-descriptions-item label="井名:" :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}">
+              {{ dataModel.well_common_name }}</a-descriptions-item>
+            <a-descriptions-item label="井别:">{{ dataModel.well_purpose }}</a-descriptions-item>
+            <a-descriptions-item label="井型:">{{ dataModel.well_type }}</a-descriptions-item>
+            <a-descriptions-item label="开钻日期:">{{ dataModel.spud_date }}</a-descriptions-item>
+            <a-descriptions-item label="完钻日期:">{{ dataModel.end_drilling_date }}</a-descriptions-item>
+            <a-descriptions-item label="设计井深:">{{
+                dataModel.budgeted_md == null ? "" : (dataModel.budgeted_md + "m")
+              }}
+            </a-descriptions-item>
+            <a-descriptions-item label="完钻层位:">{{ dataModel.completion_formation }}</a-descriptions-item>
+            <a-descriptions-item label="完井方式:">{{ dataModel.completion_method }}</a-descriptions-item>
+            <a-descriptions-item label="生产井段:">{{ dataModel.well_production_sections }}</a-descriptions-item>
+            <a-descriptions-item label="T₇⁴顶深:">{{
+                dataModel.t74_top_depth == null ? "" : (dataModel.t74_top_depth + "m")
+              }}
+            </a-descriptions-item>
+            <a-descriptions-item label="造斜点:">{{
+                dataModel.ko_azimuth == null ? "" : (dataModel.ko_azimuth + "m")
+              }}
+            </a-descriptions-item>
+            <a-descriptions-item label="水平位移:">
+              {{ dataModel.ko_horizontal_dislocation == null ? "" : (dataModel.ko_horizontal_dislocation + "m") }}
+            </a-descriptions-item>
+            <a-descriptions-item label="方位角:">{{
+                dataModel.azimuth_angle == null ? "" : (dataModel.azimuth_angle + "°")
+              }}
+            </a-descriptions-item>
+            <a-descriptions-item label="井位坐标X:">{{ dataModel.well_coordinates_x }}</a-descriptions-item>
+            <a-descriptions-item label="井位坐标y:">{{ dataModel.well_coordinates_y }}</a-descriptions-item>
+          </a-descriptions>
+          <a-divider type="vertical" class="info-title" dashed>井A1信息</a-divider>
+          <a-descriptions bordered>
+            <a-descriptions-item :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}" label="采油厂机构:">
+              {{ dataModel.org_name_a1 }}
+            </a-descriptions-item>
+            <a-descriptions-item label="单位名称:">{{ dataModel.org_name_a2 }}</a-descriptions-item>
+            <a-descriptions-item label="标准井名:">{{ dataModel.well_legal_name }}</a-descriptions-item>
+            <a-descriptions-item label="地理位置描述:" :span="3">{{ dataModel.geo_description }}</a-descriptions-item>
+            <a-descriptions-item label="构造位置描述:" :span="3">{{ dataModel.structure_pos }}</a-descriptions-item>
+            <a-descriptions-item label="创建/更新日期:">
+              {{ dataModel.update_date == null ? dataModel.create_date : dataModel.update_date }}
+            </a-descriptions-item>
+            <a-descriptions-item label="井筒生命阶段:">{{ dataModel.phase }}</a-descriptions-item>
+            <a-descriptions-item label="通用井筒名:">{{ dataModel.wellbore_common_name }}</a-descriptions-item>
+            <a-descriptions-item label="目的层:">{{ dataModel.target_formation }}</a-descriptions-item>
+            <a-descriptions-item label="审定测量深度:">
+              {{ dataModel.authorized_md }}
+              <template v-if="dataModel.authorized_md">m</template>
+            </a-descriptions-item>
+            <a-descriptions-item label="审定真垂直深度:">{{ dataModel.authorized_tvd }}
+              <template v-if="dataModel.authorized_tvd">m</template>
+            </a-descriptions-item>
 
-          <a-descriptions-item label="井底测量深度:">{{ dataModel.bh_md }}
-            <template v-if="dataModel.bh_md">m</template>
-          </a-descriptions-item>
-          <a-descriptions-item label="井底位置描述信息:" :span="2">{{ dataModel.geo_description_bh }}</a-descriptions-item>
-          <a-descriptions-item label="井底真垂直深度:">{{ dataModel.bh_tvd }}
-            <template v-if="dataModel.bh_tvd">m</template>
-          </a-descriptions-item>
-          <a-descriptions-item label="相对于参考面的造斜点深度:">{{ dataModel.ko_md }}
-            <template v-if="dataModel.ko_md">m</template>
-          </a-descriptions-item>
-          <a-descriptions-item label="实际造斜点真垂直深度:">{{ dataModel.ko_tvd }}
-            <template v-if="dataModel.ko_tvd">m</template>
-          </a-descriptions-item>
-          <a-descriptions-item label="地质单元:">{{ dataModel.project_name }}</a-descriptions-item>
-          <a-descriptions-item label="单元类型:">{{ dataModel.project_type }}</a-descriptions-item>
-          <a-descriptions-item label="单元等级:">{{ dataModel.project_level }}</a-descriptions-item>
-          <a-descriptions-item label="备注:" :span="3">{{ dataModel.remarks }}</a-descriptions-item>
-        </a-descriptions>
-        <a-divider type="vertical" class="info-title" dashed>井盆地凹陷信息</a-divider>
-        <a-descriptions bordered>
-          <a-descriptions-item :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}" label="标准盆地:">
-            {{ dataModel.bz_basin }}
-          </a-descriptions-item>
-          <a-descriptions-item label="标准地陷:">{{ dataModel.bz_depression }}</a-descriptions-item>
-          <a-descriptions-item label="标准凹陷:">{{ dataModel.bz_depressed }}</a-descriptions-item>
-          <a-descriptions-item label="标准构造带:">{{ dataModel.bz_structural_belt }}</a-descriptions-item>
-          <a-descriptions-item label="标准区块:">{{ dataModel.bz_qkdy }}</a-descriptions-item>
-          <a-descriptions-item label="标准组织机构:">{{ dataModel.bz_org_name }}</a-descriptions-item>
-          <a-descriptions-item label="标准作业区名:">{{ dataModel.bz_dwmc }}</a-descriptions-item>
-        </a-descriptions>
+            <a-descriptions-item label="井底测量深度:">{{ dataModel.bh_md }}
+              <template v-if="dataModel.bh_md">m</template>
+            </a-descriptions-item>
+            <a-descriptions-item label="井底位置描述信息:" :span="2">{{ dataModel.geo_description_bh }}</a-descriptions-item>
+            <a-descriptions-item label="井底真垂直深度:">{{ dataModel.bh_tvd }}
+              <template v-if="dataModel.bh_tvd">m</template>
+            </a-descriptions-item>
+            <a-descriptions-item label="相对于参考面的造斜点深度:">{{ dataModel.ko_md }}
+              <template v-if="dataModel.ko_md">m</template>
+            </a-descriptions-item>
+            <a-descriptions-item label="实际造斜点真垂直深度:">{{ dataModel.ko_tvd }}
+              <template v-if="dataModel.ko_tvd">m</template>
+            </a-descriptions-item>
+            <a-descriptions-item label="地质单元:">{{ dataModel.project_name }}</a-descriptions-item>
+            <a-descriptions-item label="单元类型:">{{ dataModel.project_type }}</a-descriptions-item>
+            <a-descriptions-item label="单元等级:">{{ dataModel.project_level }}</a-descriptions-item>
+            <a-descriptions-item label="备注:" :span="3">{{ dataModel.remarks }}</a-descriptions-item>
+          </a-descriptions>
+          <a-divider type="vertical" class="info-title" dashed>井盆地凹陷信息</a-divider>
+          <a-descriptions bordered>
+            <a-descriptions-item :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}" label="标准盆地:">
+              {{ dataModel.bz_basin }}
+            </a-descriptions-item>
+            <a-descriptions-item label="标准地陷:">{{ dataModel.bz_depression }}</a-descriptions-item>
+            <a-descriptions-item label="标准凹陷:">{{ dataModel.bz_depressed }}</a-descriptions-item>
+            <a-descriptions-item label="标准构造带:">{{ dataModel.bz_structural_belt }}</a-descriptions-item>
+            <a-descriptions-item label="标准区块:">{{ dataModel.bz_qkdy }}</a-descriptions-item>
+            <a-descriptions-item label="标准组织机构:">{{ dataModel.bz_org_name }}</a-descriptions-item>
+            <a-descriptions-item label="标准作业区名:">{{ dataModel.bz_dwmc }}</a-descriptions-item>
+          </a-descriptions>
+        </div>
+        <div style="flex:1;">
+          <a-divider type="vertical" class="info-title" style="margin-top: 0px" dashed>相关文档</a-divider>
+          <div style="margin-left:10px;border:1px solid #f0f0f0;padding:5px;">
+            <a-input-search
+              v-model:value="fileOptions.docKey"
+              placeholder="查找文档" allow-clear
+            />
+            <div class="files-type">
+              <a-checkable-tag color="processing"
+                               :checked="fileOptions.selectBusinessType.length==0||fileOptions.selectBusinessType.length==fileOptions.businessType.length"
+                               @change="() => fileOptions.selectBusinessType=[]">全部
+              </a-checkable-tag>
+              <template v-for="tag in fileOptions.businessType">
+                <a-checkable-tag color="processing"
+                                 :checked="fileOptions.selectBusinessType.includes(tag)"
+                                 @change="checked => onBusTypeChange(checked,tag)">{{ tag }}
+                </a-checkable-tag>
+              </template>
+            </div>
+            <div style="max-height:990px;overflow-y:scroll;">
+              <a-list item-layout="horizontal" :data-source="dataIndexList">
+                <template #renderItem="{ item }">
+                  <a-list-item v-if="(item.file_name.indexOf(fileOptions.docKey)>-1||fileOptions.docKey=='')
+                  &&(fileOptions.selectBusinessType.length==0||fileOptions.selectBusinessType.includes(item.file_business_type))">
+                    <template #actions>
+                      <filePreview :fileName="item.file_name" :filePath="item.storage_path"></filePreview>
+                      <a-button type="link" @click="downFile(item)" functioncode="T010501" danger>下载</a-button>
+                    </template>
+                    <a-list-item-meta
+                      :description="item.file_business_type">
+                      <template #title>
+                        {{ item.file_name }}
+                      </template>
+                      <template #avatar>
+                        <img src="~@/assets/images/file.png"/>
+                      </template>
+                    </a-list-item-meta>
+                  </a-list-item>
+                </template>
+              </a-list>
+            </div>
+          </div>
+        </div>
       </div>
     </a-card>
     <a-card :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
@@ -192,29 +235,6 @@
         </a-table>
       </div>
     </a-card>
-    <a-card :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
-      <template #title>
-        <div slot="title" style="width:100%" @click="cardSettings.cardFile.expand=!cardSettings.cardFile.expand">相关文档
-        </div>
-      </template>
-      <template #extra>
-        <UpSquareOutlined v-if="cardSettings.cardFile.expand" @click="cardSettings.cardFile.expand=false"
-                          :style="cardSettings.buttonStyle"/>
-        <DownSquareOutlined v-else @click="cardSettings.cardFile.expand=true"
-                            :style="cardSettings.buttonStyle"/>
-      </template>
-      <div v-if="cardSettings.cardFile.expand">
-        <a-table :columns="dataIndexColumns" :data-source="dataIndexList" :scroll="{ x:'100%', y: 500 }"
-                 :pagination="false"
-                 bordered>
-          <template #bodyCell="{ column,record }">
-            <template v-if="column.key === 'file_name'">
-              <a>{{ record.file_name }}</a>
-            </template>
-          </template>
-        </a-table>
-      </div>
-    </a-card>
     <a-card :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
       <template #title>
         <div slot="title" style="width:100%" @click="cardSettings.cardTest.expand=!cardSettings.cardTest.expand">测试历史
@@ -324,10 +344,12 @@ import router from "@/router";
 import * as columns from './columns';
 import ChartProdDynmics from '@/components/basic/chart/chart-prod-dynamics.vue'
 import ChartMap from '@/components/basic/chart/chart-map.vue'
+import filePreview from '@/components/basic/file-preview/index.vue'
+import {download} from "@/utils/downloadFile";
 
 export default defineComponent({
   name: 'wellinfoDetail',
-  components: {ChartProdDynmics, ChartMap},
+  components: {ChartProdDynmics, ChartMap, filePreview},
   setup() {
     const tabsViewStore = useTabsViewStore();
     const route = useRoute();
@@ -346,6 +368,21 @@ export default defineComponent({
     })
     const wellId = ref(history.state.params?.id);
 
+    const fileOptions = reactive({
+      docKey: '',
+      businessType: [] as any[],
+      selectBusinessType: [] as any[]
+    })
+
+    function onBusTypeChange(checked, it) {
+      if (checked) {
+        fileOptions.selectBusinessType.push(it);
+      } else {
+        fileOptions.selectBusinessType.splice(fileOptions.selectBusinessType.indexOf(it), 1);
+      }
+      console.log(checked, it);
+    }
+
     watch(
       () => cardSettings,
       () => {
@@ -365,7 +402,7 @@ export default defineComponent({
       historyAssignmentSummary: [],
       lastHistoryAssignment: {},
       historyAssignmentCount: 0,
-      dataIndexList: []
+      dataIndexList: [] as any[]
     });
 
     const loadData = async (id) => {
@@ -385,6 +422,9 @@ export default defineComponent({
         wellData.lastHistoryAssignment = data.lastHistoryAssignment ?? {};
         wellData.dataIndexList = data.dataIndexList;
         wellData.historyAssignmentCount = wellData.historyAssignmentSummary.reduce((total, it: any) => total + it.testing_num, 0);
+
+        fileOptions.businessType = wellData.dataIndexList.map(x => x.file_business_type);
+        fileOptions.businessType = Array.from(new Set(fileOptions.businessType));
       })
       get('wellInfo/getExpendSetting', {wellId: id}).then(data => {
         if (data != null) {
@@ -392,6 +432,11 @@ export default defineComponent({
         }
       })
     }
+
+    const downFile = (record: any) => {
+      download(record.storage_path, record.file_name);
+    };
+
     const onClose = () => {
       tabsViewStore.closeCurrentTab(route);
       router.back();
@@ -401,7 +446,7 @@ export default defineComponent({
       ...toRefs(wellData),
       loadData, cardSettings,
       onClose, ...columns,
-      dayjs, wellId
+      dayjs, wellId, fileOptions, downFile, onBusTypeChange
     };
   },
   created() {
@@ -422,14 +467,16 @@ export default defineComponent({
   a {
     color: #1890ff;
   }
-  .ant-card-head-title{
+
+  .ant-card-head-title {
     font-weight: bold;
-    color:#1f37dd;
+    color: #40a9ff;
   }
+
   .ant-card-head {
     padding: 0px 10px;
     height: 35px;
-    cursor:pointer;
+    cursor: pointer;
   }
 
   .ant-card-head-wrapper {
@@ -437,7 +484,20 @@ export default defineComponent({
     margin-top: 5px;
   }
 }
+.files-type{
+  margin-top: 10px;
 
+  span{
+    color:#8e9ae1;
+    border:1px solid #c6ccf0;
+    padding: 3px 5px;
+    margin-bottom: 5px;
+  }
+  .ant-tag-checkable-checked,.ant-tag-checkable-checked:active{
+    background-color: #8e9ae1;
+    color:#ffffff;
+  }
+}
 .info-body {
   line-height: 30px;
 

+ 128 - 65
vue/src/views/wellinfo/index.vue

@@ -51,11 +51,6 @@
                 :label-col="labelCol"
                 :model="formState">
           <a-row :gutter="24" class="query-index-row">
-            <a-col :span="6">
-              <a-form-item name="well_id" label="井号:">
-                <a-input v-model:value="formState.well_id"/>
-              </a-form-item>
-            </a-col>
             <a-col :span="6">
               <a-form-item name="well_common_name" label="井名:">
                 <a-input v-model:value="formState.well_common_name"/>
@@ -68,6 +63,13 @@
                 </a-select>
               </a-form-item>
             </a-col>
+            <a-col :span="6">
+              <a-form-item name="well_type" label="井别:">
+                <a-select ref="select" v-model:value="formState.well_purpose"
+                          :options="wellPurposeList" :field-names="{label:'name',value:'value'}" :allow-clear="true">
+                </a-select>
+              </a-form-item>
+            </a-col>
             <a-col :span="6" style="text-align: left">
               <MenuOutlined @click="showQuery=true" v-if="!showQuery"/>
               <LineOutlined @click="showQuery=false" v-else/>
@@ -80,12 +82,36 @@
             </a-col>
           </a-row>
           <a-row :gutter="24" class="query-index-row" v-if="showQuery">
-            <a-col :span="6">
-              <a-form-item name="spud_date_begin" label="开钻日期:">
-                <a-range-picker :key="formState.ref_date" format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']"
-                                @change="(d)=>{onRangeChange(d,'spud_date_begin','spud_date_end')}"/>
+            <a-col :span="18">
+              <a-form-item name="well_id" label="组织机构:">
+                <a-tree-select
+                  v-model:value="formState.orgList"
+                  show-search
+                  allow-clear
+                  multiple
+                  tree-line
+                  :tree-data="subjectTrees.organizationTree"
+                  tree-node-filter-prop="label">
+                </a-tree-select>
               </a-form-item>
             </a-col>
+          </a-row>
+          <a-row :gutter="24" class="query-index-row" v-if="showQuery">
+            <a-col :span="18">
+              <a-form-item name="spud_date_begin" label="地址单元:">
+                <a-tree-select
+                  v-model:value="formState.unitList"
+                  show-search
+                  allow-clear
+                  multiple
+                  tree-line
+                  :tree-data="subjectTrees.constructUnitTree"
+                  tree-node-filter-prop="label">
+                </a-tree-select>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24" class="query-index-row" v-if="showQuery">
             <a-col :span="6">
               <a-form-item name="completion_date_begin" label="完井日期:">
                 <a-range-picker :key="formState.ref_date" format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']"
@@ -93,17 +119,15 @@
               </a-form-item>
             </a-col>
             <a-col :span="6">
-              <a-form-item name="oil_prod_begin_date_begin" label="开始采油日期:">
+              <a-form-item name="oil_prod_begin_date_begin" label="投产日期:">
                 <a-range-picker :key="formState.ref_date" format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']"
                                 @change="(d)=>{onRangeChange(d,'oil_prod_begin_date_begin','oil_prod_begin_date_end')}"/>
               </a-form-item>
             </a-col>
-          </a-row>
-          <a-row :gutter="24" class="query-index-row" v-if="showQuery">
             <a-col :span="6">
-              <a-form-item label="最近采油日期:">
+              <a-form-item name="spud_date_begin" label="开钻日期:">
                 <a-range-picker :key="formState.ref_date" format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']"
-                                @change="(d)=>{onRangeChange(d,'oil_prod_recent_date_begin','oil_prod_recent_date_end')}"/>
+                                @change="(d)=>{onRangeChange(d,'spud_date_begin','spud_date_end')}"/>
               </a-form-item>
             </a-col>
           </a-row>
@@ -266,24 +290,31 @@
       </div>
     </div>
     <a-modal v-model:visible="isShowDoc" title="相关文档" :footer="null" @onCancel="isShowDoc=false">
-      <a-list item-layout="horizontal" :data-source="docList">
-        <template #renderItem="{ item }">
-          <a-list-item>
-            <template #actions>
-              <a style="color:#1890ff" @click="downFile(item)">下载</a>
-            </template>
-            <a-list-item-meta
-              :description="item.file_business_type">
-              <template #title>
-                <a href="">{{ item.file_name }}</a>
-              </template>
-              <template #avatar>
-                <img src="~@/assets/images/file.png"/>
+      <a-input-search
+        v-model:value="docKey"
+        placeholder="查找文档" allow-clear
+      />
+      <div style="max-height:300px;overflow-y:scroll;margin-top:10px;">
+        <a-list item-layout="horizontal" :data-source="docList">
+          <template #renderItem="{ item }">
+            <a-list-item v-if="item.file_name.indexOf(docKey)>-1||docKey==''">
+              <template #actions>
+                <filePreview :fileName="item.file_name" :filePath="item.storage_path"></filePreview>
+                <a-button type="link" @click="downFile(item)" functioncode="T010501" danger>下载</a-button>
               </template>
-            </a-list-item-meta>
-          </a-list-item>
-        </template>
-      </a-list>
+              <a-list-item-meta
+                :description="item.file_business_type">
+                <template #title>
+                  {{ item.file_name }}
+                </template>
+                <template #avatar>
+                  <img src="~@/assets/images/file.png"/>
+                </template>
+              </a-list-item-meta>
+            </a-list-item>
+          </template>
+        </a-list>
+      </div>
     </a-modal>
   </div>
 </template>
@@ -292,18 +323,20 @@
 import {ref, defineComponent, computed, watch} from 'vue';
 import type {FormInstance} from 'ant-design-vue';
 import {useRoute} from 'vue-router';
-import {get} from "@/api/common";
+import {get, postData} from "@/api/common";
 import {getPaginationTotalTitle} from "@/utils/common";
+import {message} from 'ant-design-vue';
 import type {TableProps} from "ant-design-vue";
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import ChartCell from '@/components/basic/chart/chart-cell.vue'
 import ChartMap from '@/components/basic/chart/chart-map.vue'
 import {download} from "@/utils/downloadFile";
-import {columns,filterColumns,formState,getTdColor} from './table'
+import {columns, filterColumns, formState, getTdColor} from './table'
+import filePreview from '@/components/basic/file-preview/index.vue'
 
 export default defineComponent({
   name: 'wellinfoindex',
-  components: {ChartCell, ChartMap},
+  components: {ChartCell, ChartMap, filePreview},
   setup() {
 
     const route = useRoute();
@@ -320,11 +353,10 @@ export default defineComponent({
     const data = ref([{children: [], label: '', value: ''}]);
     const viewModel = ref("list");
     const tabsViewStore = useTabsViewStore();
+    const docKey = ref('');
     const docList = ref([]);
-    const wellTypeList = ref([{label: "直井", value: "直井"}, {label: "定向井", value: "定向井"}, {
-      label: "分支井",
-      value: "分支井"
-    }]);
+    const wellTypeList = ref([{label: "直井", value: "直井"}, {label: "定向井", value: "定向井"}, {label: "分支井", value: "分支井"}]);
+    const wellPurposeList = ref([{label: "探井", value: "探井"}, {label: "开发井", value: "开发井"}, {label: "水井", value: "水井"}]);
     const replaceFields = {
       children: 'children',
       title: 'label',
@@ -332,47 +364,74 @@ export default defineComponent({
     };
 
     const downFile = (record: any) => {
-
-      download(record.fileId, record.file_name);
+      download(record.storage_path, record.file_name);
     };
     const resetFields = function () {
       let keys: string[] = Object.keys(formState);
       keys.forEach(key => {
         if (typeof (formState[key]) == "string") {
           formState[key] = '';
+        } else if (typeof (formState[key]) == "object") {
+          formState[key] = [];
         }
       })
     }
 
     filterColumns.value = [...columns];
 
-    watch(
-      () => showColumnType.value,
-      () => {
-        const filterValue = columns.filter((item: any) => {
-          if (!showColumnType.value.includes("oil")) {
-            if (["oil_prod_mon", "oil_prod_year", "oil"].includes(item.dataIndex)) {
-              return false
-            }
+    function showColumnTypeChange() {
+      const filterValue = columns.filter((item: any) => {
+        if (!showColumnType.value.includes("oil")) {
+          if (["oil_prod_mon", "oil_prod_year", "oil"].includes(item.dataIndex)) {
+            return false
           }
-          if (!showColumnType.value.includes("gas")) {
-            if (["gas_prod_mon", "gas_prod_year", "gas"].includes(item.dataIndex)) {
-              return false
-            }
+        }
+        if (!showColumnType.value.includes("gas")) {
+          if (["gas_prod_mon", "gas_prod_year", "gas"].includes(item.dataIndex)) {
+            return false
           }
-          if (!showColumnType.value.includes("water")) {
-            if (["water_prod_mon", "water_prod_year", "water"].includes(item.dataIndex)) {
-              return false
-            }
+        }
+        if (!showColumnType.value.includes("water")) {
+          if (["water_prod_mon", "water_prod_year", "water"].includes(item.dataIndex)) {
+            return false
           }
-          return true
+        }
+        return true
+      })
+      //拖拽后在显示隐藏列则需要按拖拽后的列排序
+      const sortedArray = filterValue.sort((a, b) => {
+        const indexA = filterColumns.value.findIndex(f=>f.key==a.key);
+        const indexB = filterColumns.value.findIndex(f=>f.key==b.key);
+        return (indexA==-1||indexB==-1)?1: indexA - indexB;
+      });
+      filterColumns.value = [...sortedArray];
+      setSettingColoumns();
+    }
+
+    function getSettingColoumns() {
+      let userColumnsJson = localStorage.getItem('userColumns');
+      let userShowColumnsType = localStorage.getItem('userShowColumnsType');
+      if (userColumnsJson != undefined) {
+        let array = new Array();
+        let userColumns = JSON.parse(userColumnsJson);
+        userColumns.forEach(it => {
+          array.push(columns.find(c => c.key == it.key));
         })
-        filterColumns.value = [...filterValue];
+        filterColumns.value = array;
+      }
+      if (userShowColumnsType != undefined) {
+        showColumnType.value = JSON.parse(userShowColumnsType);
       }
-    );
+    }
+
+    function setSettingColoumns() {
+      localStorage.setItem("userShowColumnsType", JSON.stringify(showColumnType.value));
+      localStorage.setItem("userColumns", JSON.stringify(filterColumns.value));
+    }
 
     const preCheckValues = ref(Object.assign(showColumnType.value));
     const onCheckboxChange = (checkValues: []) => {
+      showColumnTypeChange();
       setTimeout(() => {
         let tbody = document.getElementsByClassName("ant-table-body")[0];
         if (tbody) {
@@ -410,7 +469,7 @@ export default defineComponent({
 
     const loadData = async function () {
       loading.value = true;
-      const result: any = await get('wellInfo/getList', formState);
+      const result: any = await postData('wellInfo/getList', formState);
 
       data.value = result.list;
       formState.total = result.total;
@@ -487,6 +546,10 @@ export default defineComponent({
           return null;
         })
         .filter((item, i, self) => item && self.indexOf(item) === i);
+
+      if (expanded.length == 0) {
+        message.warning('没有查询到相关目录');
+      }
       subjectTrees.value.expandedKeys = expanded as string[];
       subjectTrees.value.autoExpandParent = true;
       // (treeRef.value as any).scrollTo({key:expanded[0]});
@@ -543,19 +606,19 @@ export default defineComponent({
 
     return {
       route, selectedRowKeys, loading, activeTab, showTree, onSelectChange, data,
-      expand, onQuery, loadData, onRangeChange, showQuery, wellTypeList, replaceFields,
+      expand, onQuery, loadData, onRangeChange, showQuery, wellTypeList, wellPurposeList, replaceFields,
       formRef, viewModel, handleTableChange, detail,
-      formState, isShowDoc, showDoc, docList, resetFields, showColumnType, filterColumns,
+      formState, isShowDoc, showDoc, docKey, docList, resetFields, showColumnType, filterColumns,
       labelCol, getTdColor, downFile,
       tabChange, onCheckboxChange, treeRef, colspan,
       treeOnExpand,
       subjectTrees,
       getSubjectTree, searchTree,
-      treeOnSelect, pagination,
+      treeOnSelect, pagination, getSettingColoumns,
     };
   },
-  created
-  () {
+  created() {
+    this.getSettingColoumns();
     this.loadData();
   }
   ,

+ 9 - 3
vue/src/views/wellinfo/table.ts

@@ -3,6 +3,7 @@ import dayjs from "dayjs";
 import type {GetComponentProps} from "ant-design-vue/lib/vc-table/interface";
 import {reactive, ref} from "vue";
 
+
 const state = reactive({
   dragIndex: 0
 });
@@ -63,6 +64,7 @@ const dragEnter = (e) => {
       filterColumns.value = newItems;
     }
     filterColumns.value = newItems;
+    localStorage.setItem("userColumns",JSON.stringify(filterColumns.value));
     state.dragIndex = index;
   }
 };
@@ -119,6 +121,7 @@ export const formState = reactive({
   well_common_name: '',
   well_id: '',
   well_type: '',
+  well_purpose:'',
   spud_date_begin: '',
   spud_date_end: '',
   completion_date_begin: '',
@@ -128,7 +131,9 @@ export const formState = reactive({
   oil_prod_recent_date_begin: '',
   oil_prod_recent_date_end: '',
   org_id_a1: '',
-  project_id: ''
+  project_id: '',
+  orgList:[],
+  unitList:[],
 });
 export const columns: TableColumnsType = [
   {
@@ -146,8 +151,9 @@ export const columns: TableColumnsType = [
     width: 120,
     fixed: 'left'
   },
-  {title: '采油厂机构', dataIndex: 'org_name_a1', key: 'org_name_a1', width: 120, customHeaderCell: onHeaderCell},
+  {title: '组织机构', dataIndex: 'org_name_a1', key: 'org_name_a1', width: 120, customHeaderCell: onHeaderCell},
   {title: '地质单元', dataIndex: 'project_name', key: 'project_name', width: 120, customHeaderCell: onHeaderCell},
+  {title: '井别', dataIndex: 'well_purpose', key: 'well_purpose', width: 120, customHeaderCell: onHeaderCell},
   {title: '井型', dataIndex: 'well_type', key: 'well_type', width: 120, customHeaderCell: onHeaderCell},
   {
     title: '开钻日期',
@@ -177,7 +183,7 @@ export const columns: TableColumnsType = [
       record.end_drilling_date == null ? "" : (dayjs(record.completion_date).format('YYYY-MM-DD'))
   },
   {
-    title: '开始采油日期',
+    title: '投产日期',
     dataIndex: 'oil_prod_begin_date',
     key: 'oil_prod_begin_date', width: 120, customHeaderCell: onHeaderCell,
     customRender: ({record}) =>

+ 116 - 1
web-types-npm-loader.xml

@@ -1,5 +1,120 @@
 <application>
   <component name="WebTypesNpmLoader">
-    <enabled />
+    <package name="@web-types/at-nuxt-vue-app">
+      <version value="2.10.0-1" url="https://registry.npmjs.org/@web-types/at-nuxt-vue-app/-/at-nuxt-vue-app-2.10.0-1.tgz" />
+      <version value="2.4.0-1" url="https://registry.npmjs.org/@web-types/at-nuxt-vue-app/-/at-nuxt-vue-app-2.4.0-1.tgz" />
+      <version value="2.0.0-1" url="https://registry.npmjs.org/@web-types/at-nuxt-vue-app/-/at-nuxt-vue-app-2.0.0-1.tgz" />
+    </package>
+    <package name="@web-types/bootstrap-vue">
+      <version value="2.0.0-rc.20.2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.20.2.tgz" />
+      <version value="2.0.0-1" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-2.0.0-1.tgz" />
+      <version value="1.5.0-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.5.0-2.tgz" />
+      <version value="1.4.1-1" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.4.1-1.tgz" />
+      <version value="1.4.0-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.4.0-2.tgz" />
+      <version value="1.3.0-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.3.0-2.tgz" />
+      <version value="1.2.0-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.2.0-2.tgz" />
+      <version value="1.1.0-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.1.0-2.tgz" />
+      <version value="1.0.2-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.0.2-2.tgz" />
+      <version value="1.0.1-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.0.1-2.tgz" />
+      <version value="1.0.0-2" url="https://registry.npmjs.org/@web-types/bootstrap-vue/-/bootstrap-vue-1.0.0-2.tgz" />
+    </package>
+    <package name="@web-types/lit">
+      <version value="2.0.0-3" url="https://registry.npmjs.org/@web-types/lit/-/lit-2.0.0-3.tgz" />
+    </package>
+    <package name="@web-types/quasar">
+      <version value="1.1.0-1" url="https://registry.npmjs.org/@web-types/quasar/-/quasar-1.1.0-1.tgz" />
+      <version value="1.0.5-1" url="https://registry.npmjs.org/@web-types/quasar/-/quasar-1.0.5-1.tgz" />
+      <version value="1.0.0-rc.5.2" url="https://registry.npmjs.org/@web-types/quasar/-/quasar-1.0.0-rc.5.2.tgz" />
+      <version value="1.0.0-rc.1.2" url="https://registry.npmjs.org/@web-types/quasar/-/quasar-1.0.0-rc.1.2.tgz" />
+      <version value="1.0.0-1" url="https://registry.npmjs.org/@web-types/quasar/-/quasar-1.0.0-1.tgz" />
+    </package>
+    <package name="@web-types/quasar-framework">
+      <version value="0.17.19-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.19-3.tgz" />
+      <version value="0.17.18-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.18-3.tgz" />
+      <version value="0.17.17-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.17-3.tgz" />
+      <version value="0.17.16-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.16-3.tgz" />
+      <version value="0.17.15-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.15-3.tgz" />
+      <version value="0.17.13-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.13-3.tgz" />
+      <version value="0.17.11-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.11-3.tgz" />
+      <version value="0.17.10-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.10-3.tgz" />
+      <version value="0.17.9-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.9-3.tgz" />
+      <version value="0.17.7-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.7-3.tgz" />
+      <version value="0.17.6-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.6-3.tgz" />
+      <version value="0.17.5-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.5-3.tgz" />
+      <version value="0.17.0-3" url="https://registry.npmjs.org/@web-types/quasar-framework/-/quasar-framework-0.17.0-3.tgz" />
+    </package>
+    <package name="@web-types/vue">
+      <version value="3.0.0-1" url="https://registry.npmjs.org/@web-types/vue/-/vue-3.0.0-1.tgz" />
+      <version value="2.5.0-4" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.5.0-4.tgz" />
+      <version value="2.4.0-2" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.4.0-2.tgz" />
+      <version value="2.3.0-2" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.3.0-2.tgz" />
+      <version value="2.2.0-4" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.2.0-4.tgz" />
+      <version value="2.1.8-4" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.1.8-4.tgz" />
+      <version value="2.1.0-4" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.1.0-4.tgz" />
+      <version value="2.0.0-5" url="https://registry.npmjs.org/@web-types/vue/-/vue-2.0.0-5.tgz" />
+      <version value="1.0.0-5" url="https://registry.npmjs.org/@web-types/vue/-/vue-1.0.0-5.tgz" />
+    </package>
+    <package name="@web-types/vue-client-only">
+      <version value="2.0.0-1" url="https://registry.npmjs.org/@web-types/vue-client-only/-/vue-client-only-2.0.0-1.tgz" />
+    </package>
+    <package name="@web-types/vue-no-ssr">
+      <version value="1.0.0-1" url="https://registry.npmjs.org/@web-types/vue-no-ssr/-/vue-no-ssr-1.0.0-1.tgz" />
+    </package>
+    <package name="@web-types/vue-router">
+      <version value="3.1.0-1" url="https://registry.npmjs.org/@web-types/vue-router/-/vue-router-3.1.0-1.tgz" />
+      <version value="3.0.0-1" url="https://registry.npmjs.org/@web-types/vue-router/-/vue-router-3.0.0-1.tgz" />
+    </package>
+    <package name="@web-types/vuetify">
+      <version value="2.0.15-1" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-2.0.15-1.tgz" />
+      <version value="2.0.12-1" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-2.0.12-1.tgz" />
+      <version value="2.0.5-1" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-2.0.5-1.tgz" />
+      <version value="2.0.4-1" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-2.0.4-1.tgz" />
+      <version value="2.0.1-1" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-2.0.1-1.tgz" />
+      <version value="2.0.0-1" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-2.0.0-1.tgz" />
+      <version value="1.5.12-2" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.5.12-2.tgz" />
+      <version value="1.5.1-2" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.5.1-2.tgz" />
+      <version value="1.5.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.5.0-3.tgz" />
+      <version value="1.4.5-2" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.4.5-2.tgz" />
+      <version value="1.4.4-2" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.4.4-2.tgz" />
+      <version value="1.4.1-2" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.4.1-2.tgz" />
+      <version value="1.4.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.4.0-3.tgz" />
+      <version value="1.3.14-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.3.14-3.tgz" />
+      <version value="1.3.9-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.3.9-3.tgz" />
+      <version value="1.3.8-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.3.8-3.tgz" />
+      <version value="1.3.2-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.3.2-3.tgz" />
+      <version value="1.3.1-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.3.1-3.tgz" />
+      <version value="1.3.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.3.0-3.tgz" />
+      <version value="1.2.4-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.2.4-3.tgz" />
+      <version value="1.2.2-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.2.2-3.tgz" />
+      <version value="1.2.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.2.0-3.tgz" />
+      <version value="1.1.12-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.12-3.tgz" />
+      <version value="1.1.10-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.10-3.tgz" />
+      <version value="1.1.9-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.9-3.tgz" />
+      <version value="1.1.6-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.6-3.tgz" />
+      <version value="1.1.4-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.4-3.tgz" />
+      <version value="1.1.2-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.2-3.tgz" />
+      <version value="1.1.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.1.0-3.tgz" />
+      <version value="1.0.11-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.0.11-3.tgz" />
+      <version value="1.0.2-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.0.2-3.tgz" />
+      <version value="1.0.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-1.0.0-3.tgz" />
+      <version value="0.17.2-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-0.17.2-3.tgz" />
+      <version value="0.17.0-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-0.17.0-3.tgz" />
+      <version value="0.16.5-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-0.16.5-3.tgz" />
+      <version value="0.16.4-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-0.16.4-3.tgz" />
+      <version value="0.16.2-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-0.16.2-3.tgz" />
+      <version value="0.16.1-3" url="https://registry.npmjs.org/@web-types/vuetify/-/vuetify-0.16.1-3.tgz" />
+    </package>
+    <enabled>
+      <package name="bootstrap-vue" />
+      <package name="quasar" />
+      <package name="quasar-framework" />
+      <package name="vue" />
+      <package name="vue-client-only" />
+      <package name="vue-no-ssr" />
+      <package name="vue-router" />
+      <package name="vuetify" />
+      <package name="@nuxt/vue-app" />
+      <package name="lit" />
+    </enabled>
   </component>
 </application>