contractAdd.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. <template>
  2. <div>
  3. <el-form ref="form" :model="form" style="width: 100%;padding: 5px" :rules="rules">
  4. <el-row>
  5. <el-col style="padding-bottom: 10px">
  6. <el-card shadow="always" style="padding: 15px 5px 5px 15px">
  7. <el-row>
  8. <el-col :span="5" class="col-txt"><span>网签备案号</span></el-col>
  9. <el-col :span="18" class="col-input">
  10. <el-form-item>
  11. <el-input v-model="form.recordNumber" />
  12. </el-form-item>
  13. </el-col>
  14. </el-row>
  15. <el-row>
  16. <el-col :span="5" class="col-txt"><span>*合同编号</span></el-col>
  17. <el-col :span="18" class="col-input">
  18. <el-form-item prop="contractNumber">
  19. <el-input v-model="form.contractNumber" />
  20. </el-form-item>
  21. </el-col>
  22. </el-row>
  23. <el-row>
  24. <el-col :span="5" class="col-txt"><span>出卖人</span></el-col>
  25. <el-col :span="18" class="col-input">
  26. <el-form-item>
  27. <el-input value="无锡市安居投资发展有限公司" readonly />
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. <el-row v-for="(item, index) in form.dynamicItem" :key="index">
  32. <el-col :span="5 " class="col-txt"><span>购房人{{ index + 1 }}</span></el-col>
  33. <el-col :span="4" class="col-input">
  34. <el-form-item :prop="'dynamicItem.' + index + '.name'">
  35. <el-input
  36. v-model="item.name"
  37. placeholder="请填写姓名"
  38. />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="4" class="col-input">
  42. <el-form-item :prop="'dynamicItem.' + index + '.identityCard'">
  43. <el-input
  44. v-model="item.identityCard"
  45. placeholder="请填写身份证号"
  46. />
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="4" class="col-input">
  50. <el-form-item :prop="'dynamicItem.' + index + '.phone'">
  51. <el-input
  52. v-model="item.phone"
  53. placeholder="请填写手机号"
  54. />
  55. </el-form-item>
  56. </el-col>
  57. <el-col v-if="index !== 0" :span="6" class="col-input">
  58. <el-form-item :prop="'dynamicItem.' + index + '.relationship'">
  59. <el-select
  60. v-model="item.relationship"
  61. placeholder="与1的关系"
  62. filterable
  63. :popper-append-to-body="false"
  64. popper-class="statistic_base"
  65. >
  66. <el-option
  67. v-for="relationship in dc_data.RELATIONSHIP"
  68. :key="relationship.value"
  69. :label="relationship.label"
  70. :value="relationship.value"
  71. :popper-append-to-body="false"
  72. popper-class="statistic_base"
  73. />
  74. </el-select>
  75. </el-form-item>
  76. </el-col>
  77. </el-row>
  78. <el-row>
  79. <el-col :span="5" class="col-txt"><span>房屋</span></el-col>
  80. <el-col :span="18" class="col-input">
  81. <el-form-item>
  82. <el-cascader
  83. v-model="form.houseId"
  84. :append-to-body="false"
  85. :disabled="isView"
  86. style="width: 100%;"
  87. :options="TreeData"
  88. @change="houseChange"
  89. />
  90. </el-form-item>
  91. </el-col>
  92. </el-row>
  93. <el-row>
  94. <el-col :span="5" class="col-txt"><span>*实测建筑面积</span></el-col>
  95. <el-col :span="18" class="col-input">
  96. <el-form-item prop="actualBuildArea">
  97. <el-input v-model="form.actualBuildArea" readonly />
  98. </el-form-item>
  99. </el-col>
  100. </el-row>
  101. <el-row>
  102. <el-col :span="5" class="col-txt"><span>套内建筑面积</span></el-col>
  103. <el-col :span="18" class="col-input">
  104. <el-form-item>
  105. <el-input v-model="form.actualInternalArea" readonly />
  106. </el-form-item>
  107. </el-col>
  108. </el-row>
  109. <el-row>
  110. <el-col :span="5" class="col-txt"><span>分摊共有建筑</span></el-col>
  111. <el-col :span="18" class="col-input">
  112. <el-form-item>
  113. <el-input v-model="form.actualShareArea" readonly />
  114. </el-form-item>
  115. </el-col>
  116. </el-row>
  117. <el-row>
  118. <el-col :span="5" class="col-txt"><span>房产测绘机构</span></el-col>
  119. <el-col :span="18" class="col-input">
  120. <el-form-item>
  121. <el-select
  122. v-model="form.institution"
  123. :popper-append-to-body="false"
  124. popper-class="statistic_base"
  125. placeholder=""
  126. filterable
  127. :disabled="isView"
  128. >
  129. <el-option
  130. v-for="item in dc_data.MAPPING_INSTITUTION"
  131. :key="item.value"
  132. popper-class="statistic_base"
  133. :popper-append-to-body="false"
  134. :label="item.label"
  135. :value="item.value"
  136. />
  137. </el-select>
  138. </el-form-item>
  139. </el-col>
  140. </el-row>
  141. <el-row>
  142. <el-col :span="5" class="col-txt"><span>签约日期</span></el-col>
  143. <el-col :span="18" class="col-input">
  144. <el-form-item>
  145. <el-date-picker
  146. v-model="form.signingDate"
  147. type="date"
  148. placeholder="年月日"
  149. value-format="yyyy-MM-dd"
  150. />
  151. </el-form-item>
  152. </el-col>
  153. </el-row>
  154. <el-row>
  155. <el-col :span="5" class="col-txt"><span>备注说明</span></el-col>
  156. <el-col :span="18" class="col-input">
  157. <el-input v-model="form.remark" type="textarea" maxlength="2000" show-word-limit :disabled="isView" />
  158. </el-col>
  159. </el-row>
  160. <el-row>
  161. <el-divider />
  162. </el-row>
  163. <el-row>
  164. <el-col :span="5" class="col-txt"><span style="font-weight: bold;font-size: large">房价款</span></el-col>
  165. </el-row>
  166. <el-row>
  167. <el-col :span="5" class="col-txt"><span>房屋买卖单价(元/㎡)</span></el-col>
  168. <el-col :span="18" class="col-input">
  169. <el-form-item>
  170. <el-input v-model="form.housePrice" readonly />
  171. </el-form-item>
  172. </el-col>
  173. </el-row>
  174. <el-row>
  175. <el-col :span="5" class="col-txt"><span>总价款(元)</span></el-col>
  176. <el-col :span="18" class="col-input">
  177. <el-form-item>
  178. <el-input v-model="form.totalPrice" @input="totalPriceChange" />
  179. </el-form-item>
  180. </el-col>
  181. </el-row>
  182. <el-row>
  183. <el-col :span="5" class="col-txt"><span>买受人产权份额占比为</span></el-col>
  184. <el-col :span="18" class="col-input">
  185. <el-form-item>
  186. <el-input v-model="form.buyerProportion" @input="proportionChange" />
  187. </el-form-item>
  188. </el-col>
  189. </el-row>
  190. <el-row>
  191. <el-col :span="5" class="col-txt"><span>买受人出资金额(元)</span></el-col>
  192. <el-col :span="18" class="col-input">
  193. <el-form-item>
  194. <el-input v-model="form.buyerMoney" />
  195. </el-form-item>
  196. </el-col>
  197. </el-row>
  198. <el-row>
  199. <el-col :span="5" class="col-txt"><span>付款方式</span></el-col>
  200. <el-col :span="18" class="col-input">
  201. <el-form-item>
  202. <el-select
  203. v-model="form.paymentMethod"
  204. placeholder="请选择"
  205. size="small"
  206. :disabled="isView"
  207. :popper-append-to-body="false"
  208. popper-class="statistic_base"
  209. >
  210. <el-option
  211. v-for="item in dc_data.PAYMENT_METHODS"
  212. :key="item.value"
  213. :popper-append-to-body="false"
  214. popper-class="statistic_base"
  215. :label="item.label"
  216. :value="item.value"
  217. />
  218. </el-select>
  219. </el-form-item>
  220. </el-col>
  221. </el-row>
  222. <el-row v-if="form.paymentMethod == '2'">
  223. <el-col :span="5" class="col-txt"><span>首付比例</span></el-col>
  224. <el-col :span="18" class="col-input">
  225. <el-form-item>
  226. <el-select
  227. v-model="form.downPaymentsProportion"
  228. placeholder="请选择"
  229. size="small"
  230. :disabled="isView"
  231. :popper-append-to-body="false"
  232. popper-class="statistic_base"
  233. >
  234. <el-option
  235. v-for="item in dc_data.DOWN_PAYMENT_PROPORTION"
  236. :key="item.value"
  237. :popper-append-to-body="false"
  238. popper-class="statistic_base"
  239. :label="item.label"
  240. :value="item.value"
  241. />
  242. </el-select>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. <el-row>
  247. <el-col :span="5" class="col-txt"><span>付款截止日</span></el-col>
  248. <el-col :span="18" class="col-input">
  249. <el-form-item>
  250. <el-date-picker
  251. v-model="form.deadline"
  252. type="date"
  253. placeholder="年月日"
  254. value-format="yyyy-MM-dd"
  255. />
  256. </el-form-item>
  257. </el-col>
  258. </el-row>
  259. <el-row>
  260. <el-divider />
  261. </el-row>
  262. <el-row>
  263. <el-col :span="5" class="col-txt"><span style="font-weight: bold;font-size: large">专项维修资金</span></el-col>
  264. </el-row>
  265. <el-row>
  266. <el-col :span="5" class="col-txt"><span>住宅专项维修资金(元/㎡)</span></el-col>
  267. <el-col :span="18" class="col-input">
  268. <el-form-item>
  269. <el-input v-model="form.maintenanceFunds" @input="maintenanceFundsChange"/>
  270. </el-form-item>
  271. </el-col>
  272. </el-row>
  273. <el-row>
  274. <el-col :span="5" class="col-txt"><span>总价款(元)</span></el-col>
  275. <el-col :span="18" class="col-input">
  276. <el-form-item>
  277. <el-input v-model="form.maintenanceTotalPrice" />
  278. </el-form-item>
  279. </el-col>
  280. </el-row>
  281. <el-row>
  282. <el-col :span="5" class="col-txt"><span>合同原件</span></el-col>
  283. <el-col :span="5" class="col-input">
  284. <el-form-item>
  285. <el-upload
  286. class="upload-demo"
  287. action="/server/wx/fileController/uploadImage"
  288. :http-request="uploadPhoto"
  289. :before-remove="beforeRemove"
  290. multiple
  291. :file-list="contractOriginalList"
  292. >
  293. <el-button size="small" type="primary">点击上传</el-button>
  294. <div slot="file" slot-scope="{file}">
  295. <a :href="file.url">{{ file.name }}</a>
  296. <span class="el-upload-list__item-actions">
  297. <i class="el-icon-delete" @click="handlePictureRemove(file,contractOriginalList)" />
  298. </span>
  299. </div>
  300. </el-upload>
  301. </el-form-item>
  302. </el-col>
  303. <el-col :span="5" class="col-txt"><span>其他附件</span></el-col>
  304. <el-col :span="5" class="col-input">
  305. <el-form-item>
  306. <el-upload
  307. class="upload-demo"
  308. action="/server/wx/fileController/uploadImage"
  309. :http-request="uploadContractOther"
  310. :before-remove="beforeRemove"
  311. multiple
  312. :file-list="contractOtherList"
  313. >
  314. <el-button size="small" type="primary">点击上传</el-button>
  315. <div slot="file" slot-scope="{file}">
  316. <a :href="file.url">{{ file.name }}</a>
  317. <span class="el-upload-list__item-actions">
  318. <i class="el-icon-delete" @click="handlePictureRemove(file,contractOtherList)" />
  319. </span>
  320. </div>
  321. </el-upload>
  322. </el-form-item>
  323. </el-col>
  324. </el-row>
  325. </el-card>
  326. </el-col>
  327. </el-row>
  328. </el-form>
  329. <div slot="footer" style="text-align: right">
  330. <el-button @click="cancel()">关 闭</el-button>
  331. <el-button type="primary" @click="confirmSubmit()">暂 存</el-button>
  332. <el-button type="primary" @click="confirmSubmit('signing')">签 约</el-button>
  333. </div>
  334. </div>
  335. </template>
  336. <script>
  337. import Base from '@/views/base/base'
  338. import BaseData from '@/views/base/baseData'
  339. import { upload } from '@/static/utils/channel'
  340. export default {
  341. name: 'ContractManage',
  342. components: {
  343. },
  344. mixins: [Base, BaseData],
  345. props: {
  346. // 确认从哪个页面跳转过来的,这样可以做相应的操作
  347. fromAddress: {
  348. type: String,
  349. default: ''
  350. },
  351. signYear: {
  352. type: String,
  353. default: ''
  354. }
  355. },
  356. data() {
  357. return {
  358. dc_key: ['CONTRACT_STATUS', 'MAPPING_INSTITUTION', 'PAYMENT_METHODS', 'DOWN_PAYMENT_PROPORTION', 'RELATIONSHIP'],
  359. // 弹框相关
  360. dialogVisible: false,
  361. dialogTitle: '新增',
  362. form: {
  363. dynamicItem: [
  364. {
  365. id: '',
  366. customerManagementId: '',
  367. name: '',
  368. identityCard: '',
  369. phone: '',
  370. relationship: ''
  371. }
  372. ]
  373. },
  374. rules: {
  375. contractNumber: [{ required: true, trigger: 'blur', message: '请输入合同编号' }],
  376. actualBuildArea: [{ required: true, trigger: 'blur', message: '实测建筑面积' }]
  377. },
  378. contractOriginalList: [],
  379. contractOtherList: [],
  380. signingMaterialsList: [],
  381. contractId: '',
  382. TreeData: [],
  383. isView: false, // 查看按钮权限,
  384. searchTreeData: []
  385. }
  386. },
  387. watch: {
  388. },
  389. mounted() {
  390. this.findRoomTree()
  391. this.initDict(this.dc_key).then((res) => {
  392. })
  393. },
  394. methods: {
  395. initData(val) {
  396. console.log('111')
  397. const _this = this
  398. // 查看或编辑
  399. if (val.id) {
  400. _this.isView = val.isView
  401. const postData = {
  402. id: val.id
  403. }
  404. this.baseRequest('getById', postData).then((res) => {
  405. if (res.data) {
  406. const data = res.data
  407. _this.form = Object.assign({}, _this.form, res.data)
  408. // 合同原件
  409. _this.contractOriginalList = data.contractOriginal ? JSON.parse(data.contractOriginal) : []
  410. // 其他附件
  411. _this.contractOtherList = data.contractOther ? JSON.parse(data.contractOther) : []
  412. if (data.institution) {
  413. _this.form.institution = data.institution + ''
  414. }
  415. if (data.paymentMethod) {
  416. _this.form.paymentMethod = data.paymentMethod + ''
  417. }
  418. if (data.downPaymentsProportion) {
  419. _this.form.downPaymentsProportion = data.downPaymentsProportion + ''
  420. }
  421. // 初始化专项维修资金总价款
  422. const price = _this.form.maintenanceFunds
  423. const area = _this.form.actualBuildArea
  424. if (price && area) {
  425. _this.form.maintenanceTotalPrice = price * area
  426. }
  427. }
  428. }).catch(() => {
  429. })
  430. this.baseBuyerRequest('listAll', { customerManagementId: val.customerManagementId }).then(res => {
  431. const data = res.data
  432. _this.form.dynamicItem = data
  433. this.$forceUpdate()
  434. })
  435. }
  436. },
  437. findRoomTree: function() {
  438. const _this = this
  439. this.pubRequest('getTreeData1', '').then((res) => {
  440. _this.TreeData = res.data.data
  441. }).catch(() => {
  442. })
  443. },
  444. uploadPhoto: function(param) {
  445. upload(param, true).then((res) => {
  446. this.contractOriginalList.push(res)
  447. })
  448. },
  449. uploadContractOther: function(param) {
  450. upload(param, true).then((res) => {
  451. this.contractOtherList.push(res)
  452. })
  453. },
  454. confirmSubmit: function(type) {
  455. const _this = this
  456. const p1 = new Promise((resolve, reject) => {
  457. this.$refs['form'].validate((valid) => {
  458. if (valid) resolve()
  459. })
  460. })
  461. const p2 = {}
  462. Promise.all([p1, p2])
  463. .then(() => {
  464. const soaUrl = 'edit'
  465. const extraData = {
  466. // 合同原件
  467. contractOriginal: JSON.stringify(this.contractOriginalList),
  468. // 其他附件
  469. contractOther: JSON.stringify(this.contractOtherList),
  470. // 合同状态
  471. contractStatus: type === 'signing' ? 2 : ''
  472. }
  473. const postData = Object.assign({}, _this.form, extraData)
  474. this.baseRequest(soaUrl, postData).then(res => {
  475. if (res.data.code === 200) {
  476. this.$message.success('保存成功')
  477. this.cancel()
  478. } else {
  479. this.$message.error(res.data.msg)
  480. }
  481. }).catch(err => {
  482. this.$message.error(err)
  483. })
  484. })
  485. },
  486. cancel() {
  487. this.$emit('cancel')
  488. },
  489. houseChange() {
  490. },
  491. totalPriceChange() {
  492. const _this = this
  493. const total = _this.form.totalPrice
  494. const area = _this.form.actualBuildArea
  495. if (total && area) {
  496. _this.form.housePrice = (total / area).toFixed(2)
  497. }
  498. // 触发买受人产权占比
  499. _this.proportionChange()
  500. },
  501. proportionChange() {
  502. const _this = this
  503. const total = _this.form.totalPrice
  504. const proportion = _this.form.buyerProportion / 100
  505. if (total && proportion) {
  506. _this.form.buyerMoney = total * proportion
  507. }
  508. },
  509. maintenanceFundsChange() {
  510. const _this = this
  511. const price = _this.form.maintenanceFunds
  512. const area = _this.form.actualBuildArea
  513. if (price && area) {
  514. _this.form.maintenanceTotalPrice = price * area
  515. }
  516. },
  517. baseRequest(opUrl, postData) {
  518. return this.$channel.globeRequest('ContractManageController', opUrl, postData, 'project')
  519. },
  520. pubRequest(opUrl, postData) {
  521. return this.$channel.globeRequest('ParkInfoController', opUrl, postData, 'project')
  522. },
  523. baseRoomRequest(opUrl, postData) {
  524. return this.$channel.globeRequest('ParkRoomController', opUrl, postData, 'project')
  525. },
  526. baseBuyerRequest(opUrl, postData) {
  527. return this.$channel.globeRequest('BuyerController', opUrl, postData, 'project')
  528. }
  529. }
  530. }
  531. </script>
  532. <style scoped>
  533. .ch-input .el-input__inner {
  534. border-color: #32323A;
  535. }
  536. .ch-input-size {
  537. width: 150px;
  538. }
  539. .ch-button {
  540. border-color: #32323A;
  541. background-color: #32323A;
  542. color: #fff;
  543. }
  544. .ch-button-warning {
  545. margin-left: 10px;
  546. border-color: #E6A23C;
  547. background-color: #E6A23C;
  548. color: #fff;
  549. }
  550. .ch-button-export {
  551. margin-left: 10px;
  552. border-color: #98CC1F;
  553. background-color: #98CC1F;
  554. color: #fff;
  555. }
  556. /deep/.el-dialog__header {
  557. padding: 10px 20px;
  558. }
  559. /deep/.el-dialog__body {
  560. padding: 10px 20px;
  561. }
  562. </style>