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

增加需求和规范文件夹

1、增加公式库文档
2、增加数据库设计规范文档
李爱光 преди 6 години
родител
ревизия
db66e1ac26
променени са 2 файла, в които са добавени 189 реда и са изтрити 0 реда
  1. 87 0
      规范/数据库/数据库设计规范.md
  2. 102 0
      需求/绘管家/公式库/公式库.md

+ 87 - 0
规范/数据库/数据库设计规范.md

@@ -0,0 +1,87 @@
+# 数据库设计规范
+######版本号:V0.0.1
+
+## 基本规范
+* 数据库统一使用MySQL,数据库存储引擎统一使用InnoDB
+* 字符集统一使用`utf8mb4`,排序规则统一使用`utf8mb4_general_ci`
+* 数据表、数据字段必须加入中文注释
+* 禁止使用存储过程,视图,触发器,Event
+* 文件或图片统一存储在文件系统中,URI存储文件的相对路径
+* 数据库连接优先使用内网域名,尽量避免使用IP连接
+* 数据表必须设置主键,主键数据类型必须为递增的整数
+* 不使用组合索引
+* 所有字段必须是`NOT NULL`,并提供默认值
+* 不适用ENUM枚举,使用`tinyint`替代,通过程序实现枚举功能
+* 单表索引字段数建议不要超过5个
+* 禁止使用SELECT *,只获取必要的字段
+* 禁止使用属性隐式转换,如`SELECT id FROM user_user WHERE mobile=13812345678`,而是`SELECT id FROM user_user WHERE mobile='13812345678'`
+* 禁止使用负向查询,如`NOT`,`!=`, `<>`, `!<`, `!>`, `NOT IN`, `NOT LIKE`等
+* 建议对于同一个字段的OR查询改成IN查询,如`SELECT id FROM user_user WHERE status=1 OR status=2`,改成`SELECT id FROM user_user WHERE status IN (1,2)`
+* 如非必要,尽量不使用联合查询,采用分步查询的方式实现更好
+* 应用程序必须捕获SQL异常,并做处理,必须避免将SQL异常信息直接呈现给前端用户。
+* 布尔类型的数值使用`tinyint`存储,0表示`false`,1表示`true`
+* 涉及货币的数据存储统一用整型存储,出库计算时通过程序移位完成。
+* 重要隐私信息、金融数据必须加密存储,如银行卡号。
+* 密码必须使用不可逆加密方式存储,不得存储明文。
+* 数值类型除非有特殊说明,否则默认设置为无符号整数。
+
+## 命名规范
+* 数据库名称统一使用{域名}.{租户名称}-{从库备份库标识}.{数据库环境}的方式命名。
+* 域名不包括.com,.cn这种尾缀,如www.huiguanjia.cn,则域名为huiguanjia。
+* 租户名称为租户唯一标识,若无租户则使用产品名称,如数据库为从库或备份库,则加上-slave或-backup。
+* 数据库环境分为线上环境,标识为online;开发环境,标识为dev;测试环境,标识为test。
+* 示例数据库名称如下:
+	- huiguanjia.xch.online:绘管家新成海线上数据库
+	- huiguanjia.xch.dev:绘管家新成海开发数据库
+	- huiguanjia.xch.test:绘管家新成海测试数据库
+	- huiguanjia.xch-salve.online:绘管家新成海线上从数据库
+	- huiguanjia.xch-backup.online:绘管家新成海线上备份数据库
+* 数据表字段统一使用小写字母,多个单词采用下划线分隔。单词不允许使用拼音,单个单词字符在15字符以内不允许缩写。
+* 数据表名采用模块名_实体名的方式命名,,中间表两个实体时间通过to连接,表名称长度不得超过60个字符(MySQL最大表名称长度为64,Oracle为30),建议表名在30个字符以内,示例数据表名如下:
+	- `service_feedback`:物业服务反馈表
+	- `service_feedback_detail`: 物业服务反馈详情表
+	- `charge_standard_to_house`: 收费系统收费标准关联房屋表
+
+* 数据表字段名禁用编程语言关键字,如`abstract`, `int`, `string`, `public`等。
+	
+## 常用字段
+__常用字段要求必须使用下表的字段,不允许重复新增新的字段名。__
+
+| 名称           | 数据库字段名 | 数据类型  | 最小长度 | 最大长度  | 备注         |
+|:-------------:|:-------------:|:---------:|:----------:|:--------:|:------------|
+| 主键          | id         | int      |   10    |  16      | 数据表主键      |
+| 姓名          | name       |  varchar  |   16   |  64     | 推荐长度设置为64 |
+| 性别          | sex        |  tinyint  |   1    |  1      | 0=女,1=男      |
+| 生日          | birthday        |  int  |   11    |  11   | __有符号整数__      |
+| 手机号         | mobile     | varchar  |   16   |  32      | 推荐长度设置为20 |
+| 电话号码       | telephone  | varchar  |   16   |  32      | 推荐长度设置为16 |
+| 标题          | title      | varchar  |   64   |  128     | 推荐长度设置为128 |
+| 摘要          | summary    | varchar  |   64   |  128     | 推荐长度设置为64 |
+| 备注          | remark    | varchar   |   64    |  128     | 推荐长度设置为64 |
+| 创建时间       | created_at | int     |   11    |  14      | 时间戳,如果保留毫秒数则使用14位 |
+| 更新时间       | updated_at | int     |   11    |  14      | 时间戳,如果保留毫秒数则使用14位 |
+| 创建人        | created_by  | int     |   10    |  16      | 存储数据创建者ID |
+| 更新人        | updated_by  | int     |   10    |  16      | 存储最近一次更新者ID |
+| 省份名        | province_name |  varchar  |   16   |  32  | 推荐长度设置为32 |
+| 省份编号      | province_id   |  int  |   9   |  11  | 推荐长度设置为10 |
+| 城市名        | city_name     |  varchar  |   16   |  32  | 推荐长度设置为32 |
+| 城市编号      | city_id       |  int  |   9   |  11  | 推荐长度设置为10 |
+| 地区名        | district_name     |  varchar  |   16   |  32  | 推荐长度设置为32 |
+| 地区编号      | district_id       |  int  |   9   |  11  | 推荐长度设置为10 |
+| 经度         | longitude    |  decimal  |   10,6   |  10,6  |  |
+| 纬度         | latitude     |  decimal  |   10,6   |  10,6   |  |
+| 单价         | price        |  decimal  |   8,2   |  16,6   |  推荐使用12,6,如果是参与计算的单价建议保留6位小数|
+| 删除标记     | deleted  | tinyint    |   1    |  1      | 1=已删除,0=正常 |
+| 数据可见性   | visible      | tinyint    |    1    |   1     | 0=不可见,1=可见,仅适用于针对C端用户  |
+| 是否启用   | enable         | tinyint    |    1    |   1      | 0=禁用,1=启用  |    
+
+##业务表必备字段
+业务表是指关系产品具体业务逻辑实现的数据表,不包括诸如日志,配置等表。业务表要求必须有以下字段:
+
+* `id`:主键
+* `created_at`:创建时间
+* `created_by`: 创建人(如非后台创建的数据设置为0)
+* `updated_at`: 最近一次更新时间(创建时等于创建时间)
+* `updated_by`: 最近一次更新人(如非后台更新,设置为0,创建时等于创建人)
+* `deleted`: 删除标记(默认为0,即正常状态)
+* `remark`: 备注(默认为空字符串)

