// demodemo子表某字段求和公式
export default {
    execute:async function(){
        console.log("进入到补助标准赋值公式");
        if(arguments && arguments[0] && arguments[0].length > 1 && arguments[1]){
            let params = arguments[0], context = arguments[1], targetField = params[0], funcParam = params[2], relatedFunc = params[params.length - 1]
            if (targetField instanceof BillDataNode) {
                let subTable = targetField.FieldTableCode
                let tableObj = context.getTableType(subTable)
                if (tableObj.type == "sub") {
                    let data = context.getSubData(tableObj.title)
                    if(data instanceof Array){
                        for (const iterator of data) {
                            // 初始化参数
                            let result = '', bzObj = null, dd = null, code = null
                            if (funcParam instanceof BillDataNode) {
                                dd = iterator.getValue(funcParam.FieldCode)
                                if (dd) {
                                    code = dd.objectcode
                                    bzObj = await this.getMDObject(arguments[0][1].StaticValue, code)
                                }
                            }
                            // 计算结果
                            result = this.calculate(bzObj, params)
                            iterator.setValue(targetField.FieldCode, result + '')
                        }
                        // 触发关联公式
                        if (relatedFunc instanceof FunctionNode) {
                            relatedFunc.getResult()
                        }
                    }
                }
            }
        }
    },

    /**
     * 获取运算结果
     * @param {*} bzObj 补助对应基础数据
     * @param {*} params 公式参数
     * @returns 
     */
    calculate(bzObj, params) {
        // 当运算符或者运算数2为空时结果为运算数1
        if (!bzObj || !params || params.length < 3) {
            return ''
        }
        let result = 0
        // 参数第一个为结果存放字段，第二个为基础数据, 第三个为code值存放字段，故从第4个开始
        // 最后一个为关联公式
        for (var i = 3; i < params.length - 1; i++) {
            result = (Number(result + '') + Number(bzObj[params[i].StaticValue] + '')).toFixed(2)
        }
        return result
    },
    // 获取基础数据
    getMDObject(name, code) {
        if (!name || !code) {
            return null
        }
        let param = {
            "limit": 1,
            "offset": 0,
            "pagination": true,
            "tableName": name,
            "searchKey": code,//按code和name过滤
            "queryDataStructure": "ALL"//返回的接口类型
        }
        return new Promise((resolve, reject) => {
            let promise = GMS.$http.post("/baseData/data/list", param);
            promise
                .then((data) => {
                    if (data.data && data.data.rows && data.data.rows.length > 0) {
                        resolve(data.data.rows[0]);
                    } else {
                        resolve([]);
                    }
                })
                .catch((error) => {
                    resolve([]);
                });
        });
    },
    getResultType:function(){
        return FMR.ConstDataTypes.General;
    }
}