|
@@ -1,51 +1,36 @@
|
|
|
<template>
|
|
|
<div class="hui-flex contract-edit">
|
|
|
<div class="contract-step">
|
|
|
- <div class="step-item active">
|
|
|
- <div class="step-number">1</div>
|
|
|
- <div class="step-label">基本信息</div>
|
|
|
- </div>
|
|
|
- <div class="line"><i class="el-icon-arrow-right"></i></div>
|
|
|
- <div class="step-item">
|
|
|
- <div class="step-number">2</div>
|
|
|
- <div class="step-label">费用条款</div>
|
|
|
- </div>
|
|
|
- <div class="line"><i class="el-icon-arrow-right"></i></div>
|
|
|
- <div class="step-item">
|
|
|
- <div class="step-number">3</div>
|
|
|
- <div class="step-label">合同文本</div>
|
|
|
+ <div :class="stepId === item.id ?'step-item active':'step-item'" v-for="(item,index) in stepList">
|
|
|
+ <div class="step-number">{{item.id}}</div>
|
|
|
+ <div class="step-label">{{item.name}}</div>
|
|
|
+ <i class="el-icon-arrow-right" v-if="index < stepList.length - 1"></i>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <el-form ref="form" :model="form" class="hui-flex-box" label-position="top">
|
|
|
+ <el-form ref="form" :model="form" class="hui-flex-box" label-position="top" v-show="stepId === 1">
|
|
|
<div class="contract-left">
|
|
|
<div class="contract-box">
|
|
|
<div class="hui-chart-title">所属公司信息</div>
|
|
|
<div class="contract-from">
|
|
|
<el-form-item label="所属公司">
|
|
|
- <el-select v-model="form.type" placeholder="请选择所属公司">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <el-input v-model="organization.name" disabled></el-input>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="所属部门">
|
|
|
- <el-select v-model="form.type" placeholder="请选择所属部门">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <el-cascader ref="partCascader" v-model="partValue" :options="partData" :props="partProps"
|
|
|
+ collapse-tags clearable @change="changePart" placeholder="请选择所属部门">
|
|
|
+ </el-cascader>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="招商跟进人">
|
|
|
- <el-select v-model="form.type" placeholder="请选择招商跟进人">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
+ <el-select v-model="form.investmentPromotion" placeholder="请选择招商跟进人">
|
|
|
+ <el-option :label="item.name" :value="item.id" v-for="(item,index) in partUserList"
|
|
|
+ :key="index">
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="运营跟进人">
|
|
|
- <el-select v-model="form.type" placeholder="请选择运营跟进人">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
+ <el-select v-model="form.operator" placeholder="请选择运营跟进人">
|
|
|
+ <el-option :label="item.name" :value="item.id" v-for="(item,index) in partUserList"
|
|
|
+ :key="index">
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
@@ -54,67 +39,86 @@
|
|
|
<div class="contract-box">
|
|
|
<div class="hui-chart-title">租客信息</div>
|
|
|
<div class="contract-from">
|
|
|
- <el-form-item label="所属公司">
|
|
|
- <el-select v-model="form.type" placeholder="请选择所属公司">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
+ <el-form-item label="租客类型">
|
|
|
+ <el-select v-model="form.renterType" placeholder="请选择租客类型">
|
|
|
+ <el-option label="企业" :value="1"></el-option>
|
|
|
+ <el-option label="客户" :value="2"></el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="所属部门">
|
|
|
- <el-select v-model="form.type" placeholder="请选择所属部门">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
+ <el-form-item label="企业" v-if="form.renterType === 1">
|
|
|
+ <el-select v-model="form.merchantId" placeholder="请选择企业" @change="changeMerchant">
|
|
|
+ <el-option :label="item.name" :value="item.id" v-for="(item,index) in merchantList"
|
|
|
+ :key="index">
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="招商跟进人">
|
|
|
- <el-select v-model="form.type" placeholder="请选择招商跟进人">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
+ <el-form-item label="客户" v-else-if="form.renterType === 2">
|
|
|
+ <el-select v-model="form.clientId" placeholder="请选择客户">
|
|
|
+ <el-option :label="item.name" :value="item.id" v-for="(item,index) in clientList"
|
|
|
+ :key="index">
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="运营跟进人">
|
|
|
- <el-select v-model="form.type" placeholder="请选择运营跟进人">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="法人" v-if="form.renterType === 1">
|
|
|
+ <el-input v-model="form.corporation" disabled></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="行业">
|
|
|
+ <el-input v-model="form.industry" placeholder="请输入行业"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="签订人">
|
|
|
+ <el-input v-model="form.signatory" placeholder="请输入签订人"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="租客联系人">
|
|
|
+ <el-input v-model="form.tenantContactPerson" placeholder="请输入租客联系人"></el-input>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="contract-box">
|
|
|
<div class="hui-chart-title">基本信息</div>
|
|
|
<div class="contract-from">
|
|
|
- <el-form-item label="所属公司">
|
|
|
- <el-select v-model="form.type" placeholder="请选择所属公司">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="签订日" prop="signingDate" :rules="[{required: true, message: '请选择签订日'}]">
|
|
|
+ <el-date-picker v-model="form.signingDate" value-format="yyyy-MM-dd" type="date"
|
|
|
+ placeholder="请选择签订日">
|
|
|
+ </el-date-picker>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="所属部门">
|
|
|
- <el-select v-model="form.type" placeholder="请选择所属部门">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="开始日" prop="startDate" :rules="[{required: true, message: '请选择开始日'}]">
|
|
|
+ <el-date-picker v-model="form.startDate" value-format="yyyy-MM-dd" type="date"
|
|
|
+ placeholder="请选择开始日">
|
|
|
+ </el-date-picker>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="招商跟进人">
|
|
|
- <el-select v-model="form.type" placeholder="请选择招商跟进人">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="结束日" prop="endDate" :rules="[{required: true, message: '请选择结束日'}]">
|
|
|
+ <el-date-picker v-model="form.endDate" value-format="yyyy-MM-dd" type="date"
|
|
|
+ placeholder="请选择结束日">
|
|
|
+ </el-date-picker>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="运营跟进人">
|
|
|
- <el-select v-model="form.type" placeholder="请选择运营跟进人">
|
|
|
- <el-option :label="item.name" :value="item.id"
|
|
|
- v-for="(item,index) in $field.field.fieldType" :key="index">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="contract-box">
|
|
|
+ <div class="hui-chart-title">滞纳金</div>
|
|
|
+ <div class="contract-from">
|
|
|
+ <el-form-item label="起算天数(天)">
|
|
|
+ <el-input v-model="form.lateFeesStartingDays" placeholder="请输入起算天数(天)"></el-input>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="滞纳金比例(%/天)">
|
|
|
+ <el-input v-model="form.lateFeesProportion" placeholder="请输入滞纳金比例(%/天)"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="滞纳金上限(%)">
|
|
|
+ <el-input v-model="form.lateFeesCeiling" placeholder="请输入滞纳金上限(%)"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="contract-box">
|
|
|
+ <div class="hui-chart-title">合同标签</div>
|
|
|
+ <div class="contract-from" style="padding-bottom: 20px;">
|
|
|
+ <tag ref="tag" type="insert" :tagType="4"
|
|
|
+ :tagActive="form.tagIds ? form.tagIds.split(',') : []">
|
|
|
+ </tag>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="contract-box">
|
|
|
+ <div class="hui-chart-title">自定义字段</div>
|
|
|
+ <div class="contract-from" style="padding-bottom: 20px;">
|
|
|
+ <custom-data ref="customData" :list="customList"></custom-data>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -128,25 +132,207 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-form>
|
|
|
+ <div class="hui-flex-box" v-show="stepId === 2">
|
|
|
+ <div class="contract-clause">
|
|
|
+ <div class="contract-box" v-for="(clause,index) in clauseList" :key="clause.id">
|
|
|
+ <div class="hui-chart-title">
|
|
|
+ <span>{{clause.name}}</span>
|
|
|
+ <el-button type="primary" size="mini" icon="el-icon-plus"
|
|
|
+ @click="insertClause(clause.id)">{{clause.name}}</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="contract-from">
|
|
|
+ <clause :ref="'clause' + item.id " :type="item.type"
|
|
|
+ v-for="(item,index) in clauseData.filter(node => node.type === clause.id)" :key="item.id">
|
|
|
+ <i class="el-icon-close" v-if="item.isDelete" @click="deleteClause(item.id)"></i>
|
|
|
+ </clause>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="hui-flex-box" v-show="stepId === 3">
|
|
|
+ <select-template></select-template>
|
|
|
+ </div>
|
|
|
<div class="contract-btn">
|
|
|
- <el-button size="medium">上一步</el-button>
|
|
|
- <el-button type="primary" size="medium">保存</el-button>
|
|
|
+ <el-button size="medium" @click="lastSubmit">上一步</el-button>
|
|
|
+ <el-button type="primary" size="medium" @click="submit">{{stepId === 3 ? '保存' : '下一步'}}</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+ import {
|
|
|
+ getPartList
|
|
|
+ } from '@/httpApi/organization'
|
|
|
import projectItemTreeSelect from '@/components/common/projectItemTreeSelect'
|
|
|
+ import {
|
|
|
+ getOrganizationList,
|
|
|
+ } from '@/httpApi/business'
|
|
|
+ import {
|
|
|
+ getCustomerListByPage
|
|
|
+ } from '@/httpApi/crm'
|
|
|
+ import tag from '@/components/common/tag'
|
|
|
+ import customData from '@/components/common/customData'
|
|
|
+ import clause from '@/components/work/contract/common/clause'
|
|
|
+ import selectTemplate from '@/components/work/contract/common/selectTemplate'
|
|
|
export default {
|
|
|
data() {
|
|
|
return {
|
|
|
+ stepList: [{
|
|
|
+ id: 1,
|
|
|
+ name: '基本信息'
|
|
|
+ }, {
|
|
|
+ id: 2,
|
|
|
+ name: '费用条款'
|
|
|
+ }, {
|
|
|
+ id: 3,
|
|
|
+ name: '合同文本'
|
|
|
+ }],
|
|
|
+ stepId: 1,
|
|
|
+ organization: {},
|
|
|
+ partValue: [],
|
|
|
+ partData: [],
|
|
|
+ partProps: {
|
|
|
+ value: 'id',
|
|
|
+ label: 'name',
|
|
|
+ checkStrictly: true
|
|
|
+ },
|
|
|
+ partUserList: [],
|
|
|
+ merchantList: [],
|
|
|
+ clientList: [],
|
|
|
+ customList: [],
|
|
|
form: {
|
|
|
+ organizationId: '',
|
|
|
+ roleId: '',
|
|
|
+ roleName: '',
|
|
|
+ investmentPromotion: '',
|
|
|
+ operator: '',
|
|
|
+ renterType: 1,
|
|
|
+ merchantId: '',
|
|
|
+ clientId: '',
|
|
|
+ tenant: '', //租客
|
|
|
+ industry: '',
|
|
|
+ corporation: '',
|
|
|
+ signatory: '',
|
|
|
+ tenantContactPerson: '',
|
|
|
+ signingDate: '',
|
|
|
+ startDate: '',
|
|
|
+ endDate: '',
|
|
|
+ lateFeesStartingDays: '',
|
|
|
+ lateFeesProportion: '',
|
|
|
+ tagIds: '',
|
|
|
type: ''
|
|
|
+ },
|
|
|
+ clauseList: [{
|
|
|
+ id: 1,
|
|
|
+ name: '租期条款'
|
|
|
+ }, {
|
|
|
+ id: 2,
|
|
|
+ name: '保证金条款'
|
|
|
+ }, {
|
|
|
+ id: 3,
|
|
|
+ name: '递增条款'
|
|
|
+ }, {
|
|
|
+ id: 4,
|
|
|
+ name: '优惠条款'
|
|
|
+ }],
|
|
|
+ clauseData: [{
|
|
|
+ id: 1,
|
|
|
+ type: 1,
|
|
|
+ isDelete: false
|
|
|
+ }, {
|
|
|
+ id: 2,
|
|
|
+ type: 2,
|
|
|
+ isDelete: false
|
|
|
+ }],
|
|
|
+ clauseIndex: 3
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.organization = this.$store.getters.organization;
|
|
|
+ this.form['organizationId'] = this.organization.id;
|
|
|
+ this.partList();
|
|
|
+ this.merchant();
|
|
|
+ this.client();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ partList() {
|
|
|
+ getPartList(this.organization.id, this.$store.getters.project.id).then(res => {
|
|
|
+ if (res.state) {
|
|
|
+ this.partData = res.data;
|
|
|
+ this.returnPartList(this.partData);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ merchant() {
|
|
|
+ getOrganizationList({
|
|
|
+ organizationId: this.organization.id,
|
|
|
+ status: 1
|
|
|
+ }).then(res => {
|
|
|
+ if (res.state) {
|
|
|
+ this.merchantList = res.data;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ changeMerchant() {
|
|
|
+ let data = this.merchantList.find(node => node.id == this.form.merchantId);
|
|
|
+ this.form.corporation = data.legalPerson;
|
|
|
+ },
|
|
|
+ client() {
|
|
|
+ getCustomerListByPage({
|
|
|
+ currPage: 1,
|
|
|
+ pageSize: 100,
|
|
|
+ organizationId: this.organization.id,
|
|
|
+ status: 2
|
|
|
+ }).then(res => {
|
|
|
+ if (res.state) {
|
|
|
+ this.clientList = res.data.dataList;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ returnPartList(data) {
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
|
+ if (data[i].children.length > 0) {
|
|
|
+ this.returnPartList(data[i].children)
|
|
|
+ } else {
|
|
|
+ data[i].children = null;
|
|
|
+ }
|
|
|
}
|
|
|
+ },
|
|
|
+ changePart(val) {
|
|
|
+ this.form.investmentPromotion = '';
|
|
|
+ this.form.operator = '';
|
|
|
+ this.partUserList = this.$refs.partCascader.getCheckedNodes(true)[0].data.users || [];
|
|
|
+ },
|
|
|
+ lastSubmit() {
|
|
|
+ if (this.stepId > 0) return this.stepId--;
|
|
|
+ },
|
|
|
+ submit() {
|
|
|
+ if (this.stepId < 3) return this.stepId++;
|
|
|
+ // let post = {}
|
|
|
+ // postData['data'] = JSON.stringify(this.$refs.customData.listData);
|
|
|
+ // postData['tagIds'] = this.$refs.tag.tagIds();
|
|
|
+ },
|
|
|
+ insertClause(type) {
|
|
|
+ this.clauseData.push({
|
|
|
+ id: this.clauseIndex,
|
|
|
+ type: type,
|
|
|
+ isDelete: true
|
|
|
+ })
|
|
|
+ this.clauseIndex++;
|
|
|
+ },
|
|
|
+ deleteClause(id) {
|
|
|
+ this.$confirm('确定要删除该条款', () => {
|
|
|
+ let index = this.clauseData.findIndex(node => node.id === id);
|
|
|
+ this.clauseData.splice(index, 1);
|
|
|
+ });
|
|
|
}
|
|
|
},
|
|
|
components: {
|
|
|
- projectItemTreeSelect
|
|
|
+ projectItemTreeSelect,
|
|
|
+ tag,
|
|
|
+ customData,
|
|
|
+ clause,
|
|
|
+ selectTemplate
|
|
|
},
|
|
|
}
|
|
|
</script>
|
|
@@ -159,6 +345,13 @@
|
|
|
padding: 12px 0;
|
|
|
}
|
|
|
|
|
|
+ .contract-clause {
|
|
|
+ flex: 1;
|
|
|
+ width: 0;
|
|
|
+ height: 100%;
|
|
|
+ overflow-y: auto;
|
|
|
+ }
|
|
|
+
|
|
|
.contract-project-title {
|
|
|
height: 42px;
|
|
|
border-radius: 2px;
|
|
@@ -200,6 +393,18 @@
|
|
|
background: $--box-background;
|
|
|
margin-bottom: 12px;
|
|
|
|
|
|
+ .el-icon-close {
|
|
|
+ position: absolute;
|
|
|
+ right: 10px;
|
|
|
+ top: 10px;
|
|
|
+ cursor: pointer;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .hui-chart-title {
|
|
|
+ padding-right: 20px;
|
|
|
+ }
|
|
|
+
|
|
|
.contract-from {
|
|
|
padding: 20px 0 0 15px;
|
|
|
display: flex;
|
|
@@ -242,6 +447,13 @@
|
|
|
position: relative;
|
|
|
}
|
|
|
|
|
|
+ .el-icon-arrow-right {
|
|
|
+ position: absolute;
|
|
|
+ top: 16px;
|
|
|
+ right: -8px;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+
|
|
|
.step-number {
|
|
|
width: 26px;
|
|
|
height: 26px;
|