+ 102 - 0
需求/绘管家/公式库/公式库.md

@@ -0,0 +1,102 @@
+# 公式库
+######版本:V0.0.1
+
+本文档按各个资产进行公式整理,用于绘管家对应资产的费用计算。
+
+## 名词定义
+* __判断变量__:取值为`布尔`类型,当该值为`true`时,表示关联的资产应当收取此项费用;为`false`时表示关联的资产不收取此项费用。
+* __计算变量__:参与费用计算公式计算的变量,例如__房屋面积__参与__物业服务费__的计算。
+* __阶梯价格__:不同计算变量在不同区间的单价不一样,类似阶梯逐级上升,例如阶梯电费。
+* __折扣__:对计算的结果进行打折处理,取值范围为`[0,1]`,其中1对应100%,当折扣小于1时,与原费用的差额计为__减免金额__。
+* __按房屋分摊倍数分摊__:公摊费用分摊方式的一种,此项费用按照关联的房屋的分摊倍数(大多为1)进行平均分摊。
+* __据实分摊__:公摊费用分摊方式的一种,此项费用按照关联仪表的实际行度多少进行分摊,即住户仪表行度越大,分摊费用越多。
+* __按房屋面积分摊__:公摊费用分摊方式的一种,此项费用按照关联的房屋面积进行分摊。
+* __一次性费用__:该费用仅收取一次,如装修垃圾费。
+
+## 房屋
+房屋涉及到的费用有物业服务费,装修垃圾转运费。各项费用常见公式如下:
+
+* 物业服务费:
+
+```
+物业服务费(F) = 房屋面积(A) * 计费单价(P)
+```
+
+* 装修垃圾转运费
+
+```
+装修垃圾转运费(F) = 房屋面积(A) * 计费单价(P)
+```
+
+## 电表
+电表一般按照行度进行计费,部分地区实行阶梯价格,不按阶梯计价的计算方式如下:
+
+```
+电费(F) = 电表行度(R) * 计费单价(P)
+```
+
+阶梯计费的费用计算方式如下,假设最大价格阶梯为P4,最小阶梯为P1,共4级阶梯:
+
+```php
+if 电表行度 <= P1
+   	阶梯费用 = 电表行度 * 计费单价P1
+else if 电表行度 <= P2
+	阶梯费用 = P1 * 计费单价P1 + (电表行度 - P1) * 计费单价P2
+else if 电表行度 <= P3
+	阶梯费用 = P1 * 计费单价P1 + (P2 - P1) * 计费单价P2 + (电表行度 - P2) * 计费单价P3
+else
+	阶梯费用 = P1 * 计费单价P1 + (P2 - P1) * 计费单价P2 + (P3 - P2) * 计费单价P3 + (电表行度 - P3) * 计费单价P4
+endif
+```
+
+## 水表
+水表一般按照行度进行计费,部分地区实行阶梯价格,不按阶梯计价的计算方式如下:
+
+```
+水费(F) = 水表行度(R) * 计费单价(P)
+```
+
+阶梯计费的费用计算方式如下,假设最大价格阶梯为P4,最小阶梯为P1,共4级阶梯:
+
+```php
+if 水表行度 <= P1
+   	阶梯费用 = 水表行度 * 计费单价P1
+else if 水表行度 <= P2
+	阶梯费用 = P1 * 计费单价P1 + (水表行度 - P1) * 计费单价P2
+else if 水表行度 <= P3
+	阶梯费用 = P1 * 计费单价P1 + (P2 - P1) * 计费单价P2 + (水表行度 - P2) * 计费单价P3
+else
+	阶梯费用 = P1 * 计费单价P1 + (P2 - P1) * 计费单价P2 + (P3 - P2) * 计费单价P3 + (水表行度 - P3) * 计费单价P4
+endif
+```
+
+
+## 条件单价
+在收费标准中,有些参与计算的单价是依据不同的条件设定的,例如按照楼层高低,按照是否装修等。目前已知的具有条件单价的公式有柳州的风情港,其二次加压电费是按照住户水表读数进行据实分摊,如果不存在条件单价,其计算公式如下:
+
+```
+二次加压电费(F) = 二次加压电表读数(M) * 计费单价(P) * 住户水表读数(HM) / 关联房屋住户水表总读数(THM)
+```
+
+在绘管家系统中,将二次加压电表与相应的房屋关联,收费标准设置为`按水表计费行度分摊`即可。然而,该小区为了提现不同楼层加压送水的成本不一样,针对不同楼层设置的不同的收费单价,如下表所示:
+
+| 楼层           | 单价 (元/度) | 
+|:-------------:|:-----------:|
+|  7-15         | 1.4        | 
+|  16-25        | 1.7        | 
+|  26-36        | 2.4        | 
+|  37以上        | 3          |
+
+针对该项需求,需要开发__条件单价设置__功能供客户使用,在计算时应当先计算完数量后再根据房屋满足的条件读取单价进行费用合计计算,涉及的功能调整如下。
+
+* 表单设置:在单价旁增加一个条件单价勾选项,勾选后弹出判断公式和单价两个表单及一个添加条件按钮。
+	* 判断公式用于约束该条件单价的适用范围,单价用于设置该条件下的计费单价
+	* 添加条件按钮用于添加新的条件单价
+* 费用计算:先计算该收费标准的房屋数量(如电表行度,分摊数量,面积,车辆数,车位数等),然后再根据房屋相关属性或读数判断该房屋费用使用于何种计价条件,读取符合条件的单价再乘以数量得出最终的费用。
+* 示例:以风情港二次加压电费为例,其收费公式将调整为:
+
+```
+二次加压电费(F) = 二次加压电表读数(M) * 条件计费单价(CP) * 住户水表读数(HM) / 关联房屋住户水表总读数(THM)
+```
+
+其中条件计费单价是根据某个房屋所满足的条件对应的计费单价。例如,假设该房屋的`楼层`为20层,则该房屋的`条件计费单价`为__1.7元/度__。