Преглед на файлове

新安江流域模块后台数据管理功能

dumingliang преди 1 ден
родител
ревизия
895d49b42d
променени са 34 файла, в които са добавени 3524 реда и са изтрити 0 реда
  1. 172 0
      gw-admin/src/main/java/com/goldenwater/web/controller/xajgl/StXajBController.java
  2. 73 0
      gw-admin/src/main/java/com/goldenwater/web/controller/xajgl/StXajDataController.java
  3. 122 0
      gw-admin/src/main/java/com/goldenwater/web/controller/xajgl/StXajPdmmController.java
  4. 34 0
      gw-gx/src/main/java/com/goldenwater/xajgl/domain/StSkQx.java
  5. 90 0
      gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajB.java
  6. 71 0
      gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajData.java
  7. 46 0
      gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajPdmm.java
  8. 90 0
      gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajSkB.java
  9. 22 0
      gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StSkQxMapper.java
  10. 26 0
      gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajBMapper.java
  11. 24 0
      gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajDataMapper.java
  12. 44 0
      gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajPdmmMapper.java
  13. 22 0
      gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajSkBMapper.java
  14. 19 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/IStSkQxService.java
  15. 25 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajBService.java
  16. 19 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajDataService.java
  17. 41 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajPdmmService.java
  18. 19 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajSkBService.java
  19. 36 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StSkQxServiceImpl.java
  20. 60 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajBServiceImpl.java
  21. 36 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajDataServiceImpl.java
  22. 61 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajPdmmServiceImpl.java
  23. 40 0
      gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajSkBServiceImpl.java
  24. 58 0
      gw-gx/src/main/resources/mapper/xajgl/StSkQxMapper.xml
  25. 172 0
      gw-gx/src/main/resources/mapper/xajgl/StXajBMapper.xml
  26. 83 0
      gw-gx/src/main/resources/mapper/xajgl/StXajDataMapper.xml
  27. 115 0
      gw-gx/src/main/resources/mapper/xajgl/StXajPdmmMapper.xml
  28. 138 0
      gw-gx/src/main/resources/mapper/xajgl/StXajSkBMapper.xml
  29. 38 0
      gw-ui/src/api/xajgl/data.js
  30. 76 0
      gw-ui/src/api/xajgl/pdmm.js
  31. 103 0
      gw-ui/src/api/xajgl/station.js
  32. 260 0
      gw-ui/src/views/xajgl/data/index.vue
  33. 450 0
      gw-ui/src/views/xajgl/pdmm/index.vue
  34. 839 0
      gw-ui/src/views/xajgl/station/index.vue

+ 172 - 0
gw-admin/src/main/java/com/goldenwater/web/controller/xajgl/StXajBController.java

