index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <template>
  2. <div>
  3. <div v-if="!isShowDetail" class="app-container">
  4. <div class="screen-container">
  5. <el-form ref="screenForm" :model="screenForm" label-width="70px" size="small" label-position="left">
  6. <el-row :gutter="20">
  7. <el-col :xs="24" :sm="12" :lg="6">
  8. <el-form-item label="订单号" prop="orderId">
  9. <el-input v-model="screenForm.orderId" placeholder="请输入订单号"></el-input>
  10. </el-form-item>
  11. </el-col>
  12. <el-col :xs="24" :sm="12" :lg="6">
  13. <el-form-item label="商品名称" prop="goodsName">
  14. <el-input v-model="screenForm.goodsName" placeholder="请输入商品名称"></el-input>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :xs="24" :sm="12" :lg="6">
  18. <el-form-item label="会员昵称" prop="memberName">
  19. <el-input v-model="screenForm.memberName" placeholder="请输入会员昵称"></el-input>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :xs="24" :sm="12" :lg="6">
  23. <el-form-item label="手机号" prop="phone">
  24. <el-input v-model="screenForm.phone" placeholder="请输入手机号"></el-input>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :xs="24" :sm="12" :lg="6">
  28. <el-form-item label="创建时间" prop="createDate" style="height: 33px;">
  29. <el-date-picker v-model="screenForm.createDate" type="datetimerange"
  30. value-format="yyyy-MM-dd HH:mm:ss" range-separator="至" start-placeholder="开始日期"
  31. end-placeholder="结束日期">
  32. </el-date-picker>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :xs="24" :sm="12" :lg="6">
  36. <el-form-item label="支付时间" prop="payDate" style="height: 33px;">
  37. <el-date-picker v-model="screenForm.payDate" type="datetimerange"
  38. value-format="yyyy-MM-dd HH:mm:ss" range-separator="至" start-placeholder="开始日期"
  39. end-placeholder="结束日期">
  40. </el-date-picker>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :xs="24" :sm="12" :lg="6" class="tr">
  44. <el-form-item label="">
  45. <el-button size="small" type="primary" @click="submitScreenForm">搜索</el-button>
  46. <el-button size="small" @click="resetScreenForm">清空</el-button>
  47. </el-form-item>
  48. </el-col>
  49. </el-row>
  50. </el-form>
  51. </div>
  52. <div class="tabs-container order-tabs-container clearfix">
  53. <el-tabs v-model="screenForm.status" type="card" @tab-click="changeTabs" class="fl"
  54. style="margin-right: 20px">
  55. <el-tab-pane label="全部" name=""></el-tab-pane>
  56. <el-tab-pane label="待确认" name="WAIT"></el-tab-pane>
  57. <el-tab-pane label="待开始" name="WAIT_START"></el-tab-pane>
  58. <el-tab-pane label="租凭中" name="LEASE"></el-tab-pane>
  59. <el-tab-pane label="已到期-待回收" name="OVER"></el-tab-pane>
  60. <el-tab-pane label="已到期-已回收" name="RECOVER"></el-tab-pane>
  61. <el-tab-pane label="已取消" name="CANCEL"></el-tab-pane>
  62. </el-tabs>
  63. <el-button @click="isShowDetail = true;formType = 0">新增租赁单</el-button>
  64. </div>
  65. <div class="order-main-container">
  66. <div class="table-top">
  67. <el-row style="width:100%">
  68. <el-col :span="3">
  69. <span class="item product">商品</span>
  70. </el-col>
  71. <el-col :span="3" style="text-align: right"><span class="item">总租金(元)</span></el-col>
  72. <el-col :span="3" style="text-align: center"><span class="item">订金(元)</span></el-col>
  73. <el-col :span="7" style="text-align: center"><span class="item">收货信息</span></el-col>
  74. <el-col :span="2" style="text-align: center"><span class="item">租金(元)/月</span></el-col>
  75. <el-col :span="2" style="text-align: center"><span class="item">订单状态</span></el-col>
  76. <el-col :span="4" style="text-align: center"><span class="item">操作</span></el-col>
  77. </el-row>
  78. </div>
  79. <div class="order-item" v-for="order in dataList" :key="order.orderId">
  80. <div class="order-top">
  81. <span><b>订单号</b>:{{ order.id }}</span>
  82. <span><b>下单时间</b>:{{ order.createTime }}</span>
  83. <span><b>起租时间</b>:{{ order.startDate }}</span>
  84. <span><b>结束时间</b>:{{ order.endDate }}</span>
  85. <div class="fr">
  86. <el-link type="primary" v-if="$restrict('orderNote')" :underline="false"
  87. @click="showRemark(order)">订单备注</el-link>
  88. <el-link type="primary" v-if="$restrict('detail')" :underline="false"
  89. @click="confirmOrder(order.id)">查看详情</el-link>
  90. <!-- <el-link type="primary" :underline="false" @click="queryWorkOrder(order.orderId)">订单工单</el-link> -->
  91. </div>
  92. </div>
  93. <div class="order-content">
  94. <el-row style="width:100%;">
  95. <el-col :span="6" style="height: 100%;">
  96. <div class="col-item-pro">
  97. <div class="pro-item">
  98. <div class="left">
  99. <div class="image">
  100. <img :src="order.categoryUrl" style="height:80px;width: 80px;">
  101. </div>
  102. <div class="main" style="justify-content: center;">
  103. <span>{{ order.goodsLeaseName }}</span>
  104. <span>x{{ order.qty }}</span>
  105. </div>
  106. </div>
  107. <div class="right"
  108. style="display: flex;flex-direction: column;justify-content: center;">
  109. <span>{{order.totalAmount}}</span>
  110. <span>总租金</span>
  111. </div>
  112. </div>
  113. </div>
  114. </el-col>
  115. <el-col :span="3" style="height: 100%;">
  116. <div class="col-item">
  117. <div>{{ order.bookAmount }}</div>
  118. <span>订金</span>
  119. </div>
  120. </el-col>
  121. <el-col :span="7" style="height: 100%;">
  122. <div class="col-item">
  123. <div>{{ order.userName }}/{{ order.userMobile }}</div>
  124. <div class="ellipsis-2">
  125. {{ order.province + order.city + order.area + order.street + order.userAddress}}
  126. </div>
  127. </div>
  128. </el-col>
  129. <el-col :span="2" style="height: 100%;">
  130. <div class="col-item">
  131. <div class="totalprice">¥{{ order.leasePrice }}</div>
  132. </div>
  133. </el-col>
  134. <el-col :span="2" style="height: 100%;">
  135. <div class="col-item">
  136. <div :style="{'color': filterStatus(order,'color')}">
  137. {{ filterStatus(order,'name') }}</div>
  138. </div>
  139. </el-col>
  140. <el-col :span="4" style="height: 100%;">
  141. <div class="col-item">
  142. <div class="operate">
  143. <el-button v-if="order.status === 'WAIT'" @click="confirmOrder(order.id)" type="text" size="small">确定租赁</el-button>
  144. <el-button v-if="order.status === 'LEASE' || order.status === 'OVER'" @click="confirmOrder(order.id)" type="text" size="small">确认回收</el-button>
  145. <el-popconfirm title="确定取消订单吗?" @confirm="cancelOrder(order.id)"
  146. v-if="order.status === 'WAIT'">
  147. <el-button slot="reference" type="text" size="small">取消订单</el-button>
  148. </el-popconfirm>
  149. <el-button v-if="order.status === 'LEASE'" @click="confirmOrder(order.id)" type="text" size="small">报修</el-button>
  150. </div>
  151. </div>
  152. </el-col>
  153. </el-row>
  154. </div>
  155. </div>
  156. <div class="no-data" v-if="dataList.length <= 0">暂无订单</div>
  157. </div>
  158. <div class="pagination clearfix">
  159. <div class="fr">
  160. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  161. :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="10"
  162. layout="total, sizes, prev, pager, next, jumper" :total="listTotal">
  163. </el-pagination>
  164. </div>
  165. </div>
  166. </div>
  167. <detail v-else :id="id" @back="backList" :formType="formType" :title="'租赁订单' + formDialogTitles[formType]">
  168. </detail>
  169. </div>
  170. </template>
  171. <script>
  172. import {
  173. getList, cancelOrder
  174. } from "@/api/tenancyOrder";
  175. import detail from './detail.vue'
  176. export default {
  177. components: {
  178. detail
  179. },
  180. data() {
  181. return {
  182. screenForm: { // 筛选表单数据
  183. orderId: '', // 订单号
  184. goodsName: '', // 商品名称
  185. memberName: '', // 会员昵称
  186. phone: '', // 手机号
  187. status: '', // 状态
  188. createDate: '', // 创建时间
  189. payDate: '', // 支付时间
  190. evaluateStatus: '', // 评价状态
  191. sendStatus: '', // 派单异常
  192. workerOrderNo: '', // 信息编号
  193. },
  194. isShowDetail: false,
  195. id: '',
  196. currentPage: 1, // 当前页码
  197. pageSize: 10, // 每页数量
  198. listTotal: 0, // 列表总数
  199. dataList: [],
  200. formDialogTitles: ['新增', '详情'],
  201. formType: 0,
  202. formVisible: false,
  203. typeIndex: '1',
  204. }
  205. },
  206. computed: {
  207. filterStatus() {
  208. return function(item, type) {
  209. if (item.status == 'WAIT') {
  210. return {
  211. name: '待确定订单',
  212. color: '#ff5300'
  213. } [type]
  214. } else if (item.status == 'WAIT_START') {
  215. return {
  216. name: '待开始',
  217. color: '#64c842'
  218. } [type]
  219. } else if (item.status == 'LEASE') {
  220. return {
  221. name: '租赁中',
  222. color: '#1281ff'
  223. } [type]
  224. } else if (item.status == 'OVER') {
  225. return {
  226. name: '待回收',
  227. color: '#9c84fe'
  228. } [type]
  229. } else if (item.status == 'RECOVER') {
  230. return {
  231. name: '已回收',
  232. color: '#817f7f'
  233. } [type]
  234. }
  235. }
  236. }
  237. },
  238. created() {
  239. this.getList();
  240. },
  241. methods: {
  242. backList() {
  243. this.id = ''
  244. this.isShowDetail = false;
  245. this.$refs?.pageRef?.refreshList()
  246. },
  247. changeTabs(tab, event) {
  248. this.getList();
  249. },
  250. // 获取数据列表
  251. getList() {
  252. // this.listLoading = true;
  253. let params = {
  254. orderId: this.screenForm.orderId, // 订单号
  255. productName: this.screenForm.goodsName, // 商品名称
  256. userName: this.screenForm.memberName, // 会员昵称
  257. phone: this.screenForm.phone, // 手机号
  258. orderStatus: this.screenForm.orderStatus, // 状态
  259. startCreateTime: this.screenForm.createDate[0] ? this.screenForm.createDate[0] : null, // 创建时间
  260. endCreateTime: this.screenForm.createDate[1] ? this.screenForm.createDate[1] : null, // 创建时间
  261. startPayTime: this.screenForm.payDate[0] ? this.screenForm.payDate[0] : null, // 支付时间
  262. endPayTime: this.screenForm.payDate[1] ? this.screenForm.payDate[1] : null, // 支付时间
  263. isNegative: this.screenForm.evaluateStatus, // 评价状态
  264. abnormalDispatch: this.screenForm.sendStatus, // 派单异常
  265. workerOrderNo: this.screenForm.workerOrderNo, // 信息编号
  266. pageNum: this.currentPage,
  267. pageSize: this.pageSize
  268. };
  269. getList(params).then(res => {
  270. res.data.records.forEach(item => {
  271. item.selected = false;
  272. // item.websitName = this.handleText(item.websitName);
  273. });
  274. this.dataList = res.data.records;
  275. this.listTotal = res.data.total;
  276. // this.listLoading = false;
  277. })
  278. },
  279. confirmOrder(id){
  280. this.id = id
  281. this.formType = 1
  282. this.isShowDetail = true
  283. },
  284. cancelOrder(id){
  285. cancelOrder({
  286. id
  287. }).then(res => {
  288. if(res.code == 200){
  289. this.$message.success('取消订单成功!')
  290. this.getList();
  291. }
  292. })
  293. },
  294. // 提交筛选表单
  295. submitScreenForm() {
  296. this.currentPage = 1;
  297. this.getList();
  298. },
  299. // 重置筛选表单
  300. resetScreenForm() {
  301. this.$refs.screenForm.resetFields();
  302. this.currentPage = 1;
  303. this.getList();
  304. },
  305. // 更改每页数量
  306. handleSizeChange(val) {
  307. this.pageSize = val;
  308. this.currentPage = 1;
  309. this.getList();
  310. },
  311. // 更改当前页
  312. handleCurrentChange(val) {
  313. this.currentPage = val;
  314. this.getList();
  315. },
  316. // 获取省市区街道
  317. getRegion(level = 0, id = 0) {
  318. getRegion({
  319. pid: id
  320. }).then(res => {
  321. if (level === 0) {
  322. this.provinceList = res.data;
  323. } else if (level === 1) {
  324. this.cityList = res.data;
  325. } else if (level === 2) {
  326. this.areaList = res.data;
  327. } else if (level === 3) {
  328. this.streetList = res.data;
  329. }
  330. })
  331. },
  332. // 初始化省市区街道
  333. initRegion(level, item, id = 0) {
  334. let {
  335. province,
  336. city,
  337. area,
  338. street
  339. } = item;
  340. let nextId = null;
  341. getRegion({
  342. pid: id
  343. }).then(res => {
  344. if (level === 0) {
  345. this.provinceList = res.data;
  346. nextId = this.addressForm.province = this.provinceList[this.$findElem(this.provinceList,
  347. 'name', province)].id;
  348. } else if (level === 1) {
  349. this.cityList = res.data;
  350. nextId = this.addressForm.city = this.cityList[this.$findElem(this.cityList, 'name', city)]
  351. .id;
  352. } else if (level === 2) {
  353. this.areaList = res.data;
  354. nextId = this.addressForm.area = this.areaList[this.$findElem(this.areaList, 'name', area)]
  355. .id;
  356. } else if (level === 3) {
  357. this.streetList = res.data;
  358. nextId = this.addressForm.street = this.streetList[this.$findElem(this.streetList, 'name',
  359. street)].id;
  360. }
  361. if (level < 3) {
  362. level = level + 1;
  363. this.initRegion(level, item, nextId);
  364. }
  365. })
  366. },
  367. // 保存 修改收货地址 表单
  368. save(cancel) {
  369. this.$refs.addressForm.validate((valid) => {
  370. if (valid) {
  371. }
  372. })
  373. },
  374. // 查看工单
  375. toWorkOrderDetail(orderId) {
  376. this.$router.push({
  377. name: "workOrder_detail",
  378. query: {
  379. orderId
  380. }
  381. })
  382. },
  383. handleRefreshList() {
  384. this.getList();
  385. // this.recordSelected = []
  386. // this.$refs.pageRef.refreshList()
  387. }
  388. }
  389. }
  390. </script>
  391. <style scoped lang="scss">
  392. .tabs-container {
  393. margin-bottom: 10px;
  394. }
  395. </style>