Browse Source

IU-2021.3.3 <qiao@DESKTOP-HA9P059 Merge branch 'master'

xiaoqiao 1 year ago
parent
commit
3eeac6a229
28 changed files with 4513 additions and 1307 deletions
  1. 10 0
      doc/待更新脚本
  2. 1120 588
      lib/华北油田Ai检索.PDM
  3. 1117 588
      lib/华北油田Ai检索.pdb
  4. 61 8
      src/main/java/com/bowintek/practice/controller/WellInfoController.java
  5. 30 0
      src/main/java/com/bowintek/practice/mapper/WlUserExpendSettingMapper.java
  6. 84 0
      src/main/java/com/bowintek/practice/mapper/cquery/WellInfoCQuery.java
  7. 43 0
      src/main/java/com/bowintek/practice/model/WlUserExpendSetting.java
  8. 479 0
      src/main/java/com/bowintek/practice/model/WlUserExpendSettingExample.java
  9. 113 2
      src/main/java/com/bowintek/practice/services/impl/WellInfoServiceImpl.java
  10. 14 0
      src/main/java/com/bowintek/practice/services/service/WellInfoService.java
  11. 29 0
      src/main/java/com/bowintek/practice/util/Constant.java
  12. 1 0
      src/main/java/com/bowintek/practice/vo/query/WellInfoParams.java
  13. 41 35
      src/main/resources/META-INF/MANIFEST.MF
  14. 0 1
      src/main/resources/application.yml
  15. 6 11
      src/main/resources/generatorConfig.xml
  16. 196 0
      src/main/resources/mapping/WlUserExpendSettingMapper.xml
  17. 160 9
      src/main/resources/mapping/cquery/WellInfoCQuery.xml
  18. 0 1
      target/classes/application.yml
  19. 6 11
      target/classes/generatorConfig.xml
  20. BIN
      vue/src/assets/images/file.png
  21. 118 0
      vue/src/components/basic/chart/chart-cell.vue
  22. 215 0
      vue/src/components/basic/chart/chart-prod-dynamics.vue
  23. 1 0
      vue/src/router/asyncModules/sale.ts
  24. 40 2
      vue/src/views/position/test.vue
  25. 1 0
      vue/src/views/query/table.vue
  26. 82 0
      vue/src/views/wellinfo/columns.ts
  27. 344 0
      vue/src/views/wellinfo/detail.vue
  28. 202 51
      vue/src/views/wellinfo/index.vue

+ 10 - 0
doc/待更新脚本

@@ -0,0 +1,10 @@
+create table wl_user_expend_setting
+(
+   expendID             varchar(50) not null,
+   userID               varchar(50) comment '用户ID',
+   well_id              varchar(50) comment '井ID',
+   setting_json         varchar(500) comment '配置信息setting_json',
+   primary key (expendID)
+);
+
+alter table wl_user_expend_setting comment '井筒全息信息页折叠配置';

File diff suppressed because it is too large
+ 1120 - 588
lib/华北油田Ai检索.PDM


File diff suppressed because it is too large
+ 1117 - 588
lib/华北油田Ai检索.pdb


+ 61 - 8
src/main/java/com/bowintek/practice/controller/WellInfoController.java

@@ -1,10 +1,15 @@
 package com.bowintek.practice.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.bowintek.practice.filter.exception.BaseResponse;
 import com.bowintek.practice.filter.exception.RespGenerstor;
 import com.bowintek.practice.model.WellBasicInformation;
+import com.bowintek.practice.model.WlUserExpendSetting;
+import com.bowintek.practice.services.service.AccountService;
 import com.bowintek.practice.services.service.OrganizationService;
 import com.bowintek.practice.services.service.WellInfoService;
+import com.bowintek.practice.vo.SubjectVo;
+import com.bowintek.practice.vo.SubjectfieldVo;
 import com.bowintek.practice.vo.cd.CdOrganizationTreeVo;
 import com.bowintek.practice.vo.query.WellInfoParams;
 import com.github.pagehelper.PageInfo;