@@ -0,0 +1,172 @@
+package com.goldenwater.web.controller.xajgl;
+
+import com.goldenwater.common.core.controller.BaseController;
+import com.goldenwater.common.core.domain.AjaxResult;
+import com.goldenwater.common.core.page.TableDataInfo;
+import com.goldenwater.common.utils.poi.ExcelUtil;
+import com.goldenwater.xajgl.domain.StSkQx;
+import com.goldenwater.xajgl.domain.StXajB;
+import com.goldenwater.xajgl.domain.StXajData;
+import com.goldenwater.xajgl.domain.StXajSkB;
+import com.goldenwater.xajgl.service.IStSkQxService;
+import com.goldenwater.xajgl.service.IStXajBService;
+import com.goldenwater.xajgl.service.IStXajDataService;
+import com.goldenwater.xajgl.service.IStXajSkBService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 新安江站点信息管理Controller
+ */
+@RestController
+@RequestMapping("/xajgl/station")
+@Tag(name = "新安江站点信息管理", description = "新安江站点信息管理接口")
+public class StXajBController extends BaseController {
+
+    @Resource
+    private IStXajBService stXajBService;
+
+    @Resource
+    private IStXajSkBService stXajSkBService;
+
+    @Resource
+    private IStSkQxService stSkQxService;
+
+    @Resource
+    private IStXajDataService stXajDataService;
+
+    /**
+     * 查询新安江站点列表
+     */
+    @GetMapping("/list")
+    @Operation(summary = "查询站点列表", description = "分页查询新安江站点列表")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:list')")
+    public TableDataInfo list(StXajB stXajB) {
+        startPage();
+        List<StXajB> list = stXajBService.selectStXajBList(stXajB);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询新安江站点详情
+     */
+    @GetMapping("/detail")
+    @Operation(summary = "查询站点详情", description = "根据站码查询站点基础信息")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:query')")
+    public AjaxResult detail(@Parameter(description = "测站代码") @RequestParam("stcd") String stcd) {
+        return AjaxResult.success(stXajBService.selectStXajBByStcd(stcd));
+    }
+
+    /**
+     * 查询新安江水库基础信息
+     */
+    @GetMapping("/skDetail")
+    @Operation(summary = "查询水库基础信息", description = "根据站码查询水库基础信息(当tp=SK时)")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:query')")
+    public AjaxResult skDetail(@Parameter(description = "测站代码") @RequestParam("stcd") String stcd) {
+        return AjaxResult.success(stXajSkBService.selectStXajSkBByStcd(stcd));
+    }
+
+    /**
+     * 查询库容曲线列表(用于图表)
+     */
+    @GetMapping("/qxList")
+    @Operation(summary = "查询库容曲线列表", description = "根据站码查询库容曲线列表,用于图表展示")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:query')")
+    public AjaxResult qxList(@Parameter(description = "测站代码") @RequestParam("stcd") String stcd) {
+        List<StSkQx> list = stSkQxService.selectStSkQxListByStcd(stcd);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 查询监测数据(用于图表)
+     */
+    @GetMapping("/dataList")
+    @Operation(summary = "查询监测数据", description = "根据站码和时间范围查询监测数据,用于图表展示")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:query')")
+    public AjaxResult dataList(
+            @Parameter(description = "测站代码") @RequestParam("stcd") String stcd,
+            @Parameter(description = "开始时间") @RequestParam(value = "startTm", required = false) String startTm,
+            @Parameter(description = "结束时间") @RequestParam(value = "endTm", required = false) String endTm) {
+        List<StXajData> list = stXajDataService.selectStXajDataByStcd(stcd, startTm, endTm);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 新增新安江站点
+     */
+    @PostMapping
+    @Operation(summary = "新增站点", description = "新增新安江站点")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:add')")
+    public AjaxResult add(@RequestBody StXajB stXajB) {
+        return toAjax(stXajBService.insertStXajB(stXajB));
+    }
+
+    /**
+     * 修改新安江站点
+     */
+    @PutMapping
+    @Operation(summary = "修改站点", description = "修改新安江站点")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:edit')")
+    public AjaxResult edit(@RequestBody StXajB stXajB) {
+        return toAjax(stXajBService.updateStXajB(stXajB));
+    }
+
+    /**
+     * 删除新安江站点
+     */
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除站点", description = "删除新安江站点")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:remove')")
+    public AjaxResult remove(@RequestBody StXajB stXajB) {
+        return toAjax(stXajBService.deleteStXajBByStcd(stXajB.getStcd()));
+    }
+
+    /**
+     * 导出新安江站点
+     */
+    @GetMapping("/export")
+    @Operation(summary = "导出站点", description = "导出新安江站点数据")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:export')")
+    public void export(HttpServletResponse response, StXajB stXajB) {
+        List<StXajB> list = stXajBService.selectStXajBList(stXajB);
+        ExcelUtil<StXajB> util = new ExcelUtil<StXajB>(StXajB.class);
+        util.exportExcel(response, list, "新安江站点数据");
+    }
+
+    /**
+     * 导入新安江站点
+     */
+    @PostMapping("/import")
+    @Operation(summary = "导入站点", description = "导入新安江站点数据")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:import')")
+    public AjaxResult importData(@RequestParam("file") MultipartFile file) throws Exception {
+        ExcelUtil<StXajB> util = new ExcelUtil<StXajB>(StXajB.class);
+        List<StXajB> list = util.importExcel(file.getInputStream());
+        if (list == null || list.isEmpty()) {
+            return AjaxResult.error("导入数据为空");
+        }
+        stXajBService.importStation(list);
+        return AjaxResult.success("导入成功,共导入" + list.size() + "条数据");
+    }
+
+    /**
+     * 下载新安江站点导入模板
+     */
+    @GetMapping("/importTemplate")
+    @Operation(summary = "下载导入模板", description = "下载新安江站点导入模板")
+    @PreAuthorize("@ss.hasPermi('xajgl:station:import')")
+    public void importTemplate(HttpServletResponse response) {
+        ExcelUtil<StXajB> util = new ExcelUtil<StXajB>(StXajB.class);
+        util.exportExcel(response, new ArrayList<StXajB>(), "新安江站点导入模板");
+    }
+}

+ 73 - 0
gw-admin/src/main/java/com/goldenwater/web/controller/xajgl/StXajDataController.java

@@ -0,0 +1,73 @@
+package com.goldenwater.web.controller.xajgl;
+
+import com.goldenwater.common.core.controller.BaseController;
+import com.goldenwater.common.core.domain.AjaxResult;
+import com.goldenwater.common.core.page.TableDataInfo;
+import com.goldenwater.common.utils.poi.ExcelUtil;
+import com.goldenwater.xajgl.domain.StXajData;
+import com.goldenwater.xajgl.service.IStXajDataService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * 新安江监测数据管理Controller
+ */
+@RestController
+@RequestMapping("/xajgl/data")
+@Tag(name = "新安江监测数据管理", description = "新安江监测数据管理接口")
+public class StXajDataController extends BaseController {
+
+    @Resource
+    private IStXajDataService stXajDataService;
+
+    /**
+     * 查询新安江监测数据列表
+     */
+    @GetMapping("/list")
+    @Operation(summary = "查询监测数据列表", description = "分页查询新安江监测数据列表,支持stcd、bizCode、startTm、endTm参数")
+    @PreAuthorize("@ss.hasPermi('xajgl:data:list')")
+    public TableDataInfo list(StXajData stXajData) {
+        startPage();
+        List<StXajData> list = stXajDataService.selectStXajDataList(stXajData);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询所有监测数据(不分页,用于图表)
+     */
+    @GetMapping("/listAll")
+    @Operation(summary = "查询所有监测数据", description = "不分页查询监测数据,用于图表展示")
+    @PreAuthorize("@ss.hasPermi('xajgl:data:list')")
+    public AjaxResult listAll(StXajData stXajData) {
+        List<StXajData> list = stXajDataService.selectStXajDataList(stXajData);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 删除新安江监测数据
+     */
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除监测数据", description = "删除新安江监测数据")
+    @PreAuthorize("@ss.hasPermi('xajgl:data:remove')")
+    public AjaxResult remove(@RequestBody StXajData stXajData) {
+        return toAjax(stXajDataService.deleteStXajDataByStcd(stXajData.getStcd()));
+    }
+
+    /**
+     * 导出新安江监测数据
+     */
+    @GetMapping("/export")
+    @Operation(summary = "导出监测数据", description = "导出新安江监测数据Excel文件")
+    @PreAuthorize("@ss.hasPermi('xajgl:data:export')")
+    public void export(HttpServletResponse response, StXajData stXajData) {
+        List<StXajData> list = stXajDataService.selectStXajDataList(stXajData);
+        ExcelUtil<StXajData> util = new ExcelUtil<StXajData>(StXajData.class);
+        util.exportExcel(response, list, "新安江监测数据");
+    }
+}

+ 122 - 0
gw-admin/src/main/java/com/goldenwater/web/controller/xajgl/StXajPdmmController.java

@@ -0,0 +1,122 @@
+package com.goldenwater.web.controller.xajgl;
+
+import com.goldenwater.common.core.controller.BaseController;
+import com.goldenwater.common.core.domain.AjaxResult;
+import com.goldenwater.common.core.page.TableDataInfo;
+import com.goldenwater.common.utils.poi.ExcelUtil;
+import com.goldenwater.xajgl.domain.StXajPdmm;
+import com.goldenwater.xajgl.service.IStXajPdmmService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 新安江特征值数据管理Controller
+ */
+@RestController
+@RequestMapping("/xajgl/pdmm")
+@Tag(name = "新安江特征值数据管理", description = "新安江特征值数据管理接口")
+public class StXajPdmmController extends BaseController {
+
+    @Resource
+    private IStXajPdmmService stXajPdmmService;
+
+    /**
+     * 查询新安江特征值数据列表
+     */
+    @GetMapping("/list")
+    @Operation(summary = "查询特征值列表", description = "分页查询新安江特征值数据列表")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:list')")
+    public TableDataInfo list(StXajPdmm stXajPdmm) {
+        startPage();
+        List<StXajPdmm> list = stXajPdmmService.selectStXajPdmmList(stXajPdmm);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询新安江特征值数据详情
+     */
+    @GetMapping("/detail")
+    @Operation(summary = "查询特征值详情", description = "根据站码查询特征值数据详情")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:query')")
+    public AjaxResult detail(@Parameter(description = "测站代码") @RequestParam("stcd") String stcd) {
+        return AjaxResult.success(stXajPdmmService.selectStXajPdmmByStcd(stcd));
+    }
+
+    /**
+     * 新增新安江特征值数据
+     */
+    @PostMapping
+    @Operation(summary = "新增特征值", description = "新增新安江特征值数据")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:add')")
+    public AjaxResult add(@RequestBody StXajPdmm stXajPdmm) {
+        return toAjax(stXajPdmmService.insertStXajPdmm(stXajPdmm));
+    }
+
+    /**
+     * 修改新安江特征值数据
+     */
+    @PutMapping
+    @Operation(summary = "修改特征值", description = "修改新安江特征值数据")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:edit')")
+    public AjaxResult edit(@RequestBody StXajPdmm stXajPdmm) {
+        return toAjax(stXajPdmmService.updateStXajPdmm(stXajPdmm));
+    }
+
+    /**
+     * 删除新安江特征值数据
+     */
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除特征值", description = "删除新安江特征值数据")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:remove')")
+    public AjaxResult remove(@RequestBody StXajPdmm stXajPdmm) {
+        return toAjax(stXajPdmmService.deleteStXajPdmmByStcd(stXajPdmm.getStcd()));
+    }
+
+    /**
+     * 导出新安江特征值数据
+     */
+    @GetMapping("/export")
+    @Operation(summary = "导出特征值", description = "导出新安江特征值数据Excel文件")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:export')")
+    public void export(HttpServletResponse response, StXajPdmm stXajPdmm) {
+        List<StXajPdmm> list = stXajPdmmService.selectStXajPdmmList(stXajPdmm);
+        ExcelUtil<StXajPdmm> util = new ExcelUtil<StXajPdmm>(StXajPdmm.class);
+        util.exportExcel(response, list, "新安江特征值数据");
+    }
+
+    /**
+     * 导入新安江特征值数据
+     */
+    @PostMapping("/import")
+    @Operation(summary = "导入特征值", description = "导入新安江特征值数据Excel文件")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:import')")
+    public AjaxResult importData(@RequestParam("file") MultipartFile file) throws Exception {
+        ExcelUtil<StXajPdmm> util = new ExcelUtil<StXajPdmm>(StXajPdmm.class);
+        List<StXajPdmm> list = util.importExcel(file.getInputStream());
+        if (list == null || list.isEmpty()) {
+            return AjaxResult.error("导入数据为空");
+        }
+        stXajPdmmService.importPdmm(list);
+        return AjaxResult.success("导入成功,共导入" + list.size() + "条数据");
+    }
+
+    /**
+     * 下载新安江特征值导入模板
+     */
+    @GetMapping("/importTemplate")
+    @Operation(summary = "下载导入模板", description = "下载新安江特征值数据导入模板")
+    @PreAuthorize("@ss.hasPermi('xajgl:pdmm:import')")
+    public void importTemplate(HttpServletResponse response) {
+        ExcelUtil<StXajPdmm> util = new ExcelUtil<StXajPdmm>(StXajPdmm.class);
+        util.exportExcel(response, new ArrayList<StXajPdmm>(), "新安江特征值导入模板");
+    }
+}

+ 34 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/domain/StSkQx.java

@@ -0,0 +1,34 @@
+package com.goldenwater.xajgl.domain;
+
+import com.goldenwater.common.annotation.Excel;
+import com.goldenwater.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 库容曲线对象 ST_SK_QX
+ *
+ * @author xajgl
+ */
+@Data
+public class StSkQx extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 站码 */
+    @Excel(name = "站码")
+    private String stcd;
+
+    /** 水位[m] */
+    @Excel(name = "水位")
+    private BigDecimal rz;
+
+    /** 面积[km2] */
+    @Excel(name = "面积")
+    private BigDecimal area;
+
+    /** 库容[万方] */
+    @Excel(name = "库容")
+    private BigDecimal kr;
+}

+ 90 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajB.java

@@ -0,0 +1,90 @@
+package com.goldenwater.xajgl.domain;
+
+import com.goldenwater.common.annotation.Excel;
+import com.goldenwater.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 站点基础信息对象 ST_XAJ_B
+ *
+ * @author xajgl
+ */
+@Data
+public class StXajB extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 站码 */
+    @Excel(name = "站码")
+    private String stcd;
+
+    /** 站名 */
+    @Excel(name = "站名")
+    private String stnm;
+
+    /** 类型:ZZ:水文站,DRP:雨量站,WIU:取水户,SK:水库 */
+    @Excel(name = "类型")
+    private String tp;
+
+    /** 经度 */
+    @Excel(name = "经度")
+    private BigDecimal lgtd;
+
+    /** 纬度 */
+    @Excel(name = "纬度")
+    private BigDecimal lttd;
+
+    /** 省份 */
+    @Excel(name = "省份")
+    private String prov;
+
+    /** 地市名称 */
+    @Excel(name = "地市名称")
+    private String city;
+
+    /** 区县名称 */
+    @Excel(name = "区县名称")
+    private String county;
+
+    /** 河流名称 */
+    @Excel(name = "河流名称")
+    private String rvnm;
+
+    /** 行政区划编码 */
+    @Excel(name = "行政区划编码")
+    private String addvcd;
+
+    /** 业务域编码 */
+    @Excel(name = "业务域编码")
+    private String bizCode;
+
+    /** 社会信用编码 */
+    @Excel(name = "社会信用编码")
+    private String uscc;
+
+    /** 经济类型 */
+    @Excel(name = "经济类型")
+    private String tradTp;
+
+    /** 共享单位 */
+    @Excel(name = "共享单位")
+    private String unit;
+
+    /** 顺序 */
+    @Excel(name = "顺序")
+    private BigDecimal orderNm;
+
+    /** x轴偏差 */
+    @Excel(name = "x轴偏差")
+    private BigDecimal xoffset;
+
+    /** y轴偏差 */
+    @Excel(name = "y轴偏差")
+    private BigDecimal yoffset;
+
+    /** 区县分类 */
+    @Excel(name = "区县分类")
+    private String county1;
+}

+ 71 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajData.java

@@ -0,0 +1,71 @@
+package com.goldenwater.xajgl.domain;
+
+import com.goldenwater.common.annotation.Excel;
+import com.goldenwater.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 监测数据对象 ST_XAJ_DATA
+ *
+ * @author xajgl
+ */
+@Data
+public class StXajData extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 站码 */
+    @Excel(name = "站码")
+    private String stcd;
+
+    /** 站名(关联ST_XAJ_B查询) */
+    @Excel(name = "站名")
+    private String stnm;
+
+    /** 监测时间 */
+    @Excel(name = "监测时间", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date tm;
+
+    /** 降雨量 */
+    @Excel(name = "降雨量")
+    private BigDecimal drp;
+
+    /** 水位/坝上水位 */
+    @Excel(name = "水位")
+    private BigDecimal z;
+
+    /** 流量 */
+    @Excel(name = "流量")
+    private BigDecimal q;
+
+    /** 蒸发 */
+    @Excel(name = "蒸发")
+    private BigDecimal dyp;
+
+    /** 坝下水位 */
+    @Excel(name = "坝下水位")
+    private BigDecimal dwz;
+
+    /** 入库流量 */
+    @Excel(name = "入库流量")
+    private BigDecimal inq;
+
+    /** 出库流量 */
+    @Excel(name = "出库流量")
+    private BigDecimal outq;
+
+    /** 下泄水量(万立方米) */
+    @Excel(name = "下泄水量")
+    private BigDecimal ww;
+
+    /** 业务域编码 */
+    @Excel(name = "业务域编码")
+    private String bizCode;
+
+    /** 蓄水量 */
+    @Excel(name = "蓄水量")
+    private BigDecimal w;
+}

+ 46 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajPdmm.java

@@ -0,0 +1,46 @@
+package com.goldenwater.xajgl.domain;
+
+import com.goldenwater.common.annotation.Excel;
+import com.goldenwater.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 新安江特征值数据对象 ST_XAJ_PDMM
+ */
+@Data
+public class StXajPdmm extends BaseEntity {
+
+    @Excel(name = "站码")
+    private String stcd;
+
+    @Excel(name = "多年平均水位")
+    private BigDecimal zPj;
+
+    @Excel(name = "历史最高水位")
+    private BigDecimal zMax;
+
+    @Excel(name = "历史最低水位")
+    private BigDecimal zMin;
+
+    @Excel(name = "多年平均-月份")
+    private String month;
+
+    @Excel(name = "多年平均-日期")
+    private String day;
+
+    @Excel(name = "降雨量")
+    private BigDecimal drp;
+
+    @Excel(name = "名称")
+    private String stnm;
+
+    @Excel(name = "多年平均水量(万立方米)")
+    private BigDecimal ww;
+
+    @Excel(name = "季度")
+    private String quarter;
+
+    private String delFlag;
+}

+ 90 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/domain/StXajSkB.java

@@ -0,0 +1,90 @@
+package com.goldenwater.xajgl.domain;
+
+import com.goldenwater.common.annotation.Excel;
+import com.goldenwater.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 水库基础信息对象 ST_XAJ_SK_B
+ *
+ * @author xajgl
+ */
+@Data
+public class StXajSkB extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 编码 */
+    @Excel(name = "编码")
+    private String stcd;
+
+    /** 水库类型 */
+    @Excel(name = "水库类型")
+    private String skTp;
+
+    /** 建设地点 */
+    @Excel(name = "建设地点")
+    private String stlc;
+
+    /** 多年平均径流量[亿方] */
+    @Excel(name = "多年平均径流量")
+    private BigDecimal qPj;
+
+    /** 所在河流 */
+    @Excel(name = "所在河流")
+    private String rvnm;
+
+    /** 集水面积[km2] */
+    @Excel(name = "集水面积")
+    private BigDecimal stArea;
+
+    /** 总库容[万方] */
+    @Excel(name = "总库容")
+    private BigDecimal kr;
+
+    /** 年调节库容[万方] */
+    @Excel(name = "年调节库容")
+    private BigDecimal krYr;
+
+    /** 有效库容[万方] */
+    @Excel(name = "有效库容")
+    private BigDecimal krEffect;
+
+    /** 死库容[万方] */
+    @Excel(name = "死库容")
+    private BigDecimal krDead;
+
+    /** 校核洪水位[m] */
+    @Excel(name = "校核洪水位")
+    private BigDecimal zHs;
+
+    /** 正常高水位[m] */
+    @Excel(name = "正常高水位")
+    private BigDecimal zH;
+
+    /** 汛限水位[m] */
+    @Excel(name = "汛限水位")
+    private BigDecimal zWr;
+
+    /** 年消落水位[m] */
+    @Excel(name = "年消落水位")
+    private BigDecimal zL;
+
+    /** 极限消落水位[m] */
+    @Excel(name = "极限消落水位")
+    private BigDecimal zJx;
+
+    /** 高程系统 */
+    @Excel(name = "高程系统")
+    private String gc;
+
+    /** 死水位 */
+    @Excel(name = "死水位")
+    private BigDecimal zDead;
+
+    /** 正常蓄水位 */
+    @Excel(name = "正常蓄水位")
+    private BigDecimal zX;
+}

+ 22 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StSkQxMapper.java

@@ -0,0 +1,22 @@
+package com.goldenwater.xajgl.mapper;
+
+import com.goldenwater.xajgl.domain.StSkQx;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 库容曲线Mapper接口
+ *
+ * @author xajgl
+ */
+@Mapper
+public interface StSkQxMapper {
+
+    List<StSkQx> selectStSkQxListByStcd(@Param("stcd") String stcd);
+
+    int insertStSkQx(StSkQx stSkQx);
+
+    int deleteStSkQxByStcd(@Param("stcd") String stcd);
+}

+ 26 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajBMapper.java

@@ -0,0 +1,26 @@
+package com.goldenwater.xajgl.mapper;
+
+import com.goldenwater.xajgl.domain.StXajB;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 站点基础信息Mapper接口
+ *
+ * @author xajgl
+ */
+@Mapper
+public interface StXajBMapper {
+
+    List<StXajB> selectStXajBList(StXajB stXajB);
+
+    StXajB selectStXajBByStcd(@Param("stcd") String stcd);
+
+    int insertStXajB(StXajB stXajB);
+
+    int updateStXajB(StXajB stXajB);
+
+    int deleteStXajBByStcd(@Param("stcd") String stcd);
+}

+ 24 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajDataMapper.java

@@ -0,0 +1,24 @@
+package com.goldenwater.xajgl.mapper;
+
+import com.goldenwater.xajgl.domain.StXajData;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 监测数据Mapper接口
+ *
+ * @author xajgl
+ */
+@Mapper
+public interface StXajDataMapper {
+
+    List<StXajData> selectStXajDataList(StXajData stXajData);
+
+    List<StXajData> selectStXajDataByStcd(@Param("stcd") String stcd,
+                                          @Param("startTm") String startTm,
+                                          @Param("endTm") String endTm);
+
+    int deleteStXajDataByStcd(@Param("stcd") String stcd);
+}

+ 44 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajPdmmMapper.java

@@ -0,0 +1,44 @@
+package com.goldenwater.xajgl.mapper;
+
+import com.goldenwater.xajgl.domain.StXajPdmm;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 新安江特征值数据Mapper接口
+ */
+@Mapper
+public interface StXajPdmmMapper {
+
+    /**
+     * 查询新安江特征值数据列表
+     */
+    List<StXajPdmm> selectStXajPdmmList(StXajPdmm stXajPdmm);
+
+    /**
+     * 根据站码查询新安江特征值数据
+     */
+    StXajPdmm selectStXajPdmmByStcd(@Param("stcd") String stcd);
+
+    /**
+     * 新增新安江特征值数据
+     */
+    int insertStXajPdmm(StXajPdmm stXajPdmm);
+
+    /**
+     * 修改新安江特征值数据
+     */
+    int updateStXajPdmm(StXajPdmm stXajPdmm);
+
+    /**
+     * 根据站码删除新安江特征值数据
+     */
+    int deleteStXajPdmmByStcd(@Param("stcd") String stcd);
+
+    /**
+     * 批量导入新安江特征值数据
+     */
+    int importPdmm(@Param("list") List<StXajPdmm> list);
+}

+ 22 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/mapper/StXajSkBMapper.java

@@ -0,0 +1,22 @@
+package com.goldenwater.xajgl.mapper;
+
+import com.goldenwater.xajgl.domain.StXajSkB;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 水库基础信息Mapper接口
+ *
+ * @author xajgl
+ */
+@Mapper
+public interface StXajSkBMapper {
+
+    StXajSkB selectStXajSkBByStcd(@Param("stcd") String stcd);
+
+    int insertStXajSkB(StXajSkB stXajSkB);
+
+    int updateStXajSkB(StXajSkB stXajSkB);
+
+    int deleteStXajSkBByStcd(@Param("stcd") String stcd);
+}

+ 19 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/IStSkQxService.java

@@ -0,0 +1,19 @@
+package com.goldenwater.xajgl.service;
+
+import com.goldenwater.xajgl.domain.StSkQx;
+
+import java.util.List;
+
+/**
+ * 库容曲线Service接口
+ *
+ * @author xajgl
+ */
+public interface IStSkQxService {
+
+    List<StSkQx> selectStSkQxListByStcd(String stcd);
+
+    int insertStSkQx(StSkQx stSkQx);
+
+    int deleteStSkQxByStcd(String stcd);
+}

+ 25 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajBService.java

@@ -0,0 +1,25 @@
+package com.goldenwater.xajgl.service;
+
+import com.goldenwater.xajgl.domain.StXajB;
+
+import java.util.List;
+
+/**
+ * 站点基础信息Service接口
+ *
+ * @author xajgl
+ */
+public interface IStXajBService {
+
+    List<StXajB> selectStXajBList(StXajB stXajB);
+
+    StXajB selectStXajBByStcd(String stcd);
+
+    int insertStXajB(StXajB stXajB);
+
+    int updateStXajB(StXajB stXajB);
+
+    int deleteStXajBByStcd(String stcd);
+
+    void importStation(List<StXajB> stationList);
+}

+ 19 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajDataService.java

@@ -0,0 +1,19 @@
+package com.goldenwater.xajgl.service;
+
+import com.goldenwater.xajgl.domain.StXajData;
+
+import java.util.List;
+
+/**
+ * 监测数据Service接口
+ *
+ * @author xajgl
+ */
+public interface IStXajDataService {
+
+    List<StXajData> selectStXajDataList(StXajData stXajData);
+
+    List<StXajData> selectStXajDataByStcd(String stcd, String startTm, String endTm);
+
+    int deleteStXajDataByStcd(String stcd);
+}

+ 41 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajPdmmService.java

@@ -0,0 +1,41 @@
+package com.goldenwater.xajgl.service;
+
+import com.goldenwater.xajgl.domain.StXajPdmm;
+
+import java.util.List;
+
+/**
+ * 新安江特征值数据Service接口
+ */
+public interface IStXajPdmmService {
+
+    /**
+     * 查询新安江特征值数据列表
+     */
+    List<StXajPdmm> selectStXajPdmmList(StXajPdmm stXajPdmm);
+
+    /**
+     * 根据站码查询新安江特征值数据
+     */
+    StXajPdmm selectStXajPdmmByStcd(String stcd);
+
+    /**
+     * 新增新安江特征值数据
+     */
+    int insertStXajPdmm(StXajPdmm stXajPdmm);
+
+    /**
+     * 修改新安江特征值数据
+     */
+    int updateStXajPdmm(StXajPdmm stXajPdmm);
+
+    /**
+     * 根据站码删除新安江特征值数据
+     */
+    int deleteStXajPdmmByStcd(String stcd);
+
+    /**
+     * 批量导入新安江特征值数据
+     */
+    void importPdmm(List<StXajPdmm> list);
+}

+ 19 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/IStXajSkBService.java

@@ -0,0 +1,19 @@
+package com.goldenwater.xajgl.service;
+
+import com.goldenwater.xajgl.domain.StXajSkB;
+
+/**
+ * 水库基础信息Service接口
+ *
+ * @author xajgl
+ */
+public interface IStXajSkBService {
+
+    StXajSkB selectStXajSkBByStcd(String stcd);
+
+    int insertStXajSkB(StXajSkB stXajSkB);
+
+    int updateStXajSkB(StXajSkB stXajSkB);
+
+    int deleteStXajSkBByStcd(String stcd);
+}

+ 36 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StSkQxServiceImpl.java

@@ -0,0 +1,36 @@
+package com.goldenwater.xajgl.service.impl;
+
+import com.goldenwater.xajgl.domain.StSkQx;
+import com.goldenwater.xajgl.mapper.StSkQxMapper;
+import com.goldenwater.xajgl.service.IStSkQxService;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * 库容曲线Service实现
+ *
+ * @author xajgl
+ */
+@Service("stSkQxService")
+public class StSkQxServiceImpl implements IStSkQxService {
+
+    @Resource
+    private StSkQxMapper stSkQxMapper;
+
+    @Override
+    public List<StSkQx> selectStSkQxListByStcd(String stcd) {
+        return stSkQxMapper.selectStSkQxListByStcd(stcd);
+    }
+
+    @Override
+    public int insertStSkQx(StSkQx stSkQx) {
+        return stSkQxMapper.insertStSkQx(stSkQx);
+    }
+
+    @Override
+    public int deleteStSkQxByStcd(String stcd) {
+        return stSkQxMapper.deleteStSkQxByStcd(stcd);
+    }
+}

+ 60 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajBServiceImpl.java

@@ -0,0 +1,60 @@
+package com.goldenwater.xajgl.service.impl;
+
+import com.goldenwater.xajgl.domain.StXajB;
+import com.goldenwater.xajgl.mapper.StXajBMapper;
+import com.goldenwater.xajgl.service.IStXajBService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * 站点基础信息Service实现
+ *
+ * @author xajgl
+ */
+@Service("stXajBService")
+public class StXajBServiceImpl implements IStXajBService {
+
+    @Resource
+    private StXajBMapper stXajBMapper;
+
+    @Override
+    public List<StXajB> selectStXajBList(StXajB stXajB) {
+        return stXajBMapper.selectStXajBList(stXajB);
+    }
+
+    @Override
+    public StXajB selectStXajBByStcd(String stcd) {
+        return stXajBMapper.selectStXajBByStcd(stcd);
+    }
+
+    @Override
+    public int insertStXajB(StXajB stXajB) {
+        return stXajBMapper.insertStXajB(stXajB);
+    }
+
+    @Override
+    public int updateStXajB(StXajB stXajB) {
+        return stXajBMapper.updateStXajB(stXajB);
+    }
+
+    @Override
+    public int deleteStXajBByStcd(String stcd) {
+        return stXajBMapper.deleteStXajBByStcd(stcd);
+    }
+
+    @Override
+    @Transactional
+    public void importStation(List<StXajB> stationList) {
+        for (StXajB station : stationList) {
+            StXajB existing = stXajBMapper.selectStXajBByStcd(station.getStcd());
+            if (existing != null) {
+                stXajBMapper.updateStXajB(station);
+            } else {
+                stXajBMapper.insertStXajB(station);
+            }
+        }
+    }
+}

+ 36 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajDataServiceImpl.java

@@ -0,0 +1,36 @@
+package com.goldenwater.xajgl.service.impl;
+
+import com.goldenwater.xajgl.domain.StXajData;
+import com.goldenwater.xajgl.mapper.StXajDataMapper;
+import com.goldenwater.xajgl.service.IStXajDataService;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * 监测数据Service实现
+ *
+ * @author xajgl
+ */
+@Service("stXajDataService")
+public class StXajDataServiceImpl implements IStXajDataService {
+
+    @Resource
+    private StXajDataMapper stXajDataMapper;
+
+    @Override
+    public List<StXajData> selectStXajDataList(StXajData stXajData) {
+        return stXajDataMapper.selectStXajDataList(stXajData);
+    }
+
+    @Override
+    public List<StXajData> selectStXajDataByStcd(String stcd, String startTm, String endTm) {
+        return stXajDataMapper.selectStXajDataByStcd(stcd, startTm, endTm);
+    }
+
+    @Override
+    public int deleteStXajDataByStcd(String stcd) {
+        return stXajDataMapper.deleteStXajDataByStcd(stcd);
+    }
+}

+ 61 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajPdmmServiceImpl.java

@@ -0,0 +1,61 @@
+package com.goldenwater.xajgl.service.impl;
+
+import com.goldenwater.xajgl.domain.StXajPdmm;
+import com.goldenwater.xajgl.mapper.StXajPdmmMapper;
+import com.goldenwater.xajgl.service.IStXajPdmmService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * 新安江特征值数据Service实现
+ */
+@Service("stXajPdmmService")
+public class StXajPdmmServiceImpl implements IStXajPdmmService {
+
+    @Resource
+    private StXajPdmmMapper stXajPdmmMapper;
+
+    @Override
+    public List<StXajPdmm> selectStXajPdmmList(StXajPdmm stXajPdmm) {
+        return stXajPdmmMapper.selectStXajPdmmList(stXajPdmm);
+    }
+
+    @Override
+    public StXajPdmm selectStXajPdmmByStcd(String stcd) {
+        return stXajPdmmMapper.selectStXajPdmmByStcd(stcd);
+    }
+
+    @Override
+    public int insertStXajPdmm(StXajPdmm stXajPdmm) {
+        return stXajPdmmMapper.insertStXajPdmm(stXajPdmm);
+    }
+
+    @Override
+    public int updateStXajPdmm(StXajPdmm stXajPdmm) {
+        return stXajPdmmMapper.updateStXajPdmm(stXajPdmm);
+    }
+
+    @Override
+    public int deleteStXajPdmmByStcd(String stcd) {
+        return stXajPdmmMapper.deleteStXajPdmmByStcd(stcd);
+    }
+
+    @Override
+    @Transactional
+    public void importPdmm(List<StXajPdmm> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        for (StXajPdmm item : list) {
+            StXajPdmm existing = stXajPdmmMapper.selectStXajPdmmByStcd(item.getStcd());
+            if (existing != null) {
+                stXajPdmmMapper.updateStXajPdmm(item);
+            } else {
+                stXajPdmmMapper.insertStXajPdmm(item);
+            }
+        }
+    }
+}

+ 40 - 0
gw-gx/src/main/java/com/goldenwater/xajgl/service/impl/StXajSkBServiceImpl.java

@@ -0,0 +1,40 @@
+package com.goldenwater.xajgl.service.impl;
+
+import com.goldenwater.xajgl.domain.StXajSkB;
+import com.goldenwater.xajgl.mapper.StXajSkBMapper;
+import com.goldenwater.xajgl.service.IStXajSkBService;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+
+/**
+ * 水库基础信息Service实现
+ *
+ * @author xajgl
+ */
+@Service("stXajSkBService")
+public class StXajSkBServiceImpl implements IStXajSkBService {
+
+    @Resource
+    private StXajSkBMapper stXajSkBMapper;
+
+    @Override
+    public StXajSkB selectStXajSkBByStcd(String stcd) {
+        return stXajSkBMapper.selectStXajSkBByStcd(stcd);
+    }
+
+    @Override
+    public int insertStXajSkB(StXajSkB stXajSkB) {
+        return stXajSkBMapper.insertStXajSkB(stXajSkB);
+    }
+
+    @Override
+    public int updateStXajSkB(StXajSkB stXajSkB) {
+        return stXajSkBMapper.updateStXajSkB(stXajSkB);
+    }
+
+    @Override
+    public int deleteStXajSkBByStcd(String stcd) {
+        return stXajSkBMapper.deleteStXajSkBByStcd(stcd);
+    }
+}

+ 58 - 0
gw-gx/src/main/resources/mapper/xajgl/StSkQxMapper.xml

@@ -0,0 +1,58 @@
+<?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.goldenwater.xajgl.mapper.StSkQxMapper">
+
+    <resultMap type="com.goldenwater.xajgl.domain.StSkQx" id="StSkQxResult">
+        <result property="stcd"     column="STCD"      />
+        <result property="rz"       column="RZ"        />
+        <result property="area"     column="AREA"      />
+        <result property="kr"       column="KR"        />
+        <result property="createBy"   column="CREATE_BY"  />
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy"   column="UPDATE_BY"  />
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="remark"     column="REMARK"     />
+    </resultMap>
+
+    <sql id="selectStSkQxVo">
+        select STCD,
+               CAST(NULLIF(TRIM(RZ), '') AS DECIMAL(15,3)) as RZ,
+               CAST(NULLIF(TRIM(AREA), '') AS DECIMAL(15,3)) as AREA,
+               CAST(NULLIF(TRIM(KR), '') AS DECIMAL(15,3)) as KR,
+               CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, REMARK
+        from ST_SK_QX
+    </sql>
+
+    <select id="selectStSkQxListByStcd" resultMap="StSkQxResult">
+        <include refid="selectStSkQxVo"/>
+        where STCD = #{stcd}
+        order by RZ asc
+    </select>
+
+    <insert id="insertStSkQx" parameterType="com.goldenwater.xajgl.domain.StSkQx">
+        insert into ST_SK_QX
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            STCD,
+            <if test="rz != null">RZ,</if>
+            <if test="area != null">AREA,</if>
+            <if test="kr != null">KR,</if>
+            <if test="createBy != null">CREATE_BY,</if>
+            CREATE_TIME,
+            <if test="remark != null">REMARK,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            #{stcd},
+            <if test="rz != null">#{rz},</if>
+            <if test="area != null">#{area},</if>
+            <if test="kr != null">#{kr},</if>
+            <if test="createBy != null">#{createBy},</if>
+            SYSDATE,
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+    <delete id="deleteStSkQxByStcd" parameterType="String">
+        delete from ST_SK_QX where STCD = #{stcd}
+    </delete>
+
+</mapper>

+ 172 - 0
gw-gx/src/main/resources/mapper/xajgl/StXajBMapper.xml

@@ -0,0 +1,172 @@
+<?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.goldenwater.xajgl.mapper.StXajBMapper">
+
+    <resultMap type="com.goldenwater.xajgl.domain.StXajB" id="StXajBResult">
+        <result property="stcd"     column="STCD"      />
+        <result property="stnm"     column="STNM"      />
+        <result property="tp"       column="TP"        />
+        <result property="lgtd"     column="LGTD"      />
+        <result property="lttd"     column="LTTD"      />
+        <result property="prov"     column="PROV"      />
+        <result property="city"     column="CITY"      />
+        <result property="county"   column="COUNTY"    />
+        <result property="rvnm"     column="RVNM"      />
+        <result property="addvcd"   column="ADDVCD"    />
+        <result property="bizCode"  column="BIZ_CODE"  />
+        <result property="uscc"     column="USCC"      />
+        <result property="tradTp"   column="TRAD_TP"  />
+        <result property="unit"     column="UNIT"      />
+        <result property="orderNm"  column="ORDER_NM"  />
+        <result property="xoffset"  column="XOFFSET"   />
+        <result property="yoffset"  column="YOFFSET"   />
+        <result property="county1"  column="COUNTY1"   />
+        <result property="createBy"   column="CREATE_BY"  />
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy"   column="UPDATE_BY"  />
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="remark"     column="REMARK"     />
+    </resultMap>
+
+    <sql id="selectStXajBVo">
+        select STCD, STNM, TP,
+               CAST(NULLIF(TRIM(LGTD), '') AS DECIMAL(15,6)) as LGTD,
+               CAST(NULLIF(TRIM(LTTD), '') AS DECIMAL(15,6)) as LTTD,
+               PROV, CITY, COUNTY, RVNM, ADDVCD, BIZ_CODE, USCC, TRAD_TP, UNIT,
+               CAST(NULLIF(TRIM(ORDER_NM), '') AS DECIMAL(15,3)) as ORDER_NM,
+               CAST(NULLIF(TRIM(XOFFSET), '') AS DECIMAL(15,3)) as XOFFSET,
+               CAST(NULLIF(TRIM(YOFFSET), '') AS DECIMAL(15,3)) as YOFFSET,
+               COUNTY1, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, REMARK
+        from ST_XAJ_B
+    </sql>
+
+    <select id="selectStXajBList" parameterType="com.goldenwater.xajgl.domain.StXajB" resultMap="StXajBResult">
+        <include refid="selectStXajBVo"/>
+        <where>
+            <if test="stcd != null and stcd != ''">
+                and STCD like concat('%', #{stcd}, '%')
+            </if>
+            <if test="stnm != null and stnm != ''">
+                and STNM like concat('%', #{stnm}, '%')
+            </if>
+            <if test="tp != null and tp != ''">
+                and TP = #{tp}
+            </if>
+            <if test="prov != null and prov != ''">
+                and PROV like concat('%', #{prov}, '%')
+            </if>
+            <if test="city != null and city != ''">
+                and CITY like concat('%', #{city}, '%')
+            </if>
+            <if test="county != null and county != ''">
+                and COUNTY like concat('%', #{county}, '%')
+            </if>
+            <if test="rvnm != null and rvnm != ''">
+                and RVNM like concat('%', #{rvnm}, '%')
+            </if>
+            <if test="addvcd != null and addvcd != ''">
+                and ADDVCD = #{addvcd}
+            </if>
+            <if test="bizCode != null and bizCode != ''">
+                and BIZ_CODE = #{bizCode}
+            </if>
+            <if test="uscc != null and uscc != ''">
+                and USCC = #{uscc}
+            </if>
+            <if test="unit != null and unit != ''">
+                and UNIT like concat('%', #{unit}, '%')
+            </if>
+            <if test="county1 != null and county1 != ''">
+                and COUNTY1 = #{county1}
+            </if>
+        </where>
+        order by ORDER_NM asc, STCD asc
+    </select>
+
+    <select id="selectStXajBByStcd" resultMap="StXajBResult">
+        <include refid="selectStXajBVo"/>
+        where STCD = #{stcd}
+    </select>
+
+    <insert id="insertStXajB" parameterType="com.goldenwater.xajgl.domain.StXajB">
+        insert into ST_XAJ_B
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            STCD,
+            <if test="stnm != null">STNM,</if>
+            <if test="tp != null">TP,</if>
+            <if test="lgtd != null">LGTD,</if>
+            <if test="lttd != null">LTTD,</if>
+            <if test="prov != null">PROV,</if>
+            <if test="city != null">CITY,</if>
+            <if test="county != null">COUNTY,</if>
+            <if test="rvnm != null">RVNM,</if>
+            <if test="addvcd != null">ADDVCD,</if>
+            <if test="bizCode != null">BIZ_CODE,</if>
+            <if test="uscc != null">USCC,</if>
+            <if test="tradTp != null">TRAD_TP,</if>
+            <if test="unit != null">UNIT,</if>
+            <if test="orderNm != null">ORDER_NM,</if>
+            <if test="xoffset != null">XOFFSET,</if>
+            <if test="yoffset != null">YOFFSET,</if>
+            <if test="county1 != null">COUNTY1,</if>
+            <if test="createBy != null">CREATE_BY,</if>
+            CREATE_TIME,
+            <if test="remark != null">REMARK,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            #{stcd},
+            <if test="stnm != null">#{stnm},</if>
+            <if test="tp != null">#{tp},</if>
+            <if test="lgtd != null">#{lgtd},</if>
+            <if test="lttd != null">#{lttd},</if>
+            <if test="prov != null">#{prov},</if>
+            <if test="city != null">#{city},</if>
+            <if test="county != null">#{county},</if>
+            <if test="rvnm != null">#{rvnm},</if>
+            <if test="addvcd != null">#{addvcd},</if>
+            <if test="bizCode != null">#{bizCode},</if>
+            <if test="uscc != null">#{uscc},</if>
+            <if test="tradTp != null">#{tradTp},</if>
+            <if test="unit != null">#{unit},</if>
+            <if test="orderNm != null">#{orderNm},</if>
+            <if test="xoffset != null">#{xoffset},</if>
+            <if test="yoffset != null">#{yoffset},</if>
+            <if test="county1 != null">#{county1},</if>
+            <if test="createBy != null">#{createBy},</if>
+            SYSDATE,
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+    <update id="updateStXajB" parameterType="com.goldenwater.xajgl.domain.StXajB">
+        update ST_XAJ_B
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="stnm != null">STNM = #{stnm},</if>
+            <if test="tp != null">TP = #{tp},</if>
+            <if test="lgtd != null">LGTD = #{lgtd},</if>
+            <if test="lttd != null">LTTD = #{lttd},</if>
+            <if test="prov != null">PROV = #{prov},</if>
+            <if test="city != null">CITY = #{city},</if>
+            <if test="county != null">COUNTY = #{county},</if>
+            <if test="rvnm != null">RVNM = #{rvnm},</if>
+            <if test="addvcd != null">ADDVCD = #{addvcd},</if>
+            <if test="bizCode != null">BIZ_CODE = #{bizCode},</if>
+            <if test="uscc != null">USCC = #{uscc},</if>
+            <if test="tradTp != null">TRAD_TP = #{tradTp},</if>
+            <if test="unit != null">UNIT = #{unit},</if>
+            <if test="orderNm != null">ORDER_NM = #{orderNm},</if>
+            <if test="xoffset != null">XOFFSET = #{xoffset},</if>
+            <if test="yoffset != null">YOFFSET = #{yoffset},</if>
+            <if test="county1 != null">COUNTY1 = #{county1},</if>
+            <if test="updateBy != null">UPDATE_BY = #{updateBy},</if>
+            UPDATE_TIME = SYSDATE,
+            <if test="remark != null">REMARK = #{remark},</if>
+        </trim>
+        where STCD = #{stcd}
+    </update>
+
+    <delete id="deleteStXajBByStcd" parameterType="String">
+        delete from ST_XAJ_B where STCD = #{stcd}
+    </delete>
+
+</mapper>

+ 83 - 0
gw-gx/src/main/resources/mapper/xajgl/StXajDataMapper.xml

@@ -0,0 +1,83 @@
+<?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.goldenwater.xajgl.mapper.StXajDataMapper">
+
+    <resultMap type="com.goldenwater.xajgl.domain.StXajData" id="StXajDataResult">
+        <result property="stcd"     column="STCD"      />
+        <result property="stnm"     column="STNM"      />
+        <result property="tm"       column="TM"        />
+        <result property="drp"      column="DRP"       />
+        <result property="z"        column="Z"         />
+        <result property="q"        column="Q"         />
+        <result property="dyp"      column="DYP"       />
+        <result property="dwz"      column="DWZ"       />
+        <result property="inq"      column="INQ"       />
+        <result property="outq"     column="OUTQ"      />
+        <result property="ww"       column="WW"        />
+        <result property="bizCode"  column="BIZ_CODE"  />
+        <result property="w"        column="W"         />
+        <result property="createBy"   column="CREATE_BY"  />
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy"   column="UPDATE_BY"  />
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="remark"     column="REMARK"     />
+    </resultMap>
+
+    <sql id="selectStXajDataVo">
+        select d.STCD, d.TM,
+               b.STNM,
+               CAST(NULLIF(TRIM(d.DRP), '') AS DECIMAL(15,3)) as DRP,
+               CAST(NULLIF(TRIM(d.Z), '') AS DECIMAL(15,3)) as Z,
+               CAST(NULLIF(TRIM(d.Q), '') AS DECIMAL(15,3)) as Q,
+               CAST(NULLIF(TRIM(d.DYP), '') AS DECIMAL(15,3)) as DYP,
+               CAST(NULLIF(TRIM(d.DWZ), '') AS DECIMAL(15,3)) as DWZ,
+               CAST(NULLIF(TRIM(d.INQ), '') AS DECIMAL(15,3)) as INQ,
+               CAST(NULLIF(TRIM(d.OUTQ), '') AS DECIMAL(15,3)) as OUTQ,
+               CAST(NULLIF(TRIM(d.WW), '') AS DECIMAL(15,3)) as WW,
+               d.BIZ_CODE,
+               CAST(NULLIF(TRIM(d.W), '') AS DECIMAL(15,3)) as W,
+               d.CREATE_BY, d.CREATE_TIME, d.UPDATE_BY, d.UPDATE_TIME, d.REMARK
+        from ST_XAJ_DATA d
+        left join ST_XAJ_B b on d.STCD = b.STCD
+    </sql>
+
+    <select id="selectStXajDataList" parameterType="com.goldenwater.xajgl.domain.StXajData" resultMap="StXajDataResult">
+        <include refid="selectStXajDataVo"/>
+        <where>
+            <if test="stcd != null and stcd != ''">
+                and d.STCD like concat('%', #{stcd}, '%')
+            </if>
+            <if test="bizCode != null and bizCode != ''">
+                and d.BIZ_CODE = #{bizCode}
+            </if>
+            <if test="params.beginTime != null and params.beginTime != ''">
+                and d.TM &gt;= TO_DATE(#{params.beginTime}, 'YYYY-MM-DD HH24:MI:SS')
+            </if>
+            <if test="params.endTime != null and params.endTime != ''">
+                and d.TM &lt;= TO_DATE(CONCAT(#{params.endTime}, ' 23:59:59'), 'YYYY-MM-DD HH24:MI:SS')
+            </if>
+        </where>
+        order by d.TM desc
+    </select>
+
+    <select id="selectStXajDataByStcd" resultMap="StXajDataResult">
+        <include refid="selectStXajDataVo"/>
+        <where>
+            <if test="stcd != null and stcd != ''">
+                and d.STCD = #{stcd}
+            </if>
+            <if test="startTm != null and startTm != ''">
+                and d.TM &gt;= TO_DATE(#{startTm}, 'YYYY-MM-DD HH24:MI:SS')
+            </if>
+            <if test="endTm != null and endTm != ''">
+                and d.TM &lt;= TO_DATE(CONCAT(#{endTm}, ' 23:59:59'), 'YYYY-MM-DD HH24:MI:SS')
+            </if>
+        </where>
+        order by d.TM desc
+    </select>
+
+    <delete id="deleteStXajDataByStcd" parameterType="String">
+        delete from ST_XAJ_DATA where STCD = #{stcd}
+    </delete>
+
+</mapper>

+ 115 - 0
gw-gx/src/main/resources/mapper/xajgl/StXajPdmmMapper.xml

@@ -0,0 +1,115 @@
+<?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.goldenwater.xajgl.mapper.StXajPdmmMapper">
+
+    <resultMap type="com.goldenwater.xajgl.domain.StXajPdmm" id="StXajPdmmResult">
+        <result property="stcd"    column="stcd"    />
+        <result property="zPj"     column="z_pj"   />
+        <result property="zMax"    column="z_max"  />
+        <result property="zMin"    column="z_min"  />
+        <result property="month"   column="month"  />
+        <result property="day"     column="day"     />
+        <result property="drp"     column="drp"     />
+        <result property="stnm"    column="stnm"    />
+        <result property="ww"      column="ww"      />
+        <result property="quarter" column="quarter" />
+        <result property="createBy"   column="create_by"  />
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy"   column="update_by"  />
+        <result property="updateTime" column="update_time"/>
+        <result property="remark"     column="remark"     />
+    </resultMap>
+
+    <sql id="selectStXajPdmmVo">
+        select stcd,
+               cast(z_pj as decimal(22,4)) as z_pj,
+               cast(z_max as decimal(22,4)) as z_max,
+               cast(z_min as decimal(22,4)) as z_min,
+               month, day,
+               cast(drp as decimal(22,4)) as drp,
+               stnm,
+               cast(ww as decimal(22,4)) as ww,
+               quarter
+        from ST_XAJ_PDMM
+    </sql>
+
+    <select id="selectStXajPdmmList" parameterType="com.goldenwater.xajgl.domain.StXajPdmm" resultMap="StXajPdmmResult">
+        <include refid="selectStXajPdmmVo" />
+        <where>
+            <if test="stcd != null and stcd != ''">
+                AND stcd like '%' || #{stcd} || '%'
+            </if>
+            <if test="stnm != null and stnm != ''">
+                AND stnm like '%' || #{stnm} || '%'
+            </if>
+            <if test="month != null and month != ''">
+                AND month = #{month}
+            </if>
+            <if test="quarter != null and quarter != ''">
+                AND quarter = #{quarter}
+            </if>
+        </where>
+        order by stcd asc
+    </select>
+
+    <select id="selectStXajPdmmByStcd" parameterType="String" resultMap="StXajPdmmResult">
+        <include refid="selectStXajPdmmVo" />
+        where stcd = #{stcd}
+    </select>
+
+    <insert id="insertStXajPdmm" parameterType="com.goldenwater.xajgl.domain.StXajPdmm">
+        insert into ST_XAJ_PDMM
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="stcd != null and stcd != ''">stcd,</if>
+            <if test="zPj != null">z_pj,</if>
+            <if test="zMax != null">z_max,</if>
+            <if test="zMin != null">z_min,</if>
+            <if test="month != null">month,</if>
+            <if test="day != null">day,</if>
+            <if test="drp != null">drp,</if>
+            <if test="stnm != null">stnm,</if>
+            <if test="ww != null">ww,</if>
+            <if test="quarter != null">quarter,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="stcd != null and stcd != ''">#{stcd},</if>
+            <if test="zPj != null">#{zPj},</if>
+            <if test="zMax != null">#{zMax},</if>
+            <if test="zMin != null">#{zMin},</if>
+            <if test="month != null">#{month},</if>
+            <if test="day != null">#{day},</if>
+            <if test="drp != null">#{drp},</if>
+            <if test="stnm != null">#{stnm},</if>
+            <if test="ww != null">#{ww},</if>
+            <if test="quarter != null">#{quarter},</if>
+        </trim>
+    </insert>
+
+    <update id="updateStXajPdmm" parameterType="com.goldenwater.xajgl.domain.StXajPdmm">
+        update ST_XAJ_PDMM
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="zPj != null">z_pj = #{zPj},</if>
+            <if test="zMax != null">z_max = #{zMax},</if>
+            <if test="zMin != null">z_min = #{zMin},</if>
+            <if test="month != null">month = #{month},</if>
+            <if test="day != null">day = #{day},</if>
+            <if test="drp != null">drp = #{drp},</if>
+            <if test="stnm != null">stnm = #{stnm},</if>
+            <if test="ww != null">ww = #{ww},</if>
+            <if test="quarter != null">quarter = #{quarter},</if>
+        </trim>
+        where stcd = #{stcd}
+    </update>
+
+    <delete id="deleteStXajPdmmByStcd" parameterType="String">
+        delete from ST_XAJ_PDMM where stcd = #{stcd}
+    </delete>
+
+    <insert id="importPdmm" parameterType="java.util.List">
+        insert into ST_XAJ_PDMM (stcd, z_pj, z_max, z_min, month, day, drp, stnm, ww, quarter)
+        <foreach collection="list" item="item" separator="union all">
+            select #{item.stcd}, #{item.zPj}, #{item.zMax}, #{item.zMin}, #{item.month}, #{item.day}, #{item.drp}, #{item.stnm}, #{item.ww}, #{item.quarter} from dual
+        </foreach>
+    </insert>
+
+</mapper>

+ 138 - 0
gw-gx/src/main/resources/mapper/xajgl/StXajSkBMapper.xml

@@ -0,0 +1,138 @@
+<?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.goldenwater.xajgl.mapper.StXajSkBMapper">
+
+    <resultMap type="com.goldenwater.xajgl.domain.StXajSkB" id="StXajSkBResult">
+        <result property="stcd"      column="STCD"      />
+        <result property="skTp"      column="SK_TP"     />
+        <result property="stlc"      column="STLC"      />
+        <result property="qPj"       column="Q_PJ"      />
+        <result property="rvnm"      column="RVNM"      />
+        <result property="stArea"    column="ST_AREA"   />
+        <result property="kr"        column="KR"        />
+        <result property="krYr"      column="KR_YR"     />
+        <result property="krEffect"  column="KR_EFFECT" />
+        <result property="krDead"    column="KR_DEAD"   />
+        <result property="zHs"       column="Z_HS"      />
+        <result property="zH"        column="Z_H"       />
+        <result property="zWr"       column="Z_WR"      />
+        <result property="zL"        column="Z_L"       />
+        <result property="zJx"       column="Z_JX"      />
+        <result property="gc"        column="GC"        />
+        <result property="zDead"    column="Z_DEAD"    />
+        <result property="zX"        column="Z_X"       />
+        <result property="createBy"   column="CREATE_BY"  />
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy"   column="UPDATE_BY"  />
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="remark"     column="REMARK"     />
+    </resultMap>
+
+    <sql id="selectStXajSkBVo">
+        select STCD, SK_TP, STLC,
+               CAST(NULLIF(TRIM(Q_PJ), '') AS DECIMAL(15,3)) as Q_PJ,
+               RVNM,
+               CAST(NULLIF(TRIM(ST_AREA), '') AS DECIMAL(15,3)) as ST_AREA,
+               CAST(NULLIF(TRIM(KR), '') AS DECIMAL(15,3)) as KR,
+               CAST(NULLIF(TRIM(KR_YR), '') AS DECIMAL(15,3)) as KR_YR,
+               CAST(NULLIF(TRIM(KR_EFFECT), '') AS DECIMAL(15,3)) as KR_EFFECT,
+               CAST(NULLIF(TRIM(KR_DEAD), '') AS DECIMAL(15,3)) as KR_DEAD,
+               CAST(NULLIF(TRIM(Z_HS), '') AS DECIMAL(15,3)) as Z_HS,
+               CAST(NULLIF(TRIM(Z_H), '') AS DECIMAL(15,3)) as Z_H,
+               CAST(NULLIF(TRIM(Z_WR), '') AS DECIMAL(15,3)) as Z_WR,
+               CAST(NULLIF(TRIM(Z_L), '') AS DECIMAL(15,3)) as Z_L,
+               CAST(NULLIF(TRIM(Z_JX), '') AS DECIMAL(15,3)) as Z_JX,
+               GC,
+               CAST(NULLIF(TRIM(Z_DEAD), '') AS DECIMAL(15,3)) as Z_DEAD,
+               CAST(NULLIF(TRIM(Z_X), '') AS DECIMAL(15,3)) as Z_X,
+               CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, REMARK
+        from ST_XAJ_SK_B
+    </sql>
+
+    <select id="selectStXajSkBByStcd" resultMap="StXajSkBResult">
+        <include refid="selectStXajSkBVo"/>
+        where STCD = #{stcd}
+    </select>
+
+    <insert id="insertStXajSkB" parameterType="com.goldenwater.xajgl.domain.StXajSkB">
+        insert into ST_XAJ_SK_B
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            STCD,
+            <if test="skTp != null">SK_TP,</if>
+            <if test="stlc != null">STLC,</if>
+            <if test="qPj != null">Q_PJ,</if>
+            <if test="rvnm != null">RVNM,</if>
+            <if test="stArea != null">ST_AREA,</if>
+            <if test="kr != null">KR,</if>
+            <if test="krYr != null">KR_YR,</if>
+            <if test="krEffect != null">KR_EFFECT,</if>
+            <if test="krDead != null">KR_DEAD,</if>
+            <if test="zHs != null">Z_HS,</if>
+            <if test="zH != null">Z_H,</if>
+            <if test="zWr != null">Z_WR,</if>
+            <if test="zL != null">Z_L,</if>
+            <if test="zJx != null">Z_JX,</if>
+            <if test="gc != null">GC,</if>
+            <if test="zDead != null">Z_DEAD,</if>
+            <if test="zX != null">Z_X,</if>
+            <if test="createBy != null">CREATE_BY,</if>
+            CREATE_TIME,
+            <if test="remark != null">REMARK,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            #{stcd},
+            <if test="skTp != null">#{skTp},</if>
+            <if test="stlc != null">#{stlc},</if>
+            <if test="qPj != null">#{qPj},</if>
+            <if test="rvnm != null">#{rvnm},</if>
+            <if test="stArea != null">#{stArea},</if>
+            <if test="kr != null">#{kr},</if>
+            <if test="krYr != null">#{krYr},</if>
+            <if test="krEffect != null">#{krEffect},</if>
+            <if test="krDead != null">#{krDead},</if>
+            <if test="zHs != null">#{zHs},</if>
+            <if test="zH != null">#{zH},</if>
+            <if test="zWr != null">#{zWr},</if>
+            <if test="zL != null">#{zL},</if>
+            <if test="zJx != null">#{zJx},</if>
+            <if test="gc != null">#{gc},</if>
+            <if test="zDead != null">#{zDead},</if>
+            <if test="zX != null">#{zX},</if>
+            <if test="createBy != null">#{createBy},</if>
+            SYSDATE,
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+    <update id="updateStXajSkB" parameterType="com.goldenwater.xajgl.domain.StXajSkB">
+        update ST_XAJ_SK_B
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="skTp != null">SK_TP = #{skTp},</if>
+            <if test="stlc != null">STLC = #{stlc},</if>
+            <if test="qPj != null">Q_PJ = #{qPj},</if>
+            <if test="rvnm != null">RVNM = #{rvnm},</if>
+            <if test="stArea != null">ST_AREA = #{stArea},</if>
+            <if test="kr != null">KR = #{kr},</if>
+            <if test="krYr != null">KR_YR = #{krYr},</if>
+            <if test="krEffect != null">KR_EFFECT = #{krEffect},</if>
+            <if test="krDead != null">KR_DEAD = #{krDead},</if>
+            <if test="zHs != null">Z_HS = #{zHs},</if>
+            <if test="zH != null">Z_H = #{zH},</if>
+            <if test="zWr != null">Z_WR = #{zWr},</if>
+            <if test="zL != null">Z_L = #{zL},</if>
+            <if test="zJx != null">Z_JX = #{zJx},</if>
+            <if test="gc != null">GC = #{gc},</if>
+            <if test="zDead != null">Z_DEAD = #{zDead},</if>
+            <if test="zX != null">Z_X = #{zX},</if>
+            <if test="updateBy != null">UPDATE_BY = #{updateBy},</if>
+            UPDATE_TIME = SYSDATE,
+            <if test="remark != null">REMARK = #{remark},</if>
+        </trim>
+        where STCD = #{stcd}
+    </update>
+
+    <delete id="deleteStXajSkBByStcd" parameterType="String">
+        delete from ST_XAJ_SK_B where STCD = #{stcd}
+    </delete>
+
+</mapper>

+ 38 - 0
gw-ui/src/api/xajgl/data.js

@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+
+// 查询监测数据列表(分页)
+export function listData(query) {
+  return request({
+    url: '/xajgl/data/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询监测数据(不分页,图表用)
+export function listDataAll(query) {
+  return request({
+    url: '/xajgl/data/listAll',
+    method: 'get',
+    params: query
+  })
+}
+
+// 删除监测数据
+export function delData(data) {
+  return request({
+    url: '/xajgl/data/delete',
+    method: 'delete',
+    data
+  })
+}
+
+// 导出监测数据
+export function exportData(query) {
+  return request({
+    url: '/xajgl/data/export',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 76 - 0
gw-ui/src/api/xajgl/pdmm.js

@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+
+// 查询特征值列表
+export function listPdmm(query) {
+  return request({
+    url: '/xajgl/pdmm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询特征值详情
+export function getPdmm(stcd) {
+  return request({
+    url: '/xajgl/pdmm/detail',
+    method: 'get',
+    params: { stcd }
+  })
+}
+
+// 新增特征值
+export function addPdmm(data) {
+  return request({
+    url: '/xajgl/pdmm',
+    method: 'post',
+    data
+  })
+}
+
+// 修改特征值
+export function updatePdmm(data) {
+  return request({
+    url: '/xajgl/pdmm',
+    method: 'put',
+    data
+  })
+}
+
+// 删除特征值
+export function delPdmm(data) {
+  return request({
+    url: '/xajgl/pdmm/delete',
+    method: 'delete',
+    data
+  })
+}
+
+// 导出特征值
+export function exportPdmm(query) {
+  return request({
+    url: '/xajgl/pdmm/export',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 导入特征值
+export function importPdmm(file) {
+  const formData = new FormData()
+  formData.append('file', file)
+  return request({
+    url: '/xajgl/pdmm/import',
+    method: 'post',
+    data: formData
+  })
+}
+
+// 下载导入模板
+export function importPdmmTemplate() {
+  return request({
+    url: '/xajgl/pdmm/importTemplate',
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 103 - 0
gw-ui/src/api/xajgl/station.js

@@ -0,0 +1,103 @@
+import request from '@/utils/request'
+
+// 查询站点列表
+export function listStation(query) {
+  return request({
+    url: '/xajgl/station/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询站点详情
+export function getStation(stcd) {
+  return request({
+    url: '/xajgl/station/detail',
+    method: 'get',
+    params: { stcd }
+  })
+}
+
+// 查询水库基础信息(tp=SK时)
+export function getSkDetail(stcd) {
+  return request({
+    url: '/xajgl/station/skDetail',
+    method: 'get',
+    params: { stcd }
+  })
+}
+
+// 查询库容曲线列表(图表用)
+export function listQx(stcd) {
+  return request({
+    url: '/xajgl/station/qxList',
+    method: 'get',
+    params: { stcd }
+  })
+}
+
+// 查询监测数据(图表用)
+export function listData(stcd, startTm, endTm) {
+  return request({
+    url: '/xajgl/station/dataList',
+    method: 'get',
+    params: { stcd, startTm, endTm }
+  })
+}
+
+// 新增站点
+export function addStation(data) {
+  return request({
+    url: '/xajgl/station',
+    method: 'post',
+    data
+  })
+}
+
+// 修改站点
+export function updateStation(data) {
+  return request({
+    url: '/xajgl/station',
+    method: 'put',
+    data
+  })
+}
+
+// 删除站点
+export function delStation(data) {
+  return request({
+    url: '/xajgl/station/delete',
+    method: 'delete',
+    data
+  })
+}
+
+// 导出站点
+export function exportStation(query) {
+  return request({
+    url: '/xajgl/station/export',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 导入站点
+export function importStation(file) {
+  const formData = new FormData()
+  formData.append('file', file)
+  return request({
+    url: '/xajgl/station/import',
+    method: 'post',
+    data: formData
+  })
+}
+
+// 下载导入模板
+export function importStationTemplate() {
+  return request({
+    url: '/xajgl/station/importTemplate',
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 260 - 0
gw-ui/src/views/xajgl/data/index.vue

@@ -0,0 +1,260 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="站码" prop="stcd">
+        <el-input v-model="queryParams.stcd" placeholder="请输入站码" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="业务域编码" prop="bizCode">
+        <el-input v-model="queryParams.bizCode" placeholder="请输入业务域编码" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="时间范围">
+        <el-date-picker
+            v-model="dateRange"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="YYYY-MM-DD"
+            @change="handleDateChange"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Download"
+            @click="handleExport"
+            size="mini"
+            v-hasPermi="['xajgl:data:export']"
+        >导出数据
+        </el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column type="index" label="序号" width="60" align="center"/>
+      <el-table-column prop="stcd" label="站码" width="120" align="center"/>
+      <el-table-column prop="stnm" label="站名" width="150" align="center" show-overflow-tooltip/>
+      <el-table-column prop="tm" label="监测时间" width="180" align="center">
+        <template #default="scope">{{ formatDate(scope.row.tm) }}</template>
+      </el-table-column>
+      <el-table-column prop="drp" label="降雨量(mm)" width="120" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.drp) }}</template>
+      </el-table-column>
+      <el-table-column prop="z" label="水位(m)" width="100" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.z) }}</template>
+      </el-table-column>
+      <el-table-column prop="q" label="流量(m³/s)" width="120" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.q) }}</template>
+      </el-table-column>
+      <el-table-column prop="dyp" label="蒸发(mm)" width="100" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.dyp) }}</template>
+      </el-table-column>
+      <el-table-column prop="dwz" label="坝下水位(m)" width="130" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.dwz) }}</template>
+      </el-table-column>
+      <el-table-column prop="inq" label="入库流量(m³/s)" width="140" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.inq) }}</template>
+      </el-table-column>
+      <el-table-column prop="outq" label="出库流量(m³/s)" width="140" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.outq) }}</template>
+      </el-table-column>
+      <el-table-column prop="ww" label="下泄水量(万m³)" width="140" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.ww) }}</template>
+      </el-table-column>
+      <el-table-column prop="w" label="蓄水量(万m³)" width="140" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.w) }}</template>
+      </el-table-column>
+      <el-table-column prop="bizCode" label="业务域编码" width="120" align="center"/>
+      <el-table-column label="操作" width="150" align="center" fixed="right">
+        <template #default="scope">
+          <el-button size="mini" type="text" icon="Delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['xajgl:data:remove']">删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+  </div>
+</template>
+
+<script setup name="XajData">
+import {ref, reactive} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {listData, delData, exportData} from '@/api/xajgl/data'
+
+const loading = ref(false)
+const tableData = ref([])
+const total = ref(0)
+const showSearch = ref(true)
+const selectedRows = ref([])
+
+// 获取当前日期和当月第一天
+const now = new Date()
+const firstDayOfMonth = new Date(now.getFullYear(), now.getMonth(), 1)
+const formatDateStr = (date) => {
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 15,
+  stcd: '',
+  bizCode: '',
+  params: {
+    beginTime: formatDateStr(firstDayOfMonth),
+    endTime: formatDateStr(now)
+  }
+})
+
+const dateRange = ref([formatDateStr(firstDayOfMonth), formatDateStr(now)])
+
+const getList = async () => {
+  loading.value = true
+  try {
+    const response = await listData(queryParams)
+    tableData.value = response.rows
+    total.value = response.total
+  } catch (error) {
+    console.error(error)
+  } finally {
+    loading.value = false
+  }
+}
+
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+const resetQuery = () => {
+  queryParams.stcd = ''
+  queryParams.bizCode = ''
+  queryParams.params.beginTime = formatDateStr(firstDayOfMonth)
+  queryParams.params.endTime = formatDateStr(now)
+  dateRange.value = [formatDateStr(firstDayOfMonth), formatDateStr(now)]
+  handleQuery()
+}
+
+const handleDateChange = (val) => {
+  if (val && val.length === 2) {
+    queryParams.params.beginTime = val[0]
+    queryParams.params.endTime = val[1]
+  } else {
+    queryParams.params.beginTime = ''
+    queryParams.params.endTime = ''
+  }
+}
+
+const handleDelete = async (row) => {
+  try {
+    await ElMessageBox.confirm('确定删除该监测数据吗?', '提示', {type: 'warning'})
+    await delData({stcd: row.stcd, tm: row.tm})
+    ElMessage.success('删除成功')
+    getList()
+  } catch (error) {
+    if (error !== 'cancel') {
+      ElMessage.error('删除失败')
+    }
+  }
+}
+
+const handleExport = async () => {
+  try {
+    const response = await exportData(queryParams)
+    const blob = new Blob([response])
+    const url = window.URL.createObjectURL(blob)
+    const link = document.createElement('a')
+    link.href = url
+    link.download = '新安江监测数据_' + new Date().getTime() + '.xlsx'
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+    window.URL.revokeObjectURL(url)
+    ElMessage.success('导出成功')
+  } catch (error) {
+    ElMessage.error('导出失败')
+  }
+}
+
+const handleSelectionChange = () => {
+}
+
+const formatDate = (date) => {
+  if (!date) return ''
+  return new Date(date).toLocaleString('zh-CN', {
+    year: 'numeric',
+    month: '2-digit',
+    day: '2-digit',
+    hour: '2-digit',
+    minute: '2-digit',
+    second: '2-digit'
+  })
+}
+
+const formatDecimal = (value) => {
+  if (value === null || value === undefined) return '-'
+  return parseFloat(value).toFixed(2)
+}
+
+getList()
+</script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+}
+
+.mb8 {
+  margin-bottom: 8px;
+}
+
+:deep(.el-table) {
+  font-size: 14px;
+}
+
+:deep(.el-table th) {
+  font-size: 14px;
+  font-weight: bold;
+}
+
+:deep(.el-table td) {
+  font-size: 14px;
+}
+
+:deep(.el-form-item__label) {
+  font-size: 14px;
+}
+
+:deep(.el-input__inner) {
+  font-size: 14px;
+}
+
+:deep(.el-button) {
+  font-size: 14px;
+}
+
+:deep(.el-pagination) {
+  font-size: 14px;
+  margin-top: 15px;
+}
+</style>

+ 450 - 0
gw-ui/src/views/xajgl/pdmm/index.vue

@@ -0,0 +1,450 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="站码" prop="stcd">
+        <el-input v-model="queryParams.stcd" placeholder="请输入站码" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="名称" prop="stnm">
+        <el-input v-model="queryParams.stnm" placeholder="请输入名称" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="季度" prop="quarter">
+        <el-select v-model="queryParams.quarter" placeholder="请选择季度" clearable>
+          <el-option label="Q1" value="1"/>
+          <el-option label="Q2" value="2"/>
+          <el-option label="Q3" value="3"/>
+          <el-option label="Q4" value="4"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="月份" prop="month">
+        <el-select v-model="queryParams.month" placeholder="请选择月份" clearable>
+          <el-option v-for="m in 12" :key="m" :label="String(m).padStart(2, '0')" :value="String(m).padStart(2, '0')"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+            size="mini"
+            v-hasPermi="['xajgl:pdmm:add']"
+        >新增
+        </el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList">
+        <template #right>
+          <el-button type="success" icon="Download" @click="handleExport" v-hasPermi="['xajgl:pdmm:export']">导出
+          </el-button>
+          <el-button type="warning" icon="Upload" @click="handleImport" v-hasPermi="['xajgl:pdmm:import']">导入
+          </el-button>
+          <el-button type="danger" icon="Delete" @click="handleBatchDelete" v-hasPermi="['xajgl:pdmm:remove']"
+                     :disabled="selectedRows.length === 0">批量删除
+          </el-button>
+        </template>
+      </right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column type="index" label="序号" width="60" align="center"/>
+      <el-table-column prop="stcd" label="站码" width="120"/>
+      <el-table-column prop="stnm" label="名称" width="150"/>
+      <el-table-column prop="zPj" label="多年平均水位(m)" width="150" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.zPj) }}</template>
+      </el-table-column>
+      <el-table-column prop="zMax" label="历史最高水位(m)" width="160" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.zMax) }}</template>
+      </el-table-column>
+      <el-table-column prop="zMin" label="历史最低水位(m)" width="160" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.zMin) }}</template>
+      </el-table-column>
+      <el-table-column prop="month" label="月份" width="80" align="center"/>
+      <el-table-column prop="day" label="日期" width="80" align="center"/>
+      <el-table-column prop="quarter" label="季度" width="80" align="center"/>
+      <el-table-column prop="drp" label="降雨量(mm)" width="120" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.drp) }}</template>
+      </el-table-column>
+      <el-table-column prop="ww" label="多年平均水量(万m³)" width="160" align="center">
+        <template #default="scope">{{ formatDecimal(scope.row.ww) }}</template>
+      </el-table-column>
+      <el-table-column label="操作" width="200" align="center" fixed="right">
+        <template #default="scope">
+          <el-button size="mini" type="primary" icon="Edit" @click="handleEdit(scope.row)"
+                     v-hasPermi="['xajgl:pdmm:edit']">修改
+          </el-button>
+          <el-button size="mini" type="text" icon="Delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['xajgl:pdmm:remove']">删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 新增/修改弹窗 -->
+    <el-dialog :title="isEdit ? '修改特征值' : '新增特征值'" v-model="formVisible" width="700px" append-to-body>
+      <el-form :model="form" ref="formRef" label-width="140px">
+        <el-form-item label="站码" prop="stcd" required>
+          <el-input v-model="form.stcd" :disabled="isEdit" placeholder="请输入站码"/>
+        </el-form-item>
+        <el-form-item label="名称" prop="stnm" required>
+          <el-input v-model="form.stnm" placeholder="请输入名称"/>
+        </el-form-item>
+        <el-form-item label="多年平均水位(m)" prop="zPj">
+          <el-input v-model="form.zPj" placeholder="请输入多年平均水位" type="number"/>
+        </el-form-item>
+        <el-form-item label="历史最高水位(m)" prop="zMax">
+          <el-input v-model="form.zMax" placeholder="请输入历史最高水位" type="number"/>
+        </el-form-item>
+        <el-form-item label="历史最低水位(m)" prop="zMin">
+          <el-input v-model="form.zMin" placeholder="请输入历史最低水位" type="number"/>
+        </el-form-item>
+        <el-form-item label="月份" prop="month">
+          <el-select v-model="form.month" placeholder="请选择月份" clearable>
+            <el-option v-for="m in 12" :key="m" :label="String(m).padStart(2, '0')" :value="String(m).padStart(2, '0')"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="日期" prop="day">
+          <el-input v-model="form.day" placeholder="请输入日期" type="number"/>
+        </el-form-item>
+        <el-form-item label="季度" prop="quarter">
+          <el-select v-model="form.quarter" placeholder="请选择季度">
+            <el-option label="Q1" value="Q1"/>
+            <el-option label="Q2" value="Q2"/>
+            <el-option label="Q3" value="Q3"/>
+            <el-option label="Q4" value="Q4"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="降雨量(mm)" prop="drp">
+          <el-input v-model="form.drp" placeholder="请输入降雨量" type="number"/>
+        </el-form-item>
+        <el-form-item label="多年平均水量(万m³)" prop="ww">
+          <el-input v-model="form.ww" placeholder="请输入多年平均水量" type="number"/>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="primary" @click="submitForm">确定</el-button>
+        <el-button @click="formVisible = false">取消</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 导入弹窗 -->
+    <el-dialog title="特征值数据导入" v-model="importVisible" width="500px" append-to-body>
+      <el-form ref="importForm" label-width="100px">
+        <el-form-item label="上传文件">
+          <el-upload
+              class="upload-demo"
+              drag
+              :http-request="handleHttpRequest"
+              :on-success="handleUploadSuccess"
+              :on-error="handleUploadError"
+              :file-list="fileList"
+              accept=".xlsx,.xls"
+              :auto-upload="false"
+              ref="uploadRef"
+          >
+            <el-icon class="el-icon--upload">
+              <upload-filled/>
+            </el-icon>
+            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+            <template #tip>
+              <div class="el-upload__tip">
+                <el-icon>
+                  <warning/>
+                </el-icon>
+                <span>仅支持上传Excel文件(.xlsx,.xls)</span>
+              </div>
+            </template>
+          </el-upload>
+        </el-form-item>
+        <el-form-item>
+          <span class="text-muted">下载模板:</span>
+          <el-button type="text" @click="downloadTemplate">特征值模板</el-button>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="primary" @click="submitUpload">上传</el-button>
+        <el-button @click="importVisible = false">取消</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="XajPdmm">
+import {ref, reactive} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {
+  listPdmm,
+  getPdmm,
+  addPdmm,
+  updatePdmm,
+  delPdmm,
+  exportPdmm,
+  importPdmm,
+  importPdmmTemplate
+} from '@/api/xajgl/pdmm'
+
+const loading = ref(false)
+const tableData = ref([])
+const total = ref(0)
+const showSearch = ref(true)
+const formVisible = ref(false)
+const importVisible = ref(false)
+const isEdit = ref(false)
+const selectedRows = ref([])
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 15,
+  stcd: '',
+  stnm: '',
+  quarter: '',
+  month: ''
+})
+
+const form = reactive({
+  stcd: '',
+  stnm: '',
+  zPj: null,
+  zMax: null,
+  zMin: null,
+  month: '',
+  day: null,
+  quarter: '',
+  drp: null,
+  ww: null
+})
+
+const fileList = ref([])
+const uploadRef = ref(null)
+
+const getList = async () => {
+  loading.value = true
+  try {
+    const response = await listPdmm(queryParams)
+    tableData.value = response.rows
+    total.value = response.total
+  } catch (error) {
+    console.error(error)
+  } finally {
+    loading.value = false
+  }
+}
+
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+const resetQuery = () => {
+  queryParams.stcd = ''
+  queryParams.stnm = ''
+  queryParams.quarter = ''
+  queryParams.month = ''
+  handleQuery()
+}
+
+const handleAdd = () => {
+  isEdit.value = false
+  Object.assign(form, {
+    stcd: '',
+    stnm: '',
+    zPj: null,
+    zMax: null,
+    zMin: null,
+    month: '',
+    day: null,
+    quarter: '',
+    drp: null,
+    ww: null
+  })
+  formVisible.value = true
+}
+
+const handleEdit = async (row) => {
+  isEdit.value = true
+  try {
+    const response = await getPdmm(row.stcd)
+    Object.assign(form, response.data)
+    formVisible.value = true
+  } catch (error) {
+    ElMessage.error('获取特征值信息失败')
+  }
+}
+
+const submitForm = async () => {
+  try {
+    if (isEdit.value) {
+      await updatePdmm(form)
+      ElMessage.success('修改成功')
+    } else {
+      await addPdmm(form)
+      ElMessage.success('新增成功')
+    }
+    formVisible.value = false
+    getList()
+  } catch (error) {
+    ElMessage.error('操作失败')
+  }
+}
+
+const handleDelete = async (row) => {
+  try {
+    await ElMessageBox.confirm('确定删除该特征值吗?', '提示', {type: 'warning'})
+    await delPdmm({stcd: row.stcd})
+    ElMessage.success('删除成功')
+    getList()
+  } catch (error) {
+    if (error !== 'cancel') {
+      ElMessage.error('删除失败')
+    }
+  }
+}
+
+const handleBatchDelete = async () => {
+  try {
+    await ElMessageBox.confirm('确定删除选中的特征值吗?', '提示', {type: 'warning'})
+    const data = selectedRows.value.map(item => ({stcd: item.stcd}))
+    await delPdmm(data)
+    ElMessage.success('批量删除成功')
+    getList()
+  } catch (error) {
+    if (error !== 'cancel') {
+      ElMessage.error('批量删除失败')
+    }
+  }
+}
+
+const handleSelectionChange = (val) => {
+  selectedRows.value = val
+}
+
+const handleExport = async () => {
+  try {
+    const response = await exportPdmm(queryParams)
+    const blob = new Blob([response])
+    const url = window.URL.createObjectURL(blob)
+    const link = document.createElement('a')
+    link.href = url
+    link.download = '新安江特征值数据.xlsx'
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+    window.URL.revokeObjectURL(url)
+    ElMessage.success('导出成功')
+  } catch (error) {
+    ElMessage.error('导出失败')
+  }
+}
+
+const handleImport = () => {
+  fileList.value = []
+  importVisible.value = true
+}
+
+const submitUpload = () => {
+  uploadRef.value.submit()
+}
+
+const handleHttpRequest = (options) => {
+  const {file, onSuccess, onError} = options
+  importPdmm(file).then(response => {
+    onSuccess(response, file)
+  }).catch(error => {
+    onError(error)
+  })
+}
+
+const handleUploadSuccess = (response) => {
+  if (response.code === 200) {
+    ElMessage.success(response.msg)
+    importVisible.value = false
+    fileList.value = []
+    getList()
+  } else {
+    ElMessage.error(response.msg)
+  }
+}
+
+const handleUploadError = () => {
+  ElMessage.error('导入失败')
+}
+
+const downloadTemplate = async () => {
+  try {
+    const response = await importPdmmTemplate()
+    const blob = new Blob([response])
+    const url = window.URL.createObjectURL(blob)
+    const link = document.createElement('a')
+    link.href = url
+    link.download = '新安江特征值导入模板.xlsx'
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+    window.URL.revokeObjectURL(url)
+    ElMessage.success('模板下载成功')
+  } catch (error) {
+    ElMessage.error('模板下载失败')
+  }
+}
+
+const formatDecimal = (value) => {
+  if (value === null || value === undefined) return '-'
+  return parseFloat(value).toFixed(2)
+}
+
+getList()
+</script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+}
+
+.mb8 {
+  margin-bottom: 8px;
+}
+
+:deep(.el-table) {
+  font-size: 14px;
+}
+
+:deep(.el-table th) {
+  font-size: 14px;
+  font-weight: bold;
+}
+
+:deep(.el-table td) {
+  font-size: 14px;
+}
+
+:deep(.el-form-item__label) {
+  font-size: 14px;
+}
+
+:deep(.el-input__inner) {
+  font-size: 14px;
+}
+
+:deep(.el-button) {
+  font-size: 14px;
+}
+
+:deep(.el-pagination) {
+  font-size: 14px;
+  margin-top: 15px;
+}
+</style>

