<template> 
 | 
  <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close" 
 | 
    @confirm="confirm"> 
 | 
    <div class="main"> 
 | 
      <div class="main_content"> 
 | 
        <el-form :model="form" label-position="top" ref="form" :rules="rules"> 
 | 
          <div class="head"> 
 | 
            <div class="m_title">基础信息</div> 
 | 
            <div class="tabs"> 
 | 
              <div class="tab" :class="{ active: form.feeType === 0 }" @click="timeTabClick(0)">周期费用</div> 
 | 
              <div class="tab" :class="{ active: form.feeType === 1 }" @click="timeTabClick(1)">一次性费用</div> 
 | 
            </div> 
 | 
          </div> 
 | 
          <div class="list"> 
 | 
            <el-form-item label="关联合同" prop="contractId"> 
 | 
              <el-select v-model="form.contractId" @change="changeContract" placeholder="请选择"> 
 | 
                <el-option v-for="(item, index) in contract" :key="index" :value="item.id" :label="item.code"></el-option> 
 | 
              </el-select> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="付款方" prop="renterName"> 
 | 
                <el-input v-model="form.renterName" disabled placeholder="付款方" v-trim /> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="房源" prop="ywContractRoomList"> 
 | 
              <el-select v-model="form.ywContractRoomList" @click="clickHouse" multiple placeholder="请选择"> 
 | 
                <el-option 
 | 
                  v-for="(item, index) in houseList" 
 | 
                  :key="index" 
 | 
                  :value="item.roomId" 
 | 
                  :label="item.projectName + item.buildingName + item.floorName + item.roomName" /> 
 | 
              </el-select> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="费用类型" prop="costType"> 
 | 
              <el-select v-model="form.costType" placeholder="请选择"> 
 | 
                <el-option :value="0" label="租赁费"></el-option> 
 | 
                <el-option :value="1" label="物业费"></el-option> 
 | 
                <el-option :value="2" label="租赁押金"></el-option> 
 | 
                <el-option :value="3" label="物业押金"></el-option> 
 | 
                <el-option :value="4" label="水电费"></el-option> 
 | 
                <el-option :value="5" label="杂项费"></el-option> 
 | 
                <el-option :value="6" label="其他"></el-option> 
 | 
              </el-select> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="计费周期" prop="date" v-if="form.feeType !== 1"> 
 | 
              <el-date-picker 
 | 
                type="daterange" 
 | 
                range-separator="至" 
 | 
                v-model="form.date" 
 | 
                @change="changeDate" 
 | 
                start-placeholder="开始日期" 
 | 
                end-placeholder="结束日期" 
 | 
                value-format="yyyy-MM-dd" 
 | 
                placeholder="请选择" /> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="应收金额" prop="totleFee"> 
 | 
              <el-input v-model="form.totleFee" placeholder="请输入应收金额" v-trim /> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="应收日期" prop="planPayDate"> 
 | 
              <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="请选择" /> 
 | 
            </el-form-item> 
 | 
            <el-form-item label="所属公司" prop="companyId"> 
 | 
              <el-select v-model="form.companyId" placeholder="请选择"> 
 | 
                <el-option 
 | 
                  v-for="(item, index) in comparyList" 
 | 
                  :key="index" 
 | 
                  :value="item.id" 
 | 
                  :label="item.name" /> 
 | 
              </el-select> 
 | 
            </el-form-item> 
 | 
            <el-form-item style="width: 100%;" label="账单备注" prop="remark"> 
 | 
              <el-input type="textarea" :rows="5" v-model="form.remark" placeholder="请输入" /> 
 | 
            </el-form-item> 
 | 
          </div> 
 | 
        </el-form> 
 | 
      </div> 
 | 
    </div> 
 | 
    <div class="file_wrap"> 
 | 
      <div class="head"> 
 | 
        <div>账单附件</div> 
 | 
        <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl" 
 | 
          :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError"> 
 | 
          <el-button icon="el-icon-plus" plain>添加附件</el-button> 
 | 
        </el-upload> 
 | 
      </div> 
 | 
      <el-table :data="form.multifileList" stripe> 
 | 
        <el-table-column prop="originname" label="附件名称" align="center" min-width="100" show-overflow-tooltip /> 
 | 
        <el-table-column prop="userName" label="操作人" align="center" min-width="100" show-overflow-tooltip /> 
 | 
        <el-table-column prop="createTime" label="操作时间" align="center" min-width="100" show-overflow-tooltip /> 
 | 
        <el-table-column label="操作" align="center" min-width="100"> 
 | 
          <template slot-scope="{row}"> 
 | 
            <span class="cu red" @click="dele(row.imgaddr)">删除</span> 
 | 
          </template> 
 | 
        </el-table-column> 
 | 
      </el-table> 
 | 
    </div> 
 | 
  </GlobalWindow> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
import GlobalWindow from '@/components/common/GlobalWindow' 
 | 
import BaseOpera from '@/components/base/BaseOpera' 
 | 
import { rules } from './config' 
 | 
