# pvsys **Repository Path**: piweijun/pvsys ## Basic Information - **Project Name**: pvsys - **Description**: 课设 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-06 - **Last Updated**: 2021-07-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 开发文档 ## 一、接口文档 ### 1. 项目根目录 ```tex /pvsys ``` ### 2. 主页 ```tex URL:/pvsys/index Method:GET ``` * 传入参数: | 参数名 | 参数类型 | 解释 | 是否必填 | | ------- | -------- | ------------------------------------------ | --------------- | | current | String | 指明当前页码信息,不同页码获取不同范围数据 | 否(即默认为1) | * 返回参数: * Page对象: | 参数名 | 参数类型 | 解释 | | ------- | -------- | -------------------------------------- | | current | String | 当前页码 | | limit | String | 页显示上限 | | rows | String | 本页对应表:pj_detail的总行数 | | path | String | 访问路径 | | to | String | 页码范围右边界 | | from | String | 页码范围左边界 | | total | String | 总页码数 | | offset | String | 本页第一条数据在实际存储关系中的行偏移 | * nameList | 参数名 | 参数类型 | 解释 | | -------- | ------------ | ------------------------------ | | nameList | String Array | 提取了所有光伏设备的名称,数组 | ### 3. 光伏系统项目概况的CRUD #### I. 增加 ```tex URL:/pvsys/addPjDetail Method:POST ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | -------- | ------------ | ------------ | --------------------------------- | | pjDetail | PjDetail对象 | 一个Json对象 | 除pid外(自动生成),所有属性必填 | * 参数解释 ```tex { "pjDetail":{"pid"="0", //本方法可以不用填写 项目id "name"='tn', //项目名 "type"="ttype", //项目类型 "stage"="ts", //项目阶段 'pjowner'='tp', //项目主 'pjoGroup'='pg', //项目所属组织 'designUnit'='tdu', //设计单位 'date'='2020-1-1'} //立项日期 } ``` #### II. 删除 ```tex URL:/pvsys/deletePjDetail Method:POST ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------ | -------- | -------------------- | -------- | | pid | int | 删除对应项目概况的id | 是 | * 返回参数 | 参数名 | 参数类型 | 解释 | | ------ | -------- | ------------ | | None | Int | 1成功,0失败 | #### III. 修改 ```tex URL:/pvsys/updatePjDetail Method:POST ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | -------- | -------- | ------------ | ------------------------------------------------------------ | | pjDetail | PjDetail | 一个Json对象 | 所有属性必填,与增加不同,需要你带着pid封装为整个PjDetail对象,命名为pjDetail传入 | * 参数解释 ```tex { "pjDetail":{"pid"="tx", //本方法必需填写 "name"='tn', "type"="ttype", "stage"="ts", 'pjowner'='tp', 'pjoGroup'='pg', 'designUnit'='tdu', 'date'='2020-1-1'} } ``` * 返回参数 与II相同; #### IV. 查询 这个方法似乎废弃? ```tex URL:/pvsys/getPjDetail Method:GET ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------ | -------- | --------------------- | -------- | | pid | int | 所要查询详情的项目pid | 是 | * 返回参 | 参数名 | 参数类型 | 解释 | | -------- | ------------ | ------------------ | | pjDetail | PjDetail对象 | PjDetail的详细信息 | ##### 以姓名查询 ```tex URL:/pvsys/getPjDetailByName Method:GET ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------- | -------- | ---------------- | ----------- | | name | String | 项目名称的一部分 | 是 | | current | int | 当前页码 | 是(默认1) | * 返回参数:一组满足要求的PjDetail对象; ##### 以平均气温范围查询 ```tex URL:/pvsys/getPjDetailByAT Method:GET ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------- | -------- | -------- | ----------- | | left | double | 左边界 | 是 | | right | double | 右边界 | 是 | | current | int | 当前页码 | 是(默认1) | * 返回参数:一组满足要求的PjDetail对象; ##### 以投资范围查询 ```tex URL:/pvsys/getPjDetailBySI Method:GET ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------- | -------- | -------- | ----------- | | left | double | 左边界 | 是 | | right | double | 右边界 | 是 | | current | int | 当前页码 | 是(默认1) | * 返回参数:一组满足要求的PjDetail对象; ### 5. 参数查询 #### 天气 ##### I. 修改 ```tex URL:/pvsys/updateWeather Method:POST ``` * 传入参数 ```tex Weather{ wid=1, pid=1, aveTemper=66.6, #多年平均气温 maxTemper=66.6, #多年极端最高气温 minTemper=66.6, #多年极端最低气温 mMaxTemper=66.6, #最热月平均气温 aveWindspeed=66.6, #多年平均风速 maxWindspeed=66.6, #多年极大风速 aveThunder=66.6, #多年平均雷暴日数 radition=66.6, #水平太阳总辐射 solDep=66.6 #多年最大冻土深度 } ``` | 参数名 | 参数类型 | 解释 | 是否必填 | | ------- | ----------- | --------------------- | -------- | | Weather | Weather对象 | JSON形式的Weather对象 | 是 | * 返回类型 | 参数名 | 参数类型 | 解释 | | ------ | -------- | ------------ | | None | Int | 1成功,0失败 | #### 用地情况 ##### I. 修改 ```tex URL:/pvsys/updateLandUse Method:POST ``` * 传入参数 ```tex LandUse{ luid=1, pid=1, totalArea=11.1, #总占地面积 lightArea=0.0, #光伏区用地面积 lightAreaMeth='hah', #光伏区用地方式 stationArea=11.1, #升压站总面积 generalArea=11.1, #生产区总面积 lifeArea=11.1, #生活区总面积 buildingArea=11.1, #综合楼面积 sewageArea=11.1, #污水处理系统面积 fireFightingArea=11.1, #水消防用地面积 stationAreaMeth='ewq' #升压站用地方式 } ``` * 返回结果:1 T 0 F #### 位置 ##### I. 修改 ```tex URL:/pvsys/updateLocation Method:POST ``` * 传入参数 ```tex Location{ lid=1, #位置id pid=1, loc='南京', #位置 height=211.0, #海拔 fwrcode=100, #fwr编码 latitude=76.6, #经度 longitude=53.2 #纬度 } ``` * 返回结果:1 T 0 F #### 总查询 ```tex URL:/pvsys/paramDetail Method:GET ``` * 说明:该方法封装了参数详情的三张表单信息 * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------ | -------- | --------------------- | -------- | | pid | int | 所要查询详情的项目pid | 是 | * 返回参数 | 参数名 | 参数类型 | 解释 | | -------- | ------------ | -------- | | weather | Weather对象 | 天气信息 | | landUse | LandUse对象 | 用地情况 | | location | Location对象 | 位置情况 | #### ### 6. 经济情况查询 #### 投资 ##### I. 修改 ```tex URL:/pvsys/updateInvestment Method:POST ``` * 传入参数 ```tex Investment{ iid=1, #投资id pid=1, statInvest=1.3, #静态投资 dynaInvest=1.3, #动态投资 statInvestPkwh=1.3, #单位千瓦静态投资 dynaInvestPkwh=1.3 #单位千瓦动态投资 } ``` * 返回结果:1 T 0 F #### 设备价格 ##### I. 修改 ```tex URL:/pvsys/updateEquipPrice Method:POST ``` * 传入参数 ```tex EquipPrice{ eid=1, #设备单id pid=1, ybm=14.0, #箱变价格 mainTran=14.0, #主变压器 addvcd=14.0, #无功补偿设备 uuidHh=14.0, #安全态势感知设备 oneFre=14.0 #一次调频装置 } ``` * 返回结果:1 T 0 F #### 总查询 ```tex URL:/pvsys/ecoDetail Method:GET ``` * 传入参数 | 参数名 | 参数类型 | 解释 | 是否必填 | | ------ | -------- | --------------------- | -------- | | pid | int | 所要查询详情的项目pid | 是 | * 返回参数 | 参数名 | 参数类型 | 解释 | | ---------- | -------------- | -------- | | investment | Investment对象 | 投资信息 | | equipPrice | EquipPrice对象 | 设备价格 | ## 二、开发记录 ### 1. Entity工厂 * 意识到在每一个Controller中,直接用new的形式生成对象,操作Service的方法可能有点繁杂,一个对象具有多个属性字段,下面考虑一种封装且根据类名生成对应类的简单工厂方法; * 面向接口:所有的Entity实现接口PvsysEntity,暂时未定义方法; ```java package com.dedsec.pvsys.interfaces; /** * 用于在工厂实例化所有的entity */ public interface PvsysEntity { } ``` * 简单工厂:entityFactory ```java package com.dedsec.pvsys.util; import com.alibaba.fastjson.JSONObject; import com.dedsec.pvsys.interfaces.PvsysEntity; import com.dedsec.pvsys.interfaces.Worker; import com.dedsec.pvsys.util.woker.PjDetailWorker; import org.springframework.stereotype.Component; @Component public class EntityFactory { public static PvsysEntity createPvsysEntity(String name, JSONObject json) throws Exception { //生产的系统实例 PvsysEntity entity = null; //工人 Worker worker = null; switch (name){ case "PjDetail": worker = new PjDetailWorker(); entity = (PvsysEntity) worker.create(json); break; } return entity; } } ``` * 范型接口worker: ```java package com.dedsec.pvsys.interfaces; import com.alibaba.fastjson.JSONObject; public interface Worker { T create(JSONObject json) throws Exception; } ``` * 系统实例接口 interfaces: ```java package com.dedsec.pvsys.interfaces; /** * 用于在工厂实例化所有的entity */ public interface PvsysEntity { } ``` * 创建实例PjDetail: ```java //根据前端的json对象,即可创建 PjDetail pjDetail = (PjDetail) entityFactory.createPvsysEntity("PjDetail",json); return pjDetailService.addPjDetail(pjDetail); ``` ### 2. 项目概况和其他所有表的关系 * 项目概况可以理解为强实体,没有它,其他数据:参数指标和经济指标都不复存在,所以需要额外完整性约束; * 约束条件如下: * 每当我们插入一条数据到项目概况表,参数指标和经济指标都会生成对应pid的空数据; * 每当我们从项目概况表删除一条数据,参数指标和经济指标都会删除对应pid的数据; * 通过查资料得知:触发器已经不被建议使用,因为会耗费大量的资源,那么我们采用Spring的事务管理,来解决这个问题: * 向“pjdetail表插入数据,其他所有表,插入对应pid的默认值: ## 附录 #### 1. 取值范围判断表 | 类型 | 范围 | | ------------ | ------------------- | | DECIMAL(4,1) | -999.9 ~ 9999.9 | | DECIMAL(5,1) | -9999.9 ~ 99999.9 | | DECIMAL(5,2) | -999.99 ~ 9999.99 | | DECIMAL(6,1) | -99999.9 ~ 999999.9 | | DECIMAL(6,2) | -9999.99 ~ 99999.99 | | DECIMAL(6,3) | -999.999 ~ 9999.999 |