import * as F from 'lodash'

declare global {
    // 扩展mysql的基本数据类型的映射，方便业务层的表结构定义实现。_t全部为业务框架上统一扩展的基础数据类型，在mysql底层中有正确的映射关系支持。
    // https://blog.csdn.net/yaoyutian/article/details/80244101  varchar详细解释
    type string_t = string // 映射到varchar最大值长度（可以根据需要定义其他text/mediumtext/longtext等等）
    type enum_t = string // 枚举字符串类型，最长4个字符，char[4]数据类型映射在业务代码上。
    type callback_t = Function // 回调方法的统一定义
    type alias_t = any // xquery的主表查询的别名字段名
    // type boolean_t = boolean // 映射到tinyint(1)
    // { [$.is_cancelled]: false } A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
    type boolean_t = any

    // mysql中的枚举值映射到数据库中统一定义为tinyint一个字节无符号整数10,20,30,40,xxx,之间进行扩展然后在中间插入相关值进行排序。改进为char[4]定义方便代码开发使用也易于理解。
    type double_t = number // 映射到double
    type float_t = number  // 映射到float
    type decimal_t = number  // 精确数值的特殊处理规范的约定扩展实现，仅仅在数据库中进行各种运算处理，前端仅仅是直传映射处理。
    type integer_t = number  // 映射到4字节的int类型的扩展
    type bigint_t = number   // 映射到8字节的bigint类型的扩展
    type time_t = Date // 年-月-日 时:分:秒[.微妙]  =》 映射为datetime的mysql数据类型
    type date_t = Date // 年-月-日  =》 映射为date的mysql数据类型（精简数据类型以及更好的方便处理数据）
    // 一般不需要定义会被自动生成出来（统一定义在全局Model基类中了）
    type id_t = string // 主键标识（64位的bigint处理实现，在前端上统一处理为字符串类型）对于 bigint 主键字符串的统一兼容处理实现的统一配置
    type uuid_t = string // 主键中的扩展uuid字段处理的规范(uuid-v4去掉中划线总计32个字符长度)，用xuuid方法统一生成对应的值。
    // ========== 下列属性再不支持定义在数据库Model中 ===========
    // type bigint = string  // 暂不开放支持此特性的功能实现，64位整数javascript无法处理只能当成字符串进行特殊处理，有待优化mysql的处理封装验证实现。
    // type url_t = string // 完整网址
    // type email_t = string // 邮箱字符串处理
    // type fqdn_t = string // 域名字符串处理
    // TODO 。。。 扩展更多的基础数据类型在业务应用上方便使用，以及进行正确的数据类型的统一验证处理。 
    /*
        设计规范：
        1. 所有字段都必须是NOT NULL的类型，必须强制赋值一个缺省为空的值进行配置设置（枚举值为空字符串，所有数值都是不太好的设计）
        2. 按需定义必须要配置上对应的基础数据类型规范的统一。
        不建议列上允许为空。最好限制not null，并设置一个默认值，比如0和''空字符串等，如果是datetime类型，可以设置成'0000-00-00 00:00:00'这样的特殊值。
        对于所有非空时间的统一规范检查问题，在前端统一的判定识别处理。
        3. 枚举类型统一定义为char类型4个字符长度方便代码中扩展以及人为的数据维护易于语义的理解是经过项目考验过的数据。
           枚举类型必须要有正确的初始值配置。
        ------------------
        要尽可能地把字段定义为 NOT NULL，即使应用程序无须保存 NULL（没有值），也有许多表包含了可空列（Nullable Column）
        这仅仅是因为它为默认选项。除非真的要保存 NULL，否则就把列定义为 NOT NULL
        MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。
        可空列需要更多的储存空间，还需要在MySQL内部进行特殊处理。当可空列被索引的时候，
        每条记录都需要一个额外的字节，还可能导致 MyISAM 中固定大小的索引(例如一个整数列上的索引)变成可变大小的索引。
        即使要在表中储存「没有值」的字段，还是有可能不使用 NULL 的，考虑使用 0、特殊值或空字符串来代替它。
        把 NULL 列改为 NOT NULL 带来的性能提升很小，所以除非确定它引入了问题，否则就不要把它当作优先的优化措施。
        然后，如果计划对列进行索引，就要尽量避免把它设置为可空,虽然在mysql里 Null值的列也是走索引的
    */

    // 目标代码生成内部使用的全局装饰器（业务上禁止使用，框架内部使用，此处定义规避静态类型检测误报错误）
    const D: any
}