Source: data/ModelSchema.js

/**
 * Created by seeker910 on 2017/4/16.
 *  @description 集成了模型结构以及对象的CURD操作
 *  @memberof Rsd.data
 */
Rsd.define('Rsd.data.ModelSchema', {
    extend:'Rsd.common.Object',
    xtype:'model-schema',
    text:'',
    name:'',
    keys:[],
    /**
     * @description 新增对象Service接口
     */
    insertService:'',
    /**
     * @description 修改对象Service接口
     */
    updateService:'',
    /**
     * @description 删除对象Service接口
     */
    deleteService:'',
    /**
     * @description 查找单个对象Service接口
     */
    findService:'',
    /**
     * @description 获取列表数据Service接口
     */
    listService:'',
    /**
     *  @description 列表默认显示字段
     */
    //columns:[],
    /**
     *  @description 表单默认显示字段
     */
    //fields:[],
    /**
     * @constructs Rsd.data.ModelSchema
     * @classdesc Rsd.data.ModelSchema 在js环境中,进一步对模型的结构和模型的CURD service操作进行封装。
     *
     */
    constructor: function ModelSchema (config) {
        config = config || {};
        this.apply(config);
    },
    /**
    * @description 对已存在但列进行合并,对不存在列不会添加到原始数组中,可通过列的visible属性控制列的显示状态
    * */
    getColumns:function getColumns(cols) {


        var  _temp = [];
        var _list = cols||[];
 
        for(var i in _list)
        {
            var _c = _list[i];
            if(Rsd.isEmpty(_c.name))
            {
                continue;
            }
            if(this.__columns_m[_c.name])
            { 
                this.__columns_m[_c.name].tip = this.__columns_m[_c.name].text;
                Rsd.apply(this.__columns_m[_c.name],_c);
               
            }
            else
            {
                _temp.push(_c);
            }
        }
        _temp = _temp.concat(this.columns||[]);

        _temp.sort(function (a,b) {
            return a.index - b.index;
        })

        var _rs = [];
        for(var i in _temp)
        {
            if(_temp[i].visible === false)
            {
                continue;
            }
            _rs.push(_temp[i])
        }

        return _rs;
    },
    /** 
    * @description 对已存在但字段进行合并,对不存在字段不会添加到原始数组中
    * */
    getFields:function getFields(fields) {

        var  _temp = [];

        var _list = fields||[];
        for(var i in _list)
        {
            var _f = _list[i];
            if(Rsd.isEmpty(_f.name))
            {
                continue;
            }
            if(this.__fields_m[_f.name])
            {
                Rsd.apply(this.__fields_m[_f.name],_f)
            }
            else
            {
                _temp.push(_f);
            }
        }

        _temp = _temp.concat(this.fields||[]);
        _temp.sort(function (a,b) {
            return a.index - b.index;
        })

        return _temp;
    },
    /**
    * @description 获取键值
    * */
    getKeyValue:function getKeyValue(object)
    {
        if(Rsd.isEmpty(this.keys))
        {
            return null;
        }
        var obj = object || {};
        return obj[this.keys[0]];
    },
    /**
    * @description 创建初始对象
    * */
    makeObject:function makeObject(object)
    {
        var _old_obj = object||{};
        var _new_obj = {};
        for(var i in this.fields)
        {
            var _p = this.fields[i].dataIndex;
            if(Rsd.isNullOrUndefined(_p))
            {

                continue;
            }
            var _type = this.fields[i].xtype;
            if(_old_obj.hasOwnProperty(_p))
            {
                _new_obj[_p]= _old_obj[_p];
            }
            else
            {
                switch (_type)
                {
                    case 'number':
                    case 'checkbox':
                        _new_obj[_p]= 0;
                        break;
                    case 'date':
                        break;
                    default:
                        _new_obj[_p]= '';
                        break;
                }

            }

        }
        for(var i in this.keys)
        {
            var _p = this.keys[i];
            if(Rsd.isNullOrUndefined(_p))
            { 
                continue;
            }

            if(_old_obj.hasOwnProperty(_p))
            {
                _new_obj[_p]= _old_obj[_p];
            }
        }
        return _new_obj;
    },
    /**
    * @description 新增对象
    *
    * */
    insertObject:function insertObject(object,callback) {
        if(Rsd.isEmpty(this.insertService))
        {
            Rsd.msg("权限限制,无法执行新增。(ERROR:00001)");
            return;
        }

        if (Rsd.isString(this.insertService)) {

            var _data = this.makeObject(object);

            Rsd.app.getService(this.insertService).request(_data, callback,{modelType: this.name});
        }
    },
    /**
    * @description 修改对象
    *
    * */
    updateObject:function updateObject(object,callback) {

        if(Rsd.isEmpty(this.updateService))
        {
            Rsd.msg("权限限制,无法执行修改。(ERROR:00002)");
            return;
        }

        if (Rsd.isString(this.updateService)) {

            var _data = object; 
            var _service = Rsd.app.getService(this.updateService); 
            _service.request(_data, callback,{modelType: this.name});
        }
    },
    /**
    * @description 删除对象
    *
    * */
    deleteObject:function deleteObject(key,callback) {

        if(Rsd.isEmpty(this.deleteService))
        {
            Rsd.msg("权限限制,无法执行删除。(ERROR:00003)");
            return;
        }
        if(Rsd.isEmpty(this.keys))
        {
            Rsd.msg("类型:" + this.name + "主键不存在,无法删除。");
            return ;
        }
        if (Rsd.isString(this.deleteService)) {
            var _data = {modelType: this.name,key:key};

            Rsd.app.getService(this.deleteService).request(_data, callback);
        }
    },
    /**
    * @description 获取单个对象
    * */
    findObject:function getObject(key,callback) {

        if(Rsd.isEmpty(this.findService))
        {
            Rsd.msg("权限限制,无法执行查看。(ERROR:00004)");
            return;
        }

        if(Rsd.isEmpty(this.keys))
        {
            return null;
        }

        if (Rsd.isString(this.findService)) {
            var _data = {modelType: this.name};
            _data[this.keys[0]] = key;
            Rsd.app.getService(this.findService).request(_data, callback);
        }
    },
    /**
    * @description 获取对象列表
    * */  
    listObjects:function listObjects(args,callback) {
        //debugger;
        if(Rsd.isEmpty(this.listService))
        {
            Rsd.msg("权限限制,无法执行查找。(ERROR:00005)");
            return;
        }
         
        var _args = args|| {}; 
        _args.modelType = this.name  
        _args.sort = _args.sort || [];
        if(_args.sort.length == 0)
        {
            //_args.sort.push({name:'AddTime',direction:'desc'});
        }

        if(Rsd.isArray(_args.where))
        {
            for(var i in _args.where)
            {
                var _w = _args.where[i];
                if( !Rsd.isString(_w['name']) )
                {
                    throw new Error('Property [name] is not a effective value in where json .');
                }
                    if (!Rsd.isString(_w['op']) )
                    {
                        throw new Error('Property [op] is not a effective value in where json .');
                    }
                    if((_w['op'].toLowerCase() != 'isnull' && _w['op'].toLowerCase() != 'isnotnull') &&  (_w['value']==undefined || _w['value']== null))
                {
                    throw new Error('Property [value] is not a effective value in where json .');
                }
            }
        }

        Rsd.app.getService(this.listService).request(_args, callback);
    
    }


},function (type) {

    var _columnsGetter = function () {
       if(this.__columns == undefined)
       {
           this.__columns = [];
       }
        return this.__columns;
    };

    var _columnsSetter = function (value) {

        this.__columns = value;
        this.__columns_m ={};
        for(var i in this.__columns)
        {
            var _c = this.__columns[i];
            if(Rsd.isEmpty(_c.name))
            {
                continue;
            }
            this.__columns_m[_c.name] = _c;

        }
    }

    this.defineProperty(type,"columns", _columnsGetter, _columnsSetter,false);


    var _fieldsGetter = function () {
        if(this.__fields == undefined)
        {
            this.__fields = [];
        }
        return this.__fields;
    };

    var _fieldsSetter = function (value) {

        this.__fields = value;
        this.__fields_m = {};
        for(var i in this.__fields)
        {
            var _f = this.__fields[i];
            if(Rsd.isEmpty(_f.name))
            {
                continue;
            }
            this.__fields_m[_f.name] = _f;
        }
    }

    this.defineProperty(type,"fields", _fieldsGetter, _fieldsSetter,false);
});