import Api from '~/service/Api';
import commonFunctions from '~/mixin/commonFunctions.js';
import buildFn from './buildCommons.js';
import setmod from '~/components/business/setmod/event';
import glentry from '~/components/business/glentry/event';
import engp from '~/components/business/engp/event';
import docpan from '~/components/business/docpan/event';
import ccvpan from '~/components/business/ccvpan/event';
import limitbody from '~/components/business/limitbody/event';
import doctre from '~/components/business/doctre/event';
import Utils from "~/utils"

export default {
  mixins: [commonFunctions],
  methods: {
    ...setmod,
    ...glentry,
    ...engp,
    ...docpan,
    ...ccvpan,
    ...limitbody,
    ...doctre,
    async init () {
      const params = {
        spt: JSON.parse(localStorage.getItem('row_' + this.trnName)),
        trninr: this.$route.query.trninr,
      }
      if ( typeof(this.$route.query.inr) == 'string' ){
        params.spt = null
      }
      const res = await Api.post('/service/brtcan/init', {
        ...params,
        transName: this.trnName,
        userId: window.sessionStorage.userId || 'ZL',
        brdgrp:{
          rec:{
            inr:this.$route.query.inr
          }
        },
        
      });
      if (!res.data) {
        return
      }
      this.copyValueFromVoData(this.model, res.data)
      this.copyValueFromVoData(this.model.setmod.setfeg, res.data.setfeg)
      this.copyValueFromVoData(this.model.setmod.setfog, res.data.setfog)
      this.copyValueFromVoData(this.model.setmod.setglg, res.data.setglg)
    },
    // 兼容处理在前端model中定义了字段,后端返回的数据中不存在字段的问题
    copyValueFromVoData (model, data) {
      model.modifySet = []
      let keysList = Object.keys(model)
      keysList.map((key) => {
        if (data[key]) {
          if (Utils.typeOf(model[key]) === 'Object') {
            this.copyValueFromVoData(model[key], data[key])
          } else {
            this.$set(model, key, data[key])
          }
        }
      })
    },
    async tabClick(tab) {
      if (this.isInDisplay) {
        return;
      }
      let name = tab.name;
      switch (name) {
        case 'ccvpan':
          let ccvpanRequest = buildFn.buildCcvpan(this.model, this.trnName);
          this.processLiaccv(ccvpanRequest);
          break;
        case 'engp':
          let engpRequest = buildFn.buildEngp(this.model, this.trnName);
          this.processLiaall(engpRequest);
          break;
        case 'setmod':
          let setfegRequest = buildFn.buildSetfeg(this.model, this.trnName);
          // 此处利用回调是为了等setfeg的接口调用完成后才去获取setglg参数,由于setglg参数依赖于setfeg函数的返回值
          this.processSetpan(setfegRequest, () => {
            return buildFn.buildSetglg(this.model, this.trnName);
          });
          break;
        case 'docpan':
          let docpanRequest = buildFn.buildDocpan(this.model, this.trnName);
          this.processTrndoc(docpanRequest);
          break;
        case 'glepan':
          let glentryRequest = buildFn.buildGlentry(this.model, this.trnName);
          this.processGlentry(glentryRequest);
          break;
        case 'limitbody':
          let limitbodyRequest = buildFn.buildLimitbody(this.model, this.trnName);
          this.processLimitbody(limitbodyRequest);
          break;
        case 'doctre':
          let doctreRequest = buildFn.buildDoctre(this.model, this.trnName);
          this.processDoctre(doctreRequest);
          break;
        default:
          return;
      }
    },
    // 公共组件setmod处理方式改变触发联动
    changeSetmodModel (emitParams) {
      let reqParams = {}
      switch (emitParams.code) {
        case 'processMethods':
          reqParams = buildFn.buildSetglg(this.model, this.trnName);
          this.calcPayDetail(reqParams)
          break
        case 'changeDsp':
          let index = emitParams.index;
          let setglgRequest = buildFn.buildSetglg(this.model, this.trnName);
          setglgRequest.setglg = {setgll:  emitParams.list};
          this.setgllAccts(setglgRequest, index);
          break
        default:
          return
      }
    },
    async handleSave() {
      let result = await this.save();
      if (result.respCode == SUCCESS && Object.keys(result.fieldErrors).length == 0) {
          this.$notify({
              title: "成功",
              message: "保存成功",
              type: "success",
          });
          this.$store.dispatch("TagsView/delView", this.$route)
          this.$router.go(-1)
      } else if (result.fieldErrors && Object.keys(result.fieldErrors).length > 0) {
          const tab = this.showBackendErrors(result.fieldErrors)
          if (tab) {
              // tab切换之后,需出发tab-click的事件
              this.tabClick(tab);
          }
          this.$notify({
              title: "错误",
              message: "检核失败!",
              type: "error",
          });
      } else {
          this.$notify({
              title: "失败",
              message: "保存失败",
              type: "error",
          });
      }
  }
  },
};