detail.vue 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271
  1. <template>
  2. <div class="s-page">
  3. <el-page-header @back="goBack" :content="title"></el-page-header>
  4. <el-divider></el-divider>
  5. <el-card class="box-card" v-if="formType != 0">
  6. <div class="order-main">
  7. <el-row>
  8. <el-col :span="24">
  9. <div class="order-main-title">
  10. <span>订单编号:{{ formData.id }}</span>
  11. <span>下单时间:{{ formData.createTime }}</span>
  12. </div>
  13. </el-col>
  14. </el-row>
  15. <el-row>
  16. <el-col :span="10">
  17. <div style="display: flex">
  18. <div>
  19. <div class="order-main-status">
  20. <span>{{ filterStatus(formData.status) }}</span>
  21. </div>
  22. <div class="order-main-opt-btn">
  23. <el-button
  24. v-if="formData.status === 'WAIT'"
  25. type="primary"
  26. @click="submitOrder()"
  27. style="margin-right: 10px"
  28. >确定租赁</el-button
  29. >
  30. <el-button
  31. v-if="formData.status === 'LEASE' || formData.status === 'OVER'"
  32. @click="isRecover = true"
  33. type="primary"
  34. slot="reference"
  35. style="margin-right: 10px"
  36. >确认回收</el-button
  37. >
  38. <el-popconfirm title="确定取消订单吗?" @confirm="cancelOrder()" v-if="formData.status === 'WAIT'">
  39. <el-button slot="reference" type="info" plain style="margin-right: 10px">取消订单</el-button>
  40. </el-popconfirm>
  41. <el-button
  42. v-if="formData.status === 'LEASE'"
  43. @click="isRepair = true"
  44. type="primary"
  45. style="margin-right: 10px"
  46. >报修</el-button
  47. >
  48. <el-button
  49. v-if="formData.status === 'LEASE' || formData.status === 'OVER'"
  50. @click="isRelet = true"
  51. type="primary"
  52. style="margin-right: 10px"
  53. >续租</el-button
  54. >
  55. </div>
  56. </div>
  57. </div>
  58. </el-col>
  59. <el-col :span="14" style="padding-top: 10px">
  60. <el-steps
  61. :active="
  62. formData.status == 'WAIT'
  63. ? 1
  64. : formData.status == 'LEASE'
  65. ? 2
  66. : formData.status == 'OVER'
  67. ? 3
  68. : formData.status == 'RECOVER'
  69. ? 5
  70. : 0
  71. "
  72. align-center
  73. >
  74. <el-step title="买家下单" :description="formData.createTime"></el-step>
  75. <el-step title="商家确认" :description="formData.confirmTime ? formData.confirmTime : ''"></el-step>
  76. <el-step title="租赁中" :description="formData.deliverTime ? formData.deliverTime : ''"></el-step>
  77. <el-step title="已到期-待回收" :description="formData.overTime ? formData.overTime : ''"></el-step>
  78. <el-step title="已到期-已回收" :description="formData.overTime ? formData.overTime : ''"></el-step>
  79. </el-steps>
  80. </el-col>
  81. </el-row>
  82. </div>
  83. </el-card>
  84. <el-card class="box-card">
  85. <div slot="header" class="clearfix">
  86. <span>客户信息</span>
  87. </div>
  88. <div class="mymain-container">
  89. <el-form ref="formData" :rules="rules" :model="formData" label-width="110px" size="small" label-position="left">
  90. <el-row :gutter="20" justify="start">
  91. <el-col :span="8">
  92. <el-form-item label="客户姓名" prop="userName" :required="true">
  93. <el-input
  94. type="text"
  95. :disabled="formType != 0 && formData.status != 'WAIT'"
  96. v-model="formData.userName"
  97. placeholder="请输入"
  98. ></el-input>
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="8">
  102. <el-form-item label="客户联系电话" prop="userMobile" :required="true">
  103. <zj-select
  104. v-model="formData.userInfo"
  105. blurNoMatchInputBorderColor=""
  106. :blurNoMatchText="true"
  107. :filter-method="userMobileInput"
  108. :disabled="formType != 0 && formData.status != 'WAIT'"
  109. value-key="userId"
  110. filterable
  111. @change="changeUser"
  112. @blur="userBlur"
  113. placeholder="请选择"
  114. style="width: 100%"
  115. >
  116. <zj-option
  117. v-for="item in userList"
  118. :key="item.userId"
  119. :label="item.mobile + '(' + item.nickName + ')'"
  120. :value="item"
  121. >
  122. </zj-option>
  123. </zj-select>
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="24">
  127. <el-form-item label="客户地址" class="is-required">
  128. <el-row>
  129. <el-col :span="5" style="margin-right: 12px">
  130. <el-select
  131. v-model="formData.provinceObj"
  132. :disabled="formType != 0 && formData.status != 'WAIT'"
  133. filterable
  134. value-key="id"
  135. placeholder="请选择"
  136. @change="
  137. val => {
  138. formData.provinceId = val.id
  139. formData.province = val.name
  140. formData.cityObj = null
  141. formData.cityId = ''
  142. formData.city = ''
  143. formData.areaObj = null
  144. formData.areaId = ''
  145. formData.area = ''
  146. formData.streetObj = null
  147. formData.streetId = ''
  148. formData.street = ''
  149. this.lbsAmapRegion('cityList', val.id)
  150. }
  151. "
  152. >
  153. <el-option
  154. v-for="(item, index) in provinceList"
  155. :key="index"
  156. :label="item.name"
  157. :value="item"
  158. ></el-option>
  159. </el-select>
  160. </el-col>
  161. <el-col :span="5" style="margin-right: 12px">
  162. <el-select
  163. v-model="formData.cityObj"
  164. :disabled="formType != 0 && formData.status != 'WAIT'"
  165. filterable
  166. value-key="id"
  167. placeholder="请选择"
  168. @change="
  169. val => {
  170. formData.cityId = val.id
  171. formData.city = val.name
  172. formData.areaObj = null
  173. formData.areaId = ''
  174. formData.area = ''
  175. formData.streetObj = null
  176. formData.streetId = ''
  177. formData.street = ''
  178. this.lbsAmapRegion('areaList', val.id)
  179. }
  180. "
  181. >
  182. <el-option
  183. v-for="(item, index) in cityList"
  184. :key="index"
  185. :label="item.name"
  186. :value="item"
  187. ></el-option>
  188. </el-select>
  189. </el-col>
  190. <el-col :span="5" style="margin-right: 12px">
  191. <el-select
  192. v-model="formData.areaObj"
  193. :disabled="formType != 0 && formData.status != 'WAIT'"
  194. filterable
  195. value-key="id"
  196. placeholder="请选择"
  197. @change="
  198. val => {
  199. formData.areaId = val.id
  200. formData.area = val.name
  201. formData.streetObj = null
  202. formData.streetId = ''
  203. formData.street = ''
  204. this.lbsAmapRegion('streetList', val.id)
  205. }
  206. "
  207. >
  208. <el-option
  209. v-for="(item, index) in areaList"
  210. :key="index"
  211. :label="item.name"
  212. :value="item"
  213. ></el-option>
  214. </el-select>
  215. </el-col>
  216. <el-col :span="8">
  217. <el-select
  218. v-model="formData.streetObj"
  219. :disabled="formType != 0 && formData.status != 'WAIT'"
  220. filterable
  221. value-key="id"
  222. placeholder="请选择"
  223. @change="
  224. val => {
  225. formData.streetId = val.id
  226. formData.street = val.name
  227. }
  228. "
  229. >
  230. <el-option
  231. v-for="(item, index) in streetList"
  232. :key="index"
  233. :label="item.name"
  234. :value="item"
  235. ></el-option>
  236. </el-select>
  237. </el-col>
  238. </el-row>
  239. </el-form-item>
  240. </el-col>
  241. <el-col :span="24">
  242. <el-form-item label="" prop="address">
  243. <el-row :gutter="20">
  244. <el-col :span="22">
  245. <el-input
  246. type="text"
  247. v-model="formData.address"
  248. :disabled="formType != 0 && formData.status != 'WAIT'"
  249. placeholder="详细地址"
  250. ></el-input>
  251. </el-col>
  252. <el-col :span="2">
  253. <!-- <geographicalPosi :disabled="formType!=0 && formData.status != 'WAIT'"
  254. :formData="this.formData" @selectPosi="selectAddress" /> -->
  255. </el-col>
  256. </el-row>
  257. </el-form-item>
  258. </el-col>
  259. <el-col :span="24">
  260. <el-form-item label="备注">
  261. <el-input
  262. type="textarea"
  263. :rows="4"
  264. v-model="formData.remark"
  265. :disabled="formType != 0 && formData.status != 'WAIT'"
  266. placeholder="请输入"
  267. ></el-input>
  268. </el-form-item>
  269. </el-col>
  270. <el-col :span="24">
  271. <el-form-item
  272. label="租赁合同"
  273. prop="fileUrl"
  274. :rules="[{ required: true, message: `请上传租赁合同`, trigger: 'change' }]"
  275. >
  276. <ImageUpload
  277. :fileList="formData.fileUrl"
  278. :limit="1"
  279. :isEdit="formType == 0 || formData.status == 'WAIT'"
  280. />
  281. </el-form-item>
  282. </el-col>
  283. <template v-if="formData.status == 'RECOVER'">
  284. <el-col :span="8">
  285. <el-form-item label="回收操作人" prop="recoverBy">
  286. <el-input type="text" disabled v-model="formData.recoverBy" placeholder="请输入"></el-input>
  287. </el-form-item>
  288. </el-col>
  289. <el-col :span="8">
  290. <el-form-item label="回收操作时间" prop="recoverTime">
  291. <el-input type="text" disabled v-model="formData.recoverTime" placeholder="请输入"></el-input>
  292. </el-form-item>
  293. </el-col>
  294. </template>
  295. </el-row>
  296. </el-form>
  297. </div>
  298. </el-card>
  299. <el-card class="box-card" v-if="formType == 0">
  300. <div slot="header" class="clearfix">
  301. <span>商品信息</span>
  302. </div>
  303. <el-button size="small" v-if="formType == 0" type="primary" @click="add()">添加</el-button>
  304. <div class="table">
  305. <el-form ref="formData1" :model="formData1" label-width="0" size="small" label-position="left">
  306. <el-table :data="formData1.dataList" element-loading-text="Loading" border fit highlight-current-rowstripe>
  307. <el-table-column prop="categoryName" align="center" label="*商品分类">
  308. <template slot-scope="scope">
  309. <el-form-item :prop="'dataList.' + scope.$index + '.categoryName'">
  310. <el-input type="text" v-model="scope.row.categoryName" disabled placeholder="请选择分类"></el-input>
  311. </el-form-item>
  312. </template>
  313. </el-table-column>
  314. <el-table-column label="*商品名称" align="center">
  315. <template slot-scope="scope">
  316. <el-form-item
  317. :prop="'dataList.' + scope.$index + '.goods'"
  318. :rules="[{ required: true, message: `请选择商品`, trigger: 'change' }]"
  319. >
  320. <el-select
  321. v-model="scope.row.goods"
  322. @change="changeGoods($event, scope.row)"
  323. value-key="id"
  324. :disabled="isEdit != scope.$index || formType == 2"
  325. placeholder="请选择"
  326. style="width: 100%"
  327. >
  328. <el-option v-for="item in goodsList" :key="item.id" :label="item.name" :value="item"> </el-option>
  329. </el-select>
  330. </el-form-item>
  331. </template>
  332. </el-table-column>
  333. <el-table-column prop="goodsUnit" align="center" label="单位"></el-table-column>
  334. <el-table-column prop="" align="center" label="*数量">
  335. <template slot-scope="scope">
  336. <el-form-item
  337. :prop="'dataList.' + scope.$index + '.qty'"
  338. :rules="[{ required: true, message: `请输入数量`, trigger: 'blur' }]"
  339. >
  340. <el-input
  341. type="number"
  342. v-model="scope.row.qty"
  343. :disabled="isEdit != scope.$index || formType == 2"
  344. placeholder="请输入"
  345. ></el-input>
  346. </el-form-item>
  347. </template>
  348. </el-table-column>
  349. <el-table-column prop="depositPrice" align="center" label="订金"></el-table-column>
  350. <el-table-column prop="leasePrice" align="center" label="租价"></el-table-column>
  351. <el-table-column prop="startDate" align="center" label="*起租日期">
  352. <template slot-scope="scope">
  353. <el-form-item
  354. :prop="'dataList.' + scope.$index + '.startDate'"
  355. :rules="[{ required: true, message: `请选择日期`, trigger: 'blur' }]"
  356. >
  357. <el-date-picker
  358. v-model="scope.row.startDate"
  359. type="date"
  360. @change="
  361. e => {
  362. getPrice(scope.row)
  363. }
  364. "
  365. value-format="yyyy-MM-dd HH:mm:ss"
  366. placeholder="选择日期"
  367. >
  368. </el-date-picker>
  369. </el-form-item>
  370. </template>
  371. </el-table-column>
  372. <el-table-column prop="endDate" align="center" label="*到期日期">
  373. <template slot-scope="scope">
  374. <el-form-item
  375. :prop="'dataList.' + scope.$index + '.endDate'"
  376. :rules="[{ required: true, message: `请选择日期`, trigger: 'blur' }]"
  377. >
  378. <el-date-picker
  379. v-model="scope.row.endDate"
  380. type="date"
  381. @change="
  382. e => {
  383. getPrice(scope.row)
  384. }
  385. "
  386. value-format="yyyy-MM-dd HH:mm:ss"
  387. placeholder="选择日期"
  388. >
  389. </el-date-picker>
  390. </el-form-item>
  391. </template>
  392. </el-table-column>
  393. <el-table-column prop="depositAmount" align="center" label="*押金">
  394. <template slot-scope="scope">
  395. <el-form-item
  396. :prop="'dataList.' + scope.$index + '.depositAmount'"
  397. :rules="[{ required: true, message: `请输入押金`, trigger: 'blur' }]"
  398. >
  399. <el-input type="number" v-model="scope.row.depositAmount" placeholder="请输入"></el-input>
  400. </el-form-item>
  401. </template>
  402. </el-table-column>
  403. <el-table-column prop="renewalPrice" align="center" label="*续期单价">
  404. <template slot-scope="scope">
  405. <el-form-item
  406. :prop="'dataList.' + scope.$index + '.renewalPrice'"
  407. :rules="[{ required: true, message: `请输入押金`, trigger: 'blur' }]"
  408. >
  409. <el-input
  410. type="number"
  411. v-model="scope.row.renewalPrice"
  412. @input="
  413. e => {
  414. getPrice(scope.row)
  415. }
  416. "
  417. placeholder="请输入"
  418. ></el-input>
  419. </el-form-item>
  420. </template>
  421. </el-table-column>
  422. <el-table-column prop="leaseAmount" align="center" label="总租金"></el-table-column>
  423. <el-table-column label="操作" align="right" width="140">
  424. <template slot-scope="scope" v-if="formType != 2">
  425. <el-button size="mini" type="primary" v-if="scope.$index != isEdit" @click="isEdit = scope.$index"
  426. >编辑</el-button
  427. >
  428. <el-button size="mini" type="danger" @click="del(scope.$index)">删除</el-button>
  429. </template>
  430. </el-table-column>
  431. </el-table>
  432. </el-form>
  433. </div>
  434. </el-card>
  435. <el-card class="box-card" v-if="formType != 0">
  436. <div class="table">
  437. <el-form ref="formData3" :model="formData3" label-width="0" size="small" label-position="left">
  438. <el-table :data="formData3.dataList" element-loading-text="Loading" border fit highlight-current-row stripe>
  439. <el-table-column align="center" label="*商品分类" width="300">
  440. <template slot-scope="scope">
  441. <div style="display: flex">
  442. <div class="image">
  443. <img :src="$showImgUrl(scope.row.categoryUrl)" style="height: 80px; width: 80px" />
  444. </div>
  445. <div class="main" style="display: flex; justify-content: center; flex-direction: column">
  446. <span>{{ scope.row.goodsLeaseName }}</span>
  447. <span>x{{ scope.row.qty }}</span>
  448. </div>
  449. </div>
  450. </template>
  451. </el-table-column>
  452. <el-table-column prop="depositPrice" align="center" label="订金"></el-table-column>
  453. <el-table-column prop="leasePrice" align="center" label="租价"></el-table-column>
  454. <el-table-column prop="qty" align="center" label="数量"></el-table-column>
  455. <el-table-column prop="startDate" align="center" label="*起租日期">
  456. <template slot-scope="scope">
  457. <el-form-item
  458. :prop="'dataList.' + scope.$index + '.startDate'"
  459. :rules="[{ required: true, message: `请选择日期`, trigger: 'blur' }]"
  460. >
  461. <el-date-picker
  462. v-model="scope.row.startDate"
  463. type="date"
  464. @change="
  465. e => {
  466. getPrice(scope.row)
  467. }
  468. "
  469. :disabled="formData.status != 'WAIT'"
  470. value-format="yyyy-MM-dd HH:mm:ss"
  471. placeholder="选择日期"
  472. >
  473. </el-date-picker>
  474. </el-form-item>
  475. </template>
  476. </el-table-column>
  477. <el-table-column prop="endDate" align="center" label="*到期日期">
  478. <template slot-scope="scope">
  479. <el-form-item
  480. :prop="'dataList.' + scope.$index + '.endDate'"
  481. :rules="[{ required: true, message: `请选择日期`, trigger: 'blur' }]"
  482. >
  483. <el-date-picker
  484. v-model="scope.row.endDate"
  485. type="date"
  486. @change="
  487. e => {
  488. getPrice(scope.row)
  489. }
  490. "
  491. :disabled="formData.status != 'WAIT'"
  492. value-format="yyyy-MM-dd HH:mm:ss"
  493. placeholder="选择日期"
  494. >
  495. </el-date-picker>
  496. </el-form-item>
  497. </template>
  498. </el-table-column>
  499. <el-table-column prop="realEndDate" align="center" label="实际到期日期">
  500. <template slot-scope="scope">
  501. {{ scope.row.realEndDate ? scope.row.realEndDate.substring(0, 10) : '' }}
  502. </template>
  503. </el-table-column>
  504. <el-table-column prop="depositAmount" align="center" label="*押金">
  505. <template slot-scope="scope">
  506. <el-form-item
  507. :prop="'dataList.' + scope.$index + '.depositAmount'"
  508. :rules="[{ required: true, message: `请输入押金`, trigger: 'blur' }]"
  509. >
  510. <el-input
  511. type="number"
  512. v-model="scope.row.depositAmount"
  513. :disabled="formData.status != 'WAIT'"
  514. placeholder="请输入"
  515. ></el-input>
  516. </el-form-item>
  517. </template>
  518. </el-table-column>
  519. <el-table-column prop="" align="center" label="*续期单价">
  520. <template slot-scope="scope">
  521. <el-form-item
  522. :prop="'dataList.' + scope.$index + '.renewalPrice'"
  523. :rules="[{ required: true, message: `请输入押金`, trigger: 'blur' }]"
  524. >
  525. <el-input
  526. type="number"
  527. v-model="scope.row.renewalPrice"
  528. @input="
  529. e => {
  530. getPrice(scope.row)
  531. }
  532. "
  533. :disabled="formData.status != 'WAIT'"
  534. placeholder="请输入"
  535. ></el-input>
  536. </el-form-item>
  537. </template>
  538. </el-table-column>
  539. <el-table-column prop="leaseAmount" align="center" label="总租金"></el-table-column>
  540. <el-table-column prop="renewalLeaseAmount" align="center" label="续期租金"></el-table-column>
  541. </el-table>
  542. </el-form>
  543. </div>
  544. </el-card>
  545. <el-card class="box-card" v-if="formType != 0">
  546. <div slot="header" class="clearfix">
  547. <span>租赁记录</span>
  548. </div>
  549. <div class="table">
  550. <el-table :data="formData.records" element-loading-text="Loading" border fit highlight-current-row stripe>
  551. <el-table-column prop="status" label="租赁类型" align="center">
  552. <template slot-scope="scope">
  553. {{ scope.row.orderType == 'FIRST' ? '初次租赁' : '续租' }}
  554. </template>
  555. </el-table-column>
  556. <el-table-column prop="payValue" label="订金" align="center"></el-table-column>
  557. <el-table-column prop="" align="center" label="租赁开始时间">
  558. <template slot-scope="scope">
  559. {{ scope.row.startDate ? scope.row.startDate.substring(0, 10) : '' }}
  560. </template>
  561. </el-table-column>
  562. <el-table-column prop="" align="center" label="租赁结束时间">
  563. <template slot-scope="scope">
  564. {{ scope.row.endDate ? scope.row.endDate.substring(0, 10) : '' }}
  565. </template>
  566. </el-table-column>
  567. <el-table-column prop="createBy" align="center" label="操作人"></el-table-column>
  568. <el-table-column prop="createTime" align="center" label="操作时间"></el-table-column>
  569. </el-table>
  570. </div>
  571. </el-card>
  572. <el-card class="box-card" v-if="formType != 0">
  573. <div slot="header" class="clearfix">
  574. <span>报修记录</span>
  575. </div>
  576. <div class="table">
  577. <el-table :data="formData.orderBases" element-loading-text="Loading" border fit highlight-current-row stripe>
  578. <el-table-column prop="id" label="报修单号" align="center"></el-table-column>
  579. <el-table-column prop="createDate" label="提交时间" align="center"></el-table-column>
  580. <el-table-column prop="appointmentTime" label="上门时间" align="center"></el-table-column>
  581. <el-table-column prop="overDate" label="完工时间" align="center"></el-table-column>
  582. <el-table-column prop="updateBy" align="center" label="操作人"></el-table-column>
  583. <el-table-column prop="updateTime" align="center" label="操作时间"></el-table-column>
  584. </el-table>
  585. </div>
  586. </el-card>
  587. <div class="page-footer">
  588. <div class="footer">
  589. <el-button v-if="formType == 0" size="small" type="primary" @click="submit()">提交</el-button>
  590. <el-button size="small" type="info" @click="goBack">返回</el-button>
  591. </div>
  592. </div>
  593. <el-dialog title="报修" :visible.sync="isRepair" width="30%" :close-on-click-modal="false">
  594. <el-form ref="repairForm" :model="repairForm" label-position="left">
  595. <el-form-item
  596. label="上门时间"
  597. prop="date"
  598. :rules="[{ required: true, message: `请选择上门时间`, trigger: 'blur' }]"
  599. >
  600. <el-date-picker v-model="repairForm.date" type="date" value-format="yyyy-MM-dd" placeholder="选择日期">
  601. </el-date-picker>
  602. </el-form-item>
  603. </el-form>
  604. <div slot="footer" class="dialog-footer">
  605. <el-button @click="isRepair = false">取 消</el-button>
  606. <el-button type="primary" @click="confirmRepair()">确 定</el-button>
  607. </div>
  608. </el-dialog>
  609. <el-dialog title="续租" :visible.sync="isRelet" width="30%" :close-on-click-modal="false">
  610. <el-form ref="reletForm" :model="reletForm" label-position="left">
  611. <el-form-item
  612. label="实际到期日期"
  613. prop="date"
  614. :rules="[{ required: true, message: `请选择日期`, trigger: 'blur' }]"
  615. >
  616. <el-date-picker v-model="reletForm.date" type="date" value-format="yyyy-MM-dd" placeholder="选择日期">
  617. </el-date-picker>
  618. </el-form-item>
  619. </el-form>
  620. <div slot="footer" class="dialog-footer">
  621. <el-button @click="isRelet = false">取 消</el-button>
  622. <el-button type="primary" @click="confirmRelet">确 定</el-button>
  623. </div>
  624. </el-dialog>
  625. <el-dialog title="确定回收" :visible.sync="isRecover" width="30%" :close-on-click-modal="false">
  626. <el-form ref="recoverForm" :model="recoverForm" label-position="left">
  627. <el-form-item
  628. label="实际到期日期"
  629. prop="date"
  630. :rules="[{ required: true, message: `请选择日期`, trigger: 'blur' }]"
  631. >
  632. <el-date-picker v-model="recoverForm.date" type="date" value-format="yyyy-MM-dd" placeholder="选择日期">
  633. </el-date-picker>
  634. </el-form-item>
  635. </el-form>
  636. <div slot="footer" class="dialog-footer">
  637. <el-button @click="isRecover = false">取 消</el-button>
  638. <el-button type="primary" @click="confirmRecover">确 定</el-button>
  639. </div>
  640. </el-dialog>
  641. </div>
  642. </template>
  643. <script>
  644. import { lbsAmapRegion } from '@/api/common.js'
  645. import geographicalPosi from '@/components/geographicalPosi/index.vue'
  646. import ImageUpload from '@/components/file-upload'
  647. import selectOptionWebsit from '@/utils/selectOptionWebsit.js'
  648. import {
  649. getGoods,
  650. getDetail,
  651. add,
  652. confirmOrder,
  653. confirmRecover,
  654. confirmRelet,
  655. confirmRepair,
  656. getTypeList,
  657. getUserList,
  658. getPrice
  659. } from '@/api/tenancyOrder'
  660. export default {
  661. components: {
  662. geographicalPosi,
  663. ImageUpload
  664. },
  665. props: ['id', 'title', 'formType'],
  666. data() {
  667. return {
  668. formData1: {
  669. dataList: []
  670. },
  671. formData3: {
  672. dataList: []
  673. },
  674. repairForm: {
  675. date: ''
  676. },
  677. reletForm: {
  678. date: ''
  679. },
  680. recoverForm: {
  681. date: ''
  682. },
  683. goodsList: [],
  684. userList: [],
  685. is_submit: true,
  686. isRelet: false,
  687. isRepair: false,
  688. isRecover: false,
  689. formData: {
  690. userInfo: null,
  691. userName: '',
  692. userId: '',
  693. userMobile: '',
  694. remark: '',
  695. provinceObj: null,
  696. province: '',
  697. provinceId: '',
  698. cityObj: null,
  699. city: '',
  700. cityId: '',
  701. areaObj: null,
  702. area: '',
  703. areaId: '',
  704. streetObj: null,
  705. street: '',
  706. streetId: '',
  707. address: '',
  708. lat: '',
  709. lng: '',
  710. records: [],
  711. fileUrl: []
  712. },
  713. provinceList: [],
  714. cityList: [],
  715. areaList: [],
  716. streetList: [],
  717. isEdit: 0,
  718. timer: '',
  719. companyName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
  720. rules: {
  721. address: [
  722. {
  723. required: true,
  724. message: '请选择客户地址',
  725. trigger: 'change'
  726. }
  727. ],
  728. userMobile: [
  729. {
  730. required: true,
  731. message: '请输入客户电话',
  732. trigger: 'blur'
  733. },
  734. {
  735. required: true,
  736. message: '请输入客户电话',
  737. trigger: 'change'
  738. },
  739. {
  740. pattern: /^((0\d{2,3}-\d{7,8})|(1[3456789]\d{9}))$/,
  741. message: '电话号码格式不正确',
  742. trigger: 'blur'
  743. },
  744. ,
  745. {
  746. pattern: /^((0\d{2,3}-\d{7,8})|(1[3456789]\d{9}))$/,
  747. message: '电话号码格式不正确',
  748. trigger: 'change'
  749. }
  750. ],
  751. userName: [
  752. {
  753. required: true,
  754. message: '请输入客户姓名',
  755. trigger: 'blur'
  756. },
  757. {
  758. required: true,
  759. message: '请输入客户姓名',
  760. trigger: 'change'
  761. }
  762. ]
  763. },
  764. rules1: {
  765. price: [
  766. {
  767. pattern: /^[1-9]\d*(\.\d+)?$|^0\.[1-9]\d*$/,
  768. message: '请输入大于0的数字',
  769. trigger: 'blur'
  770. }
  771. ]
  772. },
  773. typeId: ''
  774. }
  775. },
  776. computed: {
  777. filterStatus() {
  778. return function (type) {
  779. let status = {
  780. WAIT: '等待商家确认',
  781. WAIT_START: '待开始',
  782. LEASE: '租赁中',
  783. OVER: '已过期-待回收',
  784. RECOVER: '已过期-已回收'
  785. }
  786. return status[type]
  787. }
  788. }
  789. },
  790. created() {
  791. if (this.id) {
  792. this.getDetail()
  793. }
  794. this.lbsAmapRegion('provinceList', 0)
  795. this.getGoods()
  796. this.getTypeList()
  797. },
  798. methods: {
  799. // 返回
  800. goBack() {
  801. this.$emit('back')
  802. },
  803. getDetail() {
  804. getDetail({
  805. id: this.id
  806. }).then(res => {
  807. this.formData = {
  808. ...res.data,
  809. address: res.data.userAddress,
  810. fileUrl: res.data.fileUrl ? [{ url: res.data.fileUrl }] : [],
  811. provinceObj: { id: res.data.provinceId },
  812. cityObj: { id: res.data.cityId },
  813. areaObj: { id: res.data.areaId },
  814. streetObj: { id: res.data.streetId },
  815. userInfo:
  816. res.data.userId && res.data.payType == 'LINE'
  817. ? { userId: res.data.userId, userMobile: res.data.userMobile, userName: res.data.userName }
  818. : res.data.userMobile
  819. }
  820. this.formData3.dataList = res.data.items
  821. this.getinitlbslist()
  822. this.getUserList()
  823. })
  824. },
  825. getGoods() {
  826. getGoods({
  827. pageNum: 1,
  828. pageSize: -1,
  829. status: true
  830. }).then(res => {
  831. this.goodsList = res.data.records
  832. })
  833. },
  834. getPrice(item) {
  835. if (!item.startDate || !item.endDate) {
  836. return false
  837. }
  838. getPrice({
  839. startDate: item.startDate,
  840. endDate: item.endDate,
  841. isRenewal: this.formData.status == 'WAIT' || !this.formData.status ? false : true,
  842. price: this.formData.status == 'WAIT' || !this.formData.status ? item.leasePrice : item.renewalPrice,
  843. qty: item.qty
  844. }).then(res => {
  845. if (this.formData.status == 'WAIT' || !this.formData.status) {
  846. item.leaseAmount = res.data
  847. } else {
  848. item.renewalLeaseAmount = (res.data * 100 + this.formData.totalAmount * 100) / 100
  849. }
  850. })
  851. },
  852. getUserList(value) {
  853. getUserList({
  854. pageNum: 1,
  855. pageSize: -1,
  856. params: [{ param: 'a.mobile', compare: 'like', value }]
  857. }).then(res => {
  858. this.userList = res.data.records
  859. })
  860. },
  861. userBlur(e) {
  862. this.formData.userMobile = e.target.value
  863. this.formData.userInfo = e.target.value
  864. this.$forceUpdate()
  865. },
  866. changeUser(e) {
  867. this.formData.userMobile = e.mobile
  868. this.formData.userName = e.nickName
  869. this.formData.userId = e.userId
  870. },
  871. changeGoods(e, item) {
  872. item.categoryId = e.categoryId
  873. item.categoryName = e.categoryName
  874. item.categoryUrl = e.categoryUrl
  875. item.goodsLeaseName = e.name
  876. item.goodsLeaseId = e.id
  877. item.goodsUnit = e.unit
  878. item.depositPrice = e.depositPrice
  879. item.leasePrice = e.leasePrice
  880. },
  881. userMobileInput(e) {
  882. if (e && e.length > 3) {
  883. this.getUserList(e)
  884. }
  885. },
  886. add() {
  887. this.$refs.formData1.validate((valid, invalidFields, errLabels) => {
  888. if (valid) {
  889. console.log(111)
  890. if (this.formData1.dataList.length != 0) {
  891. this.isEdit = 0
  892. }
  893. this.formData1.dataList.unshift({
  894. goods: null,
  895. categoryId: '',
  896. categoryName: '',
  897. categoryUrl: '',
  898. qty: '',
  899. goodsLeaseName: '',
  900. goodsLeaseId: '',
  901. goodsUnit: '',
  902. depositPrice: null,
  903. leasePrice: null,
  904. startDate: '',
  905. endDate: '',
  906. realEndDate: '',
  907. depositAmount: null,
  908. renewalPrice: null,
  909. leaseAmount: null
  910. })
  911. }
  912. })
  913. },
  914. del(index) {
  915. if (index <= 1) {
  916. this.isEdit == 0
  917. } else {
  918. this.isEdit -= 1
  919. }
  920. this.formData1.dataList.splice(index, 1)
  921. },
  922. submit() {
  923. const that = this
  924. this.$refs.formData.validate((valid, invalidFields, errLabels) => {
  925. if (valid) {
  926. if (this.formData1.dataList.length == 0) {
  927. return this.$message.warning('请添加商品信息!')
  928. } else {
  929. this.$refs.formData1.validate((valid, invalidFields, errLabels) => {
  930. if (valid) {
  931. add({
  932. userId: this.formData.userId,
  933. userName: this.formData.userName,
  934. userMobile: this.formData.userMobile,
  935. fileUrl: this.formData.fileUrl.length > 0 ? this.formData.fileUrl[0].url : '',
  936. items: this.formData1.dataList,
  937. remark: this.formData.remark,
  938. province: this.formData.province,
  939. provinceId: this.formData.provinceId,
  940. city: this.formData.city,
  941. cityId: this.formData.cityId,
  942. area: this.formData.area,
  943. areaId: this.formData.areaId,
  944. street: this.formData.street,
  945. streetId: this.formData.streetId,
  946. userAddress: this.formData.address,
  947. lat: this.formData.lat,
  948. lng: this.formData.lng
  949. }).then(res => {
  950. if (res.code == 200) {
  951. this.$message.success('提交成功!')
  952. this.goBack()
  953. }
  954. })
  955. }
  956. })
  957. }
  958. }
  959. })
  960. },
  961. //确定租赁
  962. submitOrder() {
  963. this.$refs.formData.validate((valid, invalidFields, errLabels) => {
  964. if (valid) {
  965. this.$refs.formData3.validate((valid, invalidFields, errLabels) => {
  966. if (valid) {
  967. confirmOrder({
  968. userName: this.formData.userName,
  969. userMobile: this.formData.userMobile,
  970. fileUrl: this.formData.fileUrl.length > 0 ? this.formData.fileUrl[0].url : '',
  971. items: this.formData3.dataList,
  972. remark: this.formData.remark,
  973. province: this.formData.province,
  974. provinceId: this.formData.provinceId,
  975. city: this.formData.city,
  976. cityId: this.formData.cityId,
  977. area: this.formData.area,
  978. areaId: this.formData.areaId,
  979. street: this.formData.street,
  980. streetId: this.formData.streetId,
  981. userAddress: this.formData.address,
  982. lat: this.formData.lat,
  983. lng: this.formData.lng,
  984. id: this.formData.id
  985. }).then(res => {
  986. if (res.code == 200) {
  987. this.$message.success('提交成功!')
  988. this.getDetail()
  989. }
  990. })
  991. }
  992. })
  993. }
  994. })
  995. },
  996. //取消订单
  997. cancelOrder() {
  998. cancelOrder({
  999. id: this.id
  1000. }).then(res => {
  1001. if (res.code == 200) {
  1002. this.$message.success('取消订单成功!')
  1003. this.getDetail()
  1004. }
  1005. })
  1006. },
  1007. getTypeList() {
  1008. getTypeList({
  1009. pageNum: 1,
  1010. pageSize: -1
  1011. }).then(res => {
  1012. if (res.code == 200) {
  1013. res.data.records.forEach(item => {
  1014. if (item.orderType == 'REPAIR') {
  1015. this.typeId = item.id
  1016. }
  1017. })
  1018. }
  1019. })
  1020. },
  1021. //报修
  1022. confirmRepair() {
  1023. let productList = [
  1024. {
  1025. mainId: this.formData.items[0].categoryId,
  1026. mainName: this.formData.items[0].categoryName,
  1027. num: this.formData.items[0].qty,
  1028. imgUrl: this.formData.items[0].categoryUrl
  1029. }
  1030. ]
  1031. this.$refs.repairForm.validate((valid, invalidFields, errLabels) => {
  1032. if (valid) {
  1033. selectOptionWebsit().then(websit => {
  1034. confirmRepair({
  1035. createWebsitId: websit?.websitId,
  1036. createWebsitName: websit?.name,
  1037. companyWechatId: this.formData.companyWechatId,
  1038. appointmentTime: this.repairForm.date + ' 00:00:00',
  1039. saleOrderId: this.id,
  1040. orderSmallType: this.typeId,
  1041. province: this.formData.province,
  1042. provinceId: this.formData.provinceId,
  1043. city: this.formData.city,
  1044. cityId: this.formData.cityId,
  1045. area: this.formData.area,
  1046. areaId: this.formData.areaId,
  1047. street: this.formData.street,
  1048. streetId: this.formData.streetId,
  1049. address: this.formData.address,
  1050. orderProducts: productList,
  1051. isZl: true
  1052. }).then(res => {
  1053. if (res.code == 200) {
  1054. this.isRepair = false
  1055. this.$message.success('报修成功!')
  1056. this.getDetail()
  1057. }
  1058. })
  1059. })
  1060. }
  1061. })
  1062. },
  1063. //确认续租
  1064. confirmRelet() {
  1065. this.$refs.reletForm.validate((valid, invalidFields, errLabels) => {
  1066. if (valid) {
  1067. confirmRelet({
  1068. RealEndDate: this.reletForm.date + ' 00:00:00',
  1069. id: this.id
  1070. }).then(res => {
  1071. if (res.code == 200) {
  1072. this.isRelet = false
  1073. this.$message.success('确认续租成功!')
  1074. this.getDetail()
  1075. }
  1076. })
  1077. }
  1078. })
  1079. },
  1080. //确认回收
  1081. confirmRecover() {
  1082. this.$refs.recoverForm.validate((valid, invalidFields, errLabels) => {
  1083. if (valid) {
  1084. confirmRecover({
  1085. RealEndDate: this.recoverForm.date + ' 00:00:00',
  1086. id: this.id
  1087. }).then(res => {
  1088. if (res.code == 200) {
  1089. this.isRecover = false
  1090. this.$message.success('确认回收成功!')
  1091. this.getDetail()
  1092. }
  1093. })
  1094. }
  1095. })
  1096. },
  1097. lbsAmapRegion(name, pid) {
  1098. lbsAmapRegion({ pid }).then(res => {
  1099. this[name] = res.data
  1100. })
  1101. },
  1102. getinitlbslist() {
  1103. // 初始化请求省市区街道下拉选项数据
  1104. lbsAmapRegion({
  1105. pid: 0
  1106. }).then(res => {
  1107. this.provinceList = res.data
  1108. // 创建工单时获取ip地址定位赋值
  1109. if (!this.id && this.$IpAdd.province) {
  1110. var item = this.provinceList.find(item => item.name === this.$IpAdd.province)
  1111. if (item) {
  1112. this.formData.provinceId = item.id
  1113. this.formData.province = item.name
  1114. }
  1115. }
  1116. if (this.formData.provinceId) {
  1117. lbsAmapRegion({
  1118. pid: this.formData.provinceId
  1119. }).then(res => {
  1120. this.cityList = res.data
  1121. // 创建工单时获取ip地址定位赋值
  1122. if (!this.id && this.$IpAdd.city) {
  1123. var item2 = this.cityList.find(item => item.name === this.$IpAdd.city)
  1124. if (item2) {
  1125. this.formData.cityId = item2.id
  1126. this.formData.city = item2.name
  1127. }
  1128. }
  1129. if (this.formData.cityId) {
  1130. lbsAmapRegion({
  1131. pid: this.formData.cityId
  1132. }).then(res => {
  1133. this.areaList = res.data
  1134. })
  1135. }
  1136. if (this.formData.areaId) {
  1137. lbsAmapRegion({
  1138. pid: this.formData.areaId
  1139. }).then(res => {
  1140. this.streetList = res.data
  1141. })
  1142. }
  1143. })
  1144. }
  1145. })
  1146. },
  1147. selectAddress(data) {
  1148. this.formData.lng = data.center[0]
  1149. this.formData.lat = data.center[1]
  1150. // 获取定位的省市区街道
  1151. var { province, city, district, township } = data.data.addressComponent
  1152. // 获取选中省名称id
  1153. var { id, name } = this.provinceList.find(item => item.name === province)
  1154. this.formData.provinceId = id
  1155. this.formData.province = name
  1156. // 请求市选项
  1157. lbsAmapRegion({
  1158. pid: this.formData.provinceId
  1159. }).then(res => {
  1160. // 赋值市选项
  1161. this.cityList = res.data
  1162. // 获取选中市名称id
  1163. var { id, name } = res.data.find(item => item.name === city)
  1164. this.formData.cityId = id
  1165. this.formData.city = name
  1166. // 请求区选项
  1167. lbsAmapRegion({
  1168. pid: this.formData.cityId
  1169. }).then(res => {
  1170. // 赋值区选项
  1171. this.areaList = res.data
  1172. // 获取选中区名称id
  1173. var { id, name } = res.data.find(item => item.name === district)
  1174. this.formData.areaId = id
  1175. this.formData.area = name
  1176. // 请求街道选项
  1177. lbsAmapRegion({
  1178. pid: this.formData.areaId
  1179. }).then(res => {
  1180. // 赋值街道选项
  1181. this.streetList = res.data
  1182. // 获取选中街道名称id
  1183. var { id, name } = res.data.find(item => item.name === township)
  1184. this.formData.streetId = id
  1185. this.formData.street = name
  1186. // 赋值GPS详细地址
  1187. this.formData.address = data.name
  1188. })
  1189. })
  1190. })
  1191. }
  1192. }
  1193. }
  1194. </script>
  1195. <style scoped="scoped" lang="scss">
  1196. .s-page {
  1197. padding: 20px;
  1198. background-color: #ffffff;
  1199. }
  1200. .page-footer {
  1201. height: 70px;
  1202. }
  1203. .order-main {
  1204. .order-main-title {
  1205. font-size: 14px;
  1206. }
  1207. .order-main-title span {
  1208. margin-right: 15px;
  1209. }
  1210. .order-main-status {
  1211. padding: 15px 0;
  1212. font-size: 24px;
  1213. color: #409eff;
  1214. }
  1215. .order-main-opt-btn {
  1216. padding: 15px 0;
  1217. }
  1218. }
  1219. .order-receive-info {
  1220. margin: 15px 0;
  1221. padding: 15px;
  1222. background: #f5f7fa;
  1223. :first-child div span {
  1224. padding-right: 15px;
  1225. }
  1226. .el-row {
  1227. padding-top: 15px;
  1228. }
  1229. }
  1230. .footer {
  1231. position: fixed;
  1232. bottom: 0;
  1233. left: 0;
  1234. z-index: 1;
  1235. width: 100%;
  1236. background: #fff;
  1237. padding: 15px 40px;
  1238. box-sizing: border-box;
  1239. transition: all 0.28s;
  1240. text-align: right;
  1241. box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%), 0 2px 5px 0 rgb(0 0 0 / 10%);
  1242. &.hideSidebar {
  1243. margin-left: 54px;
  1244. width: calc(100vw - 54px);
  1245. }
  1246. &.openSidebar {
  1247. margin-left: 210px;
  1248. width: calc(100vw - 210px);
  1249. }
  1250. .tips {
  1251. font-size: 12px;
  1252. color: red;
  1253. margin-top: 10px;
  1254. }
  1255. }
  1256. </style>