import _ from 'lodash'

/**
 * 主表赋值 报销金额合计赋值
 * 公式说明 使用等号选赋值公式进行主表字段赋值时，某情况下不能触发校验公式，故改为主动赋值进行代替
 * @author fengjiansheng
 * @data 2021-09-03
 */
export default {
    execute: function () {
        console.log("s1 SetMasterAmount")
        if (arguments && arguments[0] && arguments[0].length > 1 && arguments[1]) {
            let context = arguments[1]
            let masterField = arguments[0][0]
            let masterTableObject = context.getTableType(masterField.FieldTableCode)
            if (!_.isEqual(masterTableObject.type, "master")) {
                console.error("SetMasterAmount公式配置错误,第一个参数需为主表金额字段")
                return null;
            }
            let masterData = context.getMasterData()
            if (!_.isNumber(_.toNumber(masterData.getValue(masterField.FieldCode)))) {
                console.error("SetMasterAmount公式配置错误,第一个参数需为主表金额字段")
                return null;
            }
            let subMoneyTotal = 0
            let isLazyLoading = true
            for (let [index, data] of arguments[0].entries()) {
                if (index === 0) {
                    continue
                }
                let tempSubTableObject = context.getTableType(data.FieldTableCode)
                if (!_.isEqual(tempSubTableObject.type, "sub")) {
                    console.error("SetMasterAmount公式配置错误,第", (index + 1), "个参数需为子表金额字段")
                    return null;
                }
                let allSubData = context.getAllSubData()
                if (!allSubData || _.isEmpty(allSubData)) {
                    break
                }
                isLazyLoading = false
                let tempAllSubData = context.getAllSubData()[tempSubTableObject.title]
                if (!tempAllSubData || _.isEmpty(tempAllSubData)) {
                    continue
                }
                if (tempAllSubData instanceof Array) {
                    for (const tempSubData of tempAllSubData) {
                        let tempData = tempSubData.getValue(data.FieldCode)
                        if (_.isNumber(_.toNumber(tempData))) {
                            subMoneyTotal += _.toNumber(tempData)
                        } else {
                            console.error("SetMasterAmount公式配置错误,配置字段为非金额数据")
                            return null
                        }
                    }
                }
            }
            /**
             * 随报销单保存后 数据再次加载会存在接口调用时间
             * 例如点击查看详情或者点击编辑的时候 数据会重新从接口获取 而此时的context环境尚未加载出来子表数据
             * 即context.getAllSubData() 获取到为空的数据 但本公式触发的时机就是存在子表数据发生变动时
             * 故添加此延迟加载的flag标记 用于判定是否重新设置主表的字段值
             *
             */
            if (!isLazyLoading) {
                masterData.setValue(masterField.FieldTableCode + "." + masterField.FieldCode, subMoneyTotal)
            }
        }
    },
    getResultType: function () {
        return 0
    }
}
