contractAdd.vue 22 KB

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