import moment from 'moment';
import { init } from 'echarts';
import { MDControlBase } from './md-control-base';
import { AppChartService } from '../ctrl-service';
import { Util, ChartLineSeries, ChartFunnelSeries, ChartPieSeries, ChartMapSeries, ChartBarSeries, ChartRadarSeries, ChartScatterSeries, ChartGaugeSeries, ChartCandlestickSeries, LogUtil, } from '@ibizstudio/runtime';
/**
 * 图表部件基类
 *
 * @export
 * @class ChartControlBase
 * @extends {MDControlBase}
 */
export class ChartControlBase extends MDControlBase {
    constructor() {
        super(...arguments);
        /**
         * 图表div绑定的id
         *
         * @type {}
         * @memberof ChartControlBase
         */
        this.chartId = Util.createUUID();
        /**
         * 是否无数据
         *
         * @public
         * @type {boolean}
         * @memberof ChartControlBase
         */
        this.isNoData = false;
        /**
         * 序列模型
         *
         * @type {}
         * @memberof ChartControlBase
         */
        this.seriesModel = {};
        /**
         * 图表绘制最终参数
         *
         * @memberof ChartControlBase
         */
        this.chartRenderOption = {};
        /**
         * 初始化图表所需参数
         *
         * @type {}
         * @memberof ChartControlBase
         */
        this.chartOption = {};
        /**
         * 图表自定义参数集合
         *
         * @memberof ChartControlBase
         */
        this.chartUserParams = {};
        /**
         * 图表基础动态模型
         *
         * @memberof ChartControlBase
         */
        this.chartBaseOPtion = {};
        /**
         * 图表值属性
         *
         * @memberof ChartControlBase
         */
        this.chartValueName = '';
        /**
         * 图表分类属性
         *
         * @memberof ChartControlBase
         */
        this.chartCatalogName = '';
    }
    /**
     * 部件模型数据初始化实例
     *
     * @memberof ChartControlBase
     */
    async ctrlModelInit(args) {
        await super.ctrlModelInit();
        this.service = new AppChartService(this.controlInstance, this.context);
        await this.service.loaded(this.controlInstance);
        this.initChartParams();
    }
    /**
     * 执行created后的逻辑
     *
     * @memberof ChartControlBase
     */
    ctrlInit() {
        super.ctrlInit();
        if (this.viewState) {
            this.chartStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
                if (!Object.is(tag, this.name)) {
                    return;
                }
                if (Object.is('load', action)) {
                    this.load(data);
                }
                if (Object.is('refresh', action)) {
                    this.refresh(data);
                }
            });
        }
    }
    /**
     * 初始化chart参数
     *
     * @memberof ChartControlBase
     */
    initChartParams() {
        this.initSeriesModel();
        this.initChartOption();
        this.initChartUserParams();
        this.initChartBaseOPtion();
    }
    /**
     * 初始化series
     *
     * @memberof ChartControlBase
     */
    async initSeriesModel() {
        var _a;
        if (!this.controlInstance.getPSDEChartSerieses()) {
            return;
        }
        for (let index = 0; index < ((_a = this.controlInstance.getPSDEChartSerieses()) === null || _a === void 0 ? void 0 : _a.length); index++) {
            const series = this.controlInstance.getPSDEChartSerieses()[index];
            if (series) {
                this.initChartSeries(await this.getSeriesModelParam(series), series);
            }
        }
    }
    /**
     * 获取SeriesModel参数
     *
     * @param {*} series 序列模型
     * @return {*}  {Promise<any>}
     * @memberof ChartControlBase
     */
    getSeriesModelParam(series) {
        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
        this.chartValueName = (_a = series.valueField) === null || _a === void 0 ? void 0 : _a.toLowerCase();
        this.chartCatalogName = (_b = series.catalogField) === null || _b === void 0 ? void 0 : _b.toLowerCase();
        // 构造dataSetFields属性
        const opts = {
            name: (_c = series.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(),
            categorField: (_d = series.catalogField) === null || _d === void 0 ? void 0 : _d.toLowerCase(),
            valueField: (_e = series.valueField) === null || _e === void 0 ? void 0 : _e.toLowerCase(),
            seriesValues: [],
            seriesIndex: series.index | 0,
            data: [],
            seriesMap: {},
            categorCodeList: {
                type: (_f = series.getCatalogPSCodeList()) === null || _f === void 0 ? void 0 : _f.codeListType,
                tag: (_g = series.getCatalogPSCodeList()) === null || _g === void 0 ? void 0 : _g.codeName, emptycode: 'empty',
                emptytext: (_h = series.getCatalogPSCodeList()) === null || _h === void 0 ? void 0 : _h.emptyText
            },
            dataSetFields: this.getDataSetFields(series),
            ecxObject: {
                label: {
                    show: true,
                    position: 'top',
                },
                labelLine: {
                    length: 10,
                    lineStyle: {
                        width: 1,
                        type: 'solid',
                    },
                },
                itemStyle: {
                    borderWidth: 1,
                },
                emphasis: {
                    label: {
                        show: true,
                        fontSize: 20,
                    },
                },
            },
            seriesCodeList: series.getSeriesPSCodeList() ? {
                type: (_j = series.getSeriesPSCodeList()) === null || _j === void 0 ? void 0 : _j.codeListType,
                tag: (_k = series.getSeriesPSCodeList()) === null || _k === void 0 ? void 0 : _k.codeName, emptycode: 'empty',
                emptytext: (_l = series.getSeriesPSCodeList()) === null || _l === void 0 ? void 0 : _l.emptyText
            } : null,
            seriesNameField: (_m = series.seriesField) === null || _m === void 0 ? void 0 : _m.toLowerCase(),
            ecObject: {},
            seriesTemp: {
                type: series.eChartsType,
            },
            type: series.eChartsType,
            seriesLayoutBy: series.seriesLayoutBy,
            baseOption: {},
        };
        // 饼图引导线默认配置
        if (Object.is(series.eChartsType, 'pie')) {
            Object.assign(opts.ecxObject.label, {
                position: 'outside',
                formatter: `{b}: {d}%({@${opts.valueField}})`
            });
            Object.assign(opts.ecxObject.labelLine, {
                show: true,
            });
        }
        // 漏斗图默认配置
        if (Object.is(series.eChartsType, 'funnel')) {
            Object.assign(opts.ecxObject.label, {
                position: 'outside',
                formatter: `{b}: {d}%({@${opts.valueField}})`
            });
        }
        // 地图默认配置（暂时自定义）
        if (Object.is(series.eChartsType, 'custom')) {
            Object.assign(opts.ecxObject.label, {
                formatter: `{b}: {@${opts.valueField}}`
            });
            opts.ecxObject.tooltip = {
                trigger: 'item',
                formatter: '{b}:  {c}'
            };
        }
        // 处理自定义ECX参数
        this.fillUserParam(series, opts.ecxObject, 'ECX');
        this.fillUserParam(series, opts.ecObject, 'EC');
        Object.assign(opts, series.baseOptionJOString ? new Function('return {' + series.baseOptionJOString + '}')() : {});
        return opts;
    }
    /**
     * 临时获取seriesDataSetField 模型
     *
     * @param {*} series 序列模型
     * @return {*}
     * @memberof ChartControlBase
     */
    getDataSetFields(series) {
        var _a, _b, _c;
        const seriesData = [];
        const dataSet = ((_a = this.controlInstance.getPSChartDataSets()) === null || _a === void 0 ? void 0 : _a.find((item) => {
            var _a, _b;
            return item.id === ((_b = (_a = series === null || series === void 0 ? void 0 : series.M) === null || _a === void 0 ? void 0 : _a.getPSChartDataSet) === null || _b === void 0 ? void 0 : _b.id) || null;
        })) || null;
        if (!dataSet && !dataSet.getPSChartDataSetFields()) {
            return null;
        }
        for (let index = 0; index < ((_b = dataSet.getPSChartDataSetFields()) === null || _b === void 0 ? void 0 : _b.length); index++) {
            const dataFile = dataSet.getPSChartDataSetFields()[index];
            const data = {};
            if (dataFile.getPSCodeList()) {
                const codelist = dataFile.getPSCodeList();
                Object.assign(data, { codelist: codelist });
            }
            data['isGroupField'] = dataFile.groupField;
            data['name'] = (_c = dataFile.name) === null || _c === void 0 ? void 0 : _c.toLowerCase();
            data['groupMode'] = dataFile.groupMode ? dataFile.groupMode : "";
            // 只读不合并数据（扩展值属性4）
            if (series.extValue4Field && Object.is(dataFile.name, series.extValue4Field)) {
                data['isReadOnly'] = true;
            }
            seriesData.push(data);
        }
        return seriesData;
    }
    /**
     * 初始化填充seriesModel
     *
     * @param {*} opts 图表参数
     * @param {*} series 序列模型
     * @return {*}  {*}
     * @memberof ChartControlBase
     */
    initChartSeries(opts, series) {
        var _a, _b, _c, _d, _e, _f, _g, _h, _j;
        switch (series.eChartsType) {
            // 折线图
            case 'line':
                this.seriesModel[(_a = series.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()] = new ChartLineSeries(opts);
                break;
            // 漏斗图
            case 'funnel':
                this.seriesModel[(_b = series.name) === null || _b === void 0 ? void 0 : _b.toLowerCase()] = new ChartFunnelSeries(opts);
                break;
            // 饼图
            case 'pie':
                this.seriesModel[(_c = series.name) === null || _c === void 0 ? void 0 : _c.toLowerCase()] = new ChartPieSeries(opts);
                break;
            // 柱状图
            case 'bar':
                this.seriesModel[(_d = series.name) === null || _d === void 0 ? void 0 : _d.toLowerCase()] = new ChartBarSeries(opts);
                break;
            // 雷达图
            case 'radar':
                this.seriesModel[(_e = series.name) === null || _e === void 0 ? void 0 : _e.toLowerCase()] = new ChartRadarSeries(opts);
                break;
            // 散点图
            case 'scatter':
                this.seriesModel[(_f = series.name) === null || _f === void 0 ? void 0 : _f.toLowerCase()] = new ChartScatterSeries(opts);
                break;
            // 仪表盘
            case 'gauge':
                this.seriesModel[(_g = series.name) === null || _g === void 0 ? void 0 : _g.toLowerCase()] = new ChartGaugeSeries(opts);
                break;
            // K线图
            case 'candlestick':
                this.seriesModel[(_h = series.name) === null || _h === void 0 ? void 0 : _h.toLowerCase()] = new ChartCandlestickSeries(opts);
                break;
            // 自定义（暂时地图）
            case 'custom':
                this.seriesModel[(_j = series.name) === null || _j === void 0 ? void 0 : _j.toLowerCase()] = new ChartMapSeries(opts);
                break;
        }
    }
    /**
     * 填充chartOption
     *
     * @memberof ChartControlBase
     */
    initChartOption() {
        var _a, _b, _c, _d;
        const series = [];
        // 填充series
        const indicator = [];
        (_a = this.controlInstance.getPSDEChartSerieses()) === null || _a === void 0 ? void 0 : _a.forEach((_series) => {
            series.push(this.fillSeries(_series, indicator));
        });
        // 填充xAxis
        const xAxis = [];
        (_b = this.controlInstance.getPSChartXAxises()) === null || _b === void 0 ? void 0 : _b.forEach((_xAxis) => {
            xAxis.push(this.fillAxis(_xAxis));
        });
        // 填充yAxis
        const yAxis = [];
        (_c = this.controlInstance.getPSChartYAxises()) === null || _c === void 0 ? void 0 : _c.forEach((_yAxis) => {
            yAxis.push(this.fillAxis(_yAxis));
        });
        // 填充grid
        const grid = [];
        (_d = this.controlInstance.getPSChartGrids()) === null || _d === void 0 ? void 0 : _d.forEach((_grid) => {
            grid.push(Object.assign({}, _grid.baseOptionJOString ? (new Function("return {" + _grid.baseOptionJOString + '}'))() : {}));
        });
        // chartOption参数
        const opt = {
            tooltip: { show: true },
            dataset: [],
            series: series,
            xAxis: xAxis,
            yAxis: yAxis,
            // grid: grid,
        };
        this.fillTitleOption(opt);
        this.fillLegendOption(opt);
        this.registerMap();
        // 合并chartOption
        Object.assign(this.chartOption, opt);
        // 雷达图特殊参数
        if (indicator.length > 0) {
            Object.assign(this.chartOption, { radar: { indicator } });
        }
    }
    /**
     * 填充标题配置
     *
     * @param opts 图表配置
     * @memberof ChartControlBase
     */
    fillTitleOption(opts) {
        var _a, _b;
        if (this.controlInstance.getPSDEChartTitle()) {
            const _titleModel = this.controlInstance.getPSDEChartTitle();
            let title = {
                show: _titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.showTitle,
                text: this.$tl((_a = _titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.getTitlePSLanguageRes()) === null || _a === void 0 ? void 0 : _a.lanResTag, _titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.title),
                subtext: this.$tl((_b = _titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.getSubTitlePSLanguageRes()) === null || _b === void 0 ? void 0 : _b.lanResTag, _titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.subTitle),
            };
            if (_titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.titlePos) {
                switch (_titleModel === null || _titleModel === void 0 ? void 0 : _titleModel.titlePos) {
                    case 'LEFT':
                        Object.assign(title, {
                            left: 'left',
                        });
                        break;
                    case 'RIGHT':
                        Object.assign(title, {
                            left: 'right',
                        });
                        break;
                    case 'BOTTOM':
                        Object.assign(title, {
                            left: 'center',
                            top: 'bottom'
                        });
                        break;
                }
            }
            Object.assign(opts, { title });
        }
    }
    /**
    * 填充图例配置
    *
    * @param opts 图表配置
    * @memberof ChartControlBase
    */
    fillLegendOption(opts) {
        const legendModel = this.controlInstance.getPSDEChartLegend();
        let legend = {
            show: legendModel === null || legendModel === void 0 ? void 0 : legendModel.showLegend
        };
        if (legendModel === null || legendModel === void 0 ? void 0 : legendModel.legendPos) {
            switch (legendModel.legendPos) {
                case 'LEFT':
                    Object.assign(legend, {
                        left: 'left',
                        top: 'middle',
                        orient: 'vertical'
                    });
                    break;
                case 'RIGHT':
                    Object.assign(legend, {
                        left: 'right',
                        top: 'middle',
                        orient: 'vertical'
                    });
                    break;
                case 'BOTTOM':
                    Object.assign(legend, {
                        top: 'bottom'
                    });
                    break;
            }
        }
        Object.assign(opts, { legend });
    }
    /**
    * 注册
    *
    * @param name 地图名称
    * @memberof ChartControlBase
    */
    registerMap() {
        // const userParams: any = this.controlInstance.userParams || {};
        // if (userParams?.mapName) {
        //     const geoJson = require(`@/assets/json/map/${userParams?.mapName}.json`);
        //     registerMap(userParams?.mapName, geoJson);
        // }
    }
    /**
     * 填充 series
     *
     * @param {*} series 序列模型
     * @param {*} [indicator={}] 雷达图参数
     * @return {*}
     * @memberof ChartControlBase
     */
    fillSeries(series, indicator = {}) {
        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
        const encode = {};
        let customType = "";
        const assginCodeList = (codeList) => {
            var _a, _b;
            (_b = (_a = codeList.getPSCodeItems) === null || _a === void 0 ? void 0 : _a.call(codeList)) === null || _b === void 0 ? void 0 : _b.forEach((_item) => {
                var _a, _b, _c;
                let item = {
                    name: _item.text,
                    max: ((_a = _item.userParams) === null || _a === void 0 ? void 0 : _a.MAXVALUE) ? _item.userParams.MAXVALUE : null
                };
                indicator.push(item);
                if (((_c = (_b = _item === null || _item === void 0 ? void 0 : _item.getPSCodeItems) === null || _b === void 0 ? void 0 : _b.call(_item)) === null || _c === void 0 ? void 0 : _c.length) > 0) {
                    assginCodeList(_item);
                }
            });
        };
        switch (series.eChartsType) {
            case 'line':
            case 'bar':
                const cSCartesian2DEncode = series.getPSChartSeriesEncode();
                encode.x = this.arrayToLowerCase(cSCartesian2DEncode.getX());
                encode.y = this.arrayToLowerCase(cSCartesian2DEncode.getY());
                break;
            case 'pie':
            case 'funnel':
                const CSNoneEncode = series.getPSChartSeriesEncode();
                encode.itemName = (_a = CSNoneEncode.category) === null || _a === void 0 ? void 0 : _a.toLowerCase();
                encode.value = (_b = CSNoneEncode.value) === null || _b === void 0 ? void 0 : _b.toLowerCase();
                break;
            case 'radar':
                encode.itemName = "type";
                const catalogCodeList = (_c = series.getCatalogPSCodeList) === null || _c === void 0 ? void 0 : _c.call(series);
                if (catalogCodeList) {
                    assginCodeList(catalogCodeList);
                }
                break;
            case 'scatter':
                break;
            case 'gauge':
                break;
            case 'candlestick':
                const candlestickEncode = series.getPSChartSeriesEncode();
                encode.x = this.arrayToLowerCase(candlestickEncode.getX());
                encode.y = this.arrayToLowerCase(candlestickEncode.getY());
                break;
            case 'custom':
                customType = "map";
                break;
            default:
                break;
        }
        return Object.assign({ id: (_d = series === null || series === void 0 ? void 0 : series.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), name: this.$tl((_e = series.getCapPSLanguageRes()) === null || _e === void 0 ? void 0 : _e.lanResTag, series.caption), type: customType ? customType : series.eChartsType, xAxisIndex: ((_h = (_g = (_f = series === null || series === void 0 ? void 0 : series.getPSChartSeriesEncode()) === null || _f === void 0 ? void 0 : _f.M) === null || _g === void 0 ? void 0 : _g.getPSChartXAxis) === null || _h === void 0 ? void 0 : _h.id) | 0, yAxisIndex: ((_l = (_k = (_j = series === null || series === void 0 ? void 0 : series.getPSChartSeriesEncode()) === null || _j === void 0 ? void 0 : _j.M) === null || _k === void 0 ? void 0 : _k.getPSChartYAxis) === null || _l === void 0 ? void 0 : _l.id) | 0, datasetIndex: ((_o = (_m = series === null || series === void 0 ? void 0 : series.M) === null || _m === void 0 ? void 0 : _m.getPSChartDataSet) === null || _o === void 0 ? void 0 : _o.id) | 0, encode: Object.keys(encode).length > 0 ? encode : null }, series.baseOptionJOString ? (new Function("return {" + series.baseOptionJOString + '}'))() : {});
    }
    /**
     * 填充 axis
     *
     * @param {IPSChartGridXAxis} axis 坐标模型
     * @return {*}  {*}
     * @memberof ChartControlBase
     */
    fillAxis(axis) {
        var _a;
        const _axis = {
            // gridIndex: axis.index,
            position: axis.position,
            type: axis.eChartsType,
            name: this.$tl((_a = axis.getCapPSLanguageRes()) === null || _a === void 0 ? void 0 : _a.lanResTag, axis.caption),
        };
        const dataShowMode = axis.dataShowMode;
        if (dataShowMode === 1) {
            //  纵向显示
            Object.assign(_axis, {
                axisLabel: {
                    formatter: (value) => {
                        if (value.length > 4) {
                            return value.substr(0, 4).split('').join('\n') + '\n...';
                        }
                        else {
                            return value.split('').join('\n');
                        }
                    }
                }
            });
        }
        else if (dataShowMode === 2) {
            //  横向显示
        }
        else if (dataShowMode === 3) {
            //  斜向显示
            Object.assign(_axis, {
                axisLabel: {
                    rotate: 45,
                    formatter: (value) => {
                        if (value.length > 4) {
                            return value.substr(0, 4) + '...';
                        }
                        else {
                            return value;
                        }
                    }
                }
            });
        }
        // 填充用户自定义参数
        this.fillUserParam(axis, _axis, 'EC');
        if (axis.minValue) {
            _axis['min'] = axis.minValue;
        }
        if (axis.maxValue) {
            _axis['max'] = axis.maxValue;
        }
        return _axis;
    }
    /**
     * 处理用户自定义参数
     *
     * @param {*} param 模型对象
     * @param {*} opts 图表参数
     * @param {string} tag 模式标识
     * @return {*}
     * @memberof ChartControlBase
     */
    fillUserParam(param, opts, tag) {
        if (!param.userParams) {
            return;
        }
        const userParam = param.userParams;
        switch (tag) {
            case 'ECX':
                if (userParam['ECX.label']) {
                    opts['label'] = eval("(" + userParam['ECX.label'] + ")");
                }
                if (userParam['ECX.labelLine']) {
                    opts['labelLine'] = eval("(" + userParam['ECX.labelLine'] + ")");
                }
                if (userParam['ECX.itemStyle']) {
                    opts['itemStyle'] = eval("(" + userParam['ECX.itemStyle'] + ")");
                }
                if (userParam['ECX.emphasis']) {
                    opts['emphasis'] = eval("(" + userParam['ECX.emphasis'] + ")");
                }
                for (const key in userParam) {
                    if (Object.prototype.hasOwnProperty.call(userParam, key)) {
                        if (key.indexOf('EC.') != -1) {
                            const value = userParam[key].trim();
                            opts[key.replace('EC.', '')] = value;
                        }
                    }
                }
                break;
            case 'EC':
                for (const key in userParam) {
                    if (Object.prototype.hasOwnProperty.call(userParam, key)) {
                        if (key.indexOf('EC.') != -1) {
                            const value = userParam[key].trim();
                            opts[key.replace('EC.', '')] = this.isJson(value)
                                ? this.deepJsonParseFun(JSON.parse(value))
                                : this.isArray(value)
                                    ? eval(value)
                                    : value;
                        }
                    }
                }
                break;
            default:
                break;
        }
    }
    /**
     * 初始化chartUserParams
     *
     * @memberof ChartControlBase
     */
    initChartUserParams() {
        this.fillUserParam(this.controlInstance, this.chartUserParams, 'EC');
    }
    /**
     * 初始化图表基础动态模型
     *
     * @memberof ChartControlBase
     */
    initChartBaseOPtion() {
        var _a;
        this.chartBaseOPtion = new Function('return {' + ((_a = this.controlInstance) === null || _a === void 0 ? void 0 : _a.baseOptionJOString) + '}')();
    }
    /**
     * 刷新
     *
     * @param {*} [args={}] 额外参数
     * @memberof ChartControlBase
     */
    refresh(args) {
        this.load(args);
    }
    /**
     * 获取图表数据
     *
     * @param {*} [opt] 额外参数
     * @memberof ChartControlBase
     */
    async load(opt) {
        var _a, _b, _c, _d;
        let _this = this;
        const arg = Object.assign({}, opt);
        const parentdata = {};
        this.ctrlEvent({ controlname: this.controlInstance.name, action: 'beforeload', data: parentdata });
        Object.assign(arg, parentdata);
        let tempViewParams = parentdata.viewparams ? parentdata.viewparams : opt ? opt : {};
        Object.assign(tempViewParams, Util.deepCopy(this.viewparams));
        Object.assign(arg, { viewparams: tempViewParams });
        Object.assign(arg, { page: 0, size: 1000 });
        if (this.controlInstance.minorSortDir && ((_a = this.controlInstance.getMinorSortPSAppDEField()) === null || _a === void 0 ? void 0 : _a.codeName)) {
            Object.assign(arg, { sort: `${(_c = (_b = this.controlInstance.getMinorSortPSAppDEField()) === null || _b === void 0 ? void 0 : _b.codeName) === null || _c === void 0 ? void 0 : _c.toLowerCase()},${(_d = this.controlInstance.minorSortDir) === null || _d === void 0 ? void 0 : _d.toLowerCase()}` });
        }
        let tempContext = Util.deepCopy(this.context);
        this.onControlRequset('load', tempContext, arg);
        try {
            const res = await this.service.search(this.fetchAction, tempContext, arg, this.showBusyIndicator);
            this.onControlResponse('load', res);
            if (res && res.status == 200) {
                let loadsuccessResult = await this.executeCtrlEventLogic('onloadsuccess', { action: this.fetchAction, sender: this, navContext: this.context, navParam: tempViewParams, navData: this.navdatas, data: res.data });
                if (loadsuccessResult && (loadsuccessResult === null || loadsuccessResult === void 0 ? void 0 : loadsuccessResult.hasOwnProperty('srfret')) && !loadsuccessResult.srfret) {
                    return;
                }
                this.transformToBasicChartSetData(res.data, (codelist) => {
                    _this.ctrlEvent({
                        controlname: _this.name,
                        action: 'load',
                        data: res.data,
                    });
                    _this.drawCharts();
                });
            }
        }
        catch (error) {
            this.onControlResponse('load', error);
            this.$throw(error, 'load');
        }
    }
    /**
     * 绘制图表
     *
     * @returns {*}
     * @memberof ChartControlBase
     */
    drawCharts() {
        if (!this.myChart) {
            let element = document.getElementById(this.chartId);
            if (element) {
                this.myChart = init(element);
            }
        }
        //判断刷新时dom是否存在
        if (!Object.is(this.myChart._dom.offsetHeight, 0) && !Object.is(this.myChart._dom.offsetWidth, 0)) {
            let _chartOption = this.handleChartOPtion();
            this.chartRenderOption = Object.assign({}, _chartOption);
            if (this.myChart) {
                this.myChart.setOption(_chartOption);
                this.onChartEvents();
                this.handleDefaultSelect();
                this.myChart.resize();
            }
        }
    }
    /**
     * 图表事件监听
     *
     * @memberof ChartControlBase
     */
    onChartEvents() {
        const _this = this;
        _this.myChart.on('click', (e) => {
            _this.onChartClick(e);
        });
        _this.myChart.on('selectchanged', (e) => {
            if (this.isSelectFirstDefault) {
                if (e && e.fromActionPayload) {
                    const _event = {
                        seriesId: e.fromActionPayload.seriesId,
                        data: e.fromActionPayload.curData,
                        name: e.fromActionPayload.seriesId
                    };
                    this.onChartClick(_event);
                }
            }
        });
    }
    /**
     * 处理默认选中
     *
     * @memberof ChartControlBase
     */
    handleDefaultSelect() {
        var _a, _b, _c, _d;
        if (this.isSelectFirstDefault) {
            const options = this.handleChartOPtion();
            const selectSeriesId = ((_b = (_a = this.controlInstance.getPSDEChartSerieses()) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.name) || null;
            const curData = ((_d = (_c = options === null || options === void 0 ? void 0 : options.dataset[0]) === null || _c === void 0 ? void 0 : _c.source) === null || _d === void 0 ? void 0 : _d[0]) || undefined;
            if (selectSeriesId && curData) {
                this.myChart.dispatchAction({
                    type: 'select',
                    seriesId: selectSeriesId.toLowerCase(),
                    dataIndex: 0,
                    curData: curData
                });
            }
        }
    }
    /**
     * 图表单击事件
     *
     * @memberof ChartControlBase
     */
    onChartClick(event) {
        if (!event || !event.name) {
            return;
        }
        let data = event.data;
        Object.assign(data, { _chartName: event.seriesId });
        let tempContext = JSON.parse(JSON.stringify(this.context));
        let viewparamResult = Object.assign(data, this.viewparams);
        this.ctrlEvent({
            controlname: this.controlInstance.name,
            action: 'selectionchange',
            data: { action: this.loadAction, sender: this, navContext: tempContext, navParam: viewparamResult, navData: this.navdatas, data: [data] }
        });
    }
    /**
     * 是否为数组字符串
     *
     * @param {string} str 字符串
     * @return {*}
     * @memberof ChartControlBase
     */
    isArray(str) {
        try {
            eval(str);
            return true;
        }
        catch (error) {
            return false;
        }
    }
    /**
     * 是否为json字符串
     *
     * @param {*} str 字符串
     * @return {*}  {boolean}
     * @memberof ChartControlBase
     */
    isJson(str) {
        try {
            JSON.parse(str);
            return true;
        }
        catch (error) {
            return false;
        }
    }
    /**
     * 解析字符串函数
     *
     * @param {*} data
     * @return {*}  {boolean}
     * @memberof ChartControlBase
     */
    deepJsonParseFun(data) {
        switch (typeof data) {
            case 'string':
            case 'number':
            case 'boolean':
            case 'undefined':
            case 'function':
            case 'symbol':
                return data;
        }
        for (const key in data) {
            const item = data[key];
            let res;
            if (item.isFun && item.functionBody) {
                res = new Function(item.arg, item.functionBody);
            }
            else {
                res = this.deepJsonParseFun(item);
            }
            data[key] = res;
        }
        return data;
    }
    /**
     * 数组元素小写
     *
     * @param {*} arr 数组
     * @returns
     * @memberof ChartControlBase
     */
    arrayToLowerCase(arr) {
        if (!arr || arr.length == 0) {
            return [];
        }
        for (let index = 0; index < arr.length; index++) {
            arr[index] = arr[index].toLowerCase();
        }
        return arr;
    }
    /**
     * 处理图表参数
     *
     * @memberof ChartControlBase
     */
    handleChartOPtion() {
        let _chartOption = Util.deepCopy(this.chartOption);
        if (Object.keys(this.seriesModel).length > 0) {
            let tempDataSourceMap = new Map();
            for (let i = 0; i < Object.keys(this.seriesModel).length; i++) {
                Object.values(this.seriesModel).forEach((seriesvalue) => {
                    if (seriesvalue.seriesIndex === i) {
                        tempDataSourceMap.set(seriesvalue.name, seriesvalue.data);
                    }
                });
            }
            if (tempDataSourceMap.size > 0) {
                tempDataSourceMap.forEach((item) => {
                    _chartOption.dataset.push({ source: item });
                });
            }
            Object.keys(this.seriesModel).forEach((seriesName) => {
                var _a;
                if (_chartOption && _chartOption.series.length > 0) {
                    _chartOption.series.forEach((item) => {
                        if (this.seriesModel[seriesName].ecxObject && Object.is(seriesName, item.id)) {
                            item = Util.deepObjectMerge(item, this.seriesModel[seriesName].ecxObject);
                        }
                        if (this.seriesModel[seriesName].baseOption &&
                            Object.keys(this.seriesModel[seriesName].baseOption).length > 0 &&
                            Object.is(seriesName, item.id)) {
                            item = Util.deepObjectMerge(item, this.seriesModel[seriesName].baseOption);
                        }
                        if (this.seriesModel[seriesName].ecObject && Object.is(seriesName, item.id)) {
                            item = Util.deepObjectMerge(item, this.seriesModel[seriesName].ecObject);
                        }
                    });
                }
                //设置多序列
                let tempSeries = this.seriesModel[seriesName];
                const returnIndex = _chartOption.series.findIndex((item) => {
                    return Object.is(item.id, seriesName);
                });
                if (tempSeries && Object.is(tempSeries.type, 'gauge')) {
                    _chartOption.series.splice(returnIndex, 1);
                    const maxValue = this.calcSourceMaxValue(_chartOption.dataset[0].source);
                    let temSeries = {
                        type: 'gauge',
                        title: {
                            fontSize: 14
                        },
                        progress: {
                            show: true,
                            overlap: false,
                            roundCap: true
                        },
                        max: maxValue,
                        detail: {
                            width: 40,
                            height: 14,
                            fontSize: 14,
                            color: '#fff',
                            backgroundColor: 'auto',
                            borderRadius: 3,
                            formatter: '{value}'
                        },
                        data: this.transformToChartSeriesData(_chartOption.dataset[0].source, 'gauge')
                    };
                    _chartOption.series.push(temSeries);
                }
                else if (tempSeries && Object.is(tempSeries.type, 'radar')) {
                    const maxValue = this.calcSourceMaxValue(_chartOption.dataset[0].source);
                    (_a = _chartOption.radar.indicator) === null || _a === void 0 ? void 0 : _a.forEach((item) => {
                        item.max = item.max ? item.max : maxValue;
                    });
                    _chartOption.series[returnIndex].data = this.transformToChartSeriesData(_chartOption.dataset[0].source, 'radar', _chartOption.radar.indicator);
                }
                else if (tempSeries &&
                    tempSeries.seriesIdField &&
                    tempSeries.seriesValues.length > 0) {
                    let series = _chartOption.series[returnIndex];
                    _chartOption.series.splice(returnIndex, 1);
                    delete series.id;
                    tempSeries.seriesValues.forEach((seriesvalueItem) => {
                        let tempSeriesTemp = Util.deepCopy(tempSeries.seriesTemp);
                        Object.assign(tempSeriesTemp, series);
                        tempSeriesTemp.name = tempSeries.seriesMap[seriesvalueItem];
                        tempSeriesTemp.datasetIndex = tempSeries.seriesIndex;
                        tempSeriesTemp.encode = { x: tempSeries.categorField, y: `${seriesvalueItem}` };
                        _chartOption.series.push(tempSeriesTemp);
                    });
                }
            });
        }
        if (Object.keys(this.chartBaseOPtion).length > 0) {
            Object.assign(_chartOption, this.chartBaseOPtion);
        }
        if (Object.keys(this.chartUserParams).length > 0) {
            Object.assign(_chartOption, this.chartUserParams);
        }
        return _chartOption;
    }
    /**
     * 实体数据集转化为图表数据集
     *
     * 1.获取图表所有代码表值
     * 2.查询集合映射图表数据集
     * 3.补全图表数据集
     * 4.图表数据集分组求和
     * 5.排序图表数据集
     *
     * @param {*} data 实体数据集
     * @param {Function} callback 回调
     * @memberof ChartControlBase
     */
    async transformToBasicChartSetData(data, callback) {
        if (!data || !Array.isArray(data) || data.length === 0) {
            this.isNoData = true;
            if (this.myChart) {
                this.myChart.dispose();
                this.myChart = undefined;
            }
            return;
        }
        this.isNoData = false;
        //获取代码表值
        let allCodeList = await this.getChartAllCodeList();
        if (Object.values(this.seriesModel).length > 0) {
            Object.values(this.seriesModel).forEach((singleSeries, index) => {
                // 值属性为srfcount设置{srfcount:1}到data
                let valueField = singleSeries.dataSetFields.find((datasetField) => {
                    return datasetField.name === singleSeries.valueField;
                });
                if (valueField && valueField.name && Object.is(valueField.name, 'srfcount')) {
                    data.forEach((singleData) => {
                        Object.assign(singleData, { srfcount: 1 });
                    });
                }
                // 分组属性
                let groupField = singleSeries.dataSetFields.find((datasetField) => {
                    return datasetField.name === singleSeries.categorField;
                });
                let tempChartSetData = [];
                let tempSeriesValues = new Map();
                data.forEach((item) => {
                    let tempChartSetDataItem = {};
                    // 序列属性不存在
                    if (!singleSeries.seriesIdField) {
                        Object.assign(tempChartSetDataItem, { name: singleSeries.name });
                        if (singleSeries.dataSetFields && singleSeries.dataSetFields.length > 0) {
                            singleSeries.dataSetFields.forEach((singleDataSetField) => {
                                this.handleSingleDataSetField(item, singleDataSetField, allCodeList, tempChartSetDataItem, groupField);
                            });
                        }
                    }
                    else {
                        // 序列属性存在时
                        // 序列代码表存在时,翻译tempSeriesValues的键值对
                        if (singleSeries.seriesCodeList) {
                            const seriesCodeList = allCodeList.get(singleSeries.seriesCodeList.tag);
                            let tempSeriesValueItem = tempSeriesValues.get(seriesCodeList.get(item[singleSeries.seriesIdField]));
                            if (!tempSeriesValueItem) {
                                tempSeriesValues.set(seriesCodeList.get(item[singleSeries.seriesIdField]), seriesCodeList.get(item[singleSeries.seriesNameField]));
                            }
                        }
                        else {
                            let tempSeriesValueItem = tempSeriesValues.get(item[singleSeries.seriesIdField]);
                            if (!tempSeriesValueItem) {
                                tempSeriesValues.set(item[singleSeries.seriesIdField], item[singleSeries.seriesNameField]);
                            }
                        }
                        Object.assign(tempChartSetDataItem, { name: item[singleSeries.seriesIdField] });
                        if (singleSeries.dataSetFields && singleSeries.dataSetFields.length > 0) {
                            singleSeries.dataSetFields.forEach((singleDataSetField) => {
                                this.handleSingleDataSetField(item, singleDataSetField, allCodeList, tempChartSetDataItem, groupField);
                            });
                        }
                    }
                    tempChartSetData.push(tempChartSetDataItem);
                });
                // 补全数据集合
                this.completeDataSet(tempChartSetData, singleSeries, allCodeList);
                // 序列代码表存在时,补全序列
                if (singleSeries.seriesCodeList) {
                    const seriesCodeList = allCodeList.get(singleSeries.seriesCodeList.tag);
                    tempSeriesValues = new Map();
                    seriesCodeList === null || seriesCodeList === void 0 ? void 0 : seriesCodeList.forEach((item) => {
                        tempSeriesValues.set(item, item);
                    });
                }
                singleSeries.seriesValues = [...tempSeriesValues.keys()];
                let tempSeriesMapObj = {};
                tempSeriesValues.forEach((value, key) => {
                    tempSeriesMapObj[key] = value;
                });
                singleSeries.seriesMap = tempSeriesMapObj;
                let callbackFunction = index === Object.values(this.seriesModel).length - 1 ? callback : null;
                this.transformToChartSeriesDataSet(tempChartSetData, singleSeries, callbackFunction, allCodeList);
            });
        }
    }
    /**
     * 构建图表序列数据集合
     *
     * 1.分组求和
     * 2.排序求和数组
     *
     * @param {Array<any>} data 传入数据
     * @param {Array<any>} item 单个序列
     * @param {Array<any>} callback 回调
     * @param {*} allCodeList 所有代码表
     *
     * @memberof ChartControlBase
     */
    transformToChartSeriesDataSet(data, item, callback, allCodeList) {
        if (item.seriesIdField) {
            // 多序列
            let groupField = item.dataSetFields.filter((datasetField) => {
                return datasetField.name === item.categorField;
            });
            let tempGroupField = groupField.map((item) => {
                return item.name;
            });
            let seriesField = item.dataSetFields.filter((datasetField) => {
                return datasetField.name === item.seriesIdField;
            });
            let tempSeriesField = seriesField.map((item) => {
                return item.name;
            });
            let valueField = item.dataSetFields.filter((datasetField) => {
                return datasetField.name === item.valueField;
            });
            let tempValueField = valueField.map((item) => {
                return item.name;
            });
            item.data = this.groupAndAdd(tempGroupField, tempSeriesField, tempValueField, data, item, groupField, allCodeList);
        }
        else {
            //单序列
            let groupField = item.dataSetFields.filter((datasetField) => {
                return datasetField.name === item.categorField;
            });
            let tempGroupField = groupField.map((item) => {
                return item.name;
            });
            let valueField = item.dataSetFields.filter((datasetField) => {
                return datasetField.name === item.valueField;
            });
            let tempValueField = valueField.map((item) => {
                return item.name;
            });
            item.data = this.groupAndAdd(tempGroupField, [], tempValueField, data, item, groupField, allCodeList);
        }
        if (callback && callback instanceof Function) {
            callback(allCodeList);
        }
    }
    /**
     *
     * 计算数据集最大数
     *
     * @param {Array<any>} data 传入数据
     * @memberof ChartControlBase
     */
    calcSourceMaxValue(source) {
        let data = [];
        source.forEach((item) => {
            if (item.data) {
                data.push(item.data);
            }
            else {
                let itemData = [];
                for (const key in item) {
                    if (!isNaN(item[key])) {
                        itemData.push(item[key]);
                    }
                }
                data.push(Math.max(...itemData));
            }
        });
        return Math.max(...data);
    }
    /**
     *
     * 1.整合数据集数据到data中，不走数据集
     *
     * @param {Array<any>} data 传入数据
     * @param {Array<any>} series chart类型
     * @memberof ChartControlBase
     */
    transformToChartSeriesData(source, series, indicator) {
        if (Object.is(series, "gauge")) {
            let seriesData = [];
            let offsetLength = 100 / (source.length - 1);
            source.forEach((sourceItem, index) => {
                let data = {
                    name: sourceItem[this.chartCatalogName],
                    value: sourceItem[this.chartValueName],
                    title: {
                        offsetCenter: [(index * offsetLength - 50) + '%', '80%']
                    },
                    detail: {
                        offsetCenter: [(index * offsetLength - 50) + '%', '95%']
                    }
                };
                seriesData.push(data);
            });
            return seriesData;
        }
        else if (Object.is(series, "radar")) {
            if (!indicator || indicator.length == 0) {
                LogUtil.log(this.$t('app.chart.noindicator'));
                return;
            }
            let seriesData = [];
            source.forEach((sourceItem) => {
                let name = sourceItem.type;
                let data = [];
                indicator.forEach((item) => {
                    data.push(sourceItem[item.name]);
                });
                seriesData.push({ name, value: data });
            });
            return seriesData;
        }
    }
    /**
     * 分组和求和
     *
     * @param {Array<any>} groupField 分组属性
     * @param {Array<any>} seriesField 序列属性
     * @param {Array<any>} valueField 值属性
     * @param {*} data 传入数据
     * @param {*} item 单个序列
     * @param {*} groupFieldModel 分组属性模型
     * @param {*} allCodeList 所有代码表
     * @return {*}
     * @memberof ChartControlBase
     */
    groupAndAdd(groupField, seriesField, valueField, data, item, groupFieldModel, allCodeList) {
        let tempMap = new Map();
        let groupMode = groupFieldModel[0].groupMode;
        let groupKeyStr = '';
        data.forEach((item) => {
            let tempGroupField = groupField[0];
            groupKeyStr = item[tempGroupField];
            let tempMapItem = tempMap.get(groupKeyStr);
            if (tempMapItem) {
                tempMapItem.push(item);
                tempMap.set(groupKeyStr, tempMapItem);
            }
            else {
                tempMap.set(groupKeyStr, [item]);
            }
        });
        // 处理多序列
        if (seriesField.length > 0 && tempMap.size > 0) {
            let tempSeriesField = seriesField[0];
            tempMap.forEach((item, key) => {
                let tempItemMap = new Map();
                item.forEach((singleItem) => {
                    let seriesValueArray = tempItemMap.get(singleItem[tempSeriesField]);
                    if (seriesValueArray) {
                        seriesValueArray.push(singleItem);
                        tempItemMap.set(singleItem[tempSeriesField], seriesValueArray);
                    }
                    else {
                        tempItemMap.set(singleItem[tempSeriesField], [singleItem]);
                    }
                });
                tempMap.set(key, tempItemMap);
            });
        }
        let returnArray = [];
        if (seriesField.length == 0) {
            //单序列
            tempMap.forEach((tempItem) => {
                if (tempItem.length > 0) {
                    let curObject = {};
                    let valueResult = {};
                    let categorResult;
                    tempItem.forEach((singleItem) => {
                        categorResult = singleItem[groupField[0]];
                        valueResult[valueField[0]] = valueResult[valueField[0]] ? valueResult[valueField[0]] + singleItem[valueField[0]] : singleItem[valueField[0]];
                        item.dataSetFields.forEach((dataSetField) => {
                            // 只读不合并数据（扩展值属性4）
                            if (dataSetField.isReadOnly) {
                                valueResult[dataSetField.name] = singleItem[dataSetField.name];
                            }
                            else {
                                if (!Object.is(dataSetField.name, groupField[0]) && !Object.is(dataSetField.name, valueField[0])) {
                                    valueResult[dataSetField.name] = valueResult[dataSetField.name] ? valueResult[dataSetField.name] + singleItem[dataSetField.name] : singleItem[dataSetField.name];
                                }
                            }
                        });
                    });
                    Object.defineProperty(curObject, groupField[0], {
                        value: categorResult,
                        writable: true,
                        enumerable: true,
                        configurable: true,
                    });
                    for (const value in valueResult) {
                        Object.defineProperty(curObject, value, {
                            value: valueResult[value],
                            writable: true,
                            enumerable: true,
                            configurable: true,
                        });
                    }
                    returnArray.push(curObject);
                }
            });
        }
        else {
            // 多序列
            let seriesValuesArray = item.seriesValues;
            tempMap.forEach((groupItem, groupKey) => {
                //求和
                let curObject = {};
                Object.defineProperty(curObject, groupField[0], {
                    value: groupKey,
                    writable: true,
                    enumerable: true,
                    configurable: true,
                });
                seriesValuesArray.forEach((seriesValueItem) => {
                    Object.defineProperty(curObject, seriesValueItem, {
                        value: 0,
                        writable: true,
                        enumerable: true,
                        configurable: true,
                    });
                });
                groupItem.forEach((seriesItem, seriesKey) => {
                    let seriesNum = 0;
                    seriesItem.forEach((dataItem) => {
                        seriesNum += dataItem[valueField[0]];
                    });
                    curObject[seriesKey] = seriesNum;
                });
                returnArray.push(curObject);
            });
        }
        // 补全空白分类
        if (returnArray.length > 0) {
            let emptyText = groupFieldModel[0] && groupFieldModel[0].codeList ? groupFieldModel[0].codeList.emptytext : '未定义';
            returnArray.forEach((item) => {
                if (!item[groupField[0]]) {
                    item[groupField[0]] = emptyText;
                }
            });
        }
        returnArray = this.sortReturnArray(returnArray, groupFieldModel, allCodeList);
        // 雷达图数据格式处理
        if (Object.is(item.type, 'radar') && returnArray.length > 0) {
            let tempReturnArray = [];
            let seriesValues = item.seriesValues;
            if (seriesValues && seriesValues.length > 0) {
                seriesValues.forEach((singleSeriesName) => {
                    let singleSeriesObj = {};
                    returnArray.forEach((item) => {
                        Object.assign(singleSeriesObj, { [item[groupField[0]]]: item[singleSeriesName] });
                    });
                    Object.assign(singleSeriesObj, { type: singleSeriesName });
                    tempReturnArray.push(singleSeriesObj);
                });
            }
            returnArray = tempReturnArray;
        }
        return returnArray;
    }
    /**
     * 排序数组
     *
     * @param {Array<any>} arr 传入数组
     * @param {*} groupField 分组属性
     * @param {*} allCodeList 所有代码表
     *
     * @memberof ChartControlBase
     */
    sortReturnArray(arr, groupField, allCodeList) {
        let returnArray = [];
        // todo
        // 分组属性有代码表的情况(最后执行)
        if (groupField[0].codelist) {
            let curCodeList = allCodeList.get(groupField[0].codelist.codeName);
            curCodeList.forEach((codelist) => {
                arr.forEach((item) => {
                    if (Object.is(item[groupField[0].name], codelist)) {
                        returnArray.push(item);
                        item.hasused = true;
                    }
                });
            });
            arr.forEach((item, index) => {
                if (!item.hasused) {
                    returnArray.push(item);
                }
            });
            returnArray.forEach((item) => {
                delete item.hasused;
            });
        }
        else {
            // 分组为年份
            if (Object.is(groupField[0].groupMode, 'YEAR')) {
                returnArray = arr.sort((a, b) => {
                    return Number(a[groupField[0].name]) - Number(b[groupField[0].name]);
                });
            }
            else if (Object.is(groupField[0].groupMode, 'QUARTER')) {
                returnArray = this.handleSortGroupData(arr, groupField, '季度');
            }
            else if (Object.is(groupField[0].groupMode, 'MONTH')) {
                returnArray = this.handleSortGroupData(arr, groupField, '月');
            }
            else if (Object.is(groupField[0].groupMode, 'YEARWEEK')) {
                returnArray = this.handleSortGroupData(arr, groupField, '周');
            }
            else if (Object.is(groupField[0].groupMode, 'DAY')) {
                returnArray = arr.sort((a, b) => {
                    return moment(a[groupField[0].name]).unix() - moment(b[groupField[0].name]).unix();
                });
            }
            else {
                let groupFieldName = groupField[0].name;
                let isConvert = true;
                arr.forEach((item) => {
                    if (isNaN(item[groupFieldName])) {
                        isConvert = false;
                    }
                });
                if (isConvert) {
                    returnArray = arr.sort((a, b) => {
                        return a[groupFieldName] - b[groupFieldName];
                    });
                }
                else {
                    returnArray = arr;
                }
            }
        }
        return returnArray;
    }
    /**
     * 排序分组模式下的数据
     *
     * @param {Array<any>} arr 传入数据
     * @param {Array<any>} groupField 分组属性
     * @param {Array<any>} label label标签
     *
     * @memberof ChartControlBase
     */
    handleSortGroupData(arr, groupField, label) {
        arr.forEach((item) => {
            let sortFieldValue = item[groupField[0].name].split('-');
            Object.assign(item, { sortField: Number(sortFieldValue[0]) * 10000 + Number(sortFieldValue[1]) });
            /**
             *  @judgment 分组为月份时，月份+1  start
             *  @author mos
             *  @date   2020.07.20
             */
            if (Object.is(label, '月')) {
                item[groupField[0].name] =
                    sortFieldValue[0] + '年' + (Number(sortFieldValue[1]) + 1) + label;
            }
            else {
                item[groupField[0].name] = sortFieldValue[0] + '年' + sortFieldValue[1] + label;
            }
            //  @judgment 分组为月份时，月份+1  end
        });
        arr.sort((a, b) => {
            return Number(a.sortField) - Number(b.sortField);
        });
        arr.forEach((item) => {
            delete item.sortField;
        });
        return arr;
    }
    /**
     * 补全数据集
     *
     * @param {Array<any>} data 传入数据
     * @param {Array<any>} item 单个序列
     * @param {Array<any>} allCodeList 所有的代码表
     *
     * @memberof ChartControlBase
     */
    completeDataSet(data, item, allCodeList) {
        // 分组属性
        let groupField = item.dataSetFields.find((datasetField) => {
            return datasetField.name === item.categorField;
        });
        if (!groupField || Object.is(groupField.groupMode, '')) {
            return;
        }
        //分组模式为代码表（补值）
        if (Object.is(groupField.groupMode, 'CODELIST')) {
            this.completeCodeList(data, item, allCodeList);
        }
        //分组模式为年/季度/月份（最大值，最小值，分组，补值）
        if (Object.is(groupField.groupMode, 'YEAR') ||
            Object.is(groupField.groupMode, 'QUARTER') ||
            Object.is(groupField.groupMode, 'MONTH') ||
            Object.is(groupField.groupMode, 'YEARWEEK') ||
            Object.is(groupField.groupMode, 'DAY')) {
            this.handleTimeData(data, item, allCodeList, groupField);
        }
    }
    /**
     * 获取最大值最小值
     *
     * @param {Array<any>} tempTimeArray 传入数据
     *
     * @memberof ChartControlBase
     */
    getRangeData(tempTimeArray) {
        tempTimeArray.forEach((item) => {
            let tempParams = item._i.split('-');
            item.sortField = Number(tempParams[0] + tempParams[1]);
        });
        tempTimeArray.sort((a, b) => {
            return Number(a.sortField) - Number(b.sortField);
        });
        tempTimeArray.forEach((item) => {
            delete item.sortField;
        });
        return tempTimeArray;
    }
    /**
     * 补全时间类型数据集
     *
     * @param {Array<any>} data 传入数据
     * @param {Array<any>} item 单个序列
     * @param {Array<any>} allCodeList 所有的代码表
     * @param {Array<any>} groupField 分组属性
     *
     * @memberof ChartControlBase
     */
    handleTimeData(data, item, allCodeList, groupField) {
        let valueField = item.dataSetFields.find((datasetField) => {
            return datasetField.name === item.valueField;
        });
        let groupMode = groupField.groupMode;
        // 排序数据，找到最大值、最小值
        let tempTimeArray = [];
        if (data && data.length > 0) {
            data.forEach((dataItem) => {
                // 判断时间类型是否为空，为空不处理
                if (dataItem[groupField.name]) {
                    tempTimeArray.push(moment(dataItem[groupField.name]));
                }
            });
        }
        let maxTime;
        let minTime;
        if (Object.is(groupMode, 'YEAR') || Object.is(groupMode, 'DAY')) {
            maxTime = moment.max(tempTimeArray);
            minTime = moment.min(tempTimeArray);
        }
        if (Object.is(groupMode, 'QUARTER')) {
            tempTimeArray = this.getRangeData(tempTimeArray);
            minTime = moment()
                .year(tempTimeArray[0]._i.split('-')[0])
                .quarters(tempTimeArray[0]._i.split('-')[1]);
            maxTime = moment()
                .year(tempTimeArray[tempTimeArray.length - 1]._i.split('-')[0])
                .quarters(tempTimeArray[tempTimeArray.length - 1]._i.split('-')[1]);
        }
        if (Object.is(groupMode, 'MONTH')) {
            tempTimeArray = this.getRangeData(tempTimeArray);
            minTime = moment()
                .year(tempTimeArray[0]._i.split('-')[0])
                .month(tempTimeArray[0]._i.split('-')[1]);
            maxTime = moment()
                .year(tempTimeArray[tempTimeArray.length - 1]._i.split('-')[0])
                .month(tempTimeArray[tempTimeArray.length - 1]._i.split('-')[1]);
        }
        if (Object.is(groupMode, 'YEARWEEK')) {
            tempTimeArray = this.getRangeData(tempTimeArray);
            minTime = moment()
                .year(tempTimeArray[0]._i.split('-')[0])
                .week(tempTimeArray[0]._i.split('-')[1]);
            maxTime = moment()
                .year(tempTimeArray[tempTimeArray.length - 1]._i.split('-')[0])
                .week(tempTimeArray[tempTimeArray.length - 1]._i.split('-')[1]);
        }
        let timeFragmentArray = [];
        let tempGrounpData = new Map();
        // 时间分段
        //groupMode为"YEAR"
        if (Object.is(groupMode, 'YEAR')) {
            let curTime = minTime;
            while (curTime) {
                if (curTime.isSameOrBefore(maxTime)) {
                    let tempcurTime = curTime.clone();
                    timeFragmentArray.push(tempcurTime.year().toString());
                    curTime = tempcurTime.clone().add(1, 'years');
                }
                else {
                    curTime = null;
                }
            }
        }
        //groupMode为"QUARTER"
        if (Object.is(groupMode, 'QUARTER')) {
            let curTime = minTime;
            while (curTime) {
                if (curTime.isSameOrBefore(maxTime)) {
                    let tempcurTime = curTime.clone();
                    timeFragmentArray.push(tempcurTime.year().toString() + '-' + tempcurTime.quarter().toString());
                    curTime = tempcurTime.clone().add(1, 'quarters');
                }
                else {
                    curTime = null;
                }
            }
        }
        //groupMode为"MONTH"
        if (Object.is(groupMode, 'MONTH')) {
            let curTime = minTime;
            while (curTime) {
                if (curTime.isSameOrBefore(maxTime)) {
                    let tempcurTime = curTime.clone();
                    timeFragmentArray.push(tempcurTime.year().toString() + '-' + tempcurTime.month().toString());
                    curTime = tempcurTime.clone().add(1, 'months');
                }
                else {
                    curTime = null;
                }
            }
        }
        //groupMode为"YEARWEEK"
        if (Object.is(groupMode, 'YEARWEEK')) {
            let curTime = minTime;
            while (curTime) {
                if (curTime.isSameOrBefore(maxTime)) {
                    let tempcurTime = curTime.clone();
                    timeFragmentArray.push(tempcurTime.year().toString() + '-' + tempcurTime.week().toString());
                    curTime = tempcurTime.clone().add(1, 'weeks');
                }
                else {
                    curTime = null;
                }
            }
        }
        //groupMode为"DAY"
        if (Object.is(groupMode, 'DAY')) {
            let curTime = minTime;
            while (curTime) {
                if (curTime.isSameOrBefore(maxTime)) {
                    let tempcurTime = curTime.clone();
                    timeFragmentArray.push(tempcurTime.format('YYYY-MM-DD'));
                    curTime = tempcurTime.clone().add(1, 'days');
                }
                else {
                    curTime = null;
                }
            }
        }
        data.forEach((item) => {
            let tempKeyStr = item[groupField.name];
            let tempGrounpItem = tempGrounpData.get(tempKeyStr);
            if (!tempGrounpItem) {
                tempGrounpData.set(tempKeyStr, item);
            }
        });
        timeFragmentArray.forEach((timeFragment) => {
            if (!tempGrounpData.get(timeFragment)) {
                let copyTemp = Util.deepCopy(data[0]);
                let curObj = {};
                curObj[groupField.name] = timeFragment;
                curObj[valueField.name] = 0;
                Object.assign(copyTemp, curObj);
                data.push(copyTemp);
            }
        });
    }
    /**
     * 补全代码表
     *
     * @param {Array<any>} data 传入数据
     * @param {Array<any>} item 单个序列
     * @param {Array<any>} allCodeList 所有的代码表
     *
     * @memberof ChartControlBase
     */
    completeCodeList(data, item, allCodeList) {
        let groupField = item.dataSetFields.find((datasetField) => {
            return datasetField.name === item.categorField;
        });
        if (!groupField.codelist) {
            return;
        }
        let valueField = item.dataSetFields.find((datasetField) => {
            return datasetField.name === item.valueField;
        });
        let curCodeList = allCodeList.get(groupField.codelist.codeName);
        // 对分类实现分组
        let tempGrounpData = new Map();
        data.forEach((item) => {
            let tempGrounpItem = tempGrounpData.get(item[groupField.name + '_srfvalue']);
            if (!tempGrounpItem) {
                tempGrounpData.set(item[groupField.name + '_srfvalue'], item);
            }
        });
        if (curCodeList.size !== tempGrounpData.size) {
            curCodeList.forEach((text, value) => {
                if (!tempGrounpData.get(value)) {
                    let copyTemp = Util.deepCopy(data[0]);
                    let curObj = {};
                    curObj[groupField.name + '_srfvalue'] = value;
                    curObj[groupField.name] = text;
                    curObj[valueField.name] = 0;
                    Object.assign(copyTemp, curObj);
                    data.push(copyTemp);
                }
            });
        }
    }
    /**
     * 处理单个属性
     *
     * @param {*} input 输入值
     * @param {*} field 属性值
     * @param {*} allCodeList 所有代码表
     * @param {*} result 结果值
     * @param {*} groupField 分组属性
     *
     * @memberof ChartControlBase
     */
    handleSingleDataSetField(input, field, allCodeList, result, groupField) {
        let tempFieldObj = {};
        //存在代码表的情况(自动转化值)
        if (field.codelist) {
            //获取代码表
            let curCodeList = allCodeList.get(field.codelist.codeName);
            tempFieldObj[field.name] = curCodeList.get(input[field.name]);
            tempFieldObj[field.name + '_srfvalue'] = input[field.name];
        }
        else {
            // 不存在代码表的情况
            if (groupField && Object.is(groupField.name, field.name)) {
                if (Object.is(groupField.groupMode, 'YEAR')) {
                    tempFieldObj[field.name] = moment(input[field.name])
                        .year()
                        .toString();
                }
                else if (Object.is(groupField.groupMode, 'QUARTER')) {
                    tempFieldObj[field.name] =
                        moment(input[field.name])
                            .year()
                            .toString() +
                            '-' +
                            moment(input[field.name])
                                .quarters()
                                .toString();
                }
                else if (Object.is(groupField.groupMode, 'MONTH')) {
                    tempFieldObj[field.name] =
                        moment(input[field.name])
                            .year()
                            .toString() +
                            '-' +
                            moment(input[field.name])
                                .month()
                                .toString();
                }
                else if (Object.is(groupField.groupMode, 'YEARWEEK')) {
                    tempFieldObj[field.name] =
                        moment(input[field.name])
                            .year()
                            .toString() +
                            '-' +
                            moment(input[field.name])
                                .week()
                                .toString();
                }
                else if (Object.is(groupField.groupMode, 'DAY')) {
                    tempFieldObj[field.name] = moment(input[field.name]).format('YYYY-MM-DD');
                }
                else {
                    tempFieldObj[field.name] = input[field.name];
                }
            }
            else {
                tempFieldObj[field.name] = input[field.name];
            }
        }
        Object.assign(result, tempFieldObj);
    }
    /**
     * 获取图表所需代码表
     *
     * @memberof ChartControlBase
     */
    getChartAllCodeList() {
        return new Promise((resolve, reject) => {
            let codeListMap = new Map();
            if (Object.values(this.seriesModel).length > 0) {
                let tempFlag = true;
                Object.values(this.seriesModel).forEach((singleSeries) => {
                    if (singleSeries.dataSetFields && singleSeries.dataSetFields.length > 0) {
                        let promiseArray = [];
                        let promiseKeyArray = [];
                        singleSeries.dataSetFields.forEach((singleDataSetField, index) => {
                            if (singleDataSetField.codelist) {
                                tempFlag = false;
                                if (!codeListMap.get(singleDataSetField.codelist.codeName)) {
                                    promiseArray.push(this.getCodeList(singleDataSetField.codelist));
                                    promiseKeyArray.push(singleDataSetField.codelist.codeName);
                                    Promise.all(promiseArray).then((result) => {
                                        if (result && result.length > 0) {
                                            result.forEach((codeList) => {
                                                let tempCodeListMap = new Map();
                                                if (codeList.length > 0) {
                                                    codeList.forEach((codeListItem) => {
                                                        tempCodeListMap.set(codeListItem.value, codeListItem.text);
                                                    });
                                                }
                                                codeListMap.set(singleDataSetField.codelist.codeName, tempCodeListMap);
                                            });
                                            resolve(codeListMap);
                                        }
                                    });
                                }
                            }
                        });
                    }
                });
                if (tempFlag) {
                    resolve(codeListMap);
                }
            }
            else {
                resolve(codeListMap);
            }
        });
    }
    /**
     * 获取代码表
     *
     * @param {*} codeListObject 代码表对象
     * @return {*}  {Promise<any>}
     * @memberof ChartControlBase
     */
    getCodeList(codeListObject) {
        return new Promise((resolve, reject) => {
            if (codeListObject.codeName && Object.is(codeListObject.codeListType, 'STATIC')) {
                this.codeListService
                    .getStaticItems(codeListObject.codeName, undefined, this.context)
                    .then((res) => {
                    resolve(res);
                })
                    .catch((error) => {
                    LogUtil.log(`----${codeListObject.codeName}----${this.$t('app.commonwords.codenotexist')}`);
                });
            }
            else if (codeListObject.codeName && Object.is(codeListObject.codeListType, 'DYNAMIC')) {
                this.codeListService
                    .getItems(codeListObject.codeName)
                    .then((res) => {
                    resolve(res);
                })
                    .catch((error) => {
                    LogUtil.log(`----${codeListObject.codeName}----${this.$t('app.commonwords.codenotexist')}`);
                });
            }
        });
    }
    ctrlDestroyed(args) {
        super.ctrlDestroyed();
        if (this.chartStateEvent) {
            this.chartStateEvent.unsubscribe();
        }
    }
}