import { create } from '@/api/bill' 
 | 
import { list as listAll } from '@/api/contract' 
 | 
import { companyList } from '@/api/company' 
 | 
import { Message, Loading } from 'element-ui' 
 | 
import { getContractRoom } from '@/api/house' 
 | 
import { mapState } from 'vuex' 
 | 
export default { 
 | 
  components: { 
 | 
    GlobalWindow 
 | 
  }, 
 | 
  computed: { 
 | 
    ...mapState(['userInfo']) 
 | 
  }, 
 | 
  extends: BaseOpera, 
 | 
  data () { 
 | 
    return { 
 | 
      form: { 
 | 
        contractId: '', 
 | 
        renterName: '', 
 | 
        renterId: '', 
 | 
        costType: '', 
 | 
        type: '', 
 | 
        companyId: '', 
 | 
        remark: '', 
 | 
        startDate: '', 
 | 
        endDate: '', 
 | 
        totleFee: '', 
 | 
        feeType: 0, 
 | 
        planPayDate: '', 
 | 
        multifileList: [], 
 | 
        ywContractRoomList: [], 
 | 
        date: [], 
 | 
        RoomName: '' 
 | 
      }, 
 | 
      rules, 
 | 
      loadingInstance: null, 
 | 
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch', 
 | 
      fileList: [], 
 | 
      uploadData: { 
 | 
        folder: 'YW_CONTRACT_BILL' 
 | 
      }, 
 | 
      contract: [], 
 | 
      payerList: [], 
 | 
      comparyList: [], 
 | 
      houseList: [] 
 | 
    } 
 | 
  }, 
 | 
  methods: { 
 | 
    open (title, target) { 
 | 
      this.title = title 
 | 
      this.form.feeType = 0 
 | 
      this.form.multifileList = [] 
 | 
      this.getListAll() 
 | 
      this.getCompanyList() 
 | 
      this.visible = true 
 | 
      // 新建 
 | 
      if (target == null) { 
 | 
        this.$nextTick(() => { 
 | 
          this.$refs.form.resetFields() 
 | 
          this.form[this.configData['field.id']] = null 
 | 
        }) 
 | 
        return 
 | 
      } 
 | 
      // 编辑 
 | 
      this.$nextTick(() => { 
 | 
        for (const key in this.form) { 
 | 
          this.form[key] = target[key] 
 | 
        } 
 | 
      }) 
 | 
    }, 
 | 
    clickHouse () { 
 | 
      if (!this.form.contractId) { 
 | 
        return this.$message.warning('请先选择合同') 
 | 
      } 
 | 
    }, 
 | 
    changeContract (e) { 
 | 
      this.form.renterName = this.contract.filter(item => { 
 | 
        if (item.id === e) { 
 | 
          this.form.companyId = item.companyId 
 | 
          return item 
 | 
        } 
 | 
      })[0].renterName 
 | 
      this.getHouseDate() 
 | 
    }, 
 | 
    getHouseDate () { 
 | 
      getContractRoom({ contractId: this.form.contractId, type: 0 }) 
 | 
        .then(res => { 
 | 
          this.houseList = res 
 | 
        }) 
 | 
    }, 
 | 
    confirm () { 
 | 
      this.$refs.form.validate((valid) => { 
 | 
        if (!valid) return 
 | 
        this.isWorking = true 
 | 
        let obj = JSON.parse(JSON.stringify(this.form)) 
 | 
        obj.ywContractRoomList = obj.ywContractRoomList.map(id => { 
 | 
          return { roomId: id } 
 | 
        }) 
 | 
        obj.billType = 0 
 | 
        create(obj) 
 | 
          .then(() => { 
 | 
            this.visible = false 
 | 
            this.$tip.apiSuccess('新建成功') 
 | 
            this.$emit('success') 
 | 
          }) 
 | 
          .finally(() => { 
 | 
            this.isWorking = false 
 | 
          }) 
 | 
      }) 
 | 
    }, 
 | 
    dele (imgaddr) { 
 | 
      this.form.multifileList.forEach((item, index) => { 
 | 
        if (imgaddr === item.imgaddr) { 
 | 
          this.form.multifileList.splice(index, 1) 
 | 
        } 
 | 
      }) 
 | 
    }, 
 | 
    openHouse () { 
 | 
      this.$refs.selectHouse.open('选择房源', { contractId: this.form.contractId, type: 0 }) 
 | 
    }, 
 | 
    getCompanyList () { 
 | 
      companyList({ type: 2, status: 0 }) 
 | 
        .then(res => { 
 | 
          this.comparyList = res 
 | 
        }) 
 | 
    }, 
 | 
    getListAll () { 
 | 
      listAll({}) 
 | 
        .then(res => { 
 | 
          console.log(res) 
 | 
          this.contract = res 
 | 
        }) 
 | 
    }, 
 | 
    timeTabClick (val) { 
 | 
      this.form.feeType = val 
 | 
      if (val === 1) { 
 | 
        this.form.startDate = '' 
 | 
        this.form.endDate = '' 
 | 
        this.form.date = [] 
 | 
      } 
 | 
    }, 
 | 
    changeDate (e) { 
 | 
      if (!e || e.length === 0) { 
 | 
        this.form.startDate = '' 
 | 
        this.form.endDate = '' 
 | 
      } else { 
 | 
        this.form.startDate = e[0] 
 | 
        this.form.endDate = e[1] 
 | 
      } 
 | 
    }, 
 | 
    beforeUpload (file) { 
 | 
      this.loadingInstance = Loading.service({ 
 | 
        lock: true, 
 | 
        text: 'Loading', 
 | 
        spinner: 'el-icon-loading', 
 | 
        background: 'rgba(0, 0, 0, 0.7)' 
 | 
      }) 
 | 
    }, 
 | 
    uploadError () { 
 | 
      this.$nextTick(() => { // 以服务的方式调用的 Loading 需要异步关闭 
 | 
        if (this.loadingInstance) { 
 | 
          this.loadingInstance.close() 
 | 
        } 
 | 
      }) 
 | 
    }, 
 | 
    getDay () { 
 | 
      const now = new Date(); 
 | 
      const year = now.getFullYear(); 
 | 
      const month = now.getMonth() + 1; // 加1使其从1开始 
 | 
      const day = now.getDate(); 
 | 
      const hours = now.getHours(); 
 | 
      const minutes = now.getMinutes(); 
 | 
      const seconds = now.getSeconds(); 
 | 
      return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; 
 | 
    }, 
 | 
    uploadAvatarSuccess (file) { 
 | 
      this.$nextTick(() => { 
 | 
        if (this.loadingInstance) { 
 | 
          this.loadingInstance.close() 
 | 
        } 
 | 
      }) 
 | 
      const item = file.data[0] 
 | 
      this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() }) 
 | 
    }, 
 | 
    close () { 
 | 
      this.$emit('close') 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
@import '@/assets/style/variables.scss'; 
 | 
  
 | 
  
 | 
.cost_tabs { 
 | 
  justify-content: flex-start; 
 | 
  border: none; 
 | 
  
 | 
  .tab { 
 | 
    height: 36px; 
 | 
    line-height: 36px; 
 | 
    font-size: 14px; 
 | 
  } 
 | 
} 
 | 
  
 | 
.main { 
 | 
  display: flex; 
 | 
  margin-bottom: 20px; 
 | 
  
 | 
  .main_content { 
 | 
    flex: 1; 
 | 
    margin-right: 20px; 
 | 
  
 | 
    .head { 
 | 
      display: flex; 
 | 
      align-items: center; 
 | 
      justify-content: space-between; 
 | 
  
 | 
      .tabs { 
 | 
        display: flex; 
 | 
        margin-bottom: 20px; 
 | 
        align-items: center; 
 | 
        justify-content: center; 
 | 
  
 | 
        .tab { 
 | 
          height: 14px; 
 | 
          line-height: 14px; 
 | 
          cursor: pointer; 
 | 
          border: 1px solid #ebebeb; 
 | 
          padding: 12px 24px; 
 | 
        } 
 | 
  
 | 
        .active { 
 | 
          font-weight: 500; 
 | 
          color: $primary-color; 
 | 
          border: 1px solid $primary-color; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  
 | 
    .list { 
 | 
      display: flex; 
 | 
      flex-wrap: wrap; 
 | 
  
 | 
      .el-form-item { 
 | 
        width: 33.33%; 
 | 
        box-sizing: border-box; 
 | 
        padding: 0 12px; 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  
 | 
  .main_house { 
 | 
    width: 320px; 
 | 
    padding: 24px 12px; 
 | 
    border: 1px solid #c3c6cd; 
 | 
    border-radius: 2px; 
 | 
  
 | 
    .title { 
 | 
      font-size: 16px; 
 | 
      font-weight: 500; 
 | 
      margin-bottom: 30px; 
 | 
    } 
 | 
  } 
 | 
  
 | 
} 
 | 
  
 | 
.total { 
 | 
  display: flex; 
 | 
  justify-content: space-between; 
 | 
  align-items: center; 
 | 
  height: 32px; 
 | 
  background-color: #e7e9f5; 
 | 
  
 | 
  span { 
 | 
    width: 160px; 
 | 
    text-align: center; 
 | 
  } 
 | 
} 
 | 
  
 | 
.file_wrap { 
 | 
  padding: 20px 16px; 
 | 
  border: 1px solid #c3c6cd; 
 | 
  border-radius: 2px; 
 | 
  
 | 
  .head { 
 | 
    display: flex; 
 | 
    justify-content: space-between; 
 | 
    align-items: center; 
 | 
  } 
 | 
} 
 | 
  
 | 
.m_title { 
 | 
  font-weight: 500; 
 | 
  font-size: 14px; 
 | 
  margin-bottom: 15px; 
 | 
  margin-top: 10px; 
 | 
} 
 | 
</style> 
 |