<!--
 @description: 采购员-创建采购单-第一步采购项目信息和行项目信息编辑组件
  01A("01","计划管控平台", "01A","采购单的方式","B"),//委托，不寻源   推送至集团内代理机构 B类采购单 可编辑
  01B("01","计划管控平台", "01B","行项目方式","C"),//自行，寻源      推送至集团内采购员
  02A("02", "采购平台录入", "02A","委托采购",""),//委托，寻源        托采购可以委托给集团内代理机构。又可以委托给集团外代理机构
  02B("02", "采购平台录入", "02B","自行采购","");//自行，寻源        自己录入采购计划，自己寻源
  B类采购单 01A 采购项目项目信息 是可编辑 行项目信息操作列为退回
   非B类 02A 02B 01B 采购项目信息不可编辑 行项目信息操作列为释放
 @author: gmy
 @date: 2020-6-21 14:36:58
 @routerPath:/procurement/procurementProject/projectInfoContent
-->
<template>
  <div class="p0-16">
    <p class="page-title">
      1.项目信息
    </p>
    <el-form
      v-if="JSON.stringify(formData)!=='{}'"
      ref="form"
      :model="formData"
      :rules="rules"
      :inline-message="true"
    >
      <!--    otherParameter.issourceType 布尔值 true B类项目  非B类 false   -->
      <projectBase-add :other-parameter="otherParameter" :form-data="formData" :inside-tender-project-file-type="insideTenderProjectFileType" />
    </el-form>
    <div>
      <div class="mt10 clearfix">
        <span class="page-title fl">2.行项目信息</span>
        <!-- otherParameter.isEdit判断是否为二次询价项目布尔值 -->
        <div v-if="!otherParameter.issourceType" class="fl">
          <el-button v-if="otherParameter.isEdit" style="margin-left: 10px" type="primary" @click="addRow">
            选择计划
          </el-button>
        </div>
      </div>
    </div>
    <!--行项目信息编辑列表-->
    <projectLineItemInfo-add :line-project-data="allLineProjectData" :other-parameter="otherParameter" @watchData="watchData" @upTax="onUpTax" />
    <!--分页组件-->
    <!--    <page-nation :pagination-data="paginationData" @change="paginData" />-->
    <!--保存按钮-->
    <div class="but_footer">
      <div class="but_footer-h">
        <div class="but_footer-but">
          <!-- 保存 -->
          <el-button :loading="confirmLoading" type="primary" @click="saveInfo('form')">
            保存
          </el-button>
          <!-- 下一步 -->
          <el-button :loading="confirmLoading" type="primary" @click="nextStep('form')">
            {{ language.approvalNext }}
          </el-button>
        </div>
      </div>
    </div>
    <!--选择计划弹框-->
    <addlineItemInfo-dialog :dialog-data="dialogData" @consignContractInfo="consignContractInfo" />
  </div>