+ 839 - 0
gw-ui/src/views/xajgl/station/index.vue

@@ -0,0 +1,839 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="站码" prop="stcd">
+        <el-input v-model="queryParams.stcd" placeholder="请输入站码" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="站名" prop="stnm">
+        <el-input v-model="queryParams.stnm" placeholder="请输入站名" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="站点类型" prop="tp">
+        <el-select v-model="queryParams.tp" placeholder="请选择站点类型" clearable>
+          <el-option label="水文站" value="ZZ"/>
+          <el-option label="雨量站" value="DRP"/>
+          <el-option label="取水户" value="WIU"/>
+          <el-option label="水库" value="SK"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="省份" prop="prov">
+        <el-input v-model="queryParams.prov" placeholder="请输入省份" clearable @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Upload"
+            @click="handleImport"
+            size="mini"
+            v-hasPermi="['xajgl:station:upload']"
+        >上传数据
+        </el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList">
+        <template #right>
+          <el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['xajgl:station:add']">新增站点
+          </el-button>
+          <el-button type="success" icon="Download" @click="handleExport" v-hasPermi="['xajgl:station:export']">导出
+          </el-button>
+          <el-button type="warning" icon="Upload" @click="handleImport" v-hasPermi="['xajgl:station:import']">导入
+          </el-button>
+          <el-button type="danger" icon="Delete" @click="handleBatchDelete" v-hasPermi="['xajgl:station:remove']"
+                     :disabled="selectedRows.length === 0">批量删除
+          </el-button>
+        </template>
+      </right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column type="index" label="序号" width="60" align="center"/>
+      <el-table-column prop="stcd" label="站码" width="120"/>
+      <el-table-column prop="stnm" label="站名" width="220"/>
+      <el-table-column prop="tp" label="类型" width="100">
+        <template #default="scope">{{ getTpLabel(scope.row.tp) }}</template>
+      </el-table-column>
+      <el-table-column prop="lgtd" label="经度" width="130" align="right">
+        <template #default="scope">{{ scope.row.lgtd ? Number(scope.row.lgtd).toFixed(6) : '' }}</template>
+      </el-table-column>
+      <el-table-column prop="lttd" label="纬度" width="130" align="right">
+        <template #default="scope">{{ scope.row.lttd ? Number(scope.row.lttd).toFixed(6) : '' }}</template>
+      </el-table-column>
+      <el-table-column prop="prov" label="省份" width="100"/>
+      <el-table-column prop="city" label="地市" width="100"/>
+      <el-table-column prop="district" label="区县" width="100"/>
+      <el-table-column prop="rvnm" label="河流名称" width="120"/>
+      <el-table-column prop="addvcd" label="行政区划编码" width="120"/>
+      <el-table-column prop="bizCode" label="业务域编码" width="120"/>
+      <el-table-column label="操作" width="260" align="center" fixed="right">
+        <template #default="scope">
+          <el-button size="mini" type="text" icon="View" @click="handleDetail(scope.row)">详情</el-button>
+          <el-button size="mini" type="primary" icon="Edit" @click="handleEdit(scope.row)"
+                     v-hasPermi="['xajgl:station:edit']">修改
+          </el-button>
+          <el-button size="mini" type="text" icon="Delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['xajgl:station:remove']">删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 新增/修改弹窗 -->
+    <el-dialog :title="isEdit ? '修改站点信息' : '新增站点信息'" v-model="formVisible" width="700px" append-to-body>
+      <el-form :model="form" ref="formRef" label-width="120px">
+        <el-form-item label="站码" prop="stcd" required>
+          <el-input v-model="form.stcd" :disabled="isEdit" placeholder="请输入站码"/>
+        </el-form-item>
+        <el-form-item label="站名" prop="stnm" required>
+          <el-input v-model="form.stnm" placeholder="请输入站名"/>
+        </el-form-item>
+        <el-form-item label="站点类型" prop="tp">
+          <el-select v-model="form.tp" placeholder="请选择站点类型">
+            <el-option label="水文站" value="ZZ"/>
+            <el-option label="雨量站" value="DRP"/>
+            <el-option label="取水户" value="WIU"/>
+            <el-option label="水库" value="SK"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="经度" prop="lgtd">
+          <el-input v-model="form.lgtd" placeholder="请输入经度" type="number"/>
+        </el-form-item>
+        <el-form-item label="纬度" prop="lttd">
+          <el-input v-model="form.lttd" placeholder="请输入纬度" type="number"/>
+        </el-form-item>
+        <el-form-item label="省份" prop="prov">
+          <el-input v-model="form.prov" placeholder="请输入省份"/>
+        </el-form-item>
+        <el-form-item label="地市" prop="city">
+          <el-input v-model="form.city" placeholder="请输入地市"/>
+        </el-form-item>
+        <el-form-item label="区县" prop="district">
+          <el-input v-model="form.district" placeholder="请输入区县"/>
+        </el-form-item>
+        <el-form-item label="河流名称" prop="rvnm">
+          <el-input v-model="form.rvnm" placeholder="请输入河流名称"/>
+        </el-form-item>
+        <el-form-item label="行政区划编码" prop="addvcd">
+          <el-input v-model="form.addvcd" placeholder="请输入行政区划编码"/>
+        </el-form-item>
+        <el-form-item label="业务域编码" prop="bizCode">
+          <el-input v-model="form.bizCode" placeholder="请输入业务域编码"/>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="primary" @click="submitForm">确定</el-button>
+        <el-button @click="formVisible = false">取消</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 详情弹窗 -->
+    <el-dialog title="站点详情" v-model="detailVisible" width="1200px" append-to-body @close="handleDetailClose">
+      <!-- 基本信息 -->
+      <div class="detail-section">
+        <div class="detail-section-title">基本信息</div>
+        <el-descriptions :column="3" border>
+          <el-descriptions-item label="站码">{{ detailData.stcd }}</el-descriptions-item>
+          <el-descriptions-item label="站名">{{ detailData.stnm }}</el-descriptions-item>
+          <el-descriptions-item label="站点类型">{{ getTpLabel(detailData.tp) }}</el-descriptions-item>
+          <el-descriptions-item label="经度">{{ detailData.lgtd }}</el-descriptions-item>
+          <el-descriptions-item label="纬度">{{ detailData.lttd }}</el-descriptions-item>
+          <el-descriptions-item label="省份">{{ detailData.prov }}</el-descriptions-item>
+          <el-descriptions-item label="地市">{{ detailData.city }}</el-descriptions-item>
+          <el-descriptions-item label="区县">{{ detailData.district }}</el-descriptions-item>
+          <el-descriptions-item label="河流名称">{{ detailData.rvnm }}</el-descriptions-item>
+          <el-descriptions-item label="行政区划编码">{{ detailData.addvcd }}</el-descriptions-item>
+          <el-descriptions-item label="业务域编码">{{ detailData.bizCode }}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+
+      <!-- 水库基础信息(仅当 tp === 'SK' 时显示) -->
+      <div class="detail-section" v-if="detailData.tp === 'SK'">
+        <div class="detail-section-title">水库基础信息</div>
+        <el-descriptions :column="3" border v-loading="skLoading">
+          <el-descriptions-item label="水库类型">{{ skData.skType }}</el-descriptions-item>
+          <el-descriptions-item label="建设地点">{{ skData.buildAddr }}</el-descriptions-item>
+          <el-descriptions-item label="所在河流">{{ skData.rvnm }}</el-descriptions-item>
+          <el-descriptions-item label="集水面积(km²)">{{ skData.catchArea }}</el-descriptions-item>
+          <el-descriptions-item label="总库容(万m³)">{{ skData.totalCap }}</el-descriptions-item>
+          <el-descriptions-item label="校核洪水位(m)">{{ skData.checkFloodZ }}</el-descriptions-item>
+          <el-descriptions-item label="正常高水位(m)">{{ skData.normalZ }}</el-descriptions-item>
+          <el-descriptions-item label="汛限水位(m)">{{ skData.floodLimitZ }}</el-descriptions-item>
+          <el-descriptions-item label="死水位(m)">{{ skData.deadZ }}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+
+      <!-- 库容曲线图表(仅当 tp === 'SK' 时显示) -->
+      <div class="detail-section" v-if="detailData.tp === 'SK'">
+        <div class="detail-section-title">库容曲线</div>
+        <div ref="qxChartRef" class="chart-container"></div>
+      </div>
+
+      <!-- 监测数据 -->
+      <div class="detail-section">
+        <div class="detail-section-title">监测数据</div>
+        <el-form :inline="true" class="detail-query-form">
+          <el-form-item label="时间范围">
+            <el-date-picker
+                v-model="detailDateRange"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="YYYY-MM-DD"
+                @change="handleDetailDateChange"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="Search" @click="loadDetailData">查询</el-button>
+          </el-form-item>
+        </el-form>
+        <el-table v-loading="detailDataLoading" :data="detailDataList" border stripe max-height="320">
+          <el-table-column type="index" label="序号" width="60" align="center"/>
+          <el-table-column prop="tm" label="时间" width="180" align="center">
+            <template #default="scope">{{ formatDate(scope.row.tm) }}</template>
+          </el-table-column>
+          <el-table-column prop="drp" label="降雨量(mm)" width="120" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.drp) }}</template>
+          </el-table-column>
+          <el-table-column prop="z" label="水位(m)" width="100" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.z) }}</template>
+          </el-table-column>
+          <el-table-column prop="q" label="流量(m³/s)" width="120" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.q) }}</template>
+          </el-table-column>
+          <el-table-column prop="inq" label="入库流量(m³/s)" width="140" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.inq) }}</template>
+          </el-table-column>
+          <el-table-column prop="outq" label="出库流量(m³/s)" width="140" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.outq) }}</template>
+          </el-table-column>
+          <el-table-column prop="ww" label="下泄水量(万m³)" width="140" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.ww) }}</template>
+          </el-table-column>
+          <el-table-column prop="w" label="蓄水量(万m³)" width="140" align="center">
+            <template #default="scope">{{ formatDecimal(scope.row.w) }}</template>
+          </el-table-column>
+        </el-table>
+
+        <!-- 监测数据趋势图 -->
+        <div class="detail-section-title" style="margin-top: 15px;">监测数据趋势图</div>
+        <div ref="trendChartRef" class="chart-container"></div>
+      </div>
+    </el-dialog>
+
+    <!-- 导入弹窗 -->
+    <el-dialog title="站点数据导入" v-model="importVisible" width="500px" append-to-body>
+      <el-form ref="importForm" label-width="100px">
+        <el-form-item label="上传文件">
+          <el-upload
+              class="upload-demo"
+              drag
+              :http-request="handleHttpRequest"
+              :on-success="handleUploadSuccess"
+              :on-error="handleUploadError"
+              :file-list="fileList"
+              accept=".xlsx,.xls"
+              :auto-upload="false"
+              ref="uploadRef"
+          >
+            <el-icon class="el-icon--upload">
+              <upload-filled/>
+            </el-icon>
+            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+            <template #tip>
+              <div class="el-upload__tip">
+                <el-icon>
+                  <warning/>
+                </el-icon>
+                <span>仅支持上传Excel文件(.xlsx,.xls)</span>
+              </div>
+            </template>
+          </el-upload>
+        </el-form-item>
+        <el-form-item>
+          <span class="text-muted">下载模板:</span>
+          <el-button type="text" @click="downloadTemplate">站点模板</el-button>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="primary" @click="submitUpload">上传</el-button>
+        <el-button @click="importVisible = false">取消</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="XajStation">
+import {ref, reactive, nextTick, onBeforeUnmount} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import * as echarts from 'echarts'
+import {
+  listStation,
+  getStation,
+  getSkDetail,
+  listQx,
+  listData,
+  addStation,
+  updateStation,
+  delStation,
+  exportStation,
+  importStation,
+  importStationTemplate
+} from '@/api/xajgl/station'
+
+const loading = ref(false)
+const tableData = ref([])
+const total = ref(0)
+const showSearch = ref(true)
+const formVisible = ref(false)
+const importVisible = ref(false)
+const isEdit = ref(false)
+const selectedRows = ref([])
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 15,
+  stcd: '',
+  stnm: '',
+  tp: '',
+  prov: ''
+})
+
+const form = reactive({
+  stcd: '',
+  stnm: '',
+  tp: '',
+  lgtd: null,
+  lttd: null,
+  prov: '',
+  city: '',
+  district: '',
+  rvnm: '',
+  addvcd: '',
+  bizCode: ''
+})
+
+const fileList = ref([])
+const uploadRef = ref(null)
+
+// 详情相关
+const detailVisible = ref(false)
+const detailData = ref({})
+const skLoading = ref(false)
+const skData = ref({})
+const detailDataLoading = ref(false)
+const detailDataList = ref([])
+const detailDateRange = ref([])
+const detailQuery = reactive({
+  stcd: '',
+  startTm: '',
+  endTm: ''
+})
+
+// 图表相关
+const qxChartRef = ref(null)
+const trendChartRef = ref(null)
+let qxChartInstance = null
+let trendChartInstance = null
+
+const getList = async () => {
+  loading.value = true
+  try {
+    const response = await listStation(queryParams)
+    tableData.value = response.rows
+    total.value = response.total
+  } catch (error) {
+    console.error(error)
+  } finally {
+    loading.value = false
+  }
+}
+
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+const resetQuery = () => {
+  queryParams.stcd = ''
+  queryParams.stnm = ''
+  queryParams.tp = ''
+  queryParams.prov = ''
+  handleQuery()
+}
+
+const handleAdd = () => {
+  isEdit.value = false
+  Object.assign(form, {
+    stcd: '',
+    stnm: '',
+    tp: '',
+    lgtd: null,
+    lttd: null,
+    prov: '',
+    city: '',
+    district: '',
+    rvnm: '',
+    addvcd: '',
+    bizCode: ''
+  })
+  formVisible.value = true
+}
+
+const handleEdit = async (row) => {
+  isEdit.value = true
+  try {
+    const response = await getStation(row.stcd)
+    Object.assign(form, response.data)
+    formVisible.value = true
+  } catch (error) {
+    ElMessage.error('获取站点信息失败')
+  }
+}
+
+const submitForm = async () => {
+  try {
+    if (isEdit.value) {
+      await updateStation(form)
+      ElMessage.success('修改成功')
+    } else {
+      await addStation(form)
+      ElMessage.success('新增成功')
+    }
+    formVisible.value = false
+    getList()
+  } catch (error) {
+    ElMessage.error('操作失败')
+  }
+}
+
+const handleDelete = async (row) => {
+  try {
+    await ElMessageBox.confirm('确定删除该站点吗?', '提示', {type: 'warning'})
+    await delStation({stcd: row.stcd})
+    ElMessage.success('删除成功')
+    getList()
+  } catch (error) {
+    if (error !== 'cancel') {
+      ElMessage.error('删除失败')
+    }
+  }
+}
+
+const handleBatchDelete = async () => {
+  try {
+    await ElMessageBox.confirm('确定删除选中的站点吗?', '提示', {type: 'warning'})
+    const data = selectedRows.value.map(item => ({stcd: item.stcd}))
+    await delStation(data)
+    ElMessage.success('批量删除成功')
+    getList()
+  } catch (error) {
+    if (error !== 'cancel') {
+      ElMessage.error('批量删除失败')
+    }
+  }
+}
+
+const handleSelectionChange = (val) => {
+  selectedRows.value = val
+}
+
+const handleExport = async () => {
+  try {
+    const response = await exportStation(queryParams)
+    const blob = new Blob([response])
+    const url = window.URL.createObjectURL(blob)
+    const link = document.createElement('a')
+    link.href = url
+    link.download = '新安江站点数据.xlsx'
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+    window.URL.revokeObjectURL(url)
+    ElMessage.success('导出成功')
+  } catch (error) {
+    ElMessage.error('导出失败')
+  }
+}
+
+const handleImport = () => {
+  fileList.value = []
+  importVisible.value = true
+}
+
+const submitUpload = () => {
+  uploadRef.value.submit()
+}
+
+const handleHttpRequest = (options) => {
+  const {file, onSuccess, onError} = options
+  importStation(file).then(response => {
+    onSuccess(response, file)
+  }).catch(error => {
+    onError(error)
+  })
+}
+
+const handleUploadSuccess = (response) => {
+  if (response.code === 200) {
+    ElMessage.success(response.msg)
+    importVisible.value = false
+    fileList.value = []
+    getList()
+  } else {
+    ElMessage.error(response.msg)
+  }
+}
+
+const handleUploadError = () => {
+  ElMessage.error('导入失败')
+}
+
+const downloadTemplate = async () => {
+  try {
+    const response = await importStationTemplate()
+    const blob = new Blob([response])
+    const url = window.URL.createObjectURL(blob)
+    const link = document.createElement('a')
+    link.href = url
+    link.download = '新安江站点导入模板.xlsx'
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+    window.URL.revokeObjectURL(url)
+    ElMessage.success('模板下载成功')
+  } catch (error) {
+    ElMessage.error('模板下载失败')
+  }
+}
+
+// ============ 详情弹窗相关 ============
+const handleDetail = async (row) => {
+  detailData.value = row
+  detailQuery.stcd = row.stcd
+  // 默认查询当月数据
+  const now = new Date()
+  const firstDayOfMonth = new Date(now.getFullYear(), now.getMonth(), 1)
+  detailDateRange.value = [formatDateStr(firstDayOfMonth), formatDateStr(now)]
+  detailQuery.startTm = formatDateStr(firstDayOfMonth)
+  detailQuery.endTm = formatDateStr(now)
+  detailVisible.value = true
+
+  // 清空水库数据和监测数据
+  skData.value = {}
+  detailDataList.value = []
+
+  // 如果是水库,加载水库基础信息和库容曲线
+  if (row.tp === 'SK') {
+    await nextTick()
+    loadSkDetail(row.stcd)
+    loadQxList(row.stcd)
+  }
+  // 加载监测数据
+  loadDetailData()
+}
+
+const loadSkDetail = async (stcd) => {
+  skLoading.value = true
+  try {
+    const response = await getSkDetail(stcd)
+    skData.value = response.data || {}
+  } catch (error) {
+    console.error(error)
+  } finally {
+    skLoading.value = false
+  }
+}
+
+const loadQxList = async (stcd) => {
+  try {
+    const response = await listQx(stcd)
+    await nextTick()
+    initQxChart(response.data || [])
+  } catch (error) {
+    console.error(error)
+  }
+}
+
+const loadDetailData = async () => {
+  if (!detailQuery.stcd) return
+  detailDataLoading.value = true
+  try {
+    const response = await listData(detailQuery.stcd, detailQuery.startTm, detailQuery.endTm)
+    detailDataList.value = response.data || []
+    await nextTick()
+    initTrendChart(detailDataList.value)
+  } catch (error) {
+    console.error(error)
+  } finally {
+    detailDataLoading.value = false
+  }
+}
+
+const handleDetailDateChange = (val) => {
+  if (val && val.length === 2) {
+    detailQuery.startTm = val[0]
+    detailQuery.endTm = val[1]
+  } else {
+    detailQuery.startTm = ''
+    detailQuery.endTm = ''
+  }
+}
+
+// 库容曲线图表
+const initQxChart = (data) => {
+  if (!qxChartRef.value) return
+  if (!qxChartInstance) {
+    qxChartInstance = echarts.init(qxChartRef.value)
+  }
+  const rzList = data.map(item => item.rz)
+  const krList = data.map(item => item.kr)
+  qxChartInstance.setOption({
+    title: {text: '水位-库容曲线', left: 'center', textStyle: {fontSize: 14}},
+    tooltip: {
+      trigger: 'axis',
+      formatter: (params) => {
+        const p = params[0]
+        return `水位: ${p.axisValue} m<br/>库容: ${p.data} 万m³`
+      }
+    },
+    grid: {left: '8%', right: '8%', bottom: '12%', top: '18%'},
+    xAxis: {
+      type: 'category',
+      name: '水位(m)',
+      data: rzList,
+      axisLine: {lineStyle: {color: '#646464'}},
+      axisLabel: {color: '#646464', fontSize: 12}
+    },
+    yAxis: {
+      type: 'value',
+      name: '库容(万m³)',
+      axisLine: {lineStyle: {color: '#646464'}},
+      axisLabel: {color: '#646464', fontSize: 12},
+      splitLine: {lineStyle: {color: '#e1e5e6'}}
+    },
+    series: [{
+      name: '库容',
+      type: 'line',
+      data: krList,
+      smooth: true,
+      itemStyle: {color: '#1c97e7'},
+      lineStyle: {color: '#1c97e7', width: 2},
+      areaStyle: {
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {offset: 0, color: 'rgba(28, 151, 231, 0.3)'},
+          {offset: 1, color: 'rgba(28, 151, 231, 0.05)'}
+        ])
+      }
+    }]
+  })
+}
+
+// 监测数据趋势图
+const initTrendChart = (data) => {
+  if (!trendChartRef.value) return
+  if (!trendChartInstance) {
+    trendChartInstance = echarts.init(trendChartRef.value)
+  }
+  const tmList = data.map(item => item.tm ? formatDate(item.tm) : '')
+  const zList = data.map(item => item.z)
+  const qList = data.map(item => item.q)
+  trendChartInstance.setOption({
+    title: {text: '水位/流量趋势', left: 'center', textStyle: {fontSize: 14}},
+    tooltip: {trigger: 'axis'},
+    legend: {
+      data: ['水位', '流量'],
+      top: 30,
+      textStyle: {color: '#1f1f1f', fontSize: 13}
+    },
+    grid: {left: '8%', right: '8%', bottom: '15%', top: '22%'},
+    xAxis: {
+      type: 'category',
+      data: tmList,
+      axisLine: {lineStyle: {color: '#646464'}},
+      axisLabel: {color: '#646464', fontSize: 12, rotate: 30}
+    },
+    yAxis: [
+      {
+        type: 'value',
+        name: '水位(m)',
+        position: 'left',
+        axisLine: {lineStyle: {color: '#646464'}},
+        axisLabel: {color: '#646464', fontSize: 12},
+        splitLine: {lineStyle: {color: '#e1e5e6'}}
+      },
+      {
+        type: 'value',
+        name: '流量(m³/s)',
+        position: 'right',
+        axisLine: {lineStyle: {color: '#646464'}},
+        axisLabel: {color: '#646464', fontSize: 12},
+        splitLine: {show: false}
+      }
+    ],
+    series: [
+      {
+        name: '水位',
+        type: 'line',
+        data: zList,
+        smooth: true,
+        itemStyle: {color: '#1c97e7'},
+        lineStyle: {color: '#1c97e7', width: 2}
+      },
+      {
+        name: '流量',
+        type: 'line',
+        yAxisIndex: 1,
+        data: qList,
+        smooth: true,
+        itemStyle: {color: '#26b8f3'},
+        lineStyle: {color: '#26b8f3', width: 2}
+      }
+    ]
+  })
+}
+
+const handleDetailClose = () => {
+  if (qxChartInstance) {
+    qxChartInstance.dispose()
+    qxChartInstance = null
+  }
+  if (trendChartInstance) {
+    trendChartInstance.dispose()
+    trendChartInstance = null
+  }
+}
+
+// 工具函数
+const getTpLabel = (value) => {
+  const labels = {
+    'ZZ': '水文站',
+    'DRP': '雨量站',
+    'WIU': '取水户',
+    'SK': '水库'
+  }
+  return labels[value] || value
+}
+
+const formatDateStr = (date) => {
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
+const formatDate = (date) => {
+  if (!date) return ''
+  return new Date(date).toLocaleString('zh-CN', {
+    year: 'numeric',
+    month: '2-digit',
+    day: '2-digit',
+    hour: '2-digit',
+    minute: '2-digit',
+    second: '2-digit'
+  })
+}
+
+const formatDecimal = (value) => {
+  if (value === null || value === undefined) return '-'
+  return parseFloat(value).toFixed(2)
+}
+
+// 窗口resize时重绘图表
+const handleResize = () => {
+  if (qxChartInstance) qxChartInstance.resize()
+  if (trendChartInstance) trendChartInstance.resize()
+}
+
+window.addEventListener('resize', handleResize)
+
+onBeforeUnmount(() => {
+  window.removeEventListener('resize', handleResize)
+  if (qxChartInstance) {
+    qxChartInstance.dispose()
+    qxChartInstance = null
+  }
+  if (trendChartInstance) {
+    trendChartInstance.dispose()
+    trendChartInstance = null
+  }
+})
+
+getList()
+</script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+}
+
+.mb8 {
+  margin-bottom: 8px;
+}
+
+.detail-section {
+  margin-bottom: 20px;
+}
+
+.detail-section-title {
+  font-size: 16px;
+  color: #1c97e7;
+  margin-bottom: 12px;
+  padding-left: 10px;
+  border-left: 3px solid #1c97e7;
+  line-height: 24px;
+}
+
+.chart-container {
+  width: 100%;
+  height: 320px;
+}
+
+.detail-query-form {
+  margin-bottom: 10px;
+}
+
+:deep(.el-table) {
+  font-size: 14px;
+}
+
+:deep(.el-table th) {
+  font-size: 14px;
+  font-weight: bold;
+}
+
+:deep(.el-table td) {
+  font-size: 14px;
+}
+
+:deep(.el-form-item__label) {
+  font-size: 14px;
+}
+
+:deep(.el-input__inner) {
+  font-size: 14px;
+}
+
+:deep(.el-button) {
+  font-size: 14px;
+}
+
+:deep(.el-pagination) {
+  font-size: 14px;
+  margin-top: 15px;
+}
+</style>