@@ -23,11 +28,13 @@ public class WellInfoController {
     private WellInfoService wellInfoService;
     @Autowired
     private OrganizationService organizationService;
+    @Autowired
+    private AccountService accountService;
 
     @ResponseBody
     @GetMapping("/getList")
     public BaseResponse<PageInfo<HashMap<String, Object>>> getList(@RequestParam("page") int page, @RequestParam("rows") int rows,
-                                                                         WellInfoParams params) throws Exception {
+                                                                   WellInfoParams params) throws Exception {
 
         PageInfo<HashMap<String, Object>> result = wellInfoService.getList(page, rows, params);
 
@@ -35,13 +42,59 @@ public class WellInfoController {
     }
 
     @GetMapping("/getOrganizationTree")
-    public BaseResponse getDictionaryList() {
-        List<CdOrganizationTreeVo> treeVoList = organizationService.getListTree();
-        List<HashMap<String, Object>> treeData = new ArrayList<>();
-        treeVoList.forEach((it) -> {
-            HashMap<String, Object> node = new HashMap<>();
-            //  node.put("key",)
-        });
+    public BaseResponse getOrganizationTree() {
         return RespGenerstor.success(organizationService.getListTree());
     }
+
+    @GetMapping("/getWellInfo")
+    public BaseResponse getWellInfo(String well_id) {
+
+        HashMap<String, Object> wellInfo = wellInfoService.getWellInfo(well_id);
+        List<HashMap<String, Object>> boreholeInterList = wellInfoService.selectBoreholeInterList(well_id);
+        List<HashMap<String, Object>> testHistoryList = wellInfoService.selectTestHistoryList(well_id);
+        List<HashMap<String, Object>> testHistorySummary = wellInfoService.selectTestHistorySummary(well_id);
+        HashMap<String, Object> lastTestHistory = wellInfoService.getLastTestHistory(well_id);
+        List<HashMap<String, Object>> analyticalAssaysList = wellInfoService.selectAnalyticalAssaysList(well_id);
+        List<HashMap<String, Object>> analyticalAssaysSummary = wellInfoService.selectAnalyticalAssaysSummary(well_id);
+        List<HashMap<String, Object>> historyAssignmentList = wellInfoService.selectHistoryAssignmentList(well_id);
+        List<HashMap<String, Object>> historyAssignmentSummary = wellInfoService.selectHistoryAssignmentSummary(well_id);
+        HashMap<String, Object> lastHistoryAssignment = wellInfoService.getLastHistoryAssignment(well_id);
+        List<HashMap<String, Object>> dataIndexList = wellInfoService.selectDataIndexList(well_id);
+
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("dataModel", wellInfo);
+        result.put("boreholeInterList", boreholeInterList);//业务解释列表
+        result.put("testHistoryList", testHistoryList);//测试历史列表
+        result.put("testHistorySummary", testHistorySummary);//测试历史汇总
+        result.put("lastTestHistory", lastTestHistory);//最后一次测试历史
+        result.put("analyticalAssaysList", analyticalAssaysList);//分析化验列表
+        result.put("analyticalAssaysSummary", analyticalAssaysSummary);//分析化验汇总
+        result.put("historyAssignmentList", historyAssignmentList);//作业简史列表
+        result.put("historyAssignmentSummary", historyAssignmentSummary);//作业简史汇总
+        result.put("lastHistoryAssignment", lastHistoryAssignment);//最后一次作业简史记录
+        result.put("dataIndexList", dataIndexList);
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @PostMapping("/saveExpendSetting")
+    public BaseResponse saveExpendSetting(@RequestBody WlUserExpendSetting model) {
+        int count = 0;
+        try {
+            model.setUserID(accountService.getLoginUserID());
+            count = wellInfoService.saveExpendSetting(model);
+        } catch (Exception e) {
+            return RespGenerstor.fail("-1", "程序异常:" + e.getMessage());
+        }
+        return RespGenerstor.success(count);
+    }
+    @GetMapping("/getExpendSetting")
+    public BaseResponse getExpendSetting(String wellId) {
+        return RespGenerstor.success(wellInfoService.getExpendSetting(wellId,accountService.getLoginUserID()));
+    }
+    @GetMapping("/getWellDocumentList")
+    public BaseResponse getWellDocumentList(String wellId) {
+        List<HashMap<String, Object>> dataIndexList = wellInfoService.selectDataIndexList(wellId);
+        return RespGenerstor.success(dataIndexList);
+    }
 }

+ 30 - 0
src/main/java/com/bowintek/practice/mapper/WlUserExpendSettingMapper.java

@@ -0,0 +1,30 @@
+package com.bowintek.practice.mapper;
+
+import com.bowintek.practice.model.WlUserExpendSetting;
+import com.bowintek.practice.model.WlUserExpendSettingExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface WlUserExpendSettingMapper {
+    long countByExample(WlUserExpendSettingExample example);
+
+    int deleteByExample(WlUserExpendSettingExample example);
+
+    int deleteByPrimaryKey(String expendID);
+
+    int insert(WlUserExpendSetting row);
+
+    int insertSelective(WlUserExpendSetting row);
+
+    List<WlUserExpendSetting> selectByExample(WlUserExpendSettingExample example);
+
+    WlUserExpendSetting selectByPrimaryKey(String expendID);
+
+    int updateByExampleSelective(@Param("row") WlUserExpendSetting row, @Param("example") WlUserExpendSettingExample example);
+
+    int updateByExample(@Param("row") WlUserExpendSetting row, @Param("example") WlUserExpendSettingExample example);
+
+    int updateByPrimaryKeySelective(WlUserExpendSetting row);
+
+    int updateByPrimaryKey(WlUserExpendSetting row);
+}

+ 84 - 0
src/main/java/com/bowintek/practice/mapper/cquery/WellInfoCQuery.java

@@ -8,5 +8,89 @@ import java.util.List;
 
 public interface WellInfoCQuery {
 
+    /**
+     * 查询井信息列表
+     * @param params
+     * @return
+     */
     List<HashMap<String,Object>> getWellInfoList(WellInfoParams params);
+
+    /**
+     * 获取井信息
+     * @param well_id
+     * @return
+     */
+    HashMap<String,Object> getWellInfo(String well_id);
+
+    /**
+     * 查询裸眼井综合解释列表
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectBoreholeInterList(String well_id);
+
+    /**
+     * 查询测试历史列表
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectTestHistoryList(String well_id);
+
+    /**
+     * 查询测试历史汇总
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectTestHistorySummary(String well_id);
+
+    /**
+     * 获取最近一次测试历史
+     * @param well_id
+     * @return
+     */
+    HashMap<String,Object> getLastTestHistory(String well_id);
+
+
+    /**
+     * 查询分析化验列表
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectAnalyticalAssaysList(String well_id);
+
+    /**
+     * 查询分析化验汇总
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectAnalyticalAssaysSummary(String well_id);
+
+
+    /**
+     * 作业简史
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectHistoryAssignmentList(String well_id);
+
+    /**
+     * 查询作业简史汇总
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectHistoryAssignmentSummary(String well_id);
+
+    /**
+     * 获取最近一次作业简史
+     * @param well_id
+     * @return
+     */
+    HashMap<String,Object> getLastHistoryAssignment(String well_id);
+
+    /**
+     * 井资料索引(文档)
+     * @param well_id
+     * @return
+     */
+    List<HashMap<String,Object>> selectDataIndexList(String well_id);
 }

+ 43 - 0
src/main/java/com/bowintek/practice/model/WlUserExpendSetting.java

@@ -0,0 +1,43 @@
+package com.bowintek.practice.model;
+
+public class WlUserExpendSetting {
+    private String expendID;
+
+    private String userID;
+
+    private String well_id;
+
+    private String setting_json;
+
+    public String getExpendID() {
+        return expendID;
+    }
+
+    public void setExpendID(String expendID) {
+        this.expendID = expendID == null ? null : expendID.trim();
+    }
+
+    public String getUserID() {
+        return userID;
+    }
+
+    public void setUserID(String userID) {
+        this.userID = userID == null ? null : userID.trim();
+    }
+
+    public String getWell_id() {
+        return well_id;
+    }
+
+    public void setWell_id(String well_id) {
+        this.well_id = well_id == null ? null : well_id.trim();
+    }
+
+    public String getSetting_json() {
+        return setting_json;
+    }
+
+    public void setSetting_json(String setting_json) {
+        this.setting_json = setting_json == null ? null : setting_json.trim();
+    }
+}

+ 479 - 0
src/main/java/com/bowintek/practice/model/WlUserExpendSettingExample.java

@@ -0,0 +1,479 @@
+package com.bowintek.practice.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class WlUserExpendSettingExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public WlUserExpendSettingExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andExpendIDIsNull() {
+            addCriterion("expendID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDIsNotNull() {
+            addCriterion("expendID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDEqualTo(String value) {
+            addCriterion("expendID =", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDNotEqualTo(String value) {
+            addCriterion("expendID <>", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDGreaterThan(String value) {
+            addCriterion("expendID >", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDGreaterThanOrEqualTo(String value) {
+            addCriterion("expendID >=", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDLessThan(String value) {
+            addCriterion("expendID <", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDLessThanOrEqualTo(String value) {
+            addCriterion("expendID <=", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDLike(String value) {
+            addCriterion("expendID like", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDNotLike(String value) {
+            addCriterion("expendID not like", value, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDIn(List<String> values) {
+            addCriterion("expendID in", values, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDNotIn(List<String> values) {
+            addCriterion("expendID not in", values, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDBetween(String value1, String value2) {
+            addCriterion("expendID between", value1, value2, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpendIDNotBetween(String value1, String value2) {
+            addCriterion("expendID not between", value1, value2, "expendID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDIsNull() {
+            addCriterion("userID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDIsNotNull() {
+            addCriterion("userID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDEqualTo(String value) {
+            addCriterion("userID =", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDNotEqualTo(String value) {
+            addCriterion("userID <>", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDGreaterThan(String value) {
+            addCriterion("userID >", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDGreaterThanOrEqualTo(String value) {
+            addCriterion("userID >=", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDLessThan(String value) {
+            addCriterion("userID <", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDLessThanOrEqualTo(String value) {
+            addCriterion("userID <=", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDLike(String value) {
+            addCriterion("userID like", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDNotLike(String value) {
+            addCriterion("userID not like", value, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDIn(List<String> values) {
+            addCriterion("userID in", values, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDNotIn(List<String> values) {
+            addCriterion("userID not in", values, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDBetween(String value1, String value2) {
+            addCriterion("userID between", value1, value2, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIDNotBetween(String value1, String value2) {
+            addCriterion("userID not between", value1, value2, "userID");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idIsNull() {
+            addCriterion("well_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idIsNotNull() {
+            addCriterion("well_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idEqualTo(String value) {
+            addCriterion("well_id =", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idNotEqualTo(String value) {
+            addCriterion("well_id <>", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idGreaterThan(String value) {
+            addCriterion("well_id >", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idGreaterThanOrEqualTo(String value) {
+            addCriterion("well_id >=", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idLessThan(String value) {
+            addCriterion("well_id <", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idLessThanOrEqualTo(String value) {
+            addCriterion("well_id <=", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idLike(String value) {
+            addCriterion("well_id like", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idNotLike(String value) {
+            addCriterion("well_id not like", value, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idIn(List<String> values) {
+            addCriterion("well_id in", values, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idNotIn(List<String> values) {
+            addCriterion("well_id not in", values, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idBetween(String value1, String value2) {
+            addCriterion("well_id between", value1, value2, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andWell_idNotBetween(String value1, String value2) {
+            addCriterion("well_id not between", value1, value2, "well_id");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonIsNull() {
+            addCriterion("setting_json is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonIsNotNull() {
+            addCriterion("setting_json is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonEqualTo(String value) {
+            addCriterion("setting_json =", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonNotEqualTo(String value) {
+            addCriterion("setting_json <>", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonGreaterThan(String value) {
+            addCriterion("setting_json >", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonGreaterThanOrEqualTo(String value) {
+            addCriterion("setting_json >=", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonLessThan(String value) {
+            addCriterion("setting_json <", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonLessThanOrEqualTo(String value) {
+            addCriterion("setting_json <=", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonLike(String value) {
+            addCriterion("setting_json like", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonNotLike(String value) {
+            addCriterion("setting_json not like", value, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonIn(List<String> values) {
+            addCriterion("setting_json in", values, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonNotIn(List<String> values) {
+            addCriterion("setting_json not in", values, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonBetween(String value1, String value2) {
+            addCriterion("setting_json between", value1, value2, "setting_json");
+            return (Criteria) this;
+        }
+
+        public Criteria andSetting_jsonNotBetween(String value1, String value2) {
+            addCriterion("setting_json not between", value1, value2, "setting_json");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 113 - 2
src/main/java/com/bowintek/practice/services/impl/WellInfoServiceImpl.java

@@ -2,9 +2,12 @@ package com.bowintek.practice.services.impl;
 
 import com.bowintek.practice.mapper.SrSubjectMapper;
 import com.bowintek.practice.mapper.WellBasicInformationMapper;
+import com.bowintek.practice.mapper.WlUserExpendSettingMapper;
 import com.bowintek.practice.mapper.cquery.WellInfoCQuery;
 import com.bowintek.practice.model.WellBasicInformation;
 import com.bowintek.practice.model.WellBasicInformationExample;
+import com.bowintek.practice.model.WlUserExpendSetting;
+import com.bowintek.practice.model.WlUserExpendSettingExample;
 import com.bowintek.practice.services.service.WellInfoService;
 import com.bowintek.practice.util.multipdb.DBTypeEnum;
 import com.bowintek.practice.util.multipdb.SwitchDataSource;
@@ -17,6 +20,10 @@ import org.springframework.stereotype.Component;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.UUID;
+
+import static com.bowintek.practice.util.Constant.BOREHOLE_INTER_TYPE;
+import static com.bowintek.practice.util.Constant.FACT_CURRENT_STATE;
 
 @Component
 public class WellInfoServiceImpl implements WellInfoService {
@@ -25,14 +32,118 @@ public class WellInfoServiceImpl implements WellInfoService {
     private WellBasicInformationMapper wellBasicInformationMapper;
     @Autowired
     private WellInfoCQuery wellInfoCQuery;
+    @Autowired
+    private WlUserExpendSettingMapper expendSettingMapper;
+
     @Override
     @SwitchDataSource(DBTypeEnum.POSTGRE)
     public PageInfo<HashMap<String, Object>> getList(Integer page, Integer rows, WellInfoParams params) {
         PageHelper.startPage(page, rows);
 
-        List<HashMap<String,Object>> dataList = wellInfoCQuery.getWellInfoList(params);
+        List<HashMap<String, Object>> dataList = wellInfoCQuery.getWellInfoList(params);
+
+        PageInfo<HashMap<String, Object>> result = new PageInfo(dataList);
 
-        PageInfo< HashMap<String, Object>> result = new PageInfo(dataList);
+        result.getList().forEach(it -> {
+            if (FACT_CURRENT_STATE.keySet().contains(it.get("current_state"))) {
+                it.put("current_state_name", FACT_CURRENT_STATE.get(it.get("current_state")));
+            }
+        });
         return result;
     }
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public HashMap<String, Object> getWellInfo(String well_id) {
+        return wellInfoCQuery.getWellInfo(well_id);
+    }
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectBoreholeInterList(String well_id) {
+        List<HashMap<String, Object>> dataList = wellInfoCQuery.selectBoreholeInterList(well_id);
+
+        dataList.forEach(it -> {
+            if (BOREHOLE_INTER_TYPE.keySet().contains(it.get("borehole_inter_type"))) {
+                it.put("borehole_inter_type_name", BOREHOLE_INTER_TYPE.get(it.get("borehole_inter_type")));
+            }
+        });
+        return dataList;
+    }
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectTestHistoryList(String well_id) {
+        return wellInfoCQuery.selectTestHistoryList(well_id);
+    }
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectTestHistorySummary(String well_id) {
+        return wellInfoCQuery.selectTestHistorySummary(well_id);
+    }
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public HashMap<String, Object> getLastTestHistory(String well_id) {
+        return wellInfoCQuery.getLastTestHistory(well_id);
+    }
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectAnalyticalAssaysList(String well_id) {
+        return wellInfoCQuery.selectAnalyticalAssaysList(well_id);
+    }
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectAnalyticalAssaysSummary(String well_id) {
+        return wellInfoCQuery.selectAnalyticalAssaysSummary(well_id);
+    }
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectHistoryAssignmentList(String well_id) {
+        return wellInfoCQuery.selectHistoryAssignmentList(well_id);
+    }
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectHistoryAssignmentSummary(String well_id) {
+        return wellInfoCQuery.selectHistoryAssignmentSummary(well_id);
+    }
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public HashMap<String, Object> getLastHistoryAssignment(String well_id) {
+        return wellInfoCQuery.getLastHistoryAssignment(well_id);
+    }
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<HashMap<String, Object>> selectDataIndexList(String well_id) {
+        return wellInfoCQuery.selectDataIndexList(well_id);
+    }
+
+    @Override
+    public int saveExpendSetting(WlUserExpendSetting model) {
+        WlUserExpendSettingExample example = new WlUserExpendSettingExample();
+        example.or().andUserIDEqualTo(model.getUserID()).andWell_idEqualTo(model.getWell_id());
+        List<WlUserExpendSetting> list = expendSettingMapper.selectByExample(example);
+        if (list.size() > 0) {
+            WlUserExpendSetting dbEntity = list.get(0);
+            dbEntity.setSetting_json(model.getSetting_json());
+            expendSettingMapper.updateByPrimaryKeySelective(dbEntity);
+        } else {
+            model.setExpendID(UUID.randomUUID().toString());
+            expendSettingMapper.insert(model);
+        }
+        return 1;
+    }
+    @Override
+    public WlUserExpendSetting getExpendSetting(String wellId,String userId) {
+        WlUserExpendSettingExample example = new WlUserExpendSettingExample();
+        example.or().andUserIDEqualTo(userId).andWell_idEqualTo(wellId);
+        List<WlUserExpendSetting> list = expendSettingMapper.selectByExample(example);
+        if(list.size()>0)
+        {
+            return  list.get(0);
+        }
+        return  null;
+    }
 }

+ 14 - 0
src/main/java/com/bowintek/practice/services/service/WellInfoService.java

@@ -1,6 +1,7 @@
 package com.bowintek.practice.services.service;
 
 import com.bowintek.practice.model.WellBasicInformation;
+import com.bowintek.practice.model.WlUserExpendSetting;
 import com.bowintek.practice.vo.query.WellInfoParams;
 import com.github.pagehelper.PageInfo;
 
@@ -9,5 +10,18 @@ import java.util.List;
 
 public interface WellInfoService {
 
+    HashMap<String,Object> getWellInfo(String well_id);
     PageInfo< HashMap<String, Object>> getList(Integer page, Integer rows, WellInfoParams params);
+    List<HashMap<String,Object>> selectBoreholeInterList(String well_id);
+    List<HashMap<String,Object>> selectTestHistoryList(String well_id);
+    List<HashMap<String, Object>> selectTestHistorySummary(String well_id);
+    HashMap<String, Object> getLastTestHistory(String well_id);
+    List<HashMap<String,Object>> selectAnalyticalAssaysList(String well_id);
+    List<HashMap<String,Object>> selectAnalyticalAssaysSummary(String well_id);
+    List<HashMap<String,Object>> selectHistoryAssignmentList(String well_id);
+    List<HashMap<String,Object>> selectHistoryAssignmentSummary(String well_id);
+    HashMap<String, Object> getLastHistoryAssignment(String well_id);
+    List<HashMap<String,Object>> selectDataIndexList(String well_id);
+    int saveExpendSetting(WlUserExpendSetting model);
+    WlUserExpendSetting getExpendSetting(String userId ,String wellId);
 }

+ 29 - 0
src/main/java/com/bowintek/practice/util/Constant.java

@@ -1,6 +1,35 @@
 package com.bowintek.practice.util;
 
+import java.util.HashMap;
+
 public class Constant {
     public static final String YES = "是";
     public static final String No = "否";
+
+    /**
+     * 井生产状态
+     */
+    public static final HashMap<String,String>  FACT_CURRENT_STATE=new HashMap<>(){
+        {
+            this.put("00","停用不启用流程");
+            this.put("01","停用但启用流程");
+            this.put("02","启用但不启用流");
+            this.put("11","启用并启用流程");
+        }
+    };
+    /**
+     * 裸眼井解释成果类型
+     */
+    public static final HashMap<String,String>  BOREHOLE_INTER_TYPE=new HashMap<>(){
+        {
+            this.put("00","裸眼井基本解释成果");
+            this.put("01","岩石力学参数");
+            this.put("02","储层孔隙结构评价");
+            this.put("04","裂缝型地层测井解释成果");
+            this.put("05","烃源岩解释成果");
+            this.put("06","致密油气储层解释成果");
+            this.put("07","煤层气测井解释成果");
+            this.put("08","页岩气测井解释成果");
+        }
+    };
 }

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

@@ -15,4 +15,5 @@ public class WellInfoParams {
     private String oil_prod_begin_date_end;
     private String oil_prod_recent_date_begin;
     private String oil_prod_recent_date_end;
+    private String org_id_a1;
 }

+ 41 - 35
src/main/resources/META-INF/MANIFEST.MF

@@ -1,38 +1,44 @@
 Manifest-Version: 1.0
 Main-Class: com.bowintek.practice.PracticeApplication
-Class-Path: HikariCP-4.0.3.jar jackson-annotations-2.13.3.jar jul-to-slf
- 4j-1.7.36.jar netty-codec-4.1.79.Final.jar aspectjweaver-1.9.7.jar tomc
- at-embed-el-9.0.65.jar tomcat-embed-core-9.0.65.jar commons-beanutils-1
- .9.4.jar logback-core-1.2.11.jar commons-collections-3.2.2.jar poi-scra
- tchpad-4.0.0.jar spring-data-keyvalue-2.7.2.jar spring-oxm-5.3.22.jar s
- pring-boot-devtools-2.7.2.jar poi-4.0.0.jar commons-compress-1.18.jar h
- ttpcore-4.4.15.jar reactor-core-3.4.21.jar spring-boot-autoconfigure-2.
- 7.2.jar pagehelper-spring-boot-autoconfigure-1.4.3.jar mybatis-3.5.9.ja
- r lombok-1.18.20.jar commons-collections4-4.2.jar checker-qual-3.5.0.ja
- r spring-boot-starter-2.7.2.jar jackson-datatype-jdk8-2.13.3.jar mybati
- s-spring-boot-autoconfigure-2.2.2.jar spring-tx-5.3.22.jar lettuce-core
- -6.1.9.RELEASE.jar spring-jcl-5.3.22.jar jsqlparser-4.2.jar jackson-mod
- ule-parameter-names-2.13.3.jar spring-boot-2.7.2.jar mybatis-spring-boo
- t-starter-2.2.2.jar commons-net-3.6.jar spring-context-5.3.22.jar netty
- -common-4.1.79.Final.jar fastjson-1.2.47.jar json-20190722.jar spring-w
- ebmvc-5.3.22.jar spring-data-commons-2.7.2.jar jackson-core-2.13.3.jar 
- netty-handler-4.1.79.Final.jar mybatis-spring-2.0.7.jar xmlbeans-3.0.1.
- jar jackson-datatype-jsr310-2.13.3.jar commons-pool2-2.11.1.jar java-jw
- t-3.9.0.jar httpclient-4.5.9.jar spring-boot-starter-json-2.7.2.jar spr
- ing-context-support-5.3.22.jar netty-buffer-4.1.79.Final.jar jakarta.an
- notation-api-1.3.5.jar spring-beans-5.3.22.jar netty-transport-4.1.79.F
- inal.jar druid-spring-boot-starter-1.2.11.jar commons-codec-1.15.jar sp
- ring-boot-starter-data-redis-2.7.2.jar poi-ooxml-schemas-4.0.0.jar mysq
- l-connector-java-8.0.29.jar tomcat-embed-websocket-9.0.65.jar druid-1.2
- .11.jar spring-web-5.3.22.jar commons-lang3-3.5.jar spring-data-redis-2
- .7.2.jar aspectjrt-1.9.7.jar poi-ooxml-4.0.0.jar spring-boot-starter-lo
- gging-2.7.2.jar jackson-databind-2.13.3.jar postgresql-42.3.6.jar netty
- -transport-native-unix-common-4.1.79.Final.jar spring-jdbc-5.3.22.jar s
- pring-boot-starter-web-2.7.2.jar spring-core-5.3.22.jar commons-logging
- -1.2.jar spring-expression-5.3.22.jar aspose-words-15.8.0-jdk16.jar spr
- ing-aop-5.3.22.jar pagehelper-5.3.1.jar spring-boot-starter-tomcat-2.7.
- 2.jar logback-classic-1.2.11.jar spring-boot-starter-jdbc-2.7.2.jar net
- ty-resolver-4.1.79.Final.jar log4j-api-2.17.2.jar reactive-streams-1.0.
- 4.jar log4j-to-slf4j-2.17.2.jar pagehelper-spring-boot-starter-1.4.3.ja
- r slf4j-api-1.7.36.jar snakeyaml-1.30.jar curvesapi-1.04.jar
+Class-Path: mybatis-spring-2.0.7.jar reactor-core-3.4.21.jar lettuce-cor
+ e-6.1.9.RELEASE.jar spring-data-keyvalue-2.7.2.jar jackson-databind-2.1
+ 3.3.jar jackson-datatype-jdk8-2.13.3.jar spring-boot-starter-data-redis
+ -2.7.2.jar spring-boot-starter-jdbc-2.7.2.jar lucene-queries-4.7.2.jar 
+ snakeyaml-1.30.jar netty-handler-4.1.79.Final.jar jackson-module-parame
+ ter-names-2.13.3.jar jackson-core-2.13.3.jar poi-4.0.0.jar spring-webmv
+ c-5.3.22.jar commons-collections4-4.2.jar fastjson-1.2.47.jar spring-be
+ ans-5.3.22.jar commons-lang3-3.5.jar httpasyncclient-4.1.5.jar netty-re
+ solver-4.1.79.Final.jar spring-boot-starter-json-2.7.2.jar lombok-1.18.
+ 20.jar spring-boot-autoconfigure-2.7.2.jar reactive-streams-1.0.4.jar a
+ spectjrt-1.9.7.jar spring-expression-5.3.22.jar jul-to-slf4j-1.7.36.jar
+  checker-qual-3.5.0.jar netty-codec-4.1.79.Final.jar parsson-1.0.0.jar 
+ slf4j-api-1.7.36.jar xmlbeans-3.0.1.jar lucene-queryparser-4.7.2.jar to
+ mcat-embed-core-9.0.65.jar opentelemetry-api-1.29.0.jar spring-jdbc-5.3
+ .22.jar mysql-connector-java-8.0.29.jar spring-core-5.3.22.jar poi-ooxm
+ l-4.0.0.jar pagehelper-spring-boot-starter-1.4.3.jar elasticsearch-java
+ -8.11.1.jar mybatis-3.5.9.jar elasticsearch-rest-client-7.17.4.jar jsql
+ parser-4.2.jar netty-common-4.1.79.Final.jar jakarta.annotation-api-1.3
+ .5.jar spring-tx-5.3.22.jar netty-transport-4.1.79.Final.jar ikanalyzer
+ -2012_u6.jar httpcore-4.4.15.jar mybatis-spring-boot-autoconfigure-2.2.
+ 2.jar jakarta.json-api-2.0.1.jar log4j-to-slf4j-2.17.2.jar spring-boot-
+ 2.7.2.jar druid-spring-boot-starter-1.2.11.jar pagehelper-spring-boot-a
+ utoconfigure-1.4.3.jar spring-data-redis-2.7.2.jar commons-beanutils-1.
+ 9.4.jar log4j-api-2.17.2.jar lucene-sandbox-4.7.2.jar httpclient-4.5.9.
+ jar jsr305-3.0.2.jar HikariCP-4.0.3.jar tomcat-embed-websocket-9.0.65.j
+ ar spring-boot-starter-web-2.7.2.jar postgresql-42.3.6.jar commons-coll
+ ections-3.2.2.jar logback-classic-1.2.11.jar logback-core-1.2.11.jar po
+ i-ooxml-schemas-4.0.0.jar spring-boot-devtools-2.7.2.jar netty-buffer-4
+ .1.79.Final.jar pagehelper-5.3.1.jar commons-pool2-2.11.1.jar spring-bo
+ ot-starter-2.7.2.jar spring-data-commons-2.7.2.jar commons-codec-1.15.j
+ ar spring-aop-5.3.22.jar curvesapi-1.04.jar spring-boot-starter-tomcat-
+ 2.7.2.jar opentelemetry-context-1.29.0.jar aspectjweaver-1.9.7.jar spri
+ ng-web-5.3.22.jar commons-logging-1.2.jar aspose-words-15.8.0-jdk16.jar
+  postgresql-42.3.4.jar java-jwt-3.9.0.jar jackson-annotations-2.13.3.ja
+ r lucene-analyzers-common-4.7.2.jar tomcat-embed-el-9.0.65.jar json-201
+ 90722.jar druid-1.2.11.jar jackson-datatype-jsr310-2.13.3.jar mybatis-s
+ pring-boot-starter-2.2.2.jar commons-compress-1.18.jar spring-oxm-5.3.2
+ 2.jar httpcore-nio-4.4.15.jar spring-context-support-5.3.22.jar spring-
+ context-5.3.22.jar netty-transport-native-unix-common-4.1.79.Final.jar 
+ commons-net-3.6.jar poi-scratchpad-4.0.0.jar spring-jcl-5.3.22.jar spri
+ ng-boot-starter-logging-2.7.2.jar lucene-core-4.7.2.jar
 

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

@@ -105,7 +105,6 @@ mybatis:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 pagehelper:
-  helperDialect: mysql
   reasonable: true
   supportMethodsArguments: true
   params: count=countSql

+ 6 - 11
src/main/resources/generatorConfig.xml

@@ -4,7 +4,8 @@
 
 <generatorConfiguration>
     <!--mysql 连接数据库jar 这里选择自己本地位置-->
-    <classPathEntry location="./lib/postgresql-42.3.4.jar"/>
+   <!-- <classPathEntry location="./lib/postgresql-42.3.4.jar"/>-->
+    <classPathEntry location=".\lib\mysql-connector-java-5.1.46.jar"/>
     <context id="testTables" targetRuntime="MyBatis3">
         <!-- 运行环境配置 -->
         <!--<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>-->
@@ -17,20 +18,14 @@
             <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
         </commentGenerator>
         <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
-        <!-- mysql
         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
-                        connectionURL="jdbc:mysql://192.168.0.29:3306/zci_db" userId="root"
-                        password="bowin123">
-        </jdbcConnection>
-        -->
-  <!--      <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                         connectionURL="jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useSSL=false" userId="root"
-                        password="bowin123">-->
-        <jdbcConnection driverClass="org.postgresql.Driver"
+                        password="bowin123"/>
+      <!--  <jdbcConnection driverClass="org.postgresql.Driver"
                         connectionURL="jdbc:postgresql://office.bowintek.com:5432/postgres"
                         userId="postgres"
                         password="bowin123">
-        </jdbcConnection>
+        </jdbcConnection>-->
 
         <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
@@ -123,6 +118,6 @@
             <columnOverride column="StandardMajorID" javaType="java.lang.Integer" jdbcType="INTEGER" />
             <table schema="" tableName="Sys_Log"><property name="useActualColumnNames" value="true"/></table>
         </table>-->
-        <table schema="" tableName="well_basic_information"><property name="useActualColumnNames" value="true"/></table>
+        <table schema="" tableName="wl_user_expend_setting"><property name="useActualColumnNames" value="true"/></table>
     </context>
 </generatorConfiguration>

+ 196 - 0
src/main/resources/mapping/WlUserExpendSettingMapper.xml

@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.bowintek.practice.mapper.WlUserExpendSettingMapper">
+  <resultMap id="BaseResultMap" type="com.bowintek.practice.model.WlUserExpendSetting">
+    <id column="expendID" jdbcType="VARCHAR" property="expendID" />
+    <result column="userID" jdbcType="VARCHAR" property="userID" />
+    <result column="well_id" jdbcType="VARCHAR" property="well_id" />
+    <result column="setting_json" jdbcType="VARCHAR" property="setting_json" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    expendID, userID, well_id, setting_json
+  </sql>
+  <select id="selectByExample" parameterType="com.bowintek.practice.model.WlUserExpendSettingExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from wl_user_expend_setting
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from wl_user_expend_setting
+    where expendID = #{expendID,jdbcType=VARCHAR}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    delete from wl_user_expend_setting
+    where expendID = #{expendID,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.bowintek.practice.model.WlUserExpendSettingExample">
+    delete from wl_user_expend_setting
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.bowintek.practice.model.WlUserExpendSetting">
+    insert into wl_user_expend_setting (expendID, userID, well_id, 
+      setting_json)
+    values (#{expendID,jdbcType=VARCHAR}, #{userID,jdbcType=VARCHAR}, #{well_id,jdbcType=VARCHAR}, 
+      #{setting_json,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.bowintek.practice.model.WlUserExpendSetting">
+    insert into wl_user_expend_setting
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="expendID != null">
+        expendID,
+      </if>
+      <if test="userID != null">
+        userID,
+      </if>
+      <if test="well_id != null">
+        well_id,
+      </if>
+      <if test="setting_json != null">
+        setting_json,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="expendID != null">
+        #{expendID,jdbcType=VARCHAR},
+      </if>
+      <if test="userID != null">
+        #{userID,jdbcType=VARCHAR},
+      </if>
+      <if test="well_id != null">
+        #{well_id,jdbcType=VARCHAR},
+      </if>
+      <if test="setting_json != null">
+        #{setting_json,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.bowintek.practice.model.WlUserExpendSettingExample" resultType="java.lang.Long">
+    select count(*) from wl_user_expend_setting
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update wl_user_expend_setting
+    <set>
+      <if test="row.expendID != null">
+        expendID = #{row.expendID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.userID != null">
+        userID = #{row.userID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.well_id != null">
+        well_id = #{row.well_id,jdbcType=VARCHAR},
+      </if>
+      <if test="row.setting_json != null">
+        setting_json = #{row.setting_json,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="example != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update wl_user_expend_setting
+    set expendID = #{row.expendID,jdbcType=VARCHAR},
+      userID = #{row.userID,jdbcType=VARCHAR},
+      well_id = #{row.well_id,jdbcType=VARCHAR},
+      setting_json = #{row.setting_json,jdbcType=VARCHAR}
+    <if test="example != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.bowintek.practice.model.WlUserExpendSetting">
+    update wl_user_expend_setting
+    <set>
+      <if test="userID != null">
+        userID = #{userID,jdbcType=VARCHAR},
+      </if>
+      <if test="well_id != null">
+        well_id = #{well_id,jdbcType=VARCHAR},
+      </if>
+      <if test="setting_json != null">
+        setting_json = #{setting_json,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where expendID = #{expendID,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.bowintek.practice.model.WlUserExpendSetting">
+    update wl_user_expend_setting
+    set userID = #{userID,jdbcType=VARCHAR},
+      well_id = #{well_id,jdbcType=VARCHAR},
+      setting_json = #{setting_json,jdbcType=VARCHAR}
+    where expendID = #{expendID,jdbcType=VARCHAR}
+  </update>
+</mapper>

+ 160 - 9
src/main/resources/mapping/cquery/WellInfoCQuery.xml

@@ -2,14 +2,165 @@
 <!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.WellInfoCQuery">
 
-    <select id="getWellInfoList" parameterType="com.bowintek.practice.vo.query.WellInfoParams"  resultType="java.util.HashMap">
-        select well.*,fact.oil_prod_begin_date,fact.oil_prod_recent_date,fact.current_state,fact.water_cut
-        from well_basic_information well
-                 inner join (
-            select daily.* from FACT_DWR_PC_PRO_WELL_VOL_DAILY daily
-                                    inner join(
-                select  well_id, max(prod_time) prod_time from FACT_DWR_PC_PRO_WELL_VOL_DAILY group by well_id
-            ) maxdaly on daily.well_id=maxdaly.well_id and daily.prod_time=maxdaly.prod_time
-        )fact on well.well_id= fact.well_id
+    <select id="getWellInfo" resultType="java.util.HashMap">
+        select well.*,
+               fact_daily.fluid_prod_daily,
+               fact_daily.oil_prod_daily,
+               fact_daily.water_cut,
+               fact_daily.oil_prod_cum,
+               fact_intr.start_prod_date,
+               fact_intr.prod_horizon,
+               fact_intr.recent_testing_date,
+               fact_intr.recent_testing_name,
+               fact_intr.construction_description,
+               fact_intr.recent_prod_date,
+               fact_intr.oil_nozzle,
+               fact_intr.tubing_pres,
+               fact_intr.casing_pres,
+               fact_intr.start_pump_liq_level,
+               str.well_production_sections,
+               str.t74_top_depth,
+               str.ko_azimuth,
+               str.ko_horizontal_dislocation,
+               str.azimuth_angle,
+               str.well_coordinates_x,
+               str.well_coordinates_y
+        from public.well_basic_information well
+                 left join public.fact_dwr_well_structure str on well.well_id = str.well_id
+                 left join (
+            select daily.*
+            from public.fact_dwr_pc_pro_well_vol_d daily
+                     inner join(
+                select well_id, max(prod_time) prod_time from public.fact_dwr_pc_pro_well_vol_d group by well_id
+            ) maxdaily on daily.well_id = maxdaily.well_id and daily.prod_time = maxdaily.prod_time
+        ) fact_daily on well.well_id = fact_daily.well_id
+                 left join (
+            select intr.*
+            from public.fact_dwr_well_history_introduction intr
+                     inner join(
+                select well_id, max(start_prod_date) start_prod_date
+                from public.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
+        ) fact_intr on well.well_id = fact_intr.well_id
+        where well.well_id = #{well_id}
+    </select>
+    <select id="getWellInfoList" parameterType="com.bowintek.practice.vo.query.WellInfoParams"
+            resultType="java.util.HashMap">
+        select
+        well.*,fact_daily.oil_prod_begin_date,fact_daily.oil_prod_recent_date,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
+        from public.well_basic_information well
+        left join (
+        select daily.* from public.fact_dwr_pc_pro_well_vol_d daily
+        inner join(
+        select well_id, max(prod_time) prod_time from public.fact_dwr_pc_pro_well_vol_d group by well_id
+        ) maxdaily on daily.well_id=maxdaily.well_id and daily.prod_time=maxdaily.prod_time
+        )fact_daily on well.well_id= fact_daily.well_id
+        left join (
+        select mon.* from public.fact_dwr_pc_pro_well_vol_monthly mon
+        inner join(
+        select well_id, max(prod_time) prod_time from public.fact_dwr_pc_pro_well_vol_monthly group by well_id
+        ) maxmon on mon.well_id=maxmon.well_id and mon.prod_time=maxmon.prod_time
+        )fact_mon on well.well_id= fact_mon.well_id
+        where 1=1
+        <if test="well_common_name!='' and well_common_name!=null">
+            and well.well_common_name like Concat('%',#{well_common_name},'%')
+        </if>
+        <if test="well_id!='' and well_id!=null">
+            and well.well_id like Concat('%',#{well_id},'%')
+        </if>
+        <if test="well_type!='' and well_type!=null">
+            and well.well_type like Concat('%',#{well_type},'%')
+        </if>
+        <if test="spud_date_begin!='' and spud_date_begin!=null">
+            and well.spud_date <![CDATA[ >= ]]> CAST(#{spud_date_begin} AS DATE)
+        </if>
+        <if test="spud_date_end!='' and spud_date_end!=null">
+            and well.spud_date  <![CDATA[ < ]]> (CAST(#{spud_date_end} AS DATE) + INTERVAL '1 day')
+        </if>
+        <if test="completion_date_begin!='' and completion_date_begin!=null">
+            and well.completion_date <![CDATA[ >= ]]> CAST(#{completion_date_begin} AS DATE)
+        </if>
+        <if test="completion_date_end!='' and completion_date_end!=null">
+            and well.completion_date  <![CDATA[ < ]]> (CAST(#{completion_date_end} AS DATE) + INTERVAL '1 day')
+        </if>
+        <if test="oil_prod_begin_date_begin!='' and oil_prod_begin_date_begin!=null">
+            and fact_daily.oil_prod_begin_date <![CDATA[ >= ]]> CAST(#{oil_prod_begin_date_begin} AS DATE)
+        </if>
+        <if test="oil_prod_begin_date_end!='' and oil_prod_begin_date_end!=null">
+            and fact_daily.oil_prod_begin_date  <![CDATA[ < ]]> (CAST(#{oil_prod_begin_date_end} AS DATE) + INTERVAL '1
+            day')
+        </if>
+        <if test="oil_prod_recent_date_begin!='' and oil_prod_recent_date_begin!=null">
+            and fact_daily.oil_prod_recent_date <![CDATA[ >= ]]> CAST(#{oil_prod_recent_date_begin} AS DATE)
+        </if>
+        <if test="oil_prod_recent_date_end!='' and oil_prod_recent_date_end!=null">
+            and fact_daily.oil_prod_recent_date  <![CDATA[ < ]]> (CAST(#{oil_prod_recent_date_end} AS DATE) + INTERVAL
+            '1 day')
+        </if>
+        <if test="org_id_a1!='' and org_id_a1!=null">
+            and well.org_id_a1 =#{org_id_a1}
+        </if>
+    </select>
+    <select id="selectBoreholeInterList" resultType="java.util.HashMap">
+        select *
+        from public.fact_dwr_wl_ach_borehole_inter bi
+        where bi.well_id = #{well_id}
+    </select>
+    <select id="selectTestHistoryList" resultType="java.util.HashMap">
+        select *
+        from public.dws_dm_test_history th
+        where th.well_id = #{well_id}
+    </select>
+    <select id="selectTestHistorySummary" resultType="java.util.HashMap">
+        select testing_name,count(1) as testing_num from public.dws_dm_test_history th
+        where th.well_id = #{well_id}
+        group by th.testing_name
+    </select>
+    <select id="getLastTestHistory" resultType="java.util.HashMap">
+        select *from  public.dws_dm_test_history th
+        where th.well_id = #{well_id}
+        order by th.testing_date desc
+        limit 1
+    </select>
+    <select id="selectAnalyticalAssaysList" resultType="java.util.HashMap">
+        select *
+        from public.dws_dm_analytical_assays aa
+        where aa.well_id = #{well_id}
+    </select>
+    <select id="selectAnalyticalAssaysSummary" resultType="java.util.HashMap">
+        SELECT item_code,SUM(CASE WHEN item_code = '井裸眼井基本解释成果' THEN 1 ELSE 0 END)  AS 井裸眼井基本解释成果,
+               SUM(CASE WHEN item_code = '岩石力学参数解释成果' THEN 1 ELSE 0 END)  AS 岩石力学参数解释成果,
+               SUM(CASE WHEN item_code = '储层孔隙结构评价' THEN 1 ELSE 0 END)    AS 储层孔隙结构评价,
+               SUM(CASE WHEN item_code = '裂缝型地层测井解释成果' THEN 1 ELSE 0 END) AS 裂缝型地层测井解释成果,
+               SUM(CASE WHEN item_code = '煤层气测井解释成果' THEN 1 ELSE 0 END)   AS 煤层气测井解释成果,
+               SUM(CASE WHEN item_code = '录井综合解释' THEN 1 ELSE 0 END)      AS 录井综合解释,
+               SUM(CASE WHEN item_code = '气测解释' THEN 1 ELSE 0 END)        AS 气测解释,
+               SUM(CASE WHEN item_code = '定量荧光解释' THEN 1 ELSE 0 END)      AS 定量荧光解释
+        FROM public.dws_dm_analytical_assays
+        where well_id = #{well_id}
+        GROUP BY item_code;
+    </select>
+    <select id="selectHistoryAssignmentList" resultType="java.util.HashMap">
+        select *
+        from public.fact_dwr_brief_history_assignment ha
+        where ha.well_id = #{well_id}
+    </select>
+    <select id="selectHistoryAssignmentSummary" resultType="java.util.HashMap">
+        select test_processes_name,count(1) as testing_num from public.fact_dwr_brief_history_assignment bha
+        where bha.well_id = #{well_id}
+        group by bha.test_processes_name
+    </select>
+    <select id="getLastHistoryAssignment" resultType="java.util.HashMap">
+        select *from  public.fact_dwr_brief_history_assignment bha
+        where bha.well_id = #{well_id}
+        order by bha.start_time desc
+        limit 1
+    </select>
+    <select id="selectDataIndexList" resultType="java.util.HashMap">
+        select *
+        from public.fact_dwr_well_data_index di
+        where di.well_id = #{well_id}
     </select>
 </mapper>

+ 0 - 1
target/classes/application.yml

@@ -105,7 +105,6 @@ mybatis:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 pagehelper:
-  helperDialect: mysql
   reasonable: true
   supportMethodsArguments: true
   params: count=countSql

+ 6 - 11
target/classes/generatorConfig.xml

@@ -4,7 +4,8 @@
 
 <generatorConfiguration>
     <!--mysql 连接数据库jar 这里选择自己本地位置-->
-    <classPathEntry location="./lib/postgresql-42.3.4.jar"/>
+   <!-- <classPathEntry location="./lib/postgresql-42.3.4.jar"/>-->
+    <classPathEntry location=".\lib\mysql-connector-java-5.1.46.jar"/>
     <context id="testTables" targetRuntime="MyBatis3">
         <!-- 运行环境配置 -->
         <!--<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>-->
@@ -17,20 +18,14 @@
             <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
         </commentGenerator>
         <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
-        <!-- mysql
         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
-                        connectionURL="jdbc:mysql://192.168.0.29:3306/zci_db" userId="root"
-                        password="bowin123">
-        </jdbcConnection>
-        -->
-  <!--      <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                         connectionURL="jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useSSL=false" userId="root"
-                        password="bowin123">-->
-        <jdbcConnection driverClass="org.postgresql.Driver"
+                        password="bowin123"/>
+      <!--  <jdbcConnection driverClass="org.postgresql.Driver"
                         connectionURL="jdbc:postgresql://office.bowintek.com:5432/postgres"
                         userId="postgres"
                         password="bowin123">
-        </jdbcConnection>
+        </jdbcConnection>-->
 
         <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
@@ -123,6 +118,6 @@
             <columnOverride column="StandardMajorID" javaType="java.lang.Integer" jdbcType="INTEGER" />
             <table schema="" tableName="Sys_Log"><property name="useActualColumnNames" value="true"/></table>
         </table>-->
-        <table schema="" tableName="well_basic_information"><property name="useActualColumnNames" value="true"/></table>
+        <table schema="" tableName="wl_user_expend_setting"><property name="useActualColumnNames" value="true"/></table>
     </context>
 </generatorConfiguration>

BIN
vue/src/assets/images/file.png


+ 118 - 0
vue/src/components/basic/chart/chart-cell.vue

@@ -0,0 +1,118 @@
+<template>
+  <a-popover trigger="hover"
+             placement="left"
+             @visibleChange="onOpenChange">
+    <template #content>
+      <div class="echart" :id="('popover-'+id)" :style="chartStylePopover"></div>
+    </template>
+    <div class="echart" :id="('chart-'+id)" :style="chartStyle"></div>
+  </a-popover>
+</template>
+
+<script lang="ts">
+  import {defineComponent, computed, markRaw} from 'vue';
+  import * as echarts from "echarts";
+
+  export  default defineComponent ({
+    props:{
+      datas : [] as any
+    },
+    name : 'ChartCell',
+    data() {
+      return{
+        loading : false,
+        chartStyle: { width: "100%", height: "100%" },
+        chartStylePopover: { width: "460px", height: "300px" },
+        cell : null as any,
+        chart : null as any,
+        serieType : 'line',
+        id : Date.now(),
+        hovered : false
+      }
+    },
+    setup(props, context){
+      console.log("ChartCell setup" , props, context);
+
+      const datas = computed(() => {
+        return props.datas ? props.datas : []
+      });
+
+      return{
+        datas
+      }
+    },
+    mounted(){
+      console.log("mounted" , this.id);
+      this.readerCell();
+      //this.readerChart();
+    },
+    methods:{
+      getxAxis:function (show){
+        let xAxis = {type : 'category', data : [] as any, show : show, axisLabel:{rotate:50}};
+        //数据组装,这里根据业务组装x轴数据
+        xAxis.data = ['2023年1月', '2023年2月', '2023年3月', '2023年4月', '2023年5月', '2023年6月',
+          '2023年7月', '2023年8月', '2023年9月', '2023年10月', '2023年11月', '2023年12月'];
+        return xAxis;
+      },
+      getyAxis:function (){
+        return {type: 'value', min:'dataMin', max:'dataMax', show:false };
+      },
+      getSeries:function (showSymbol){
+        let series = [{type: this.serieType, data:[] as any, showSymbol:showSymbol}];
+        //数据组装,这里根据业务组装y轴数据
+        series[0].data = [820, 932, 901, 934, 1290, 1330,
+        2000, 3000, 4000, 5000, 5000, 6000];
+        console.log("getSeries", series);
+        return series;
+      },
+      readerCell: function () {
+        const option = {
+          grid: { top: 0, left: 0, right: 0, bottom: 0, containLabel: false },
+          xAxis: this.getxAxis(false),
+          yAxis: this.getyAxis(),
+          series: this.getSeries(false)
+        };
+        console.log("readerCell-"+this.serieType,option);
+
+        if(this.cell==null)
+          this.cell = markRaw(echarts.init(document.getElementById('chart-'+this.id) as HTMLElement));
+        if(this.cell!=null) {
+          this.cell.setOption(option);
+          this.cell.resize();
+        }
+      },
+      readerChart: function () {
+        let xAxis = this.getxAxis(true);
+        xAxis['nameRotate'] = 0;
+        const option = {
+          title: { left: 'center', text: '累产量趋势图' },
+          tooltip: { trigger: 'item', triggerOn:"mousemove",showContent:true },
+          grid: { top:'15%', left: '8%', right: '3%', bottom: '6%', containLabel: true },
+          xAxis: xAxis,
+          yAxis: { name:'累产量', nameGap: 50, nameLocation:'center', type: 'value'},
+          series: this.getSeries(true)
+        };
+        console.log("readerChart-"+this.serieType,option);
+
+        if(this.chart==null)
+          this.chart = markRaw(echarts.init(document.getElementById('popover-'+this.id) as HTMLElement));
+        if(this.chart!=null) {
+          this.chart.setOption(option);
+          this.chart.resize();
+        }
+      },
+      onOpenChange:function(visible){
+        console.log("onOpenChange", visible);
+        if(visible) {
+          setTimeout(this.readerChart, 100);
+        }
+        else{
+          this.chart.dispose();
+          this.chart = null;
+        }
+      }
+    }
+  })
+</script>
+
+<style lang="less" scoped></style>

+ 215 - 0
vue/src/components/basic/chart/chart-prod-dynamics.vue

@@ -0,0 +1,215 @@
+<template>
+  <div>
+    <a-form
+      ref="formRef"
+      name="advanced_search"
+      class="ant-advanced-search-form"
+      :model="formState"
+      @finish="onFinish"
+    >
+      <a-row :gutter="24">
+        <a-col :span="8">
+          <a-form-item
+            label="统计起止日期"
+            :label-col="{span:8}">
+            <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']" @change="onRangeChange"/>
+          </a-form-item>
+        </a-col>
+
+        <a-col :span="4">
+          <a-form-item
+            name="selectType"
+            label="统计维度"
+            :label-col="{span:12}">
+            <a-select
+              v-model:value="formState.selectType"
+              :options="getOptions()"
+            ></a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="6">
+          <a-form-item
+            name="tempNo"
+            label="数据项"
+            :label-col="{span:8}">
+            <a-select
+              v-model:value="formState.dataTypes"
+              mode="multiple"
+              placeholder="..."
+              max-tag-count="responsive"
+              :options="getTypeOptions()"
+            ></a-select>
+          </a-form-item>
+        </a-col>
+
+        <a-col :span="6">
+          <a-button type="primary" html-type="submit" @click="onFinish">查询</a-button>
+        </a-col>
+      </a-row>
+    </a-form>
+    <div class="echart" :id="('chart-'+id)" :style="getChartStyle()"></div>
+  </div>
+</template>
+
+<script lang="ts">
+  import {defineComponent, computed, markRaw, ref, reactive} from 'vue';
+  import * as echarts from "echarts";
+  import dayjs from 'dayjs';
+  import type {FormInstance} from 'ant-design-vue';
+
+  export  default defineComponent ({
+    props:{
+      datas : [] as any
+    },
+    name : 'ChartProdDynmics',
+    data() {
+      return{
+        loading : false,
+        chartStyle: { width: "100%", height: "100%" },
+        chart : null as any,
+        serieType : 'line',
+        id : Date.now(),
+        hovered : false,
+        height : 130
+      }
+    },
+    setup(props, context){
+      console.log("ChartCell setup" , props, context);
+
+      const datas = computed(() => {
+        return props.datas ? props.datas : []
+      });
+
+      const formRef = ref<FormInstance>();
+      const formState = reactive({
+        selectType: "日",  beiginDate: '', endDate: '',
+        dataTypes : ['0', '1', '2', '5']
+      });
+
+      return{
+        datas,
+        formRef,
+        formState
+      }
+    },
+    mounted(){
+      console.log("mounted" , this.id);
+      this.readerChart();
+    },
+    methods:{
+      onFinish:function (){
+        this.readerChart();
+      },
+      getChartStyle:function (){
+        return { width: "100%", height: (this.height) * this.getTypes().length + 160 + "px" };
+      },
+      getOptions:function (){
+        return [{label:'日', value:'0'},
+          {label:'月', value:'1'},
+          {label:'年', value:'2'}];
+      },
+      getTypeOptions:function (){
+        return [{label:'产油量', value:'0'},
+          {label:'产水量', value:'1'},
+          {label:'产液量', value:'2'},
+          {label:'产气量', value:'3'},
+          {label:'含水率', value:'4'},
+          {label:'油井开井数', value:'5'}];
+      },
+      getTypes:function (){
+        return this.getTypeOptions().filter((item) => {
+          return this.formState.dataTypes.indexOf(item.value) >=0;
+        });
+      },
+      getxDatas:function (){
+        //根据后台数据生成需要显示的数据集
+        let day = dayjs();
+        let arys = [] as any;
+        for(let i=0;i<12;i++){
+          day = day.add(1, 'day');
+          arys.push(day.format('YYYY-MM-DD'));
+        }
+        console.log("getxDatas",arys);
+        return arys;
+      },
+      getyDatas:function (){
+        //根据后台数据生成需要显示的数据集
+        let datas = [] as any;
+        let xLength = this.getxDatas().length;
+        for(let i=0;i< this.getTypes().length;i++){
+          let arys = [] as any;
+          for(let n=0;n<xLength;n++){
+            arys.push(parseInt(Math.random() * (10000 - 1000 + 1) + 1000));
+          }
+          datas.push(arys);
+        }
+        console.log("getyDatas",datas);
+        return datas;
+      },
+      getGrids:function (){
+        let grids = [] as any;
+        let showList = this.getTypes();
+        for(let i=0;i< showList.length;i++){
+          let top = 20 + i * (this.height) + i * 10;
+          grids.push({ left:'10%', top: top + 'px', width:'86%', height: (this.height-30) + 'px'});
+        }
+        console.log("getGrids",grids);
+        return grids;
+      },
+      getxAxis:function (){
+        let xAxis = [] as any;
+        let showList = this.getTypes();
+        for(let i=0;i< showList.length;i++){
+          let row = { gridIndex : i, type : 'category',
+            data : this.getxDatas(),
+            show : (i+1)==showList.length,
+            axisLabel:{rotate:50}};
+          xAxis.push(row);
+        }
+        console.log("getxAxis",xAxis);
+        return xAxis;
+      },
+      getyAxis:function (){
+        let yAxis = [] as any;
+        let showList = this.getTypes();
+        for(let i=0;i< showList.length;i++){
+          let row = { gridIndex : i,
+            name:showList[i].label,
+            nameGap: 50,
+            nameLocation:'center',
+            type : 'value'};
+          yAxis.push(row);
+        }
+        console.log("getyAxis",yAxis);
+        return yAxis;
+      },
+      getSeries:function (){
+        let series = [] as any;
+        let showList = this.getTypes();
+        let yDatas = this.getyDatas();
+        for(let i=0;i< showList.length;i++){
+          let row = { xAxisIndex : i, yAxisIndex: i, type : this.serieType, data: yDatas[i] };
+          series.push(row);
+        }
+        console.log("getSeries",series);
+        return series;
+      },
+      readerChart: function () {
+        const option = {
+          tooltip: { trigger: 'item', triggerOn:"mousemove",showContent:true },
+          grid: this.getGrids(),
+          xAxis: this.getxAxis(),
+          yAxis: this.getyAxis(),
+          series: this.getSeries()
+        };
+        console.log("readerChart-"+this.serieType,option);
+
+        if(this.chart!=null) this.chart.dispose();
+        this.chart = markRaw(echarts.init(document.getElementById('chart-'+this.id) as HTMLElement));
+        this.chart.setOption(option);
+      }
+    }
+  })
+</script>
+
+<style lang="less" scoped></style>

+ 1 - 0
vue/src/router/asyncModules/sale.ts

@@ -8,4 +8,5 @@ export default {
   'views/subjectedit': () => import( '@/views/subject/edit.vue'),
   'views/subjectdetail': () => import( '@/views/subject/detail.vue'),
   'views/wellinfo': () => import( '@/views/wellinfo/index.vue'),
+  'views/wellinfoDetail': () => import( '@/views/wellinfo/detail.vue'),
 }

+ 40 - 2
vue/src/views/position/test.vue

@@ -25,6 +25,25 @@
       <!--热门搜索历史使用示例,实际应用改样式即可-->
       <QueryHistoryList ref="queryHistoryList" :maxRows="20"></QueryHistoryList>
     </div>
+
+    <a-divider orientation="left">列表单元格中显示简单的曲线图</a-divider>
+    <div style="width:1000px;">
+      <a-table :columns="columns" :data-source="data">
+        <template #bodyCell="{ column, text }">
+          <template v-if="column.dataIndex === 'chart'">
+            <div style="height:40px">
+              <!--列表单元格中显示曲线图,数据需要根据业务库整理-->
+              <ChartCell></ChartCell>
+            </div>
+          </template>
+        </template>
+      </a-table>
+    </div>
+
+    <a-divider orientation="left">Grid类型的图表</a-divider>
+    <div style="width:1200px;">
+      <ChartProdDynmics></ChartProdDynmics>
+    </div>
   </div>
 </template>
 
@@ -33,10 +52,12 @@ import {ref,defineComponent,watch} from "vue";
 import { useRoute} from 'vue-router';
 import QueryHistoryList from '@/components/basic/querylog/history-list.vue'
 import QueryHistoryComplete from '@/components/basic/querylog/history-complete.vue'
+import ChartCell from '@/components/basic/chart/chart-cell.vue'
+import ChartProdDynmics from '@/components/basic/chart/chart-prod-dynamics.vue'
 
 export default defineComponent({
   name: 'QueryTest',
-  components: {QueryHistoryList, QueryHistoryComplete},
+  components: {QueryHistoryList, QueryHistoryComplete, ChartCell, ChartProdDynmics},
   setup() {
     const route = useRoute();
     const queryHistoryComplete = ref<typeof QueryHistoryComplete>();
@@ -55,10 +76,27 @@ export default defineComponent({
       (queryHistoryComplete.value as any).saveHistory(formState.value.keyString);
     };
 
+    const columns = [
+      { title: 'Name', dataIndex: 'name', key: 'name', },
+      { title: 'Age', dataIndex: 'age', key: 'age', width: 80, },
+      { title: 'Address', dataIndex: 'address', key: 'address 1', ellipsis: true, },
+      { title: 'Long Column Long Column Long Column', dataIndex: 'address', key: 'address 2', ellipsis: true},
+      { title: 'ChartCell', dataIndex: 'chart', key: 'ChartCell', width:160}
+    ];
+
+    const data = [
+      { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park, New York No. 1 Lake Park', tags: ['nice', 'developer']},
+      { 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']},
+    ];
+
     return {
       formState,
       onFinish,
-      queryHistoryComplete
+      queryHistoryComplete,
+
+      columns,
+      data
     };
   }
 });

+ 1 - 0
vue/src/views/query/table.vue

@@ -109,6 +109,7 @@
     <div class="search-result-list" v-else="viewModel=='list'">
       <a-table :columns="columns" :data-source="data" :scroll="{ x:'100%', y: 500 }"
                :loading="loading"
+               :pagination="false"
                :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
                :row-key="record=>record.tempId"
                bordered>

+ 82 - 0
vue/src/views/wellinfo/columns.ts

@@ -0,0 +1,82 @@
+export const boreholeInterColumns=[
+  {title: '井筒id', dataIndex: 'wellbore_id', key: 'wellbore_id', width: 120},
+  {title: '层位id', dataIndex: 'zone_id', key: 'zone_id', width: 120},
+  {title: '层号(序号)', dataIndex: 'zone_no', key: 'zone_no', width: 120},
+  {title: '裸眼井解释成果类型', dataIndex: 'borehole_inter_type_name', key: 'borehole_inter_type_name', width: 120},
+  {title: '起始深度', dataIndex: 'start_depth', key: 'start_depth', width: 120},
+  {title: '终止深度', dataIndex: 'end_depth', key: 'end_depth', width: 120},
+  {title: '厚度', dataIndex: 'thickness', key: 'thickness', width: 120},
+  {title: '岩性类型', dataIndex: 'lithology_class', key: 'lithology_class', width: 120},
+  {title: '自然电位', dataIndex: 'spontaneous_potential', key: 'spontaneous_potential', width: 120},
+  {title: '自然伽马', dataIndex: 'sp_gamma_radiant_intensity', key: 'sp_gamma_radiant_intensity', width: 120},
+  {title: '井径', dataIndex: 'well_diameter', key: 'well_diameter', width: 120},
+  {title: '体积密度', dataIndex: 'formation_volume_density', key: 'formation_volume_density', width: 120},
+  {title: '声波时差', dataIndex: 'sonic_differential_time', key: 'sonic_differential_time', width: 120},
+  {title: '中子', dataIndex: 'compensated_neutron', key: 'compensated_neutron', width: 120},
+  {title: '浅电阻率', dataIndex: 'laterolog_shallow', key: 'laterolog_shallow', width: 120},
+  {title: '深电阻率', dataIndex: 'laterolog_deep', key: 'laterolog_deep', width: 120},
+  {title: '冲洗带电阻率', dataIndex: 'laterolog_flushed_zone', key: 'laterolog_flushed_zone', width: 120},
+  {title: '密度孔隙度', dataIndex: 'density_porosity', key: 'density_porosity', width: 120},
+  {title: '声波孔隙度', dataIndex: 'sonic_porosity', key: 'sonic_porosity', width: 120},
+  {title: '中子孔隙度', dataIndex: 'neutron_porosity', key: 'neutron_porosity', width: 120},
+  {title: '有效孔隙度', dataIndex: 'effective_porosity', key: 'effective_porosity', width: 120},
+  {title: '总孔隙度', dataIndex: 'total_porosity', key: 'total_porosity', width: 120},
+  {title: '渗透率', dataIndex: 'permeability', key: 'permeability', width: 120},
+  {title: '含油气饱和度', dataIndex: 'oil_gas_saturation', key: 'oil_gas_saturation', width: 120},
+  {title: '束缚水饱和度', dataIndex: 'irreducible_water_saturation', key: 'irreducible_water_saturation', width: 120},
+  {title: '泥质含量', dataIndex: 'shale_content', key: 'shale_content', width: 120},
+  {title: '砂质含量', dataIndex: 'sandy_content', key: 'sandy_content', width: 120},
+  {title: '灰质含量', dataIndex: 'lime_content', key: 'lime_content', width: 120},
+  {title: '白云质含量', dataIndex: 'dolomitic_content', key: 'dolomitic_content', width: 120},
+  {title: '碳酸盐岩含量', dataIndex: 'carbonate_content', key: 'carbonate_content', width: 120},
+  {title: '指标类型', dataIndex: 'idx_type', key: 'idx_type', width: 120},
+  {title: '解释结论', dataIndex: 'interpretation_result', key: 'interpretation_result', width: 120},
+  {title: '垂深顶深', dataIndex: 'start_tvd', key: 'start_tvd', width: 120},
+  {title: '垂深底深', dataIndex: 'end_tvd', key: 'end_tvd', width: 120},
+  {title: '垂深层厚 ', dataIndex: 'tvd_thickness', key: 'tvd_thickness', width: 120},
+  {title: '备注', dataIndex: 'remarks', key: 'remarks', width: 120},
+  {title: '创建/更新日期', dataIndex: 'update_date', key: 'update_date', width: 120,customRender:({record})=>{
+    return record.update_date == null ? record.create_date : record.update_date;
+    }}
+];
+export const testHistoryColumns=[
+  {title: '测试日期', dataIndex: 'testing_date', key: 'testing_date', width: 120},
+  {title: '测试名称', dataIndex: 'testing_name', key: 'testing_name', width: 120},
+  {title: '测试单位', dataIndex: 'anal_coy', key: 'anal_coy', width: 120},
+  {title: '内容描述', dataIndex: 'construction_description', key: 'construction_description', width: 120}
+]
+
+export const analyticalAssaysColumns=[
+  {title: '分析类型', dataIndex: 'item_code', key: 'item_code', width: 120},
+  {title: '分析指标', dataIndex: 'item_name', key: 'item_name', width: 120},
+  {title: '指标单位', dataIndex: 'meter_unit', key: 'meter_unit', width: 120},
+  {title: '指标值', dataIndex: 'idx_value', key: 'idx_value', width: 120},
+  {title: '描述', dataIndex: 'description', key: 'description', width: 120}
+]
+export const historyAssignmentColumns=[
+  {title: '井筒id', dataIndex: 'wellbore_id', key: 'wellbore_id', width: 120},
+  {title: '作业阶段id', dataIndex: 'event_id', key: 'event_id', width: 120},
+  {title: '试油试采id', dataIndex: 'test_id', key: 'test_id', width: 120},
+  {title: '开始时间', dataIndex: 'start_time', key: 'start_time', width: 120},
+  {title: '结束时间', dataIndex: 'end_time', key: 'end_time', width: 120},
+  {title: '施工简述', dataIndex: 'constr_description', key: 'constr_description', width: 120},
+  {title: '备注', dataIndex: 'remarks', key: 'remarks', width: 120},
+  {title: '生产井段', dataIndex: 'well_production_sections', key: 'well_production_sections', width: 120},
+  {title: '层位', dataIndex: 'formation_name', key: 'formation_name', width: 120},
+  {title: '井段顶深', dataIndex: 'top_md', key: 'top_md', width: 120},
+  {title: '井段底深', dataIndex: 'btm_md', key: 'btm_md', width: 120},
+  {title: '厚度', dataIndex: 'thickness', key: 'thickness', width: 120},
+  {title: '层序号', dataIndex: 'layer_no', key: 'layer_no', width: 120},
+  {title: '作业类型', dataIndex: 'working_type', key: 'working_type', width: 120},
+  {title: '作业工序名称', dataIndex: 'test_processes_name', key: 'test_processes_name', width: 120},
+  {title: '作业工作内容', dataIndex: 'worksummary', key: 'worksummary', width: 120},
+  {title: '施工次序', dataIndex: 'construct_no', key: 'construct_no', width: 120},
+  {title: '作业队伍', dataIndex: 'work_team', key: 'work_team', width: 120},
+  {title: '泵深', dataIndex: 'pump_depth', key: 'pump_depth', width: 120},
+]
+export const dataIndexColumns=[
+  {title: '日期', dataIndex: 'date', key: 'date', width: 120},
+  {title: '文档名', dataIndex: 'file_name', key: 'file_name', width: 120 },
+  {title: '文档业务类型', dataIndex: 'file_business_type', key: 'file_business_type', width: 120},
+  {title: '存储类型', dataIndex: 'storage_type', key: 'storage_type', width: 120}
+]

+ 344 - 0
vue/src/views/wellinfo/detail.vue

@@ -0,0 +1,344 @@
+<template>
+
+  <div>
+    <a-card title="井史简介" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardSummary.expand" @click="cardSettings.cardSummary.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardSummary.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardSummary.expand" class="info-body">
+        <p>井名<span>{{ dataModel.well_common_name }}</span>构造位置<span>{{
+            dataModel.structure_pos
+          }}</span>,于<span>{{ dataModel.spud_date }}</span>开钻,<span>{{ dataModel.end_drilling_date }}</span>完钻,采取<span>{{
+            dataModel.completion_method
+          }}</span>方式完井。
+        </p>
+
+        <p>投产于<span>{{ dataModel.start_prod_date }}</span>,生产层位<span>{{ dataModel.prod_horizon }}</span>层位
+          <span>{{ dataModel.recent_testing_date }}</span>进行最近一次<span>{{ dataModel.recent_testing_name }}</span>测试,最近一次产油时间<span>{{
+              dataModel.recent_prod_date
+            }}</span>,油嘴<span>{{ dataModel.oil_nozzle }}</span>mm,
+        </p>
+        <p>
+          油压<span>{{ dataModel.tubing_pres }}</span>MPa,套压<span>{{
+            dataModel.casing_pres
+          }}</span>MPa,日产液量<span>{{ dataModel.fluid_prod_daily }}</span>t/d,日产油量<span>{{
+            dataModel.oil_prod_daily
+          }}</span>t/d,含水<span>{{ dataModel.water_cut }}</span>%,动液面<span>{{ dataModel.start_pump_liq_level }}</span>m,截止目前累产油<span>{{
+            dataModel.oil_prod_cum
+          }}</span>吨。
+        </p>
+      </div>
+    </a-card>
+    <a-card title="生产动态" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardChat.expand" @click="cardSettings.cardChat.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardChat.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardChat.expand">
+        <p>Card content</p>
+        <p>Card content</p>
+        <p>Card content</p>
+      </div>
+    </a-card>
+    <a-card title="基本信息" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardBaseInfo.expand" @click="cardSettings.cardBaseInfo.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <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 }}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 }}m</a-descriptions-item>
+          <a-descriptions-item label="造斜点:">{{ dataModel.ko_azimuth }}m</a-descriptions-item>
+          <a-descriptions-item label="水平位移:">{{ dataModel.ko_horizontal_dislocation }}m</a-descriptions-item>
+          <a-descriptions-item label="方位角:">{{ 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 }}</a-descriptions-item>
+          <a-descriptions-item label="审定真垂直深度:">{{ dataModel.authorized_tvd }}</a-descriptions-item>
+
+          <a-descriptions-item label="井底测量深度:">{{ dataModel.bh_md }}</a-descriptions-item>
+          <a-descriptions-item label="井底位置描述信息:" :span="2">{{ dataModel.geo_description_bh }}</a-descriptions-item>
+          <a-descriptions-item label="井底真垂直深度:">{{ dataModel.bh_tvd }}</a-descriptions-item>
+          <a-descriptions-item label="相对于参考面的造斜点深度:">{{ dataModel.ko_md }}</a-descriptions-item>
+          <a-descriptions-item label="实际造斜点真垂直深度:">{{ dataModel.ko_tvd }}</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>
+    </a-card>
+    <a-card title="业务解释" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardExplain.expand" @click="cardSettings.cardExplain.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardExplain.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardExplain.expand">
+        <a-table :columns="boreholeInterColumns" :data-source="boreholeInterList" :scroll="{ x:'100%', y: 500 }"
+                 :pagination="false"
+                 bordered>
+        </a-table>
+      </div>
+    </a-card>
+    <a-card title="相关文档" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <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 title="测试历史" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardTest.expand" @click="cardSettings.cardTest.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardTest.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardTest.expand">
+        <p  class="info-body">本井共实施
+          <template v-for="it in testHistorySummary">
+            <span>{{it.testing_num}}</span>次{{ it.testing_name }}、
+          </template>
+          <span>{{lastTestHistory.testing_date}}</span>进行最近一次<span>{{lastTestHistory.testing_name}}</span>,   <span>{{lastTestHistory.construction_description}}</span>
+        </p>
+        <br/>
+        <a-table :columns="testHistoryColumns" :data-source="testHistoryList" :scroll="{ x:'100%', y: 500 }"
+                 :pagination="false"
+                 bordered>
+        </a-table>
+      </div>
+    </a-card>
+    <a-card title="分析化验" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardAnalysis.expand" @click="cardSettings.cardAnalysis.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardAnalysis.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardAnalysis.expand">
+        <p class="info-body">
+          <template v-for="it in analyticalAssaysSummary">
+            {{ it.item_code }}<span>{{it[it.item_code]}}</span>组、
+          </template>
+        </p>
+        <br>
+        <a-table :columns="analyticalAssaysColumns" :data-source="analyticalAssaysList" :scroll="{ x:'100%', y: 500 }"
+                 :pagination="false"
+                 bordered>
+        </a-table>
+      </div>
+    </a-card>
+    <a-card title="作业简史(业务过程)" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardWork.expand" @click="cardSettings.cardWork.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardWork.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardWork.expand">
+        <p  class="info-body">
+          井实施井下作业施工<span>{{historyAssignmentCount}}</span>次,其中
+          <template v-for="it in historyAssignmentSummary">
+            {{ it.test_processes_name }}<span>{{it.testing_num}}</span>次、
+          </template>
+          <span>{{ lastHistoryAssignment.start_time }}{{ lastHistoryAssignment.test_processes_name }}</span>,
+          <span>{{ lastHistoryAssignment.test_processes_name }}</span>井段<span>{{ lastHistoryAssignment.well_production_sections }}</span></p>
+        <br/>
+        <a-table :columns="historyAssignmentColumns" :data-source="historyAssignmentList" :scroll="{ x:'100%', y: 500 }"
+                 :pagination="false"
+                 bordered>
+        </a-table>
+      </div>
+    </a-card>
+    <a-card title="GIS地图" :bordered="false" :headStyle="cardSettings.cardHeadStyle" class="card-detail">
+      <template #extra>
+        <UpSquareOutlined v-if="cardSettings.cardGIS.expand" @click="cardSettings.cardGIS.expand=false"
+                          :style="cardSettings.buttonStyle"/>
+        <DownSquareOutlined v-else @click="cardSettings.cardGIS.expand=true"
+                            :style="cardSettings.buttonStyle"/>
+      </template>
+      <div v-if="cardSettings.cardGIS.expand">
+        哈23-12井井实施井下作业施工1次,其中油管测试1次;2015年08月23日油管测试,油管测试井段7458m-7613.05m
+        <p>Card content</p>
+        <p>Card content</p>
+        <p>Card content</p>
+      </div>
+    </a-card>
+  </div>
+</template>
+<script lang="ts">
+import {ref, defineComponent, toRefs, reactive, watch} from 'vue';
+import {get, postData} from "@/api/common";
+import {useTabsViewStore} from "@/store/modules/tabsView";
+import dayjs from "dayjs";
+import {useRoute} from "vue-router";
+import router from "@/router";
+import * as columns from './columns';
+
+export default defineComponent({
+  name: 'wellinfoDetail',
+  components: {},
+  setup() {
+    const tabsViewStore = useTabsViewStore();
+    const route = useRoute();
+    const cardSettings = ref({
+      cardHeadStyle: {fontWeight: 'bold'},
+      buttonStyle: {fontSize: '20px', cursor: 'pointer'},
+      cardSummary: {expand: true},
+      cardChat: {expand: true},
+      cardBaseInfo: {expand: true},
+      cardExplain: {expand: true},
+      cardFile: {expand: true},
+      cardTest: {expand: true},
+      cardAnalysis: {expand: true},
+      cardWork: {expand: true},
+      cardGIS: {expand: true}
+    })
+    watch(
+      () => cardSettings,
+      () => {
+        let id = history.state.params?.id ?? wellData.dataModel.well_id;
+        postData('wellInfo/saveExpendSetting', {well_id: id, setting_json: JSON.stringify(cardSettings.value)});
+      }, {deep: true, immediate: false}
+    );
+    const wellData = reactive({
+      dataModel: {well_id: null},
+      boreholeInterList: [],
+      testHistoryList: [],
+      testHistorySummary:[],
+      lastTestHistory:{},
+      analyticalAssaysList: [],
+      analyticalAssaysSummary:[],
+      historyAssignmentList: [],
+      historyAssignmentSummary:[],
+      lastHistoryAssignment:{},
+      historyAssignmentCount:0,
+      dataIndexList: []
+    });
+
+    const loadData = async (id) => {
+      if (id == undefined) {
+        return;
+      }
+      get('wellInfo/getWellInfo', {well_id: id}).then(data => {
+        wellData.dataModel = data.dataModel;
+        wellData.boreholeInterList = data.boreholeInterList;
+        wellData.testHistoryList = data.testHistoryList;
+        wellData.testHistorySummary =data.testHistorySummary;
+        wellData.lastTestHistory=data.lastTestHistory;
+        wellData.analyticalAssaysList = data.analyticalAssaysList;
+        wellData.analyticalAssaysSummary=data.analyticalAssaysSummary;
+        wellData.historyAssignmentList = data.historyAssignmentList;
+        wellData.historyAssignmentSummary=data.historyAssignmentSummary;
+        wellData.lastHistoryAssignment=data.lastHistoryAssignment;
+        wellData.dataIndexList = data.dataIndexList;
+        wellData.historyAssignmentCount =wellData.historyAssignmentSummary.reduce((total, it:any) => total + it.testing_num, 0);
+      })
+      get('wellInfo/getExpendSetting', {wellId: id}).then(data => {
+        if (data != null) {
+          cardSettings.value = JSON.parse(data.setting_json);
+        }
+      })
+    }
+    const onClose = () => {
+      tabsViewStore.closeCurrentTab(route);
+      router.back();
+    };
+
+    return {
+      ...toRefs(wellData),
+      loadData, cardSettings,
+      onClose, ...columns,
+      dayjs
+    };
+  },
+  created() {
+    const id = history.state.params?.id;
+    if (id == undefined) {
+      this.onClose();
+    }
+    this.loadData(id);
+  }
+});
+</script>
+
+<style lang="less" scoped>
+.card-detail {
+  width: 100%;
+  margin-top: 10px;
+
+  a {
+    color: #1890ff;
+  }
+}
+
+.info-body {
+  line-height: 30px;
+
+  span {
+    color: #1890ff;
+  }
+}
+
+.info-title {
+  border-color: #7cb305;
+  margin: 15px;
+  font-weight: bold;
+}
+</style>

+ 202 - 51
vue/src/views/wellinfo/index.vue

@@ -25,7 +25,7 @@
           v-model:selectedKeys="subjectTrees.selectedKeys"
           :replace-fields="replaceFields"
           :autoExpandParent="subjectTrees.autoExpandParent"
-          @expand="treeOnExpand">
+          @expand="treeOnExpand" @select="treeOnSelect">
           <template #title="{ label,value,children }">
                     <span v-if="label!=null&&label.indexOf(subjectTrees.searchStr) > -1">
                       {{ label.substr(0, label.indexOf(subjectTrees.searchStr)) }}
@@ -95,41 +95,121 @@
           </a-row>
           <a-row :gutter="24" class="query-index-row" v-if="showQuery">
             <a-col :span="6">
-              <a-form-item name="tempName" label="开钻日期:">
+              <a-form-item name="tempName" label="最近采油日期:">
                 <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']"
                                 @change="(d)=>{onRangeChange(d,'oil_prod_recent_date_begin','oil_prod_recent_date_end')}"/>
               </a-form-item>
             </a-col>
           </a-row>
+          <a-row class="edit-operation">
+            <a-col :span="24" style="text-align: right">
+              <a-radio-group v-model:value="viewModel" style="text-align: left">
+                <a-radio-button value="list">
+                  <UnorderedListOutlined/>
+                  列表
+                </a-radio-button>
+                <a-radio-button value="card">
+                  <TableOutlined/>
+                  卡片
+                </a-radio-button>
+              </a-radio-group>
+            </a-col>
+          </a-row>
         </a-form>
       </div>
       <a-spin :spinning="loading">
-        <div class="query-index-table">
+        <div class="query-index-table" v-if="viewModel=='list'">
           <a-table :columns="columns" :data-source="data" :scroll="{ x:'100%', y: 500 }"
-                   :loading="loading"
-                   :row-key="record=>record.tempId"
+                   :row-key="record=>record.tempId" :pagination="false"
                    bordered>
             <template #bodyCell="{ column,record }">
+              <template v-if="column.key === 'well_id'">
+                <a-button type="link" size="small" @click="detail(record.well_id)">{{ record.well_id }}</a-button>
+              </template>
               <template v-if="column.key === 'operation'">
-                <a-popover trigger="hover" placement="left">
-                  <template #content>
-                    <a-button type="link" size="small">复制模板</a-button>
-                    <br/>
-                    <a-button type="link" size="small">查看详情</a-button>
-                    <br/>
-                    <a-popconfirm placement="leftTop"
-                                  title="是否删除数据?">
-                      <a-button type="link" size="small">删除</a-button>
-                    </a-popconfirm>
-                  </template>
-                  <a-button type="link" size="small">更多</a-button>
-                </a-popover>
+                <a-button type="link" size="small" @click="showDoc(record.well_id)">相关文档</a-button>
               </template>
             </template>
           </a-table>
         </div>
+        <div class="query-index-table" v-else>
+          <a-row :gutter="[24,8]">
+            <a-col :span="8" v-for="item in data">
+              <a-card :title="'井名:'+item.well_common_name" bodyStyle="padding: 10px;">
+                <template #extra>
+                  <a-button type="link" @click="detail(item.well_id)">查看详情</a-button>
+                  <a-button type="link" @click="showDoc(item.well_id)">相关文档</a-button>
+                </template>
+                <table class="well-card-table">
+                  <tr>
+                    <th>井型:</th>
+                    <td>{{ item.well_type }}</td>
+                    <th>状态:</th>
+                    <td>{{ item.current_state_name }}</td>
+                  </tr>
+                  <tr>
+                    <th>开钻日期:</th>
+                    <td>{{ item.spud_date }}</td>
+                    <th>含水率:</th>
+                    <td><span style="padding:2px 10px;" :class="getTdColor( item.water_cut)">{{ item.water_cut }}</span></td>
+                  </tr>
+                  <tr>
+                    <th>开始采油日期:</th>
+                    <td>{{ item.oil_prod_begin_date }}</td>
+                    <th>最近采油日期:</th>
+                    <td>{{ item.oil_prod_recent_date }}</td>
+                  </tr>
+                  <tr>
+                    <th>月产油量:</th>
+                    <td>{{ item.oil_prod_mon }}t</td>
+                    <td colspan="2" rowspan="2"></td>
+                  </tr>
+                  <tr>
+                    <th>累产油量:</th>
+                    <td>{{ item.oil_prod_year }}t</td>
+                  </tr>
+                  <tr>
+                    <th>月产气量:</th>
+                    <td>{{ item.gas_prod_mon }}m³</td>
+                    <td colspan="2" rowspan="2"></td>
+                  </tr>
+                  <tr>
+                    <th>累产气量:</th>
+                    <td>{{ item.gas_prod_year }}m³</td>
+                  </tr>
+                </table>
+              </a-card>
+            </a-col>
+          </a-row>
+        </div>
+        <a-pagination :page-size-options="['5', '20', '30', '40', '50']" show-size-changer
+                      v-model:current="pagination.current" :total="pagination.total"
+                      style="float: right;margin-top: 10px;"
+                      :pageSize="pagination.pageSize" :show-total="total => `共 ${total} 条`"
+                      @change="(current)=>handleTableChange({ current: current,pageSize: pagination.pageSize })"
+                      @showSizeChange="(current,pageSize)=>handleTableChange({ current: current,pageSize: pageSize })"/>
       </a-spin>
     </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">下载</a>
+            </template>
+            <a-list-item-meta
+              :description="item.file_business_type">
+              <template #title>
+                <a href="https://www.antdv.com/">{{ item.file_name }}</a>
+              </template>
+              <template #avatar>
+                <img src="~@/assets/images/file.png"/>
+              </template>
+            </a-list-item-meta>
+          </a-list-item>
+        </template>
+      </a-list>
+    </a-modal>
   </div>
 </template>
 
@@ -141,9 +221,11 @@ import {get} from "@/api/common";
 import type {TableColumnsType} from "ant-design-vue";
 import dayjs from "dayjs";
 import {getPaginationTotalTitle} from "@/utils/common";
+import type {TableProps} from "ant-design-vue";
+import {useTabsViewStore} from "@/store/modules/tabsView";
 
 export default defineComponent({
-  name: 'queryindex',
+  name: 'wellinfoindex',
   components: {},
   setup() {
     const route = useRoute();
@@ -154,7 +236,11 @@ export default defineComponent({
     const selectedRowKeys = ref([]);
     const activeTab = ref("1");
     const showTree = ref(true);
-    const data = ref([]);
+    const isShowDoc = ref(false);
+    const data = ref([{children: [], label: '', value: ''}]);
+    const viewModel = ref("list");
+    const tabsViewStore = useTabsViewStore();
+    const docList = ref([]);
     const wellTypeList = ref([{label: "直井", value: "直井"}, {label: "定向井", value: "定向井"}, {label: "分支井", value: "分支井"}]);
     const replaceFields = {
       children: 'children',
@@ -176,7 +262,8 @@ export default defineComponent({
       oil_prod_begin_date_begin: '',
       oil_prod_begin_date_end: '',
       oil_prod_recent_date_begin: '',
-      oil_prod_recent_date_end: ''
+      oil_prod_recent_date_end: '',
+      org_id_a1: ''
     });
     const columns: TableColumnsType = [
       {
@@ -184,11 +271,12 @@ export default defineComponent({
         width: 60,
         dataIndex: 'index',
         key: 'index',
-        align: "center",
+        align: "center",fixed: 'left',
         customRender: item => `${formState.rows * (formState.page - 1) + item.index + 1}`
       },
-      {title: '井号', dataIndex: 'well_id', key: 'well_id', width: 120},
+      {title: '井号', dataIndex: 'well_id', key: 'well_id', width: 120,fixed: 'left'},
       {title: '井名', dataIndex: 'well_common_name', key: 'well_common_name', width: 120},
+      {title: '采油厂机构', dataIndex: 'org_name_a1', key: 'org_name_a1', width: 120},
       {title: '井型', dataIndex: 'well_type', key: 'well_type', width: 120},
       {
         title: '开钻日期', dataIndex: 'spud_date', key: 'spud_date', width: 120, customRender: ({record}) =>
@@ -200,7 +288,7 @@ export default defineComponent({
       },
       {
         title: '完井日期', dataIndex: 'completion_date', key: 'completion_date', width: 120, customRender: ({record}) =>
-          record.end_drilling_date == null ? "" : (dayjs(record.end_drilling_date).format('YYYY-MM-DD'))
+          record.end_drilling_date == null ? "" : (dayjs(record.completion_date).format('YYYY-MM-DD'))
       },
       {
         title: '开始采油日期',
@@ -216,17 +304,32 @@ export default defineComponent({
         customRender: ({record}) =>
           record.oil_prod_recent_date == null ? "" : (dayjs(record.oil_prod_recent_date).format('YYYY-MM-DD'))
       },
-      {title: '状态', dataIndex: 'current_state', key: 'current_state', width: 120},
+      {title: '状态', dataIndex: 'current_state_name', key: 'current_state', width: 120},
       {title: '设计井深(m)', dataIndex: 'budgeted_md', key: 'tempNo', width: 120},
-      {title: '含水率', dataIndex: 'water_cut', key: 'water_cut', width: 120},
+      {
+        title: '含水率', dataIndex: 'water_cut', key: 'water_cut', width: 60, align: 'center', customCell: (record) => {
+          return {class: getTdColor(record.water_cut)};
+        }
+      },
       {title: '月产油量(t)', dataIndex: 'oil_prod_mon', key: 'oil_prod_mon', width: 120},
-      {title: '累产油量(t)', dataIndex: 'oil_prod_ year', key: 'oil_prod_ year', width: 120},
+      {title: '累产油量(t)', dataIndex: 'oil_prod_year', key: 'oil_prod_year', width: 120},
       {title: '累产油量趋势', dataIndex: 'tempNo', key: 'tempNo', width: 150},
-      {title: '月产气量(m³)', dataIndex: 'gas_prod_ year', key: 'gas_prod_ year', width: 120},
-      {title: '累产气量(m³)', dataIndex: 'gas_prod_mon', key: 'gas_prod_mon', width: 120},
+      {title: '月产气量(m³)', dataIndex: 'gas_prod_mon', key: 'gas_prod_mon', width: 120},
+      {title: '累产气量(m³)', dataIndex: 'gas_prod_year', key: 'gas_prod_year', width: 120},
       {title: '累产油量趋势', dataIndex: 'tempNo', key: 'tempNo', width: 150},
-      {title: '操作列', dataIndex: 'operation', key: 'operation', width: 120}
+      {title: '操作列', dataIndex: 'operation', key: 'operation', align: 'center', width: 120}
     ];
+    const getTdColor = (water_cut) => {
+      if (water_cut == null || water_cut <= 2) {
+        return "";
+      } else if (water_cut > 2 && water_cut <= 40) {
+        return "color_level2";
+      } else if (water_cut > 40 && water_cut <= 8) {
+        return "color_level3";
+      } else {
+        return "color_level4";
+      }
+    }
     const onSelectChange = (keys: any) => {
       selectedRowKeys.value = keys;
     };
@@ -246,6 +349,13 @@ export default defineComponent({
       formState.total = result.total;
       loading.value = false;
     }
+    const handleTableChange: TableProps['onChange'] = (
+      pag: { pageSize: number; current: number },
+    ) => {
+      formState.page = pag.current;
+      formState.rows = pag.pageSize;
+      loadData();
+    };
     const onRangeChange = (dateString, begin, end) => {
       formState[begin] = dateString ? dateString[0].format("YYYY-MM-DD") : '';
       formState[end] = dateString ? dateString[1].format("YYYY-MM-DD") : '';
@@ -256,6 +366,9 @@ export default defineComponent({
 
       }
     }
+    const detail = (well_id) => {
+      tabsViewStore.addTabByPath('/wellinfo/detail', {id: well_id});
+    }
     const onQuery = () => {
       loadData();
     }
@@ -263,11 +376,10 @@ export default defineComponent({
       data: [],
       expandedKeys: [''],
       selectedKeys: [''],
-      autoExpandParent:true,
+      autoExpandParent: true,
       searchStr: ''
     });
     const getSubjectTree = async function () {
-      //loading.value = true;
       subjectTrees.value.data = await get('wellInfo/getOrganizationTree', {tabName: subjectTrees.value.searchStr});
       //计算第一个展开节点
       subjectTrees.value.expandedKeys = [];
@@ -322,19 +434,23 @@ export default defineComponent({
     }
     const treeOnSelect = function (selected, selectedNodes, node) {
       console.log(selected, selectedNodes, node);
-      if (selected && selectedNodes.node.parent != undefined) {
-      }
-      if (selectedNodes.node.parent == undefined) {
-        subjectTrees.value.expandedKeys = [selectedNodes.node.key];
-      }
+      formState.org_id_a1 = selected.length>0 ? selectedNodes.node.key : '';
+      loadData();
     }
+    const showDoc = (id) => {
+      get('wellInfo/getWellDocumentList', {wellId: id}).then(data => {
+        docList.value = data;
+        isShowDoc.value = true;
+      })
+    };
     const labelCol = {style: {width: '100px'}};
+
     return {
       route, selectedRowKeys, columns, loading, activeTab, showTree, onSelectChange, data,
       expand, onQuery, loadData, onRangeChange, showQuery, wellTypeList, replaceFields,
-      formRef,
-      formState,
-      labelCol,
+      formRef, viewModel, handleTableChange, detail,
+      formState, isShowDoc, showDoc, docList,
+      labelCol, getTdColor,
       tabChange,
       treeOnExpand,
       subjectTrees,
@@ -349,16 +465,7 @@ export default defineComponent({
   }
 });
 </script>
-
-<style lang="less" scoped>
-.ant-form-item {
-  margin: 0 0 10px !important;
-}
-
-.ant-form-item-label label {
-  width: 100% !important;
-  background-color: #2dd36f;
-}
+<style lang="less">
 
 .query-index {
   display: flex;
@@ -394,6 +501,10 @@ export default defineComponent({
 .query-index-table {
   flex-grow: 1;
   display: flex;
+
+  .ant-row{
+    width:100%;
+  }
 }
 
 .query-index-tabs {
@@ -427,8 +538,48 @@ export default defineComponent({
   max-height: 600px;
 }
 
-.query-index-row {
+.col-text {
+  padding-right: 0px !important;
+  text-align: right;
+  font-weight: bold;
+}
+
+.col-content {
+  width: 200px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ant-card-body {
+  padding: 10px;
+}
+
+.well-card-table {
+  th {
+    width: 25%;
+    text-align: right;
+  }
+
+  td {
+    width: 25%;
+    text-align: left;
+  }
+}
+
+.color_level1, .color_level1:hover {
+}
+
+.color_level2, .color_level2:hover {
+  background-color: #EAF4FF !important;
+}
+
+.color_level3, .color_level3:hover {
+  background-color: #D5EAFF;
+}
 
+.color_level4, .color_level4:hover {
+  background-color: #B7DBFF;
 }
 </style>