</template>
<script>
/* 接口*/
import { listSubjectMatterPagesByTenderId, saveBaseProcurementProjectInfo, queryBaseProcurementProjectInfo, deleteBulletinOrInvitation } from '@/api/procurement/procurementProject' // 获取采购项目基本信息
/* 公共方法*/
import { ListMixin } from '@/mixins/ListMixin'// 分页
import { filterObj } from '@/assets/js/utils'// 深拷贝
import { procurementProjectGroupMixin } from '../mixins/procurementProjectGroupMixin' // 采购立项 公共字典
import { procurementProjectMixins } from '../mixins/procurementProjectMixins' // 采购立项 公共数据
/* 校验方法*/
import { validatorCode, validateInput, email, linkerName, phoneAndText, characters1_auto } from '@/assets/js/validate'
/* 公共组件*/
// mport pagination from '@comp/common/pagination/pagination' // 分页组件
import ProjectLineItemInfoAdd from '../procurementProjectLineItemInfo/procurementProjectLineItemInfo-add' // 行项目物资组件
import addlineItemInfo from '../procurementProjectLineItemInfo/procurementAddlineItemInfo-dialog' // 选择项目计划弹框
import projectBaseAdd from '../procurementProjectBase/procurementProjectBase-add' // 项目信息可编辑模块
// vuex
import { mapGetters } from 'vuex'
export default {
  name: 'ProjectInfoMemberAddVue',
  components: {
    'projectLineItemInfo-add': ProjectLineItemInfoAdd, // 行项目物资组件
    'addlineItemInfo-dialog': addlineItemInfo, // 选择项目计划弹框
    'projectBase-add': projectBaseAdd // 项目信息可编辑模块
  },
  mixins: [ListMixin, procurementProjectGroupMixin, procurementProjectMixins],
  data() {
    return {
      flowStatus: this.$route.query.flowStatus, // true 工作流进入驳回编辑
      tenderId: '', // 项目id
      confirmLoading: false, // 暂存Loding
      // 选择计划弹窗-展示/隐藏状态 true 展示/false 隐藏
      dialogData: {
        consignContractVisible: false,
        packId: '', // 项目标段id
        tenderId: '', // 项目id
        purchaseMethod: '', // 采购方式
        purchaseOrganization: '' // 项目的组织形式
      },
      buyersId: '', // 采购人机构ID
      allLineProjectData: [],
      lineProjectData: [], // 行项目信息
      // 行项目信息分页请求数据
      searchForm: {
        createUser: '', // 物资创建人id
        orderBy: 0, // 排序
        tenderId: '' // 项目id
      },
      // 创建采购单的其他参数
      otherParameter: {
        issourceType: false, // 项目类型包含01A 属于集团内可编辑 不包含01A则不可编辑展示 布尔值默认空
        isEdIt: true, // 仅判断是否是询价并且是发起二次的为true其他默认false
        procFrameType: '', // procFrameType 采购和框架项目 00 采购 01框架
        tenderId: ''
      },
      // 校验规则
      rules: {
        buyersName: [{ required: true, validator: validateInput, trigger: 'blur' }], // 采购单位名称
        tenderName:
        [{ required: true, validator: validateInput, trigger: 'blur' }, // 采购单名称
          { required: true, validator: characters1_auto, trigger: 'blur' }], // 采购单名称
        tenderMethod: [{ required: true, message: '请选择', trigger: 'blur' }], // 询价方式
        buyersCode: [{ required: true, validator: validatorCode, trigger: 'blur' }], // 项目编号
        buyersLinkerName: [{ required: true, validator: linkerName, trigger: 'blur' }], // 联系人
        buyersLinkerTel: [{ required: true, validator: phoneAndText, trigger: 'blur' }], // 联系人手机号电话校验
        buyersLinkerEmail: [{ required: true, validator: email, trigger: 'blur' }], // 联系人邮箱
        // buyersLinkerAddress: [{ required: true, validator: characters1_auto, trigger: 'blur' }], // 地址
        tenderType: [{ required: true, message: '请选择', trigger: 'blur' }], // 公开邀请
        purchaseIndustryName: [{ required: true, message: '请选择', trigger: 'blur' }]// 项目类型

      },
      nextRouterPath: '' // 下一步跳转路由
    }
  },
  computed: {
    /* language 国际化*/
    ...mapGetters(['language'])
  },
  created() {
    // isSecondProject 判断是否为发起二次询价的字段 00 否 01 是
    this.isEdIt = this.$route.query.isSecondProject === '01'
    this.handelFlow()
  },
  methods: {
    // flowStatus true 工作流进入
    handelFlow() {
      if (this.flowStatus) {
        this.tenderId = this.$route.query.id
        this.searchForm.tenderId = this.tenderId
        this.dialogData.tenderId = this.tenderId
        this.nextRouterPath = '/work/procurementProjectList/procurementRuleContentAdd'
      } else {
        this.tenderId = this.$route.query.tenderId || this.formData.tenderId
        this.searchForm.tenderId = this.tenderId
        this.dialogData.tenderId = this.tenderId
        this.nextRouterPath = '/procurement/procurementRuleContentAdd'
      }
      // 获取项目信息
      this.initData(this.tenderId)
    },
    // 开启选择计划开启弹框
    addRow() {
      // 获取保存参数
      const data = this.assetsData()
      // 调用保存数据方法
      this.saveData(data, 'save')
    },
    /*
    * 选择计划触发回调函数
    * val参数 val 值true点击弹框确定按钮
    * */
    consignContractInfo(val) {
      if (val) {
        this.searchForm.tenderId = this.tenderId
        // 调用获取项目信息方法
        this.initData(this.tenderId)
      }
    },
    /*
    * 物资删除触发回调函数
    * val参数 val 值true表示已删除
    * */
    watchData(val) {
      if (val) {
        // 调用获取行项目信息方法
        this.initLineInfoData()
      }
    },
    // 保存提交数据
    assetsData() {
      // 采购项目信息
      const projectInfo = {
        id: this.tenderId, // 项目id
        tenderNo: this.formData.tenderNo, // 项目编号
        tenderName: this.formData.tenderName, // 项目名称
        tenderMethod: this.formData.tenderMethod, // 采购方式
        tenderOrgMethod: this.formData.tenderOrgMethod, // 组织方式
        tenderType: this.formData.tenderType, // 项目类型
        isPack: this.formData.isPack, // 是否分包
        purchaseIndustryName: this.formData.purchaseIndustryName, // 项目类型
        tendermethodRemarks: this.formData.tendermethodRemarks // 说明信息
      }
      // 保存行项目信息是需要的自采的采购目信息 自采的向后端传数据格式的数据
      const buyersInfo = [
        {
          purchaseDepartName: this.formData.buyersName, // 采购人名称
          buyersCode: this.formData.buyersCode, // 采购人机构代码
          purchaseDepartId: this.formData.buyersId, // 采购人机构ID
          tenderId: this.tenderId, // 项目id
          buyersLinkerAddress: this.formData.buyersLinkerAddress, // 采购人联系地址
          buyersLinkerEmail: this.formData.buyersLinkerEmail, // 采购人邮箱
          buyersLinkerName: this.formData.buyersLinkerName, // 采购人联系人
          buyersLinkerTel: this.formData.buyersLinkerTel // 采购人电话
        }
      ]
      // 保存行项目信息是需要的委托的采购目信息 委托的
      const agentInfo =
        {
          agentName: this.formData.buyersName, // 采购人名称
          agentCode: this.formData.buyersCode, // 采购人机构代码
          agentId: this.formData.buyersId, // 采购人机构ID
          tenderId: this.tenderId, // 项目id
          agentLinkerAddress: this.formData.buyersLinkerAddress, // 采购人联系地址
          agentLinkerEmail: this.formData.buyersLinkerEmail, // 采购人邮箱
          agentLinkerName: this.formData.buyersLinkerName, // 采购人联系人
          agentLinkerTel: this.formData.buyersLinkerTel // 采购人电话

        }
      // 行项目列表信息
      const saveSubjectMatterList = this.setMatterListdeliveryDate(this.allLineProjectData)
      // 根据采购组织形式判断传参方式 tenderOrgMethod 01 委托 传对象
      if (this.formData.tenderOrgMethod === '01') {
        const data = {
          saveBaseProcurementProjectInfoDto: projectInfo,
          saveProcurementProjectDepartInfoDto: agentInfo, //
          saveSubjectMatterList: saveSubjectMatterList
        }
        return data
      } else {
        // 根据采购组织形式判断传参方式 tenderOrgMethod 00 自采 传数组
        const data = {
          saveBaseProcurementProjectInfoDto: projectInfo,
          saveProcurementProjectBuysersInfoList: buyersInfo, // 自采
          saveSubjectMatterList: saveSubjectMatterList
        }
        return data
      }
    },
    // 筛选行项目信息 将交货时间给保存至秒
    setMatterListdeliveryDate(matterList) {
      const newMatterList = matterList.map(matterItem => {
        return {
          ...matterItem,
          deliveryDate: matterItem.deliveryDate ? this.$Moment(matterItem.deliveryDate).format(this.momentSaveFormat) : ''
        }
      })
      return newMatterList
    },
    // 删除多余信息删除之前存储的信息
    deleteBulletinData() {
      const data = {
        tenderId: this.tenderId,
        tenderType: this.formData.tenderType,
        tenderMethod: this.formData.tenderMethod
      }
      return data
    },
    // 保存
    saveInfo() {
      this.confirmLoading = true
      // 获取修改前数据
      const deleteData = this.deleteBulletinData()
      // 调用删除保存之前数据方法
      this.deleteBulletinOrInvitationData(deleteData, 'saveInfo')
    },
    // 下一步
    nextStep(formName) {
      this.confirmLoading = true
      // 组织形式不包含01A需添加校
      this.$refs[formName].validate((valid, field) => {
        if (valid) {
          // 调用删除多余数据方法
          const deleteData = this.deleteBulletinData()
          // 校验行项目交货时间和税率情况
          if (this.procVerifylineItem(this.formData.planType)) {
            // 调用删除保存之前数据方法
            this.deleteBulletinOrInvitationData(deleteData, 'next')
          }
        } else {
          this.$message.warning('请注意页面提示信息')
          this.confirmLoading = false
          return false
        }
      })
    },
    // 校验行项目交货时间和税率情况 planType 采购项目和框架采购项目 00 采购项目 01框架采购项目
    procVerifylineItem(planType) {
      if (planType === '00') {
        // 校验行项目信中的说率和交货时间是否为空 lineItemIsEmpty 有空返回下标 不为空返回-1
        const lineItemIsEmpty = this.allLineProjectData.findIndex(lineitem => {
          return lineitem.taxRate === '' || lineitem.deliveryDate === null
        })
        if (lineItemIsEmpty === -1) {
          return true
        }
        this.confirmLoading = false
        this.$message.warning('行项目列表第' + (lineItemIsEmpty + 1) + '行的税率或者交货日期不可为空')
        return false
      } else {
        // 校验行项目信中的说率是否为空 lineItemIsEmpty 有空返回下标 不为空返回-1
        const lineItemIsEmpty = this.allLineProjectData.findIndex(lineitem => {
          return lineitem.taxRate === ''
        })
        if (lineItemIsEmpty === -1) {
          return true
        }
        this.confirmLoading = false
        this.$message.warning('行项目列表第' + (lineItemIsEmpty + 1) + '行的税率不可为空')
        return false
      }
    },
    // 查询条件
    getQueryParams() {
      const param = Object.assign({}, this.searchForm)
      return filterObj(param)
    },
    // 封装获取项目基本信息请求方法
    initData(tenderId) {
      queryBaseProcurementProjectInfo({ tenderId: tenderId }).then(res => {
        this.formData = res.data // 获取采购项目基本信息
        this.insideTenderProjectFileType.bizId = this.formData.id // 内部附件信息
        if (!this.formData.purchaseIndustryName) this.formData.purchaseIndustryName = '00' // 项目类型默认选中物资
        this.otherParameter.isEdit = res.data.sourceTenderId === null // sourceTenderId是否属于二次询价项目 有值是 null不是
        this.otherParameter.issourceType = res.data.sourceType.indexOf('01A') !== -1 // true 不可编辑 false 可编辑 项目类型包含01A 属于集团内可编辑 不包含01A则不可编辑展示 布尔值默认空
        this.otherParameter.procFrameType = this.formData.planType // 区分是否是采购或者框架项目 00 采购 01框架
        // 调用加载行项目信息方法
        this.initLineInfoData()
      }).catch(() => {})
    },
    // 改变税率更新采购单含税总预算
    onUpTax(val) {
      this.formData.budgetTotalTaxMoney = val
    },
    // 封装行项目信息请求方法
    initLineInfoData() {
      // 查询条件
      const params = this.getQueryParams()
      listSubjectMatterPagesByTenderId(params).then(res => {
        // 获取行项目数据
        this.allLineProjectData = res.data.records.map(lineItem => {
          return {
            ...lineItem,
            taxRate: lineItem.taxRate.toString()
          }
        })
        // 获取标段id
        this.formData.packId = res.data.records[0].packId
        this.otherParameter.tenderId = params.tenderId
      }).catch(() => {})
    },
    /*
      保存 下一步 保存前删除修改前的数据
      deleteData: 修改前保存的项目数据
      info: 区分 下一步 选择计划 保存字段   next 下一步 save 选择计划 saveInfo保存
    */
    deleteBulletinOrInvitationData(deleteData, info) {
      // 获取保存数据
      const saveProjectData = this.assetsData()
      // 设置保存提交的状态码 state 下一步 01 保存00
      if (info === 'next') {
        saveProjectData.state = '01'
      } else {
        saveProjectData.state = '00'
      }
      // 添加保存数据状态字段 00 保存  01 下一步
      deleteBulletinOrInvitation(deleteData).then(res => {
        // 调用保存项目信息方法
        this.saveData(saveProjectData, info)
      }).catch(() => {
        this.confirmLoading = false
      })
    },
    /*
     封装保存数据请求方法
     data: 保存行项目数据
     info: 区分下一步 保存 选择计划 字段  next 下一步 save 选择计划 saveInfo保存
    */
    saveData(data, info) {
      saveBaseProcurementProjectInfo(data).then(res => {
        this.formData.packId = res.data.packId
        this.formData.tenderId = res.data.tenderId
        // 下一步
        if (info === 'next') {
          this.confirmLoading = false
          this.$router.push({
            path: this.nextRouterPath,
            query: { ...this.$route.query,
              tenderId: this.formData.tenderId, // 项目id
              tenderMethod: this.formData.tenderMethod, // 项目采购方式
              tenderType: res.data.tenderType, // 项目采购形式
              packId: this.formData.packId, // 标段id
              sourceType: this.formData.sourceType, // 项目组织形式
              systemType: this.formData.systemType, // 集团内集团外 00 内 01 外
              buyersId: res.data.buyersId // 获取采购单位id
            }
          })
          return
        }
        // 选择计划是的保存
        if (info === 'save') {
          // 获取项目标段id
          this.dialogData.packId = this.formData.packId
          // 获取项目id
          this.dialogData.tenderId = this.formData.tenderId
          // 更新项目id
          this.searchForm.tenderId = res.data.tenderId
          // 初始化获取采购方式
          this.dialogData.purchaseMethod = this.formData.tenderMethod
          // 项目组织形式 00 委托 01 自采
          this.dialogData.purchaseOrganization = this.formData.tenderOrgMethod
          // 调用查询页面方法
          this.initData(this.formData.tenderId)
          // 开启弹框
          this.dialogData.consignContractVisible = true
          return
        }
        this.$message.success('保存成功')
        // 调用查询页面方法
        this.initData(this.formData.tenderId)
        // 保存按纽成功后
        this.confirmLoading = false
      }).catch(() => {
        this.confirmLoading = false
      })
    }
  },
  // 路由生命钩子动态修改前往路由的meta中的path值
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
    // 动态修改前往路由的meta中的path
    // 前往路由的path为空时在获取
    // 选择项目信息弹框打开后再复制meta
    // if (this.selectModeData.dialog) {
    //   to.meta.path = from.meta.path
    // }
    to.meta.path = from.meta.path
    next()
  }
}
</script>

<style lang="less" scoped>

  /deep/.show-word-limit-padding{
    .el-input__inner{
      padding-right: 70px;
    }
  }
  /deep/.el-table {
    .el-table__fixed {
      height:auto !important; // 此处的important表示优先于element.style
      bottom:10px; //..度后，设置与父容器的底部距离，则高度会动态改变
    }
  }
  /deep/.el-table__body-wrapper::-webkit-scrollbar{
    padding-top: 50px;
    height:10px;
  }
</style>

