# 本项目用于根据设计文档生成unit单元
## 框架的思路
+ 将复杂的流程转为一个个PU，框架托管PU的非逻辑部分，PU只关注逻辑部分代码即可。
+ 设计人员写完设计文档后，自动生成PU单元的脚本，提供测试数据，提供单元测试模块，可直接运行，后台开发人员可直接启动，提供假数据，同时进行业务逻辑开发。前端人员可快速调通接口，进行开发。
## 使用步骤
1. 按格式编写设计文档
2. 运行DalGenScript.py，直接运行须修改main函数中路径，cmd运行须传入路径参数
3. 按设计文档自动生成对应unit单元，测试单元包括脚本、测试用例、测试数据、启动脚本
4. 根据设计文档中的unit的连接关系，生成unit结构图，以新文件的形式重写md设计文档  
![unit_frame](source/unit_frame.png)

## 测试运行
1. 运行生成文件中的run_test.py
2. 运行jar
3. 获取token，发送http请求：  
localhost:8080/pu?fidx=calSymbolProfit&type=QueryMeta&url=http://www.qq.com

## 生成目录
代码根据设计文档中unit中unit_info的folder路径，生成unit名称目录，然后生成.py和.info文件：  
![generate_folder](source/generate_folder.png)
## 关于unit.py文件
根据设计文档生成unit类，设计文档中的function_list中的每个function都会生成4个函数
+ func_Info() 表示func的基本信息
+ func_Meta() 表示func的数据描述，首先请求此函数
+ func_Data() 表示func的实际数据，需要使用func_Meta()的返回结果来请求
+ func_NewData() 用户订阅数据后，数据更新则进入此函数
## 关于上层unit
1. 根据设计文档中的上层unit列表，可自动生成上层unit中各function的数据接口，可直接调用获取数据，接口名格式如下：\_get_[unit_name]_[function_name]_data()
2. 上层unit和DB冲突，只能存在一个
## 关于设计文档
+ 设计文档采用markdowm格式编辑
+ ***模板中以“#”开头的关键词请全部保留，即使内容为空***
+ 设计文档模板见[UnitDesign/design.md](./UnitDesign/design.md)
+ 设计文档请严格按照模板目录结构编写，包括带“+ ”的数据列表，“+”数据列表赋值用“=”，注意markdown格式中的空格
+ 非开头的“#”作为数据注释
+ 保留“> ”开头的为注释
+ 功能的output请用json格式定义，注意不要漏写“双引号”
### 设计文档示例
```markdown
# HoldingProfit_PU
## unit_info
+ discription = 计算品种持仓盈亏
+ lang = python
> 语言包括：python C++ 
+ folder = F:\SZZN\HuaWen\code\calPU\
+ type = pu
## upper_unit
+ tick_data_PU
+ sina_data_PU
+ trade_data_PU
## data_base
> 只生成读的函数，参数为： 表明、字段名列表 、where条件
+ hosts = localhost
+ port = 3306
+ user = root
+ pd = admin
+ db = MarketDataRaw
## function_list
### calSymbolProfit()
#### input
+ accountid = 42313454332
+ sttime = 20200401
+ symbol = cu2010
#### output
> 注意，md语法每行最后双空格再换行才是换行,转pdf时注意

{
    "trade_dic" :
    {
        "tradeId" : "str", # 交易代码
        "tradeTime" : "datetime", # 交易时间
        "buyPrice" : "st", # 买入价
        "symbolinfo" :  # 标的信息
        {
            "symbol":"str", # 标的名
            "exchange":"str", # 交易所
            "priceInfo": # 价格信息
            {
                "pricetick":"float", # 最小变动价格
                "margin":"float"
            }
        }
    }
}

#### meta_data
+ ownerID = 500
+ ownerGroupID = 200
+ acCode = 0x111
+ did = 9527
+ zipDataSize = 692k
+ rawDataSize = 1428k
+ md5 = lkjliudfadf12jolx
+ dataTime = 20200109
+ version = 1.0
+ description = 这里写了一堆的数据描述

### calTotalProfit()
#### input
+ accountid = 42313454332
+ sttime = 20200101
#### output
> 注意，md语法每行最后双空格再换行才是换行,转pdf时注意

{
    "trade_dic" :
    {
        "tradeId" : "str", # 交易代码
        "tradeTime" : "datetime", # 交易时间
        "buyPrice" : "st", # 买入价
        "symbolinfo" :  # 标的信息
        {
            "symbol":"str", # 标的名
            "exchange":"str", # 交易所
            "priceInfo": # 价格信息
            {
                "pricetick":"float", # 最小变动价格
                "margin":"float"
            }
        }
    }
}
#### meta_data
+ ownerID = 500
+ ownerGroupID = 200
+ acCode = 0x111
+ did = 9527
+ zipDataSize = 692k
+ rawDataSize = 1428k
+ md5 = lkjliudfadf12jolx
+ dataTime = 20200109
+ version = 1.0
+ description = 这里写了一堆的数据描述
