Merge remote-tracking branch 'origin/master'
已添加40个文件
已删除59个文件
已修改9个文件
| | |
| | | # å¼åç¯å¢é
ç½® |
| | | NODE_ENV = 'development' |
| | | VUE_APP_API_URL = 'http://192.168.1.44:10010' |
| | | VUE_APP_API_URL = 'http://192.168.1.4:10010' |
| | | # VUE_APP_API_URL = 'https://jinkuai.832smartfarm.com/jinkuai_admin' |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/banner/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function create (data) { |
| | | return request.post('/business/banner/create', data) |
| | | } |
| | | |
| | | export function updateStatus (data) { |
| | | return request.post('/business/banner/updateStatus', data) |
| | | } |
| | | |
| | | export function updateById (data) { |
| | | return request.post('/business/banner/updateById', data) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/banner/${id}`) |
| | | } |
| | | |
| | | export function deleteById (id) { |
| | | return request.get(`/business/banner/delete/${id}`) |
| | | } |
| | | |
| | | export function deleteByIdInBatch (ids) { |
| | | return request.get('/business/banner/delete/batch', { |
| | | params: { |
| | | ids |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 导åºExcel |
| | | export function exportExcel (data) { |
| | | return request.post('/business/banner/exportExcel', data, { |
| | | download: true, |
| | | trim: true |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/driverInfo/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/driverInfo/detail/${id}`) |
| | | } |
| | | |
| | | export function updateStatus (data) { |
| | | return request.post('/business/driverInfo/updateStatus', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function exportExcel (data) { |
| | | return request.post('/business/driverInfo/exportExcel', data, { |
| | | download: true, |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function audit (data) { |
| | | return request.post('/business/driverInfo/audit', data, { |
| | | trim: true |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/category/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function create (data) { |
| | | return request.post('/business/category/create', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function updateStatus (data) { |
| | | return request.post('/business/category/updateStatus', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function updateById (data) { |
| | | return request.post('/business/category/updateById', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/category/${id}`) |
| | | } |
| | | |
| | | export function deleteById (id) { |
| | | return request.get(`/business/category/delete/${id}`) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/member/list/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/member/detail/${id}`) |
| | | } |
| | | |
| | | export function exportExcel (data) { |
| | | return request.post('/business/member/list/exportExcel', data, { |
| | | download: true, |
| | | trim: true |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/orders/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/orders/detail/${id}`) |
| | | } |
| | | |
| | | export function exportExcel (data) { |
| | | return request.post('/business/orders/exportExcel', data, { |
| | | download: true, |
| | | trim: true |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/revenue/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function create (data) { |
| | | return request.post('/business/revenue/create', data) |
| | | } |
| | | |
| | | export function updateStatus (data) { |
| | | return request.post('/business/revenue/updateStatus', data) |
| | | } |
| | | |
| | | export function updateById (data) { |
| | | return request.post('/business/revenue/updateShop', data) |
| | | } |
| | | |
| | | export function deleteById (id) { |
| | | return request.get(`/business/revenue/delete/${id}`) |
| | | } |
| | | |
| | | export function deleteByIdInBatch (ids) { |
| | | return request.get('/business/revenue/delete/batch', { |
| | | params: { |
| | | ids |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 导åºExcel |
| | | export function exportExcel (data) { |
| | | return request.post('/business/revenue/exportExcel', data, { |
| | | download: true, |
| | | trim: true |
| | | }) |
| | | } |
| | |
| | | export function resetPassword (data) { |
| | | return request.post('/business/shopInfo/resetPassword', data) |
| | | } |
| | | |
| | | // é¨åºå®¡æ¹ |
| | | export function audit (data) { |
| | | return request.post('/business/shopInfo/audit', data) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function fetchList (data) { |
| | | return request.post('/business/withdrawalOrders/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/withdrawalOrders/${id}`) |
| | | } |
| | | |
| | | export function getTotalAmount (data) { |
| | | return request.post('/business/withdrawalOrders/totalAmount', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function audit (data) { |
| | | return request.post('/business/withdrawalOrders/audit', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function approve (data) { |
| | | return request.post('/business/withdrawalOrders/approve', data, { |
| | | trim: true |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '../../utils/request' |
| | | |
| | | export function getParams () { |
| | | return request.get('/business/operationConfig') |
| | | } |
| | | |
| | | export function saveParams (data) { |
| | | return request.post('/business/operationConfig/save', data, { |
| | | trim: true |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | width="500px" |
| | | :confirm-working="isWorking" |
| | | @confirm="confirm" |
| | | > |
| | | <el-form ref="form" :model="form" :rules="rules"> |
| | | <el-form-item label="æ é¢" prop="title"> |
| | | <el-input v-model="form.title" placeholder="请è¾å
¥æ é¢"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å¾ç" prop="imgurl"> |
| | | <UploadImages |
| | | :fileList="imgurl ? [{ url: imgurl }] : []" |
| | | :uploadData="{ folder: 'banner' }" |
| | | :maxCount="1" |
| | | @getFileList="e => { form.imgurl = e.fileurl; imgurl = e.url }" |
| | | @deleteRow="form.imgurl = ''; imgurl = ''" /> |
| | | </el-form-item> |
| | | <el-form-item label="æåºç " prop="sortnum"> |
| | | <el-input v-model="form.sortnum" placeholder="请è¾å
¥æåºç "></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-switch |
| | | v-model="form.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | ></el-switch> |
| | | </el-form-item> |
| | | <el-form-item label="å±ç¤ºä½ç½®" prop="position"> |
| | | <el-select v-model="form.position" placeholder="è¯·éæ©å±ç¤ºä½ç½®"> |
| | | <el-option label="ä¼å端é¦é¡µè½®æ" :value="0"></el-option> |
| | | <el-option label="叿ºAPPå¼å¯¼é¡µ" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="跳转æ¹å¼" prop="type"> |
| | | <el-select v-model="form.type" placeholder="è¯·éæ©è·³è½¬æ¹å¼"> |
| | | <el-option label="æ " :value="0"></el-option> |
| | | <el-option label="坿æ¬" :value="1"></el-option> |
| | | <el-option label="å¤é¾" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å
容" prop="content" v-if="form.type === 1"> |
| | | <RichEditor :richData="form.content" :styleEditor="styleEditor" @getWangedditor="getWangedditor" :readonly="false"/> |
| | | </el-form-item> |
| | | <el-form-item label="å
容" prop="content" v-if="form.type === 2"> |
| | | <el-input v-model="form.content" placeholder="请è¾å
¥å
容"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseOpera from '@/components/base/BaseOpera' |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import UploadImages from '@/components/common/uploadImages' |
| | | import { getById } from '@/api/business/banner' |
| | | import RichEditor from '@/components/common/RichEditor' |
| | | export default { |
| | | name: 'OperaBannerEditWindow', |
| | | extends: BaseOpera, |
| | | components: { GlobalWindow, UploadImages, RichEditor }, |
| | | data () { |
| | | return { |
| | | // è¡¨åæ°æ® |
| | | styleEditor:'border: 1px solid #ccc;display: inline-block;', |
| | | form: { |
| | | id: null, |
| | | title: '', |
| | | content: '', |
| | | position: '', |
| | | imgurl: '', |
| | | type: '', |
| | | sortnum: '', |
| | | status: 1 |
| | | }, |
| | | imgurl: '', |
| | | rules: { |
| | | position: [{ required: true, message: 'è¯·éæ©å±ç¤ºä½ç½®', trigger: 'change' }], |
| | | imgurl: [{ required: true, message: '请ä¸ä¼ å¾ç', trigger: 'change' }], |
| | | type: [{ required: true, message: 'è¯·éæ©è·³è½¬æ¹å¼', trigger: 'change' }], |
| | | content: [{ required: true, message: '请è¾å
¥å
容', trigger: 'blur' }] |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/banner', |
| | | 'field.id': 'id' |
| | | }) |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | if (row && row.id) { |
| | | getById(row.id).then(res => { |
| | | this.form = { |
| | | id: res.id, |
| | | title: res.title || '', |
| | | position: res.position, |
| | | imgurl: res.imgurl || '', |
| | | type: res.type, |
| | | sortnum: res.sortnum, |
| | | status: res.status ?? 1, |
| | | content: res.content || '' |
| | | } |
| | | this.imgurl = res.imgurlFull |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } else { |
| | | this.form = { |
| | | id: null, |
| | | title: '', |
| | | position: '', |
| | | imgurl: '', |
| | | type: '', |
| | | sortnum: '', |
| | | status: 1, |
| | | content: '' |
| | | } |
| | | this.imgurl = '' |
| | | this.visible = true |
| | | } |
| | | }, |
| | | getWangedditor (data) { |
| | | this.form.content = data |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | // æ¥è¯¢å¼å°å¯éè§åå表 |
| | | // æ¥è¯¢é¢è®¡æ¶æ |
| | | fetchEstimatedDelivery () { |
| | | estimatedDelivery(this.form.cityId) |
| | | .then(data => { |
| | | this.timeTableData = [ |
| | | data |
| | | ] |
| | | this.timeTableData = data |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | |
| | | Promise.all([ |
| | | batchSave({ cityId: this.form.cityId, items: this.jiudiTableData }), |
| | | batchSaveRemoteDelivery({ cityId: this.form.cityId, items: this.remoteTableData }), |
| | | batchSaveEstimatedDelivery({ cityId: this.form.cityId, ...this.timeTableData[0] }), |
| | | batchSaveEstimatedDelivery({ cityId: this.form.cityId, items: this.timeTableData }), |
| | | batchSaveStoreDeposit({ cityId: this.form.cityId, items: this.storeDepositData }), |
| | | batchSaveRevenueShare({ cityId: this.form.cityId, items: this.shareTableData }) |
| | | ]) |
| | | .then(() => { |
| | | this.visible = false |
| | | this.$tip.apiSuccess('ä¿åæå') |
| | | // this.$tip.apiSuccess('ä¿åæå') |
| | | this.$emit('success') |
| | | }) |
| | | .catch(e => { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | title="æå¨æ´¾å" |
| | | :visible.sync="visible" |
| | | width="700px" |
| | | @confirm="handleConfirm" |
| | | @close="handleClose" |
| | | > |
| | | <div class="dispatch-info"> |
| | | <div class="info-row"> |
| | | <div class="info-item"> |
| | | <span class="label">订åç¼å·ï¼</span> |
| | | <span class="value">{{ orderInfo.orderNo }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å®ä»éé¢ï¼</span> |
| | | <span class="value">Â¥{{ (orderInfo.payAmount / 100).toFixed(2) }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é
éæ¹å¼ï¼</span> |
| | | <span class="value"> |
| | | <span v-if="orderInfo.deliveryType === 1">æ®éé
é</span> |
| | | <span v-else-if="orderInfo.deliveryType === 2">æ¥éè¾¾</span> |
| | | <span v-else-if="orderInfo.deliveryType === 3">å¼å°å¯é</span> |
| | | <span v-else>-</span> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-table :data="orderInfo.goodsList" stripe class="goods-table"> |
| | | <el-table-column prop="goodsName" label="ç©ååç§°" min-width="100px"></el-table-column> |
| | | <el-table-column prop="goodsSize" label="ç©å尺寸" min-width="80px"></el-table-column> |
| | | <el-table-column label="é
éä»·ï¼å
ï¼" min-width="100px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.deliveryPrice / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="quantity" label="æ°é" min-width="60px"></el-table-column> |
| | | <el-table-column label="å°è®¡ï¼å
ï¼" min-width="100px"> |
| | | <template slot-scope="{row}">Â¥{{ ((row.deliveryPrice * row.quantity) / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <el-form ref="form" :model="form" :rules="rules" label-width="100px" class="dispatch-form"> |
| | | <el-form-item label="é
é叿º" prop="driverId"> |
| | | <el-select v-model="form.driverId" placeholder="è¯·éæ©é
é叿º" style="width: 100%"> |
| | | <el-option label="叿ºA" :value="1"></el-option> |
| | | <el-option label="叿ºB" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å æ¥è´¹" prop="urgentFee"> |
| | | <el-input-number v-model="form.urgentFee" :min="0" :precision="2" controls-position="right" style="width: 100%"></el-input-number> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨è¯´æ" prop="remark"> |
| | | <el-input type="textarea" v-model="form.remark" placeholder="请è¾å
¥å¤æ³¨è¯´æ" :rows="3"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | |
| | | export default { |
| | | name: 'OperaDispatch', |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | visible: false, |
| | | orderInfo: { |
| | | orderNo: '', |
| | | payAmount: 0, |
| | | deliveryType: '', |
| | | goodsList: [] |
| | | }, |
| | | form: { |
| | | driverId: '', |
| | | urgentFee: 0, |
| | | remark: '' |
| | | }, |
| | | rules: { |
| | | driverId: [{ required: true, message: 'è¯·éæ©é
é叿º', trigger: 'change' }] |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | open (row) { |
| | | this.orderInfo = { |
| | | orderNo: row.orderNo, |
| | | payAmount: row.payAmount || 0, |
| | | deliveryType: row.deliveryType || '', |
| | | goodsList: row.goodsList || [] |
| | | } |
| | | this.form = { |
| | | driverId: '', |
| | | urgentFee: 0, |
| | | remark: '' |
| | | } |
| | | this.visible = true |
| | | }, |
| | | handleClose () { |
| | | this.visible = false |
| | | }, |
| | | handleConfirm () { |
| | | this.$refs.form.validate(valid => { |
| | | if (!valid) return |
| | | this.$emit('confirm', { |
| | | orderId: this.orderInfo.id, |
| | | ...this.form |
| | | }) |
| | | this.visible = false |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .dispatch-info { |
| | | margin-bottom: 20px; |
| | | } |
| | | .info-row { |
| | | display: flex; |
| | | gap: 30px; |
| | | padding: 15px; |
| | | background: #f5f7fa; |
| | | border-radius: 4px; |
| | | } |
| | | .info-item { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | } |
| | | .info-item .value { |
| | | color: #606266; |
| | | } |
| | | .goods-table { |
| | | margin-bottom: 20px; |
| | | } |
| | | .dispatch-form { |
| | | margin-top: 20px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | width="900px" |
| | | :withFooter="false" |
| | | > |
| | | <div class="driver-approval"> |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">叿ºä¿¡æ¯</span> |
| | | <el-tag type="success" v-if="detailInfo.auditStatus">å·²ææææºå·</el-tag> |
| | | <el-tag type="warning" v-else>æªææææºå·</el-tag> |
| | | <div class="approval-status"> |
| | | <el-tag v-if="detailInfo.auditStatus === 0" type="warning" class="status-tag">å¾
å®¡æ ¸</el-tag> |
| | | <el-tag v-else-if="detailInfo.auditStatus === 1" type="success" class="status-tag">审æ¹éè¿</el-tag> |
| | | <el-tag v-else-if="detailInfo.auditStatus === 2" type="danger" class="status-tag">审æ¹é©³å</el-tag> |
| | | </div> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">叿ºå§åï¼</span> |
| | | <span class="value">{{ detailInfo.name || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ææææºå·ï¼</span> |
| | | <span class="value">{{ detailInfo.telephone || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">身份è¯å·ï¼</span> |
| | | <span class="value">{{ detailInfo.idcard || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å©å§»æ
åµï¼</span> |
| | | <span class="value" v-if="detailInfo.maritalStatus === 3">丧å¶</span> |
| | | <span class="value" v-else-if="detailInfo.maritalStatus === 2">离å¼</span> |
| | | <span class="value" v-else-if="detailInfo.maritalStatus === 1">å·²å©</span> |
| | | <span class="value" v-else-if="detailInfo.maritalStatus === 0">æªå©</span> |
| | | <span class="value" v-else>-</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æ§å«ï¼</span> |
| | | <span class="value">{{ detailInfo.gender === 1 ? 'ç·' : detailInfo.gender === 2 ? '女' : '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç°å±
ä½å°åï¼</span> |
| | | <span class="value">{{ detailInfo.livePlace || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">è¯çº§ï¼</span> |
| | | <span class="value">{{ detailInfo.driverLevel || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç¶æï¼</span> |
| | | <span class="value">{{ detailInfo.status === 0 ? 'å¯ç¨' : 'ç¦ç¨' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">车è¾ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">车çå·ï¼</span> |
| | | <span class="value">{{ detailInfo.carCode || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">车è¾ç±»åï¼</span> |
| | | <span class="value">{{ detailInfo.carTypeName || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">车è¾é¢è²ï¼</span> |
| | | <span class="value">{{ detailInfo.carColor || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é©¾é©¶è¯æææï¼</span> |
| | | <span class="value">{{ detailInfo.cardStartDate || '-' }} è³ {{ detailInfo.cardEndDate || '-' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">éä»¶ææ</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">èº«ä»½è¯æ£é¢ï¼</span> |
| | | <el-image |
| | | v-if="detailInfo.idcardImg" |
| | | style="width: 80px; height: 80px" |
| | | :src="detailInfo.imgPrefix + detailInfo.idcardImg" |
| | | :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImg]" |
| | | fit="cover" |
| | | ></el-image> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">身份è¯åé¢ï¼</span> |
| | | <el-image |
| | | v-if="detailInfo.idcardImgBack" |
| | | style="width: 80px; height: 80px" |
| | | :src="detailInfo.imgPrefix + detailInfo.idcardImgBack" |
| | | :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImgBack]" |
| | | fit="cover" |
| | | ></el-image> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">车è¾ç
§çï¼</span> |
| | | <span v-if="!detailInfo.carImgList">-</span> |
| | | <div v-else class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.carImgList" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img.fileurlFull" |
| | | :preview-src-list="detailInfo.carImgList.map(item => item.fileurlFull)" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">驾驶è¯ç
§çï¼</span> |
| | | <span v-if="!detailInfo.licenseImgList">-</span> |
| | | <div v-else class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.licenseImgList" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img.fileurlFull" |
| | | :preview-src-list="detailInfo.licenseImgList.map(item => item.fileurlFull)" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">å
¶å®ææï¼</span> |
| | | <span v-if="!detailInfo.otherImgList">-</span> |
| | | <div v-else class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.otherImgList" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img.fileurlFull" |
| | | :preview-src-list="detailInfo.otherImgList.map(item => item.fileurlFull)" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="approval-form" v-if="detailInfo.auditStatus === 0"> |
| | | <el-form ref="approvalForm" :model="approvalForm" :rules="approvalRules"> |
| | | <el-form-item label="审æ¹ç»æ" prop="auditStatus"> |
| | | <el-radio-group v-model="approvalForm.auditStatus"> |
| | | <el-radio :label="0">éè¿</el-radio> |
| | | <el-radio :label="1">æç»</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="叿ºè¯çº§" prop="driverLevel"> |
| | | <el-select v-model="approvalForm.driverLevel" placeholder="è¯·éæ©å¸æºè¯çº§" style="width: 300px"> |
| | | <el-option label="S" :value="5"></el-option> |
| | | <el-option label="A" :value="4"></el-option> |
| | | <el-option label="B" :value="3"></el-option> |
| | | <el-option label="C" :value="2"></el-option> |
| | | <el-option label="D" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§" prop="auditRemark"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="approvalForm.auditRemark" |
| | | placeholder="请è¾å
¥å®¡æ¹æè§" |
| | | :rows="3" |
| | | style="width: 400px" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="approval-buttons"> |
| | | <el-button @click="close">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleConfirm" :loading="isWorking">ç¡®å®</el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { getById, audit } from '@/api/business/driver' |
| | | |
| | | export default { |
| | | name: 'OperaDriverApproval', |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | title: '叿ºå®¡æ ¸', |
| | | visible: false, |
| | | isWorking: false, |
| | | detailInfo: {}, |
| | | approvalForm: { |
| | | id: null, |
| | | auditStatus: 0, |
| | | driverLevel: '', |
| | | auditRemark: '' |
| | | }, |
| | | approvalRules: { |
| | | auditStatus: [{ required: true, message: 'è¯·éæ©å®¡æ¹ç»æ', trigger: 'change' }], |
| | | driverLevel: [{ required: true, message: 'è¯·éæ©å¸æºè¯çº§', trigger: 'change' }], |
| | | auditRemark: [{ required: true, message: '请è¾å
¥å®¡æ¹æè§', trigger: 'blur' }] |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | this.approvalForm = { |
| | | id: row.id, |
| | | auditStatus: 1, |
| | | driverLevel: '', |
| | | auditRemark: '' |
| | | } |
| | | this.$nextTick(() => { |
| | | this.$refs.approvalForm && this.$refs.approvalForm.clearValidate() |
| | | }) |
| | | getById(row.id).then(res => { |
| | | this.detailInfo = res |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | close () { |
| | | this.visible = false |
| | | }, |
| | | handleConfirm () { |
| | | this.$refs.approvalForm.validate(valid => { |
| | | if (!valid) return |
| | | if (this.approvalForm.status === 2 && !this.approvalForm.remark) { |
| | | this.$message.warning('请è¾å
¥å®¡æ¹æè§') |
| | | return |
| | | } |
| | | this.isWorking = true |
| | | audit({ |
| | | id: this.approvalForm.id, |
| | | auditStatus: this.approvalForm.auditStatus, |
| | | driverLevel: this.approvalForm.driverLevel, |
| | | auditRemark: this.approvalForm.auditRemark |
| | | }).then(res => { |
| | | this.$tip.apiSuccess(res || 'å®¡æ ¸æå') |
| | | this.$emit('success', this.approvalForm) |
| | | this.visible = false |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }).finally(() => { |
| | | this.isWorking = false |
| | | }) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .driver-approval { |
| | | |
| | | } |
| | | .section { |
| | | margin-bottom: 25px; |
| | | } |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10px; |
| | | margin-bottom: 15px; |
| | | flex-wrap: wrap; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .approval-status { |
| | | margin-left: auto; |
| | | } |
| | | .status-tag { |
| | | font-size: 14px; |
| | | padding: 4px 12px; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | padding: 0 10px; |
| | | } |
| | | .info-item { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-item.full-width { |
| | | grid-column: span 2; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | min-width: 110px; |
| | | } |
| | | .info-item .value { |
| | | color: #606266; |
| | | word-break: break-all; |
| | | } |
| | | .image-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | } |
| | | .approval-form { |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | border-top: 1px solid #eee; |
| | | } |
| | | .approval-form /deep/ .el-form-item { |
| | | margin-bottom: 15px; |
| | | } |
| | | .approval-form /deep/ .el-form-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | .approval-buttons { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 10px; |
| | | margin-top: 15px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | width="900px" |
| | | :withFooter="false" |
| | | > |
| | | <div class="driver-detail"> |
| | | <el-tabs v-model="activeTab"> |
| | | <el-tab-pane label="åºæ¬ä¿¡æ¯" name="basic"></el-tab-pane> |
| | | <el-tab-pane label="叿ºä¸å¡" name="business"></el-tab-pane> |
| | | </el-tabs> |
| | | |
| | | <div v-show="activeTab === 'basic'" class="tab-content"> |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">叿ºä¿¡æ¯</span> |
| | | <el-tag type="success" v-if="detailInfo.auditStatus">å·²ææææºå·</el-tag> |
| | | <el-tag type="warning" v-else>æªææææºå·</el-tag> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">叿ºå§åï¼</span> |
| | | <span class="value">{{ detailInfo.name || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ææææºå·ï¼</span> |
| | | <span class="value">{{ detailInfo.telephone || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">身份è¯å·ï¼</span> |
| | | <span class="value">{{ detailInfo.idcard || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å©å§»æ
åµï¼</span> |
| | | <span class="value" v-if="detailInfo.maritalStatus === 3">丧å¶</span> |
| | | <span class="value" v-else-if="detailInfo.maritalStatus === 2">离å¼</span> |
| | | <span class="value" v-else-if="detailInfo.maritalStatus === 1">å·²å©</span> |
| | | <span class="value" v-else-if="detailInfo.maritalStatus === 0">æªå©</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æ§å«ï¼</span> |
| | | <span class="value">{{ detailInfo.gender === 1 ? 'ç·' : detailInfo.gender === 2 ? '女' : '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç°å±
ä½å°åï¼</span> |
| | | <span class="value">{{ detailInfo.livePlace || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">è¯çº§ï¼</span> |
| | | <span class="value">{{ detailInfo.driverLevel || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç¶æï¼</span> |
| | | <span class="value">{{ detailInfo.status === 0 ? 'å¯ç¨' : 'ç¦ç¨' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">车è¾ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">车çå·ï¼</span> |
| | | <span class="value">{{ detailInfo.carCode || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">车è¾ç±»åï¼</span> |
| | | <span class="value">{{ detailInfo.carTypeName || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">车è¾é¢è²ï¼</span> |
| | | <span class="value">{{ detailInfo.carColor || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é©¾é©¶è¯æææï¼</span> |
| | | <span class="value">{{ detailInfo.cardStartDate || '-' }} è³ {{ detailInfo.cardEndDate || '-' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">éä»¶ææ</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">èº«ä»½è¯æ£é¢ï¼</span> |
| | | <el-image |
| | | v-if="detailInfo.idcardImg" |
| | | style="width: 80px; height: 80px" |
| | | :src="detailInfo.imgPrefix + detailInfo.idcardImg" |
| | | :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImg]" |
| | | fit="cover" |
| | | ></el-image> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">身份è¯åé¢ï¼</span> |
| | | <el-image |
| | | v-if="detailInfo.idcardImgBack" |
| | | style="width: 80px; height: 80px" |
| | | :src="detailInfo.imgPrefix + detailInfo.idcardImgBack" |
| | | :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImgBack]" |
| | | fit="cover" |
| | | ></el-image> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">车è¾ç
§çï¼</span> |
| | | <span v-if="!detailInfo.carImgList">-</span> |
| | | <div v-else class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.carImgList" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img.fileurlFull" |
| | | :preview-src-list="detailInfo.carImgList.map(item => item.fileurlFull)" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">驾驶è¯ç
§çï¼</span> |
| | | <span v-if="!detailInfo.licenseImgList">-</span> |
| | | <div v-else class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.licenseImgList" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img.fileurlFull" |
| | | :preview-src-list="detailInfo.licenseImgList.map(item => item.fileurlFull)" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">å
¶å®ææï¼</span> |
| | | <span v-if="!detailInfo.otherImgList">-</span> |
| | | <div v-else class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.otherImgList" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img.fileurlFull" |
| | | :preview-src-list="detailInfo.otherImgList.map(item => item.fileurlFull)" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div v-show="activeTab === 'business'" class="tab-content"> |
| | | <el-form ref="searchForm" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="订åç¼å·" prop="orderNo"> |
| | | <el-input v-model="searchForm.orderNo" clearable placeholder="请è¾å
¥è®¢åç¼å·"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç©åä¿¡æ¯" prop="goodsInfo"> |
| | | <el-input v-model="searchForm.goodsInfo" clearable placeholder="请è¾å
¥ç©åä¿¡æ¯"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <el-form-item label="订åç¶æ" prop="orderStatus"> |
| | | <el-select v-model="searchForm.orderStatus" clearable placeholder="è¯·éæ©è®¢åç¶æ"> |
| | | <el-option label="å¾
åä»¶" :value="1"></el-option> |
| | | <el-option label="é
éä¸" :value="2"></el-option> |
| | | <el-option label="已宿" :value="3"></el-option> |
| | | <el-option label="已忶" :value="4"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ç®ç¶æ" prop="settleStatus"> |
| | | <el-select v-model="searchForm.settleStatus" clearable placeholder="è¯·éæ©ç»ç®ç¶æ"> |
| | | <el-option label="æªç»ç®" :value="0"></el-option> |
| | | <el-option label="å·²ç»ç®" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="searchBusiness">æç´¢</el-button> |
| | | <el-button @click="resetBusiness">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | |
| | | <div class="statistics"> |
| | | <span>è®¢åæ°ï¼{{ statistics.orderCount }}</span> |
| | | <span>è®¢åæ»ä»·ï¼Â¥{{ (statistics.orderAmount / 100).toFixed(2) }}</span> |
| | | <span>ç»ç®æ»ä»·ï¼Â¥{{ (statistics.settleAmount / 100).toFixed(2) }}</span> |
| | | </div> |
| | | |
| | | <el-table :data="businessData.list" stripe> |
| | | <el-table-column prop="orderNo" label="订åç¼å·" min-width="150px"></el-table-column> |
| | | <el-table-column prop="goodsInfo" label="ç©åä¿¡æ¯" min-width="120px"></el-table-column> |
| | | <el-table-column prop="type" label="ç±»å" min-width="80px"></el-table-column> |
| | | <el-table-column prop="level" label="订å级å«" min-width="80px"></el-table-column> |
| | | <el-table-column label="ç©åä¿è´¹ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.insuranceAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="åºç¡æå¡è´¹ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.serviceAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="订åç¶æ" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span v-if="row.orderStatus === 1">å¾
åä»¶</span> |
| | | <span v-else-if="row.orderStatus === 2">é
éä¸</span> |
| | | <span v-else-if="row.orderStatus === 3">已宿</span> |
| | | <span v-else-if="row.orderStatus === 4">已忶</span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç»ç®ç¶æ" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span :style="{ color: row.settleStatus === 1 ? '#67c23a' : '#e6a23c' }"> |
| | | {{ row.settleStatus === 1 ? 'å·²ç»ç®' : 'æªç»ç®' }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleBusinessSizeChange" |
| | | @current-change="handleBusinessPageChange" |
| | | :pagination="businessData.pagination" |
| | | ></pagination> |
| | | </div> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import { getById } from '@/api/business/driver' |
| | | |
| | | export default { |
| | | name: 'OperaDriverDetail', |
| | | components: { GlobalWindow, Pagination }, |
| | | data () { |
| | | return { |
| | | title: '叿ºè¯¦æ
', |
| | | visible: false, |
| | | activeTab: 'basic', |
| | | detailInfo: {}, |
| | | searchForm: { |
| | | orderNo: '', |
| | | goodsInfo: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '', |
| | | orderStatus: '', |
| | | settleStatus: '' |
| | | }, |
| | | statistics: { |
| | | orderCount: 0, |
| | | orderAmount: 0, |
| | | settleAmount: 0 |
| | | }, |
| | | businessData: { |
| | | list: [], |
| | | pagination: { page: 1, size: 10, total: 0 } |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | this.activeTab = 'basic' |
| | | getById(row.id).then(res => { |
| | | this.detailInfo = res |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | searchBusiness () { |
| | | }, |
| | | resetBusiness () { |
| | | this.searchForm = { |
| | | orderNo: '', |
| | | goodsInfo: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '', |
| | | orderStatus: '', |
| | | settleStatus: '' |
| | | } |
| | | this.searchBusiness() |
| | | }, |
| | | handleDateChange (val) { |
| | | this.searchForm.startTime = val ? val[0] : '' |
| | | this.searchForm.endTime = val ? val[1] : '' |
| | | }, |
| | | handleBusinessSizeChange () { |
| | | }, |
| | | handleBusinessPageChange () { |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .driver-detail { |
| | | width: 100%; |
| | | } |
| | | .tab-content { |
| | | margin-top: 20px; |
| | | } |
| | | .section { |
| | | margin-bottom: 25px; |
| | | } |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10px; |
| | | margin-bottom: 15px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | padding: 0 10px; |
| | | } |
| | | .info-item { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-item.full-width { |
| | | grid-column: span 2; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | min-width: 110px; |
| | | } |
| | | .info-item .value { |
| | | color: #606266; |
| | | word-break: break-all; |
| | | } |
| | | .image-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | } |
| | | .statistics { |
| | | display: flex; |
| | | gap: 40px; |
| | | padding: 15px; |
| | | background: #f5f7fa; |
| | | border-radius: 4px; |
| | | margin-bottom: 15px; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | margin: 20px 0; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | width="500px" |
| | | :confirm-working="isWorking" |
| | | @confirm="confirm" |
| | | > |
| | | <el-form ref="form" :model="form" :rules="rules"> |
| | | <el-form-item label="ç±»ååç§°" prop="name" v-if="form.type === 1"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥ç±»ååç§°"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="è¡æç±»å" prop="name" v-if="form.type === 4"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥è¡æç±»å"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç©ååç§°" prop="name" v-if="form.type === 2"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥ç©ååç§°"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç级åç§°" prop="name" v-if="form.type === 3"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥ç级åç§°"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="éè¡æ¹å¼" prop="detail" v-if="form.type === 1"> |
| | | <el-select v-model="form.detail" placeholder="è¯·éæ©éè¡æ¹å¼"> |
| | | <el-option label="æºå¨è½¦" value="driving"></el-option> |
| | | <el-option label="éæºå¨è½¦" value="bicycling"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸ä¼ 驾驶è¯" prop="otherField" v-if="form.type === 1"> |
| | | <el-radio-group v-model="form.otherField"> |
| | | <el-radio label="1">éè¦</el-radio> |
| | | <el-radio label="0">ä¸éè¦</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="æ¯å¦ç¹å¤§å°ºå¯¸" prop="detail" v-if="form.type === 4"> |
| | | <el-radio-group v-model="form.detail"> |
| | | <el-radio label="0">å¦</el-radio> |
| | | <el-radio label="1">æ¯</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="徿 " prop="iconFull" v-if="form.type === 4"> |
| | | <UploadImages |
| | | :fileList="form.iconFull ? [{ url: form.iconFull }] : []" |
| | | :uploadData="{ folder: 'category' }" |
| | | :maxCount="1" |
| | | @getFileList="e => { form.icon = e.fileurl; form.iconFull = e.url }" |
| | | @deleteRow="form.icon = ''; form.iconFull = ''" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç©åç级" prop="relationId" v-if="form.type === 2"> |
| | | <el-select v-model="form.relationId" placeholder="è¯·éæ©ç©åç级"> |
| | | <el-option |
| | | v-for="item in list" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æé叿ºè¯çº§" prop="detail" v-if="form.type === 3"> |
| | | <el-select v-model="form.detail" placeholder="è¯·éæ©å¸æºè¯çº§"> |
| | | <el-option label="S" :value="5"></el-option> |
| | | <el-option label="A" :value="4"></el-option> |
| | | <el-option label="B" :value="3"></el-option> |
| | | <el-option label="C" :value="2"></el-option> |
| | | <el-option label="D" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å¯å说æ" prop="detail" v-if="form.type === 2"> |
| | | <el-input v-model="form.detail" type="textarea" :rows="3" placeholder="请è¾å
¥å¯å说æ"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨è¯´æ" prop="remark" v-if="form.type === 3 || form.type === 4"> |
| | | <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请è¾å
¥å¤æ³¨è¯´æ"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æåº" prop="sortnum"> |
| | | <el-input v-model="form.sortnum" placeholder="请è¾å
¥æåº"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <div style="display: flex; align-items: center;"> |
| | | <el-switch |
| | | v-model="form.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | <span v-if="form.type === 2" style="margin-left: 5px; font-size: 12px; color: #909399;">å¼å¯åï¼è¯¥åå¸ä¸é¨åºå¯è¢«ä¼åæ¥ç</span> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseOpera from '@/components/base/BaseOpera' |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { getById, fetchList } from '@/api/business/goodsCategory' |
| | | import UploadImages from '@/components/common/uploadImages' |
| | | export default { |
| | | name: 'OperaGoodsCategoryEditWindow', |
| | | extends: BaseOpera, |
| | | components: { GlobalWindow, UploadImages }, |
| | | data () { |
| | | return { |
| | | form: { |
| | | id: null, |
| | | name: '', |
| | | relationId: '', |
| | | detail: '', |
| | | sortnum: '', |
| | | status: 0, |
| | | type: '', |
| | | remark: '', |
| | | icon: '', |
| | | iconFull: '', |
| | | otherField: '1' |
| | | }, |
| | | rules: {}, |
| | | list: [] |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/goodsCategory', |
| | | 'field.id': 'id' |
| | | }) |
| | | }, |
| | | methods: { |
| | | open (title, row, type) { |
| | | this.title = title |
| | | if (type === 2) { |
| | | fetchList({ |
| | | capacity: 99999, |
| | | page: 1, |
| | | model: { |
| | | type: 3 |
| | | } |
| | | }).then(res => { |
| | | this.list = res.records || [] |
| | | }) |
| | | } |
| | | if (row && row.id) { |
| | | getById(row.id).then(res => { |
| | | this.form = { |
| | | id: res.id, |
| | | name: res.name || '', |
| | | relationId: res.relationId || '', |
| | | detail: res.detail || '', |
| | | sortnum: res.sortnum || '', |
| | | status: res.status ?? 0, |
| | | type: res.type ?? 2, |
| | | remark: res.remark || '', |
| | | icon: res.icon || '', |
| | | iconFull: res.iconFull || '', |
| | | otherField: res.otherField || '' |
| | | } |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } else { |
| | | this.form = { |
| | | id: null, |
| | | name: '', |
| | | relationId: '', |
| | | detail: '', |
| | | sortnum: '', |
| | | status: 0, |
| | | type: '', |
| | | remark: '', |
| | | icon: '', |
| | | iconFull: '', |
| | | otherField: '1' |
| | | } |
| | | if (type === 4) { |
| | | this.form.detail = '0' |
| | | } |
| | | this.form.type = type |
| | | this.visible = true |
| | | } |
| | | if (this.form.type === 2) { |
| | | this.rules = { |
| | | name: [{ required: true, message: '请è¾å
¥ç©ååç§°', trigger: 'blur' }], |
| | | relationId: [{ required: true, message: 'è¯·éæ©ç©åç级', trigger: 'blur' }] |
| | | } |
| | | } else if (this.form.type === 3) { |
| | | this.rules = { |
| | | name: [{ required: true, message: '请è¾å
¥ç级åç§°', trigger: 'blur' }], |
| | | detail: [{ required: true, message: 'è¯·éæ©å¸æºè¯çº§', trigger: 'blur' }] |
| | | } |
| | | } else if (this.form.type === 4) { |
| | | this.rules = { |
| | | name: [{ required: true, message: '请è¾å
¥è¡æç±»å', trigger: 'blur' }], |
| | | detail: [{ required: true, message: 'è¯·éæ©æ¯å¦ç¹å¤§å°ºå¯¸', trigger: 'blur' }], |
| | | icon: [{ required: true, message: '请ä¸ä¼ 徿 ', trigger: 'blur' }] |
| | | } |
| | | } else if (this.form.type === 1) { |
| | | this.rules = { |
| | | name: [{ required: true, message: '请è¾å
¥ç±»ååç§°', trigger: 'blur' }], |
| | | detail: [{ required: true, message: 'è¯·éæ©éè¡æ¹å¼', trigger: 'blur' }], |
| | | otherField: [{ required: true, message: 'è¯·éæ©éè¡æ¹å¼', trigger: 'blur' }] |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | width="600px" |
| | | :withFooter="false" |
| | | > |
| | | <div class="detail-container"> |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">ç¨æ·ä¿¡æ¯</span> |
| | | <span class="status-tag"> |
| | | <el-tag type="success" v-if="detailInfo.telephone">å·²ææææºå·</el-tag> |
| | | <el-tag type="warning" v-else>æªææææºå·</el-tag> |
| | | </span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">微信openidï¼</span> |
| | | <span class="value">{{ detailInfo.openId }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç¨æ·æµç§°ï¼</span> |
| | | <span class="value">{{ detailInfo.nickName }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ä¼åå§åï¼</span> |
| | | <span class="value">{{ detailInfo.name }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ææææºå·ï¼</span> |
| | | <span class="value">{{ detailInfo.telephone }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç¶æï¼</span> |
| | | <span class="value">{{ detailInfo.status === 0 ? 'æ£å¸¸' : detailInfo.status === 1 ? 'åç¨' : '已注é' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { getById } from '@/api/business/memberManage' |
| | | import BaseOpera from '@/components/base/BaseOpera' |
| | | export default { |
| | | name: 'OperaMemberDetail', |
| | | extends: BaseOpera, |
| | | components: { GlobalWindow, BaseOpera }, |
| | | data () { |
| | | return { |
| | | detailInfo: { |
| | | id: null, |
| | | openId: '', |
| | | nickName: '', |
| | | name: '', |
| | | phone: '', |
| | | status: 1 |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | getById(row.id).then(res => { |
| | | this.detailInfo = { |
| | | id: res.id, |
| | | openId: res.openId, |
| | | nickName: res.nickName, |
| | | name: res.name, |
| | | phone: res.phone, |
| | | status: res.status |
| | | } |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .detail-container { |
| | | padding: 20px; |
| | | } |
| | | .section { |
| | | margin-bottom: 30px; |
| | | } |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 15px; |
| | | margin-bottom: 15px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .status-tag { |
| | | padding: 4px 12px; |
| | | border-radius: 4px; |
| | | font-size: 12px; |
| | | } |
| | | .status-pending { |
| | | background: #fdf6ec; |
| | | color: #E6A23C; |
| | | } |
| | | .status-success { |
| | | background: #f0f9eb; |
| | | color: #67C23A; |
| | | } |
| | | .status-reject { |
| | | background: #fef0f0; |
| | | color: #F56C6C; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | padding: 0 10px; |
| | | } |
| | | .info-item { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | min-width: 90px; |
| | | } |
| | | .info-item .value { |
| | | color: #606266; |
| | | } |
| | | .info-item .amount { |
| | | color: #f56c6c; |
| | | font-weight: bold; |
| | | } |
| | | .info-item.full-width { |
| | | grid-column: span 2; |
| | | } |
| | | .timeline-content { |
| | | padding: 10px; |
| | | background: #f5f7fa; |
| | | border-radius: 4px; |
| | | } |
| | | .timeline-title { |
| | | font-size: 14px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 8px; |
| | | } |
| | | .timeline-info { |
| | | display: flex; |
| | | gap: 20px; |
| | | font-size: 13px; |
| | | color: #606266; |
| | | margin-bottom: 5px; |
| | | } |
| | | .timeline-remark { |
| | | font-size: 13px; |
| | | color: #909399; |
| | | } |
| | | .approval-form { |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | border-top: 1px solid #eee; |
| | | } |
| | | .approval-form /deep/ .el-form-item { |
| | | margin-bottom: 15px; |
| | | } |
| | | .approval-form /deep/ .el-form-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | .approval-buttons { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 10px; |
| | | margin-top: 15px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | width="900px" |
| | | :withFooter="false" |
| | | > |
| | | <div class="order-detail" v-if="detailInfo"> |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">订å详æ
</span> |
| | | <el-tag v-if="detailInfo.status === 1" type="warning">å¾
åä»¶</el-tag> |
| | | <el-tag v-else-if="detailInfo.status === 2" type="primary">é
éä¸</el-tag> |
| | | <el-tag v-else-if="detailInfo.status === 3" type="success">已宿</el-tag> |
| | | <el-tag v-else-if="detailInfo.status === 4" type="info">已忶</el-tag> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">订åç¼å·ï¼</span> |
| | | <span class="value">{{ detailInfo.order.code || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å建æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.order.createTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">订åç±»åï¼</span> |
| | | <span class="value"> |
| | | <span v-if="detailInfo.order.type === 0">å°±å°åå</span> |
| | | <span v-else-if="detailInfo.order.type === 1">å¼å°åå</span> |
| | | <span v-else>-</span> |
| | | </span> |
| | | </div> |
| | | |
| | | <div class="info-item"> |
| | | <span class="label">æ¯ä»æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.order.payTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æ¯ä»æ¹å¼ï¼</span> |
| | | <span class="value"> |
| | | <span>微信æ¯ä»</span> |
| | | </span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å®ä»éé¢ï¼</span> |
| | | <span class="value"> |
| | | <span>Â¥{{ (detailInfo.order.payAmount / 100).toFixed(2) }}</span> |
| | | </span> |
| | | </div> |
| | | |
| | | <div class="info-item"> |
| | | <span class="label">订å级å«ï¼</span> |
| | | <span class="value">{{ detailInfo.order.orderLevel || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é¢è®¡å°åºæ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.order.expectedDepositTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é¢è®¡åä»¶æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.order.expectedTakeTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">è®¢åæ»ä»·ï¼</span> |
| | | <span class="value">Â¥{{ (detailInfo.order.totalAmount / 100).toFixed(2) }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ä¿ä»·éé¢ï¼</span> |
| | | <span class="value">Â¥{{ (detailInfo.order.declaredAmount / 100).toFixed(2) }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç©åä¿è´¹ï¼</span> |
| | | <span class="value">Â¥{{ (detailInfo.order.declaredFee / 100).toFixed(2) }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é¢è®¡å¯å天æ°/é
ééç¨ï¼</span> |
| | | <span class="value">{{ detailInfo.order.estimatedDepositDays || '-' }}天/{{ detailInfo.order.distance || '-' }}å
Ž</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">客æ·å¤æ³¨ï¼</span> |
| | | <span class="value">{{ detailInfo.order.remark || '-' }}</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">ç©åæç
§ï¼</span> |
| | | <div v-if="detailInfo.depositImages && detailInfo.depositImages.length" class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.depositImages" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img" |
| | | :preview-src-list="detailInfo.depositImages" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | <span v-else>-</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">ä¼åä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">å§åï¼</span> |
| | | <span class="value">{{ detailInfo.memberName || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ææºå·ç ï¼</span> |
| | | <span class="value">{{ detailInfo.memberPhone || '-' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">é
éä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">æ¶ä»¶äººï¼</span> |
| | | <span class="value">{{ detailInfo.order.takeUser || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æ¶ä»¶äººçµè¯ï¼</span> |
| | | <span class="value">{{ detailInfo.order.takePhone || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å¯ä»¶å°åï¼</span> |
| | | <span class="value">{{ detailInfo.order.depositLocation || '' }}{{ detailInfo.order.depositLocationRemark || '' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æ¶ä»¶å°åï¼</span> |
| | | <span class="value">{{ detailInfo.order.takeLocation || '' }}{{ detailInfo.order.takeLocationRemark || '' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æ¯å¦æ¶ä»¶æå¡ç¹ï¼</span> |
| | | <span class="value">{{ detailInfo.order.takeShopId ? 'æ¯' : 'å¦' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é
é叿ºï¼</span> |
| | | <span class="value">{{ detailInfo.driverName || '-' }}</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">é¨åºæ¶ä»¶æç
§ï¼</span> |
| | | <div v-if="detailInfo.storeInImages && detailInfo.storeInImages.length" class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.storeInImages" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img" |
| | | :preview-src-list="detailInfo.storeInImages" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">叿ºåä»¶æç
§ï¼</span> |
| | | <div v-if="detailInfo.driverTakeImages && detailInfo.driverTakeImages.length" class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.driverTakeImages" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img" |
| | | :preview-src-list="detailInfo.driverTakeImages" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">叿ºéè¾¾æç
§/é¨åºå
¥åºæç
§ï¼</span> |
| | | <div v-if="detailInfo.driverDoneImages && detailInfo.driverDoneImages.length" class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.driverDoneImages" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img" |
| | | :preview-src-list="detailInfo.driverDoneImages" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | <span v-else>-</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">é¨åºåºåºæç
§ï¼</span> |
| | | <div v-if="detailInfo.storeOutImages && detailInfo.storeOutImages.length" class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.storeOutImages" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img" |
| | | :preview-src-list="detailInfo.storeOutImages" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | <span v-else>-</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">åæ¶ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">åæ¶æä½äººï¼</span> |
| | | <span class="value">{{ detailInfo.platformUserName || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">åæ¶æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.order.cancelTime || '-' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section" v-if="detailInfo.ordersRefund"> |
| | | <div class="section-header"> |
| | | <span class="section-title">鿬¾ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">鿬¾çç±ï¼</span> |
| | | <span class="value">{{ detailInfo.ordersRefund.cancelInfo || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">鿬¾ç³è¯·æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.ordersRefund.createTime || '-' }}</span> |
| | | </div> |
| | | |
| | | |
| | | <div class="info-item"> |
| | | <span class="label">鿬¾éé¢ï¼</span> |
| | | <span class="value">{{ detailInfo.ordersRefund.createTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">鿬¾å¤çæ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.ordersRefund.refundTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">鿬¾æ¹å¼ï¼</span> |
| | | <span class="value" v-if="detailInfo.ordersRefund.type === 0">æªåä»¶ç´æ¥åæ¶</span> |
| | | <span class="value" v-else-if="detailInfo.ordersRefund.type === 1">å¹³å°ç´æ¥åæ¶</span> |
| | | <span class="value" v-else-if="detailInfo.ordersRefund.type === 2">å·²åä»¶ç³è¯·åæ¶</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">鿬¾å¤æ³¨ï¼</span> |
| | | <span class="value">{{ detailInfo.ordersRefund.remark || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æä½äººï¼</span> |
| | | <span class="value">{{ detailInfo.platformUserName || '-' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æä½æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.ordersRefund.updateTime || '-' }}</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">é¨åºé款æç
§ï¼</span> |
| | | <div v-if="detailInfo.refundTakeImages && detailInfo.refundTakeImages.length" class="image-list"> |
| | | <el-image |
| | | v-for="(img, index) in detailInfo.refundTakeImages" |
| | | :key="index" |
| | | style="width: 80px; height: 80px; margin-right: 10px" |
| | | :src="img" |
| | | :preview-src-list="detailInfo.refundTakeImages" |
| | | fit="cover" |
| | | ></el-image> |
| | | </div> |
| | | <span v-else>-</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">ç©åä¿¡æ¯</span> |
| | | </div> |
| | | <el-table :data="detailInfo.detailList" stripe class="goods-table"> |
| | | <el-table-column prop="typeName" label="ç©ååç§°" min-width="80px"></el-table-column> |
| | | <el-table-column prop="luggageName" label="ç©å尺寸" min-width="80px"></el-table-column> |
| | | <el-table-column label="åä»·ï¼å
ï¼" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | ¥{{ (row.unitPriceYuan / 100).toFixed(2) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="num" label="æ°é" min-width="60px"></el-table-column> |
| | | <el-table-column label="å°è®¡ï¼å
ï¼" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | ¥{{ (row.subtotal / 100).toFixed(2) }} |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div class="price-summary"> |
| | | <span>åºç¡æå¡è´¹ï¼Â¥{{ (detailInfo.order.price / 100).toFixed(2) }}</span> |
| | | <span>ç©åä¿è´¹ï¼Â¥{{ (detailInfo.order.declaredFee / 100).toFixed(2) }}</span> |
| | | <span>è®¢åæ»ä»·ï¼Â¥{{ (detailInfo.order.totalAmount / 100).toFixed(2) }}</span> |
| | | <span>å®é
æ¯ä»ï¼Â¥{{ (detailInfo.order.payAmount / 100).toFixed(2) }}</span> |
| | | <span>鿬¾éé¢ï¼Â¥{{ (detailInfo.order.refundAmount / 100).toFixed(2) }}</span> |
| | | <span>è¶
æ¶éé¢ï¼Â¥{{ (detailInfo.order.overdueAmount / 100).toFixed(2) }}</span> |
| | | <span>å¼å¸¸éé¢ï¼Â¥{{ (detailInfo.order.exceptionAmount / 100).toFixed(2) }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { getById } from '@/api/business/orderManagement' |
| | | |
| | | export default { |
| | | name: 'OperaOrderDetail', |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | title: '订å详æ
', |
| | | visible: false, |
| | | detailInfo: null |
| | | } |
| | | }, |
| | | methods: { |
| | | open (row) { |
| | | this.title = '订å详æ
' |
| | | getById(row.id).then(res => { |
| | | console.log(res) |
| | | this.detailInfo = res |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .order-detail { |
| | | |
| | | } |
| | | .section { |
| | | margin-bottom: 25px; |
| | | } |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10px; |
| | | margin-bottom: 15px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | padding: 0 10px; |
| | | } |
| | | .info-item { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-item.full-width { |
| | | grid-column: span 2; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | min-width: 140px; |
| | | } |
| | | .info-item .value { |
| | | color: #606266; |
| | | word-break: break-all; |
| | | } |
| | | .image-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | } |
| | | .goods-table { |
| | | margin-bottom: 15px; |
| | | } |
| | | .price-summary { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 11px; |
| | | padding: 15px; |
| | | background: #f5f7fa; |
| | | border-radius: 4px; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :withFooter="false" |
| | | :visible.sync="visible" |
| | | width="80%" |
| | | > |
| | | <div class="store-header" v-if="storeInfo"> |
| | | <div class="store-header-left"> |
| | | <el-image :src="storeInfo.payMemberCoverImage ? storeInfo.imgPrefix + storeInfo.payMemberCoverImage : ''" fit="cover" class="store-avatar"> |
| | | <div slot="error" class="image-slot"> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> |
| | | </el-image> |
| | | </div> |
| | | <div class="store-header-right"> |
| | | <div class="store-name">{{ storeInfo.name }}</div> |
| | | <div class="store-info-row"> |
| | | <span class="info-item"> |
| | | <span class="label">é¨åºç±»åï¼</span> |
| | | <span class="value">{{ storeInfo.companyType === 1 ? 'ä¼ä¸' : '个人' }}</span> |
| | | </span> |
| | | <span class="info-item"> |
| | | <span class="label">è系人ï¼</span> |
| | | <span class="value">{{ storeInfo.linkName }}</span> |
| | | </span> |
| | | <span class="info-item"> |
| | | <span class="label">èç³»çµè¯ï¼</span> |
| | | <span class="value">{{ storeInfo.linkPhone }}</span> |
| | | </span> |
| | | <span class="info-item"> |
| | | <span class="label">身份è¯å·ï¼</span> |
| | | <span class="value">{{ storeInfo.idcard }}</span> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="qualification-content" v-if="storeInfo"> |
| | | <div class="qualification-section"> |
| | | <h4 class="section-title">åºæ¬ä¿¡æ¯</h4> |
| | | <div class="info-grid"> |
| | | <div class="info-row"> |
| | | <span class="label">æå¨çå¸åºï¼</span> |
| | | <span class="value">{{ storeInfo.provinceName || '' }} {{ storeInfo.cityName || '' }} {{ storeInfo.areaName || '' }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">é¨åºå°åï¼</span> |
| | | <span class="value">{{ storeInfo.address }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">é¨åºç¶æï¼</span> |
| | | <span class="value">{{ storeInfo.auditStatus === 0 ? 'å¾
审æ¹' : storeInfo.auditStatus === 1 ? '审æ¹éè¿' : 'å®¡æ¹æªéè¿' }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">é
éèå´ï¼</span> |
| | | <span class="value">{{ storeInfo.deliveryRange || 'ææ ' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="qualification-section"> |
| | | <h4 class="section-title">主ä½èµè´¨</h4> |
| | | <template v-if="storeInfo.companyType === 1"> |
| | | <div class="info-grid"> |
| | | <div class="info-row"> |
| | | <span class="label">æ³äººå§åï¼</span> |
| | | <span class="value">{{ storeInfo.legalPersonName }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">æ³äººææºå·ï¼</span> |
| | | <span class="value">{{ storeInfo.legalPersonPhone }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">æ³äººèº«ä»½è¯å·ç ï¼</span> |
| | | <span class="value">{{ storeInfo.legalPersonCard }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="image-section"> |
| | | <div class="image-item"> |
| | | <span class="label">æ³äººèº«ä»½è¯æ£é¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImg]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item"> |
| | | <span class="label">æ³äººèº«ä»½è¯åé¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImgBack" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImgBack]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item"> |
| | | <span class="label">è¥ä¸æ§ç
§ï¼</span> |
| | | <el-image :src="storeInfo.businessImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.businessImg]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <template v-else> |
| | | <div class="image-item-row"> |
| | | <span class="label">èº«ä»½è¯æ£é¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImg]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">身份è¯åé¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImgBack" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImgBack]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">ææå³å¨ååï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.laborContractImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.laborContractImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">社ä¿ç¼´çº³è¯æï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.socialSecurityImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.socialSecurityImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </div> |
| | | |
| | | <div class="qualification-section" v-if="storeInfo.companyType === 1"> |
| | | <h4 class="section-title">é¨åºç
§çåå
¶ä»ææ</h4> |
| | | <div class="image-item-row"> |
| | | <span class="label">é¨åºé¨å¤´ç
§ï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.storeFrontImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.storeFrontImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">é¨åºå
é¨ç
§çï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.storeInteriorImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.storeInteriorImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">å
¶å®ææï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.otherMaterialImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.otherMaterialImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="approval-section" v-if="storeInfo && storeInfo.auditStatus !== 0"> |
| | | <div class="approval-result" :class="storeInfo.auditStatus === 1 ? 'approval-pass' : 'approval-reject'"> |
| | | <div class="approval-status" v-if="storeInfo.auditStatus === 1"> |
| | | <i class="el-icon-circle-check"></i> |
| | | <span>å®¡æ ¸éè¿</span> |
| | | </div> |
| | | <div class="approval-status" v-else> |
| | | <i class="el-icon-circle-close"></i> |
| | | <span>å®¡æ ¸æç»</span> |
| | | </div> |
| | | <div class="approval-info" v-if="storeInfo.auditStatus === 1"> |
| | | <span class="info-item">å®¡æ ¸æ¶é´ï¼{{ storeInfo.auditTime }}</span> |
| | | <span class="info-item">å®¡æ ¸äººï¼{{ storeInfo.auditName }}</span> |
| | | </div> |
| | | <div class="approval-info" v-else> |
| | | <div class="info-item" v-if="storeInfo.auditRemark">夿³¨ï¼{{ storeInfo.auditRemark }}</div> |
| | | <div class="info-item">å®¡æ ¸æ¶é´ï¼{{ storeInfo.auditTime }}</div> |
| | | <div class="info-item">å®¡æ ¸äººï¼{{ storeInfo.auditName }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="approval-form" v-if="storeInfo && storeInfo.auditStatus === 0"> |
| | | <el-form ref="approvalForm" :model="approvalForm" :rules="approvalRules"> |
| | | <el-form-item label="审æ¹ç»æ" prop="auditStatus"> |
| | | <el-radio-group v-model="approvalForm.auditStatus" @change="handleAuditStatusChange"> |
| | | <el-radio :label="0">éè¿</el-radio> |
| | | <el-radio :label="1">æç»</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§" prop="auditRemark"> |
| | | <el-input |
| | | v-model="approvalForm.auditRemark" |
| | | type="textarea" |
| | | :rows="2" |
| | | :placeholder="approvalForm.auditStatus === 2 ? '请è¾å
¥æç»åå ï¼å¿
å¡«ï¼' : '请è¾å
¥å®¡æ¹æè§'" |
| | | style="width: 300px" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <section class="approval-buttons"> |
| | | <el-button type="primary" @click="handleSubmit" :loading="isWorking.submit">æäº¤</el-button> |
| | | <el-button @click="handleCancel">åæ¶</el-button> |
| | | </section> |
| | | </el-form> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseOpera from '@/components/base/BaseOpera' |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { detail, audit } from '@/api/business/shopInfo' |
| | | |
| | | export default { |
| | | name: 'OperaShopApprovalWindow', |
| | | extends: BaseOpera, |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | storeInfo: null, |
| | | approvalForm: { |
| | | id: null, |
| | | auditStatus: 0, |
| | | auditRemark: '' |
| | | }, |
| | | approvalRules: { |
| | | auditRemark: [ |
| | | { required: true, message: '请è¾å
¥æç»åå ', trigger: 'blur' } |
| | | ] |
| | | }, |
| | | isWorking: { |
| | | submit: false |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/shopInfo', |
| | | 'field.id': 'id' |
| | | }) |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | this.approvalForm = { |
| | | id: row.id, |
| | | auditStatus: 1, |
| | | auditRemark: '' |
| | | } |
| | | detail(row.id) |
| | | .then(res => { |
| | | this.storeInfo = res |
| | | this.visible = true |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | handleAuditStatusChange (val) { |
| | | if (val === 1) { |
| | | this.approvalRules.auditRemark = [] |
| | | } else { |
| | | this.approvalRules.auditRemark = [{ required: true, message: '请è¾å
¥æç»åå ', trigger: 'blur' }] |
| | | } |
| | | }, |
| | | handleSubmit () { |
| | | this.$refs.approvalForm.validate(valid => { |
| | | if (!valid) return |
| | | this.isWorking.submit = true |
| | | audit(this.approvalForm) |
| | | .then(res => { |
| | | this.$tip.apiSuccess(res || 'æäº¤æå') |
| | | this.visible = false |
| | | this.$emit('success') |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.submit = false |
| | | }) |
| | | }) |
| | | }, |
| | | handleCancel () { |
| | | this.visible = false |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .store-header { |
| | | display: flex; |
| | | background: #f5f7fa; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .store-header-left { |
| | | margin-right: 20px; |
| | | } |
| | | .store-avatar { |
| | | width: 80px; |
| | | height: 80px; |
| | | border-radius: 50%; |
| | | } |
| | | .store-header-right { |
| | | flex: 1; |
| | | } |
| | | .store-name { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 10px; |
| | | } |
| | | .store-info-row { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 20px; |
| | | } |
| | | .info-item { |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | } |
| | | .qualification-content { |
| | | padding: 20px; |
| | | } |
| | | .qualification-section { |
| | | margin-bottom: 30px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 15px; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .info-row { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-row .label { |
| | | color: #909399; |
| | | min-width: 100px; |
| | | } |
| | | .info-row .value { |
| | | color: #606266; |
| | | } |
| | | .image-section { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 30px; |
| | | } |
| | | .image-item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | .image-item-row { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | margin-bottom: 20px; |
| | | } |
| | | .image-item-row .label { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | min-width: 120px; |
| | | } |
| | | .image-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 10px; |
| | | } |
| | | .image-item .label { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | margin-bottom: 8px; |
| | | } |
| | | .qualification-image { |
| | | width: 150px; |
| | | height: 100px; |
| | | border-radius: 4px; |
| | | border: 1px solid #eee; |
| | | } |
| | | .image-slot { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: #f5f7fa; |
| | | color: #909399; |
| | | font-size: 20px; |
| | | } |
| | | .approval-section { |
| | | padding: 20px; |
| | | } |
| | | .approval-result { |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | } |
| | | .approval-pass { |
| | | background: #f0f9eb; |
| | | border: 1px solid #67c23a; |
| | | } |
| | | .approval-reject { |
| | | background: #fef0f0; |
| | | border: 1px solid #f56c6c; |
| | | } |
| | | .approval-status { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | margin-bottom: 15px; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10px; |
| | | } |
| | | .approval-pass .approval-status { |
| | | color: #67c23a; |
| | | } |
| | | .approval-reject .approval-status { |
| | | color: #f56c6c; |
| | | } |
| | | .approval-info { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 30px; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | .approval-form { |
| | | padding: 20px; |
| | | border-top: 1px solid #eee; |
| | | background: #f5f7fa; |
| | | border-radius: 8px; |
| | | margin-top: 20px; |
| | | } |
| | | .approval-buttons { |
| | | margin-top: 20px; |
| | | } |
| | | </style> |
| | |
| | | <GlobalWindow |
| | | title="ç¼è¾é¨åº" |
| | | :visible.sync="visible" |
| | | width="60%" |
| | | width="600px" |
| | | :confirm-working="isWorking.save" |
| | | @confirm="handleConfirm" |
| | | > |
| | | <el-form ref="form" :model="form" label-width="120px" :rules="rules" class="inline-form"> |
| | | <el-form ref="form" :model="form" :rules="rules"> |
| | | <div class="form-section"> |
| | | <h4 class="section-title">è´¦å·ä¿¡æ¯</h4> |
| | | <el-form-item label="æ³¨åææºå·" prop="telephone"> |
| | |
| | | this.$refs.form.validate(valid => { |
| | | if (!valid) return |
| | | this.isWorking.save = true |
| | | const imageFields = ['businessImg', 'idcardImg', 'idcardImgBack', 'laborContractImgs', 'socialSecurityImgs', 'storeFrontImgs', 'storeInteriorImgs', 'otherMaterialImgs'] |
| | | const imageFields = ['laborContractImgs', 'socialSecurityImgs', 'storeFrontImgs', 'storeInteriorImgs', 'otherMaterialImgs'] |
| | | const singleImageFields = ['businessImg', 'idcardImg', 'idcardImgBack'] |
| | | const data = { ...this.form } |
| | | singleImageFields.forEach(field => { |
| | | if (data[field] && Array.isArray(data[field])) { |
| | | data[field] = data[field].map(item => typeof item === 'object' ? item.fileurl : item).join(',') |
| | | } |
| | | }) |
| | | imageFields.forEach(field => { |
| | | if (data[field]) { |
| | | const list = Array.isArray(data[field]) ? data[field] : [data[field]] |
| | | data[field] = list.map(item => typeof item === 'object' ? item.fileurl : item).join(',') |
| | | if (data[field] && Array.isArray(data[field])) { |
| | | data[field] = data[field].map(item => typeof item === 'object' ? item.fileurl : item) |
| | | } |
| | | }) |
| | | data.provinceId = this.form.areaCode[0] || '' |
| | |
| | | .password-tip { |
| | | color: #909399; |
| | | font-size: 12px; |
| | | margin: -10px 0 15px 120px; |
| | | margin: -10px 0 15px 0; |
| | | } |
| | | .longitude-latitude { |
| | | display: flex; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :withFooter="false" |
| | | :visible.sync="visible" |
| | | width="80%" |
| | | > |
| | | <div class="store-header" v-if="storeInfo"> |
| | | <div class="store-header-left"> |
| | | <el-image :src="storeInfo.payMemberCoverImage ? storeInfo.imgPrefix + storeInfo.payMemberCoverImage : ''" fit="cover" class="store-avatar"> |
| | | <div slot="error" class="image-slot"> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> |
| | | </el-image> |
| | | </div> |
| | | <div class="store-header-right"> |
| | | <div class="store-name">{{ storeInfo.name }}</div> |
| | | <div class="store-info-row"> |
| | | <span class="info-item"> |
| | | <span class="label">é¨åºç±»åï¼</span> |
| | | <span class="value">{{ storeInfo.companyType === 1 ? 'ä¼ä¸' : '个人' }}</span> |
| | | </span> |
| | | <span class="info-item"> |
| | | <span class="label">è系人ï¼</span> |
| | | <span class="value">{{ storeInfo.linkName }}</span> |
| | | </span> |
| | | <span class="info-item"> |
| | | <span class="label">èç³»çµè¯ï¼</span> |
| | | <span class="value">{{ storeInfo.linkPhone }}</span> |
| | | </span> |
| | | <span class="info-item"> |
| | | <span class="label">身份è¯å·ï¼</span> |
| | | <span class="value">{{ storeInfo.idcard }}</span> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="approval-section" v-if="storeInfo && storeInfo.auditStatus !== 0"> |
| | | <div class="approval-result" :class="storeInfo.auditStatus === 1 ? 'approval-pass' : 'approval-reject'"> |
| | | <div class="approval-status" v-if="storeInfo.auditStatus === 1"> |
| | | <i class="el-icon-circle-check"></i> |
| | | <span>å®¡æ ¸éè¿</span> |
| | | </div> |
| | | <div class="approval-status" v-else> |
| | | <i class="el-icon-circle-close"></i> |
| | | <span>å®¡æ ¸æç»</span> |
| | | </div> |
| | | <div class="approval-info" v-if="storeInfo.auditStatus === 1"> |
| | | <span class="info-item">å®¡æ ¸æ¶é´ï¼{{ storeInfo.auditTime }}</span> |
| | | <span class="info-item">å®¡æ ¸äººï¼{{ storeInfo.auditName }}</span> |
| | | </div> |
| | | <div class="approval-info" v-else> |
| | | <div class="info-item" v-if="storeInfo.auditRemark">夿³¨ï¼{{ storeInfo.auditRemark }}</div> |
| | | <div class="info-item">å®¡æ ¸æ¶é´ï¼{{ storeInfo.auditTime }}</div> |
| | | <div class="info-item">å®¡æ ¸äººï¼{{ storeInfo.auditName }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="qualification-content" v-if="storeInfo"> |
| | | <div class="qualification-section"> |
| | | <h4 class="section-title">åºæ¬ä¿¡æ¯</h4> |
| | | <div class="info-grid"> |
| | | <div class="info-row"> |
| | | <span class="label">æå¨çå¸åºï¼</span> |
| | | <span class="value">{{ storeInfo.provinceName || '' }} {{ storeInfo.cityName || '' }} {{ storeInfo.areaName || '' }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">é¨åºå°åï¼</span> |
| | | <span class="value">{{ storeInfo.address }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">é¨åºç¶æï¼</span> |
| | | <span class="value">{{ storeInfo.auditStatus === 0 ? 'å¾
审æ¹' : storeInfo.auditStatus === 1 ? '审æ¹éè¿' : 'å®¡æ¹æªéè¿' }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">é
éèå´ï¼</span> |
| | | <span class="value">{{ storeInfo.deliveryRange || 'ææ ' }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="qualification-section"> |
| | | <h4 class="section-title">主ä½èµè´¨</h4> |
| | | <template v-if="storeInfo.companyType === 1"> |
| | | <div class="info-grid"> |
| | | <div class="info-row"> |
| | | <span class="label">æ³äººå§åï¼</span> |
| | | <span class="value">{{ storeInfo.legalPersonName }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">æ³äººææºå·ï¼</span> |
| | | <span class="value">{{ storeInfo.legalPersonPhone }}</span> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="label">æ³äººèº«ä»½è¯å·ç ï¼</span> |
| | | <span class="value">{{ storeInfo.legalPersonCard }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="image-section"> |
| | | <div class="image-item"> |
| | | <span class="label">æ³äººèº«ä»½è¯æ£é¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImg]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item"> |
| | | <span class="label">æ³äººèº«ä»½è¯åé¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImgBack" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImgBack]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item"> |
| | | <span class="label">è¥ä¸æ§ç
§ï¼</span> |
| | | <el-image :src="storeInfo.businessImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.businessImg]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <template v-else> |
| | | <div class="image-item-row"> |
| | | <span class="label">èº«ä»½è¯æ£é¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImg]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">身份è¯åé¢ï¼</span> |
| | | <el-image :src="storeInfo.idcardImgBack" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImgBack]"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">ææå³å¨ååï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.laborContractImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.laborContractImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">社ä¿ç¼´çº³è¯æï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.socialSecurityImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.socialSecurityImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </div> |
| | | |
| | | <div class="qualification-section" v-if="storeInfo.companyType === 1"> |
| | | <h4 class="section-title">é¨åºç
§çåå
¶ä»ææ</h4> |
| | | <div class="image-item-row"> |
| | | <span class="label">é¨åºé¨å¤´ç
§ï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.storeFrontImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.storeFrontImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">é¨åºå
é¨ç
§çï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.storeInteriorImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.storeInteriorImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | <div class="image-item-row"> |
| | | <span class="label">å
¶å®ææï¼</span> |
| | | <div class="image-list"> |
| | | <el-image v-for="(img, index) in storeInfo.otherMaterialImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.otherMaterialImgs"> |
| | | <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div> |
| | | </el-image> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseOpera from '@/components/base/BaseOpera' |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { detail, audit } from '@/api/business/shopInfo' |
| | | |
| | | export default { |
| | | name: 'OperaShopInfoSeeWindow', |
| | | extends: BaseOpera, |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | storeInfo: null, |
| | | approvalForm: { |
| | | id: null, |
| | | auditStatus: 0, |
| | | auditRemark: '' |
| | | }, |
| | | approvalRules: { |
| | | auditRemark: [ |
| | | { required: true, message: '请è¾å
¥æç»åå ', trigger: 'blur' } |
| | | ] |
| | | }, |
| | | isWorking: { |
| | | submit: false |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/shopInfo', |
| | | 'field.id': 'id' |
| | | }) |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | this.approvalForm = { |
| | | id: row.id, |
| | | auditStatus: 1, |
| | | auditRemark: '' |
| | | } |
| | | detail(row.id) |
| | | .then(res => { |
| | | this.storeInfo = res |
| | | this.visible = true |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | handleAuditStatusChange (val) { |
| | | if (val === 1) { |
| | | this.approvalRules.auditRemark = [] |
| | | } else { |
| | | this.approvalRules.auditRemark = [{ required: true, message: '请è¾å
¥æç»åå ', trigger: 'blur' }] |
| | | } |
| | | }, |
| | | handleSubmit () { |
| | | this.$refs.approvalForm.validate(valid => { |
| | | if (!valid) return |
| | | this.isWorking.submit = true |
| | | audit(this.approvalForm) |
| | | .then(res => { |
| | | this.$tip.apiSuccess(res || 'æäº¤æå') |
| | | this.visible = false |
| | | this.$emit('success') |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.submit = false |
| | | }) |
| | | }) |
| | | }, |
| | | handleCancel () { |
| | | this.visible = false |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .store-header { |
| | | display: flex; |
| | | background: #f5f7fa; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .store-header-left { |
| | | margin-right: 20px; |
| | | } |
| | | .store-avatar { |
| | | width: 80px; |
| | | height: 80px; |
| | | border-radius: 50%; |
| | | } |
| | | .store-header-right { |
| | | flex: 1; |
| | | } |
| | | .store-name { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 10px; |
| | | } |
| | | .store-info-row { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 20px; |
| | | } |
| | | .info-item { |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | } |
| | | .qualification-content { |
| | | padding: 20px; |
| | | } |
| | | .qualification-section { |
| | | margin-bottom: 30px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 15px; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .info-row { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-row .label { |
| | | color: #909399; |
| | | min-width: 100px; |
| | | } |
| | | .info-row .value { |
| | | color: #606266; |
| | | } |
| | | .image-section { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 30px; |
| | | } |
| | | .image-item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | .image-item-row { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | margin-bottom: 20px; |
| | | } |
| | | .image-item-row .label { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | min-width: 120px; |
| | | } |
| | | .image-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 10px; |
| | | } |
| | | .image-item .label { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | margin-bottom: 8px; |
| | | } |
| | | .qualification-image { |
| | | width: 150px; |
| | | height: 100px; |
| | | border-radius: 4px; |
| | | border: 1px solid #eee; |
| | | } |
| | | .image-slot { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: #f5f7fa; |
| | | color: #909399; |
| | | font-size: 20px; |
| | | } |
| | | .approval-section { |
| | | padding: 20px; |
| | | } |
| | | .approval-result { |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | } |
| | | .approval-pass { |
| | | background: #f0f9eb; |
| | | border: 1px solid #67c23a; |
| | | } |
| | | .approval-reject { |
| | | background: #fef0f0; |
| | | border: 1px solid #f56c6c; |
| | | } |
| | | .approval-status { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | margin-bottom: 15px; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10px; |
| | | } |
| | | .approval-pass .approval-status { |
| | | color: #67c23a; |
| | | } |
| | | .approval-reject .approval-status { |
| | | color: #f56c6c; |
| | | } |
| | | .approval-info { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 30px; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :withFooter="false" |
| | | :visible.sync="visible" |
| | | width="80%" |
| | | > |
| | | <div class="store-header" v-if="storeInfo"> |
| | | <div class="store-header-left"> |
| | | <!-- <el-image :src="storeInfo.headImage || defaultAvatar" fit="cover" class="store-avatar"> |
| | | <el-image :src="storeInfo.payMemberCoverImage ? storeInfo.imgPrefix + storeInfo.payMemberCoverImage : ''" fit="cover" class="store-avatar"> |
| | | <div slot="error" class="image-slot"> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> |
| | | </el-image> --> |
| | | </el-image> |
| | | </div> |
| | | <div class="store-header-right"> |
| | | <div class="store-name">{{ storeInfo.name }}</div> |
| | |
| | | <el-tabs v-model="activeTab" class="store-tabs"> |
| | | <el-tab-pane label="é¨åºä¸ç»©" name="performance"> |
| | | <el-form ref="searchForm" :model="searchForm" inline> |
| | | <el-form-item label="交æå·" prop="transactionId"> |
| | | <el-input v-model="searchForm.transactionId" clearable placeholder="请è¾å
¥äº¤æå·"></el-input> |
| | | <el-form-item label="交æå·" prop="orderNo"> |
| | | <el-input v-model="searchForm.orderNo" clearable placeholder="请è¾å
¥äº¤æå·"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶æ¯ç±»å" prop="type"> |
| | | <el-select v-model="searchForm.type" clearable placeholder="è¯·éæ©ç±»å"> |
| | | <el-option label="å
¨é¨" :value="0"></el-option> |
| | | <el-form-item label="æ¶æ¯ç±»å" prop="optType"> |
| | | <el-select v-model="searchForm.optType" clearable placeholder="è¯·éæ©ç±»å"> |
| | | <el-option label="å
¨é¨" value=""></el-option> |
| | | <el-option label="æ¶å
¥" :value="1"></el-option> |
| | | <el-option label="æ¯åº" :value="2"></el-option> |
| | | <el-option label="æ¯åº" :value="-1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶æ¯æ¶é´" prop="createTime"> |
| | |
| | | <el-table :data="tableData.list" border stripe v-loading="isWorking.search" class="performance-table"> |
| | | <el-table-column label="æ¶å
¥/æ¯åº" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span :class="row.type === 1 ? 'income' : 'expense'">{{ row.type === 1 ? 'æ¶å
¥' : 'æ¯åº' }}</span> |
| | | <span :class="row.optType === 1 ? 'income' : 'expense'">{{ row.optType === 1 ? 'æ¶å
¥' : 'æ¯åº' }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="amount" label="éé¢ï¼å
ï¼" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span :class="row.type === 1 ? 'income' : 'expense'">{{ row.amount }}</span> |
| | | <span :class="row.optType === 1 ? 'income' : 'expense'">{{ row.amount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="createTime" label="æ¶æ¯æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column prop="businessType" label="ä¸å¡ç±»å" min-width="100px"></el-table-column> |
| | | <el-table-column prop="transactionId" label="交æå·" min-width="180px"></el-table-column> |
| | | <el-table-column label="ä¸å¡ç±»å" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span v-if="row.type === 0">å®æè®¢å</span> |
| | | <span v-if="row.type === 1">æç°æ¯åº</span> |
| | | <span v-if="row.type === 2">æç°éå</span> |
| | | <span v-if="row.type === 3">å¹³å°å¥å±</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="orderNo" label="交æå·" min-width="180px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span :class="row.status === 1 ? 'status-success' : 'status-pending'"> |
| | | {{ row.status === 1 ? 'å·²å°è´¦' : 'æç°ä¸' }} |
| | | <span :class="row.vaildStatus === 1 ? 'status-success' : 'status-pending'"> |
| | | {{ row.vaildStatus === 1 ? 'å·²å°è´¦' : 'æç°ä¸' }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import { detail } from '@/api/business/shopInfo' |
| | | import { fetchList, exportExcel } from '@/api/business/revenue' |
| | | export default { |
| | | name: 'OperaShopInfoWindow', |
| | | extends: BaseOpera, |
| | |
| | | activeTab: 'performance', |
| | | storeInfo: null, |
| | | searchForm: { |
| | | transactionId: '', |
| | | type: 0, |
| | | createTime: '' |
| | | orderNo: '', |
| | | optType: 0, |
| | | createTime: '', |
| | | memberId: '', |
| | | memberType: 2 |
| | | }, |
| | | tableData: { |
| | | list: [], |
| | |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.searchForm.memberId = row.id |
| | | detail(row.id) |
| | | .then(res => { |
| | | this.storeInfo = res |
| | | this.activeTab = 'performance' |
| | | this.searchForm = { |
| | | transactionId: '', |
| | | type: 0, |
| | | createTime: '' |
| | | orderNo: '', |
| | | optType: '', |
| | | createTime: '', |
| | | memberId: '', |
| | | memberType: 2 |
| | | } |
| | | this.title = title |
| | | this.visible = true |
| | |
| | | search () { |
| | | this.isWorking.search = true |
| | | const data = { |
| | | pageIndex: this.tableData.pagination.pageIndex, |
| | | pageSize: this.tableData.pagination.pageSize, |
| | | shopId: this.storeInfo?.id, |
| | | transactionId: this.searchForm.transactionId, |
| | | type: this.searchForm.type, |
| | | startTime: this.searchForm.createTime?.[0] || '', |
| | | endTime: this.searchForm.createTime?.[1] || '' |
| | | capacity: this.tableData.pagination.pageSize, |
| | | page: this.tableData.pagination.pageIndex, |
| | | model: { |
| | | orderNo: this.searchForm.orderNo, |
| | | optType: this.searchForm.optType, |
| | | startTime: this.searchForm.createTime?.[0] || '', |
| | | endTime: this.searchForm.createTime?.[1] || '', |
| | | memberId: this.searchForm.memberId, |
| | | memberType: this.searchForm.memberType || '' |
| | | } |
| | | } |
| | | this.api.fetchPerformance(data) |
| | | fetchList(data) |
| | | .then(res => { |
| | | this.tableData.list = res.list || [] |
| | | this.tableData.pagination.total = res.total || 0 |
| | |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | transactionId: '', |
| | | type: 0, |
| | | createTime: '' |
| | | orderNo: '', |
| | | optType: '', |
| | | createTime: '', |
| | | memberId: '', |
| | | memberType: 2 |
| | | } |
| | | this.search() |
| | | }, |
| | |
| | | exportExcel () { |
| | | this.isWorking.export = true |
| | | const data = { |
| | | shopId: this.storeInfo?.id, |
| | | transactionId: this.searchForm.transactionId, |
| | | type: this.searchForm.type, |
| | | startTime: this.searchForm.createTime?.[0] || '', |
| | | endTime: this.searchForm.createTime?.[1] || '' |
| | | capacity: 999999, |
| | | page: this.tableData.pagination.pageIndex, |
| | | model: { |
| | | orderNo: this.searchForm.orderNo, |
| | | optType: this.searchForm.optType, |
| | | startTime: this.searchForm.createTime?.[0] || '', |
| | | endTime: this.searchForm.createTime?.[1] || '', |
| | | memberId: this.searchForm.memberId, |
| | | memberType: this.searchForm.memberType || '' |
| | | } |
| | | } |
| | | this.api.exportPerformance(data) |
| | | exportExcel(data) |
| | | .then(res => { |
| | | this.download(res) |
| | | this.$tip.apiSuccess('å¯¼åºæå') |
| | | }) |
| | | .catch(e => { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <GlobalWindow |
| | | :title="title" |
| | | :visible.sync="visible" |
| | | :withFooter="false" |
| | | width="70%" |
| | | :confirm-working="isWorking.submit" |
| | | @confirm="handleConfirm" |
| | | > |
| | | <div class="detail-container"> |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">åºæ¬ä¿¡æ¯</span> |
| | | <span class="status-tag" :class="getStatusClass(detailInfo.status)"> |
| | | {{ getStatusText(detailInfo.status) }} |
| | | </span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">é¨åºåç§°ï¼</span> |
| | | <span class="value">{{ detailInfo.shopName }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">é¨åºè系人ï¼</span> |
| | | <span class="value">{{ detailInfo.linkName }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç³è¯·æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.createTime }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <div class="section-header"> |
| | | <span class="section-title">æç°ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">æç°éé¢ï¼</span> |
| | | <span class="value amount">Â¥{{ detailInfo.amount / 100 }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">æç°è´¦æ·ï¼</span> |
| | | <span class="value">{{ detailInfo.aliAccount }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å®¡æ ¸äººï¼</span> |
| | | <span class="value">{{ detailInfo.updateUserName }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å®¡æ ¸æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.updateTime }}</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">å®¡æ ¸å¤æ³¨ï¼</span> |
| | | <span class="value">{{ detailInfo.approveRemark }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section" v-if="detailInfo.status !== 0"> |
| | | <div class="section-header"> |
| | | <span class="section-title">审æ¹ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">å®¡æ ¸äººï¼</span> |
| | | <span class="value">{{ detailInfo.updateUserName }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å®¡æ ¸æ¶é´ï¼</span> |
| | | <span class="value">{{ detailInfo.updateTime }}</span> |
| | | </div> |
| | | <div class="info-item full-width"> |
| | | <span class="label">å®¡æ ¸å¤æ³¨ï¼</span> |
| | | <span class="value">{{ detailInfo.approveRemark }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="approval-form" v-if="detailInfo.status === 0"> |
| | | <el-form ref="approvalForm" :model="approvalForm" :rules="approvalRules"> |
| | | <el-form-item label="审æ¹ç»æ" prop="status"> |
| | | <el-radio-group v-model="approvalForm.status"> |
| | | <el-radio :label="1">éè¿</el-radio> |
| | | <el-radio :label="2">驳å</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="approveRemark"> |
| | | <el-input |
| | | v-model="approvalForm.approveRemark" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥å¤æ³¨" |
| | | style="width: 100%" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="approval-buttons"> |
| | | <el-button @click="visible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleConfirm" :loading="isWorking.submit">ç¡®å®</el-button> |
| | | </div> |
| | | </div> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { getById, approve } from '@/api/business/shopWithdraw' |
| | | |
| | | export default { |
| | | name: 'OperaWithdrawDetailWindow', |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | title: 'æç°è¯¦æ
', |
| | | visible: false, |
| | | detailInfo: { |
| | | status: '', |
| | | shopName: '', |
| | | linkName: '', |
| | | createTime: '', |
| | | amount: '', |
| | | bankCardNo: '', |
| | | auditLogs: [] |
| | | }, |
| | | approvalForm: { |
| | | id: null, |
| | | status: 1, |
| | | approveRemark: '' |
| | | }, |
| | | approvalRules: { |
| | | status: [{ required: true, message: 'è¯·éæ©å®¡æ¹ç»æ', trigger: 'change' }] |
| | | }, |
| | | isWorking: { |
| | | submit: false |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | open (title, row) { |
| | | this.title = title |
| | | this.approvalForm.id = row.id |
| | | this.approvalForm.status = 1 |
| | | this.approvalForm.approveRemark = '' |
| | | getById(row.id).then(res => { |
| | | this.detailInfo = { |
| | | status: res.status, |
| | | shopName: res.shopName, |
| | | linkName: res.linkName, |
| | | createTime: res.createTime, |
| | | amount: res.amount, |
| | | bankCardNo: res.bankCardNo, |
| | | auditLogs: res.auditLogs || [], |
| | | updateUserName: res.updateUserName, |
| | | updateTime: res.updateTime, |
| | | approveRemark: res.approveRemark |
| | | } |
| | | this.visible = true |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | getStatusText (status) { |
| | | const map = { 0: 'æç°ç³è¯·ä¸', 1: 'æç°æå', 2: 'æç°å¤±è´¥' } |
| | | return map[status] || '-' |
| | | }, |
| | | getStatusClass (status) { |
| | | const map = { 0: 'status-pending', 1: 'status-success', 2: 'status-reject' } |
| | | return map[status] || '' |
| | | }, |
| | | handleConfirm () { |
| | | if (this.detailInfo.status !== 0) { |
| | | this.visible = false |
| | | return |
| | | } |
| | | this.$refs.approvalForm.validate(valid => { |
| | | if (!valid) return |
| | | this.isWorking.submit = true |
| | | approve(this.approvalForm).then(res => { |
| | | this.$tip.apiSuccess(res || 'æäº¤æå') |
| | | this.visible = false |
| | | this.$emit('success') |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }).finally(() => { |
| | | this.isWorking.submit = false |
| | | }) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .detail-container { |
| | | padding: 20px; |
| | | } |
| | | .section { |
| | | margin-bottom: 30px; |
| | | } |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 15px; |
| | | margin-bottom: 15px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .status-tag { |
| | | padding: 4px 12px; |
| | | border-radius: 4px; |
| | | font-size: 12px; |
| | | } |
| | | .status-pending { |
| | | background: #fdf6ec; |
| | | color: #E6A23C; |
| | | } |
| | | .status-success { |
| | | background: #f0f9eb; |
| | | color: #67C23A; |
| | | } |
| | | .status-reject { |
| | | background: #fef0f0; |
| | | color: #F56C6C; |
| | | } |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 15px; |
| | | padding: 0 10px; |
| | | } |
| | | .info-item { |
| | | display: flex; |
| | | font-size: 14px; |
| | | } |
| | | .info-item .label { |
| | | color: #909399; |
| | | min-width: 90px; |
| | | } |
| | | .info-item .value { |
| | | color: #606266; |
| | | } |
| | | .info-item .amount { |
| | | color: #f56c6c; |
| | | font-weight: bold; |
| | | } |
| | | .info-item.full-width { |
| | | grid-column: span 2; |
| | | } |
| | | .timeline-content { |
| | | padding: 10px; |
| | | background: #f5f7fa; |
| | | border-radius: 4px; |
| | | } |
| | | .timeline-title { |
| | | font-size: 14px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 8px; |
| | | } |
| | | .timeline-info { |
| | | display: flex; |
| | | gap: 20px; |
| | | font-size: 13px; |
| | | color: #606266; |
| | | margin-bottom: 5px; |
| | | } |
| | | .timeline-remark { |
| | | font-size: 13px; |
| | | color: #909399; |
| | | } |
| | | .approval-form { |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | border-top: 1px solid #eee; |
| | | } |
| | | .approval-form /deep/ .el-form-item { |
| | | margin-bottom: 15px; |
| | | } |
| | | .approval-form /deep/ .el-form-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | .approval-buttons { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 10px; |
| | | margin-top: 15px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:category:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="åç§°" prop="name"> |
| | | <el-input v-model="searchForm.name" clearable placeholder="请è¾å
¥åç§°" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <ul class="toolbar"> |
| | | <li><el-button type="primary" @click="$refs.operaGoodsCategoryEditWindow.open('æ°å»ºç©åç级', null, 4)" icon="el-icon-plus">æ°å»º</el-button></li> |
| | | </ul> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="id" label="ID" min-width="80px"></el-table-column> |
| | | <el-table-column prop="name" label="è¡æç±»å" min-width="120px"></el-table-column> |
| | | <el-table-column prop="remark" label="夿³¨è¯´æ" min-width="200px"></el-table-column> |
| | | <el-table-column prop="sortnum" label="æåº" min-width="100px"></el-table-column> |
| | | <el-table-column prop="createTime" label="æäº¤æ¶é´" min-width="100px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="150" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" @click="deleteById(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaGoodsCategoryEditWindow ref="operaGoodsCategoryEditWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaGoodsCategoryEditWindow from '@/components/business/OperaGoodsCategoryEditWindow' |
| | | import { updateStatus } from '@/api/business/goodsCategory' |
| | | |
| | | export default { |
| | | name: 'BaggageTypeList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaGoodsCategoryEditWindow }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | name: '', |
| | | type: 4 |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/goodsCategory', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleEdit (row) { |
| | | this.$refs.operaGoodsCategoryEditWindow.open('ç¼è¾ç©åç级', row, 4) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:banner:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="æ é¢" prop="title"> |
| | | <el-input v-model="searchForm.title" clearable placeholder="请è¾å
¥æ é¢" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <ul class="toolbar" v-permissions="['business:banner:create']"> |
| | | <li><el-button type="primary" @click="$refs.operaBannerEditWindow.open('æ°å»ºè½®æå¾',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:banner:create']">æ°å»º</el-button></li> |
| | | </ul> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="title" label="æ é¢" min-width="120px"></el-table-column> |
| | | <el-table-column prop="position" label="å±ç¤ºä½ç½®" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | {{ positionOptions[row.position] || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¾ç" min-width="120px"> |
| | | <template slot-scope="{row}"> |
| | | <el-image |
| | | v-if="row.imgurlFull" |
| | | style="width: 80px; height: 40px" |
| | | :src="row.imgurlFull" |
| | | fit="contain" |
| | | ></el-image> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="跳转æ¹å¼" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | {{ jumpTypeOptions[row.type] || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="sortnum" label="æåºç " min-width="80px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="updateTime" label="ä¿®æ¹æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column label="æä½" min-width="150" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" @click="deleteById(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaBannerEditWindow ref="operaBannerEditWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaBannerEditWindow from '@/components/business/OperaBannerEditWindow' |
| | | import { updateById, deleteById } from '@/api/business/banner' |
| | | |
| | | export default { |
| | | name: 'BannerList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaBannerEditWindow }, |
| | | data () { |
| | | return { |
| | | positionOptions: { |
| | | 0: 'é¦é¡µ', |
| | | 1: 'åºéºé¦é¡µ' |
| | | }, |
| | | jumpTypeOptions: { |
| | | 0: 'æ ', |
| | | 1: 'ä¼å端é¦é¡µè½®æ', |
| | | 2: '叿ºAPPå¼å¯¼é¡µ' |
| | | }, |
| | | searchForm: { |
| | | title: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/banner', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | loadTableData (resolve) { |
| | | this.isWorking.search = true |
| | | list(this.getTableParams()) |
| | | .then(data => { |
| | | this.tableData.list = data.list || [] |
| | | this.tableData.pagination.total = data.total || 0 |
| | | if (resolve) resolve(data) |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e, 'å 载失败') |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.search = false |
| | | }) |
| | | }, |
| | | handleEdit (row) { |
| | | this.$refs.operaBannerEditWindow.open('ç¼è¾è½®æå¾', row) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateById({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:driverInfo:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="叿ºä¿¡æ¯" prop="keyword"> |
| | | <el-input v-model="searchForm.keyword" clearable placeholder="请è¾å
¥å¸æºå§å/ææºå·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="车çå·" prop="carNo"> |
| | | <el-input v-model="searchForm.carNo" clearable placeholder="请è¾å
¥è½¦çå·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="searchForm.status" clearable placeholder="è¯·éæ©ç¶æ" @change="search"> |
| | | <el-option label="ç¦ç¨" :value="1"></el-option> |
| | | <el-option label="å¯ç¨" :value="0"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select v-model="searchForm.sex" clearable placeholder="è¯·éæ©æ§å«" @change="search"> |
| | | <el-option label="ç·" :value="1"></el-option> |
| | | <el-option label="女" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | <el-button :loading="isWorking.export" @click="exportExcel">导åº</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="name" label="叿ºå§å" min-width="100px"></el-table-column> |
| | | <el-table-column label="æ§å«" min-width="60px"> |
| | | <template slot-scope="{row}">{{ row.gender === 1 ? 'ç·' : row.gender === 2 ? '女' : '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="telephone" label="æ³¨åææºå·" min-width="120px"></el-table-column> |
| | | <el-table-column prop="idcard" label="身份è¯å·" min-width="160px"></el-table-column> |
| | | <el-table-column label="è´¦æ·ä½é¢" min-width="100px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.memberAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="carCode" label="车çå·" min-width="100px"></el-table-column> |
| | | <el-table-column prop="createTime" label="å建æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="100" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleDetail(row)">详æ
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaDriverDetail ref="operaDriverDetail" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaDriverDetail from '@/components/business/OperaDriverDetail' |
| | | import { updateStatus, exportExcel } from '@/api/business/driver' |
| | | |
| | | export default { |
| | | name: 'DriverList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaDriverDetail }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | keyword: '', |
| | | carNo: '', |
| | | status: '', |
| | | sex: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '', |
| | | auditStatus: 1 |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/driver', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleDateChange (val) { |
| | | this.searchForm.startTime = val ? val[0] : '' |
| | | this.searchForm.endTime = val ? val[1] : '' |
| | | this.search() |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | keyword: '', |
| | | carNo: '', |
| | | status: '', |
| | | sex: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleDetail (row) { |
| | | this.$refs.operaDriverDetail.open('叿ºè¯¦æ
', row) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | handleExport () { |
| | | this.isWorking.export = true |
| | | exportExcel(this.getTableParams()) |
| | | .then(res => { |
| | | this.download(res) |
| | | this.$tip.apiSuccess('å¯¼åºæå') |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.export = false |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:driverInfo:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="叿ºä¿¡æ¯" prop="keyword"> |
| | | <el-input v-model="searchForm.keyword" clearable placeholder="请è¾å
¥å¸æºå§å/ææºå·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="车çå·" prop="carNo"> |
| | | <el-input v-model="searchForm.carNo" clearable placeholder="请è¾å
¥è½¦çå·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ ¸ç¶æ" prop="auditStatus"> |
| | | <el-select v-model="searchForm.auditStatus" clearable placeholder="è¯·éæ©ç¶æ" @change="search"> |
| | | <el-option label="å¾
审æ¹" :value="0"></el-option> |
| | | <el-option label="审æ¹éè¿" :value="1"></el-option> |
| | | <el-option label="审æ¹é©³å" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | <el-button :loading="isWorking.export" @click="exportExcel">导åº</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="name" label="叿ºå§å" min-width="100px"></el-table-column> |
| | | <el-table-column label="æ§å«" min-width="60px"> |
| | | <template slot-scope="{row}">{{ row.gender === 1 ? 'ç·' : row.gender === 2 ? '女' : '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="telephone" label="æ³¨åææºå·" min-width="120px"></el-table-column> |
| | | <el-table-column prop="idcard" label="身份è¯å·" min-width="160px"></el-table-column> |
| | | <el-table-column label="å©å§»ç¶åµ" min-width="100px"> |
| | | <template slot-scope="{row}">{{ row.maritalStatus === 0 ? 'æªå©' : row.maritalStatus === 1 ? 'å·²å©' : row.maritalStatus === 2 ? '离å¼' : '丧å¶' }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="carCode" label="车çå·" min-width="100px"></el-table-column> |
| | | <el-table-column prop="createTime" label="å建æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column label="å®¡æ ¸ç¶æ"> |
| | | <template slot-scope="{row}"> |
| | | <span style="color: #e6a23c;" v-if="row.auditStatus === 0">å¾
审æ¹</span> |
| | | <span style="color: #13ce66;" v-else-if="row.auditStatus === 1">审æ¹éè¿</span> |
| | | <span style="color: #ff4949;" v-else>审æ¹é©³å</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="100" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleDetail(row)">详æ
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaDriverApproval ref="operaDriverApproval" @success="handleApprovalSuccess" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaDriverApproval from '@/components/business/OperaDriverApproval' |
| | | import { updateStatus, exportExcel } from '@/api/business/driver' |
| | | |
| | | export default { |
| | | name: 'DriverVerification', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaDriverApproval }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | keyword: '', |
| | | carNo: '', |
| | | auditStatus: '', |
| | | sex: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/driver', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleDateChange (val) { |
| | | this.searchForm.startTime = val ? val[0] : '' |
| | | this.searchForm.endTime = val ? val[1] : '' |
| | | this.search() |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | keyword: '', |
| | | carNo: '', |
| | | status: '', |
| | | sex: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleDetail (row) { |
| | | this.$refs.operaDriverApproval.open('叿ºå®¡æ ¸', row) |
| | | }, |
| | | handleApprovalSuccess (data) { |
| | | this.$tip.apiSuccess('å®¡æ ¸æäº¤æå') |
| | | this.search() |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | handleExport () { |
| | | this.isWorking.export = true |
| | | exportExcel(this.getTableParams()) |
| | | .then(res => { |
| | | this.download(res) |
| | | this.$tip.apiSuccess('å¯¼åºæå') |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.export = false |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:category:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="åç§°" prop="name"> |
| | | <el-input v-model="searchForm.name" clearable placeholder="请è¾å
¥åç§°" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <ul class="toolbar"> |
| | | <li><el-button type="primary" @click="$refs.operaGoodsCategoryEditWindow.open('æ°å»ºç©ååç±»', null, 2)" icon="el-icon-plus">æ°å»º</el-button></li> |
| | | </ul> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="id" label="ID" min-width="80px"></el-table-column> |
| | | <el-table-column prop="name" label="ç©ååç§°" min-width="120px"></el-table-column> |
| | | <el-table-column prop="detail" label="å¯å说æ" min-width="200px"></el-table-column> |
| | | <el-table-column prop="sortnum" label="åç±»æåº" min-width="100px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="150" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" @click="deleteById(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaGoodsCategoryEditWindow ref="operaGoodsCategoryEditWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaGoodsCategoryEditWindow from '@/components/business/OperaGoodsCategoryEditWindow' |
| | | import { fetchList, updateStatus, deleteById } from '@/api/business/goodsCategory' |
| | | |
| | | export default { |
| | | name: 'GoodsCategoryList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaGoodsCategoryEditWindow }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | name: '', |
| | | status: '', |
| | | type: 2 |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/goodsCategory', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleEdit (row) { |
| | | this.$refs.operaGoodsCategoryEditWindow.open('ç¼è¾ç©ååç±»', row, 2) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:category:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="åç§°" prop="name"> |
| | | <el-input v-model="searchForm.name" clearable placeholder="请è¾å
¥åç§°" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <ul class="toolbar"> |
| | | <li><el-button type="primary" @click="$refs.operaGoodsCategoryEditWindow.open('æ°å»ºç©åç级', null, 3)" icon="el-icon-plus">æ°å»º</el-button></li> |
| | | </ul> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="id" label="ID" min-width="80px"></el-table-column> |
| | | <el-table-column prop="name" label="ç级åç§°" min-width="120px"></el-table-column> |
| | | <el-table-column prop="detail" label="夿³¨è¯´æ" min-width="200px"></el-table-column> |
| | | <el-table-column prop="sortnum" label="æåº" min-width="100px"></el-table-column> |
| | | <el-table-column prop="createTime" label="æäº¤æ¶é´" min-width="100px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="150" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" @click="deleteById(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaGoodsCategoryEditWindow ref="operaGoodsCategoryEditWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaGoodsCategoryEditWindow from '@/components/business/OperaGoodsCategoryEditWindow' |
| | | import { updateStatus } from '@/api/business/goodsCategory' |
| | | |
| | | export default { |
| | | name: 'ItemLevelList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaGoodsCategoryEditWindow }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | name: '', |
| | | type: 3 |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/goodsCategory', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleEdit (row) { |
| | | this.$refs.operaGoodsCategoryEditWindow.open('ç¼è¾ç©åç级', row, 3) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:member:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="ä¼åä¿¡æ¯" prop="keyword"> |
| | | <el-input v-model="searchForm.keyword" clearable placeholder="请è¾å
¥å§å/ææºå·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="searchForm.status" clearable placeholder="è¯·éæ©ç¶æ" @change="search"> |
| | | <el-option label="æ£å¸¸" :value="0"></el-option> |
| | | <el-option label="åç¨" :value="1"></el-option> |
| | | <el-option label="已注é" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | <el-button :loading="isWorking.export" @click="exportExcel">导åº</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="nickName" label="ç¨æ·æµç§°" min-width="120px"></el-table-column> |
| | | <el-table-column prop="name" label="ä¼åå§å" min-width="120px"></el-table-column> |
| | | <el-table-column prop="telephone" label="ææææºå·" min-width="130px"></el-table-column> |
| | | <el-table-column prop="createTime" label="å建æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | {{ row.status === 0 ? 'æ£å¸¸' : row.status === 1 ? 'åç¨' : '已注é' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="100" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleDetail(row)">详æ
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaMemberDetailWindow ref="operaMemberDetailWindow" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaMemberDetailWindow from '@/components/business/OperaMemberDetail' |
| | | |
| | | export default { |
| | | name: 'MemberList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaMemberDetailWindow }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | keyword: '', |
| | | status: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/memberManage', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleDateChange (val) { |
| | | this.searchForm.startTime = val ? val[0] : '' |
| | | this.searchForm.endTime = val ? val[1] : '' |
| | | this.search() |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | keyword: '', |
| | | status: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleDetail (row) { |
| | | this.$refs.operaMemberDetailWindow.open('ä¼å详æ
', row) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:member:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="ä¼åä¿¡æ¯" prop="keyword"> |
| | | <el-input v-model="searchForm.keyword" clearable placeholder="请è¾å
¥ç¨æ·æµç§°/ä¼åå§å/ææºå·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="searchForm.status" clearable placeholder="è¯·éæ©ç¶æ" @change="search"> |
| | | <el-option label="ç¦ç¨" :value="0"></el-option> |
| | | <el-option label="å¯ç¨" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | <el-button :loading="isWorking.export" @click="handleExport">导åº</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="nickName" label="ç¨æ·æµç§°" min-width="120px"></el-table-column> |
| | | <el-table-column prop="name" label="ä¼åå§å" min-width="120px"></el-table-column> |
| | | <el-table-column prop="phone" label="ææææºå·" min-width="130px"></el-table-column> |
| | | <el-table-column prop="createTime" label="å建æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="100" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleDetail(row)">详æ
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaMemberDetail ref="operaMemberDetail" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaMemberDetail from '@/components/business/OperaMemberDetail' |
| | | import { fetchList, updateStatus, exportExcel } from '@/api/business/memberManage' |
| | | |
| | | export default { |
| | | name: 'MemberManage', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaMemberDetail }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | keyword: '', |
| | | status: '', |
| | | createTime: '', |
| | | createStartTime: '', |
| | | createEndTime: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/member', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | loadTableData (resolve) { |
| | | this.isWorking.search = true |
| | | fetchList(this.getTableParams()) |
| | | .then(data => { |
| | | this.tableData.list = data.list || [] |
| | | this.tableData.pagination.total = data.total || 0 |
| | | if (resolve) resolve(data) |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e, 'å 载失败') |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.search = false |
| | | }) |
| | | }, |
| | | handleDateChange (val) { |
| | | this.searchForm.createStartTime = val ? val[0] : '' |
| | | this.searchForm.createEndTime = val ? val[1] : '' |
| | | this.search() |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | keyword: '', |
| | | status: '', |
| | | createTime: '', |
| | | createStartTime: '', |
| | | createEndTime: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleDetail (row) { |
| | | this.$refs.operaMemberDetail.open('ä¼å详æ
', row) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | handleExport () { |
| | | this.isWorking.export = true |
| | | exportExcel(this.getTableParams()) |
| | | .then(res => { |
| | | this.download(res) |
| | | this.$tip.apiSuccess('å¯¼åºæå') |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | .finally(() => { |
| | | this.isWorking.export = false |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:orders:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="订åç¼å·" prop="code"> |
| | | <el-input v-model="searchForm.code" clearable placeholder="请è¾å
¥è®¢åç¼å·" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç©åä¿¡æ¯" prop="goodsInfo"> |
| | | <el-input v-model="searchForm.goodsInfo" clearable placeholder="请è¾å
¥ç©åä¿¡æ¯" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" prop="createTime1"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime1" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¯ä»¶é¨åº" prop="depositShopName"> |
| | | <el-input v-model="searchForm.depositShopName" clearable placeholder="请è¾å
¥å¯ä»¶é¨åº" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶ä»¶é¨åº" prop="takeShopName"> |
| | | <el-input v-model="searchForm.takeShopName" clearable placeholder="请è¾å
¥æ¶ä»¶é¨åº" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å" prop="type"> |
| | | <el-select v-model="searchForm.type" clearable placeholder="è¯·éæ©ç±»å" @change="search"> |
| | | <el-option label="å°±å°åå" :value="0"></el-option> |
| | | <el-option label="å¼å°åå" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="订åç¶æ" prop="status"> |
| | | <el-select v-model="searchForm.status" clearable placeholder="è¯·éæ©è®¢åç¶æ" @change="search"> |
| | | <el-option label="å
¨é¨" value=""></el-option> |
| | | <el-option label="å¾
æ¯ä»" :value="0"></el-option> |
| | | <el-option label="å¾
å¯å" :value="1"></el-option> |
| | | <el-option label="å·²å¯å" :value="2"></el-option> |
| | | <el-option label="å·²æ¥å" :value="3"></el-option> |
| | | <el-option label="æ´¾éä¸" :value="4"></el-option> |
| | | <el-option label="å·²å°åº/å·²éè¾¾" :value="5"></el-option> |
| | | <el-option label="åå¨é¾æ" :value="6"></el-option> |
| | | <el-option label="已宿" :value="7"></el-option> |
| | | <el-option label="订åå
³éï¼é款ï¼" :value="96"></el-option> |
| | | <el-option label="忶龿" :value="97"></el-option> |
| | | <el-option label="åæ¶ä¸" :value="98"></el-option> |
| | | <el-option label="已忶" :value="99"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ç®ç¶æ" prop="settlementStatus"> |
| | | <el-select v-model="searchForm.settlementStatus" clearable placeholder="è¯·éæ©ç»ç®ç¶æ" @change="search"> |
| | | <el-option label="å¾
ç»ç®" :value="0"></el-option> |
| | | <el-option label="å·²ç»ç®" :value="1"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | <el-button :loading="isWorking.export" @click="exportExcel">导åº</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="code" label="订åç¼å·" min-width="150px"> |
| | | <template slot-scope="{row}"> |
| | | <span class="order-no" @click="handleOrderDetail(row)">{{ row.code }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="goodsInfo" label="ç©åä¿¡æ¯" min-width="120px"></el-table-column> |
| | | <el-table-column label="ç±»å" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <span v-if="row.type === 0">å°±å°åå</span> |
| | | <span v-else-if="row.type === 1">å¼å°åå</span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="orderLevel" label="订å级å«" min-width="80px"></el-table-column> |
| | | <el-table-column label="ç©åä¿è´¹ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.declaredFee / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="åºç¡æå¡è´¹ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.price / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è®¢åæ»ä»·ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.totalAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å®ä»ç°éï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.payAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="鿬¾éé¢ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.refundAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è¶
æ¶éé¢" min-width="100px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.overdueAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼å¸¸éé¢" min-width="100px"> |
| | | <template slot-scope="{row}">Â¥{{ (row.exceptionAmount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="ç»ç®ç¶æ" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span :style="{ color: row.settlementStatus === 1 ? '#67c23a' : '#e6a23c' }"> |
| | | {{ row.settlementStatus === 1 ? 'å·²ç»ç®' : 'æªç»ç®' }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="120" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleDispatch(row)">æå¨æ´¾å</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaDispatch ref="operaDispatch" /> |
| | | <OperaOrderDetail ref="operaOrderDetail" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaDispatch from '@/components/business/OperaDispatch' |
| | | import OperaOrderDetail from '@/components/business/OperaOrderDetail' |
| | | export default { |
| | | name: 'OrderManagement', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaDispatch, OperaOrderDetail }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | code: '', |
| | | goodsInfo: '', |
| | | createTime1: '', |
| | | createStartTime: '', |
| | | createEndTime: '', |
| | | depositShopName: '', |
| | | takeShopName: '', |
| | | type: '', |
| | | status: '', |
| | | settlementStatus: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/orderManagement', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleDateChange (val) { |
| | | this.searchForm.createStartTime = val ? val[0] : '' |
| | | this.searchForm.createEndTime = val ? val[1] : '' |
| | | this.search() |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | orderNo: '', |
| | | goodsInfo: '', |
| | | createTime1: '', |
| | | createStartTime: '', |
| | | createEndTime: '', |
| | | sendShopName: '', |
| | | receiveShopName: '', |
| | | type: '', |
| | | orderStatus: '', |
| | | settleStatus: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleDispatch (row) { |
| | | this.$refs.operaDispatch.open(row) |
| | | }, |
| | | handleOrderDetail (row) { |
| | | this.$refs.operaOrderDetail.open(row) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .order-no { |
| | | color: #2E68EC; |
| | | text-decoration: underline; |
| | | cursor: pointer; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:shopInfo:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="é¨åºåç§°" prop="name"> |
| | | <el-input v-model="searchForm.name" clearable placeholder="请è¾å
¥é¨åºåç§°" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å" prop="companyType"> |
| | | <el-select v-model="searchForm.companyType" clearable placeholder="è¯·éæ©ç±»å" @change="search"> |
| | | <el-option label="ä¼ä¸" :value="1"></el-option> |
| | | <el-option label="个人" :value="0"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="é¨åºå°å" prop="address"> |
| | | <el-input v-model="searchForm.address" clearable placeholder="请è¾å
¥é¨åºå°å" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="linkName"> |
| | | <el-input v-model="searchForm.linkName" clearable placeholder="请è¾å
¥è系人" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="èç³»çµè¯" prop="linkPhone"> |
| | | <el-input v-model="searchForm.linkPhone" clearable placeholder="请è¾å
¥èç³»çµè¯" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æäº¤æ¶é´" prop="createTime"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="auditStatus"> |
| | | <el-select v-model="searchForm.auditStatus" clearable placeholder="è¯·éæ©ç¶æ" @change="search"> |
| | | <el-option label="å¾
审æ¹" :value="0"></el-option> |
| | | <el-option label="审æ¹éè¿" :value="1"></el-option> |
| | | <el-option label="å®¡æ¹æªéè¿" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column prop="name" label="é¨åºåç§°" min-width="120px"> |
| | | <template slot-scope="{row}"> |
| | | <span class="link-name" @click="openShopInfo(row)">{{ row.name }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="companyType" label="ç±»å" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | {{row.companyType == 1 ? 'ä¼ä¸' : '个人'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="address" label="é¨åºå°å" min-width="200px"></el-table-column> |
| | | <el-table-column prop="linkName" label="è系人" min-width="100px"></el-table-column> |
| | | <el-table-column prop="linkPhone" label="èç³»çµè¯" min-width="120px"></el-table-column> |
| | | <el-table-column prop="createTime" label="æäº¤æ¥æ" min-width="160px"></el-table-column> |
| | | <el-table-column label="审æ¹ç¶æ" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span style="color: yellow;" v-if="row.auditStatus == 0">å¾
审æ¹</span> |
| | | <span style="color: #13ce66;" v-else-if="row.auditStatus == 1">审æ¹éè¿</span> |
| | | <span style="color: #ff4949;" v-else-if="row.auditStatus == 2">å®¡æ¹æªéè¿</span> |
| | | <span style="color: #13ce66;" v-else-if="row.auditStatus == 3">å·²æ¯ä»æ¼é</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="150" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" v-if="row.auditStatus == 0" @click="handleAudit(row)">å®¡æ ¸</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | > |
| | | </pagination> |
| | | </template> |
| | | <!-- é¨åºè¯¦æ
--> |
| | | <OperaShopInfoSeeWindow ref="operaShopInfoSeeWindow" /> |
| | | <OperaShopApprovalWindow ref="operaShopApprovalWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaShopInfoSeeWindow from '@/components/business/OperaShopInfoSeeWindow' |
| | | import OperaShopApprovalWindow from '@/components/business/OperaShopApprovalWindow' |
| | | |
| | | export default { |
| | | name: 'ShopQualificationList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaShopInfoSeeWindow, OperaShopApprovalWindow }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | name: '', |
| | | companyType: '', |
| | | address: '', |
| | | linkName: '', |
| | | linkPhone: '', |
| | | createTime: '', |
| | | createStartTime: '', |
| | | createEndTime: '', |
| | | auditStatusList: [0,1,2] |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | module: 'é¨åºå表', |
| | | api: '/business/shopInfo', |
| | | 'field.id': 'id', |
| | | 'field.main': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | reset () { |
| | | this.searchForm = { |
| | | name: '', |
| | | companyType: '', |
| | | address: '', |
| | | linkName: '', |
| | | linkPhone: '', |
| | | createTime: '', |
| | | status: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleDateChange (val) { |
| | | this.searchForm.createStartTime = val ? val[0] : '' |
| | | this.searchForm.createEndTime = val ? val[1] : '' |
| | | }, |
| | | handleAudit (row) { |
| | | this.$refs.operaShopApprovalWindow.open('é¨åºå®¡æ¹', row) |
| | | }, |
| | | openShopInfo (row) { |
| | | this.$refs.operaShopInfoSeeWindow.open('é¨åºä¿¡æ¯', row) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .link-name { |
| | | color: #2E68EC; |
| | | text-decoration: underline; |
| | | cursor: pointer; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:withdrawalorders:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="é¨åºåç§°" prop="shopName"> |
| | | <el-input v-model="searchForm.shopName" clearable placeholder="请è¾å
¥é¨åºåç§°" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç³è¯·æ¶é´" prop="createTime1"> |
| | | <el-date-picker type="daterange" v-model="searchForm.createTime1" clearable value-format="yyyy-MM-dd" |
| | | range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" @change="handleDateChange" /> |
| | | </el-form-item> |
| | | <el-form-item label="审æ¹ç¶æ" prop="status"> |
| | | <el-select v-model="searchForm.status" clearable placeholder="è¯·éæ©ç¶æ" @change="search"> |
| | | <el-option label="æç°ç³è¯·ä¸" :value="0"></el-option> |
| | | <el-option label="æç°æå" :value="1"></el-option> |
| | | <el-option label="æç°å¤±è´¥" :value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <div class="total-amount"> |
| | | <span>累计æç°ï¼Â¥{{ totalAmount }}</span> |
| | | </div> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="shopName" label="é¨åºåç§°" min-width="120px"></el-table-column> |
| | | <el-table-column prop="linkName" label="é¨åºè系人" min-width="100px"></el-table-column> |
| | | <el-table-column prop="amount" label="æç°éé¢ï¼å
ï¼" min-width="120px"> |
| | | <template slot-scope="{row}"> |
| | | <span class="amount">Â¥{{ row.amount / 100 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="createTime" label="ç³è¯·æ¶é´" min-width="160px"></el-table-column> |
| | | <el-table-column label="å®¡æ ¸ç¶æ" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | <span :style="{ color: getStatusColor(row.status) }"> |
| | | {{ getStatusText(row.status) }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="100" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleView(row)">æ¥ç</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaWithdrawDetailWindow ref="operaWithdrawDetailWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaWithdrawDetailWindow from '@/components/business/OperaWithdrawDetailWindow' |
| | | import { fetchList, getTotalAmount } from '@/api/business/shopWithdraw' |
| | | |
| | | export default { |
| | | name: 'ShopWithdrawList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaWithdrawDetailWindow }, |
| | | data () { |
| | | return { |
| | | totalAmount: '0.00', |
| | | searchForm: { |
| | | shopName: '', |
| | | createTime1: '', |
| | | createStartTime: '', |
| | | createEndTime: '', |
| | | status: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/shopWithdraw', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.loadTotalAmount() |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | loadTotalAmount () { |
| | | getTotalAmount({ |
| | | capacity: 99999, |
| | | pageNum: 1, |
| | | model: { |
| | | shopName: this.searchForm.shopName, |
| | | createStartTime: this.searchForm.createStartTime, |
| | | createEndTime: this.searchForm.createEndTime, |
| | | status: this.searchForm.status |
| | | } |
| | | }).then(res => { |
| | | this.totalAmount = res / 100 || '0.00' |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | getStatusText (status) { |
| | | const map = { 0: 'æç°ç³è¯·ä¸', 1: 'æç°æå', 2: 'æç°å¤±è´¥' } |
| | | return map[status] || '-' |
| | | }, |
| | | getStatusColor (status) { |
| | | const map = { 0: '#E6A23C', 1: '#67C23A', 2: '#F56C6C' } |
| | | return map[status] || '#606266' |
| | | }, |
| | | handleDateChange (val) { |
| | | this.searchForm.createStartTime = val ? val[0] : '' |
| | | this.searchForm.createEndTime = val ? val[1] : '' |
| | | this.search() |
| | | }, |
| | | reset () { |
| | | this.searchForm = { |
| | | shopName: '', |
| | | createTime1: '', |
| | | createStartTime: '', |
| | | createEndTime: '', |
| | | auditStatus: '' |
| | | } |
| | | this.search() |
| | | }, |
| | | handleView (row) { |
| | | this.$refs.operaWithdrawDetailWindow.open('æç°è¯¦æ
', row) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .total-amount { |
| | | padding: 15px 20px; |
| | | background: #f5f7fa; |
| | | border-radius: 8px; |
| | | margin-bottom: 15px; |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | } |
| | | .amount { |
| | | color: #f56c6c; |
| | | font-weight: bold; |
| | | } |
| | | </style> |
| | |
| | | createTime: '', |
| | | createStartTime: '', |
| | | createEndTime: '', |
| | | auditStatus: '' |
| | | auditStatus: 3 |
| | | } |
| | | } |
| | | }, |
| | |
| | | linkName: '', |
| | | linkPhone: '', |
| | | createTime: '', |
| | | status: '' |
| | | status: '', |
| | | auditStatus: 3 |
| | | } |
| | | this.search() |
| | | }, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout> |
| | | <template v-slot:table-wrap> |
| | | <div class="params-container"> |
| | | <div class="section"> |
| | | <h3 class="section-title">叿ºè§å</h3> |
| | | <div class="form-item"> |
| | | <span class="label">叿ºæ¯æ¥å¯åæ¶è®¢å次æ°ä¸º</span> |
| | | <el-input-number v-model="form.driverDailyCancelLimit" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">次ï¼è¶
è¿æ¬¡æ°åï¼ä»æ¥ä¸å¯æ¢å</span> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">叿ºæå¤§åæ¶è¿è¡ä¸è®¢åæ°é为</span> |
| | | <el-input-number v-model="form.orderAcceptLimit" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">个ï¼è¶
è¿è¯¥æ°éä¸å
许æ¢å<span class="red">ï¼å³è®¢åç¶æ=å¾
åä»¶/é
éä¸ï¼</span></span> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">客æ·ä¸å忝é</span> |
| | | <el-input-number v-model="form.orderAcceptLimit" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">åéæªæå¸æºæ¢åï¼ç³»ç»æ¨éå¹³å°ç®¡çå</span> |
| | | <el-input-number v-model="form.orderAcceptLimit" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">æéå æ¥æ´¾åå¤çã</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section"> |
| | | <h3 class="section-title">订åè§å</h3> |
| | | <div class="form-item"> |
| | | <span class="label">è¶
æ¶</span> |
| | | <el-input-number v-model="form.autoCancelTime" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">åéæªæ¯ä»ï¼è®¢åèªå¨åæ¶</span> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">æ¥é达订å计价系æ°</span> |
| | | <el-input-number v-model="form.urgentCoefficient" :min="0" :precision="2" controls-position="right"></el-input-number> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">ç©åä¿è´¹æ¯ä¾</span> |
| | | <el-input-number v-model="form.insuranceRate" :min="0" :precision="2" controls-position="right"></el-input-number> |
| | | <span class="desc">%</span> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">å¼å°å¯é模å¼ä¸ï¼è¥ç©åå·²éè¾¾ï¼è客æ·å½å¤©æªåä»¶ï¼ååç»ç³»ç»æ</span> |
| | | <el-input-number v-model="form.unpickedDiscount" :min="0" :precision="2" controls-position="right"></el-input-number> |
| | | <span class="desc">ææ£ç³»æ°è®¡ç®</span> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">订åéè¾¾åé»è®¤</span> |
| | | <el-input-number v-model="form.autoConfirmReceipt" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">天åèªå¨ç¡®è®¤æ¶è´§<span class="red">ï¼ä»
éæ¶ä»¶å°å䏿¯æå¡ç¹çæ
åµï¼</span></span> |
| | | </div> |
| | | <div class="form-item"> |
| | | <span class="label">订å宿å</span> |
| | | <el-input-number v-model="form.settlementDate" :min="0" controls-position="right"></el-input-number> |
| | | <span class="label">天åç³»ç»ç»ç®è®¢åï¼å¹¶ç»ä¸åä¸è§è²ææ¯ä¾åæ</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="footer"> |
| | | <el-button type="primary" @click="handleSave" :loading="isWorking.save">ä¿å</el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import { getParams, saveParams } from '@/api/business/sysParams' |
| | | |
| | | export default { |
| | | name: 'SysParams', |
| | | components: { TableLayout }, |
| | | data () { |
| | | return { |
| | | form: { |
| | | autoCancelTime: '', |
| | | autoConfirmReceipt: '', |
| | | driverDailyCancelLimit: '', |
| | | insuranceRate: '', |
| | | orderAcceptLimit: '', |
| | | settlementDate: '', |
| | | unpickedDiscount: '', |
| | | urgentCoefficient: '' |
| | | }, |
| | | isWorking: { |
| | | save: false |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.loadData() |
| | | }, |
| | | methods: { |
| | | loadData () { |
| | | getParams().then(res => { |
| | | this.form = { |
| | | autoCancelTime: res.autoCancelTime || '', |
| | | autoConfirmReceipt: res.autoConfirmReceipt || '', |
| | | driverDailyCancelLimit: res.driverDailyCancelLimit || '', |
| | | insuranceRate: res.insuranceRate || '', |
| | | orderAcceptLimit: res.orderAcceptLimit || '', |
| | | settlementDate: res.settlementDate || '', |
| | | unpickedDiscount: res.unpickedDiscount || '', |
| | | urgentCoefficient: res.urgentCoefficient || '' |
| | | } |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | }, |
| | | handleSave () { |
| | | this.isWorking.save = true |
| | | saveParams(this.form).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿åæå') |
| | | }).catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }).finally(() => { |
| | | this.isWorking.save = false |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .params-container { |
| | | padding: 20px; |
| | | } |
| | | .section { |
| | | margin-bottom: 40px; |
| | | } |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 20px; |
| | | padding-left: 10px; |
| | | border-left: 4px solid #2E68EC; |
| | | } |
| | | .form-item { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-bottom: 20px; |
| | | flex-wrap: wrap; |
| | | } |
| | | .form-item .label { |
| | | color: #606266; |
| | | font-size: 14px; |
| | | white-space: nowrap; |
| | | } |
| | | .form-item .desc { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | margin-left: 10px; |
| | | } |
| | | .form-item .red { |
| | | color: #f56c6c; |
| | | } |
| | | .form-item /deep/ .el-input-number { |
| | | margin: 0 10px; |
| | | } |
| | | .form-item /deep/ .el-input-number .el-input__inner { |
| | | text-align: center; |
| | | } |
| | | .footer { |
| | | padding-top: 20px; |
| | | border-top: 1px solid #eee; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <TableLayout :permissions="['business:category:query']"> |
| | | <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> |
| | | <el-form-item label="åç§°" prop="name"> |
| | | <el-input v-model="searchForm.name" clearable placeholder="请è¾å
¥åç§°" @keypress.enter.native="search"></el-input> |
| | | </el-form-item> |
| | | <section> |
| | | <el-button type="primary" @click="search">æç´¢</el-button> |
| | | <el-button @click="reset">éç½®</el-button> |
| | | </section> |
| | | </el-form> |
| | | <template v-slot:table-wrap> |
| | | <ul class="toolbar"> |
| | | <li><el-button type="primary" @click="$refs.operaGoodsCategoryEditWindow.open('æ°å»ºç©åç级', null, 1)" icon="el-icon-plus">æ°å»º</el-button></li> |
| | | </ul> |
| | | <el-table |
| | | :height="tableHeightNew" |
| | | v-loading="isWorking.search" |
| | | :data="tableData.list" |
| | | stripe |
| | | > |
| | | <el-table-column prop="id" label="ID" min-width="80px"></el-table-column> |
| | | <el-table-column prop="name" label="ç±»ååç§°" min-width="120px"></el-table-column> |
| | | <el-table-column prop="detail" label="éè¡æ¹å¼" min-width="200px"> |
| | | <template slot-scope="{row}"> |
| | | {{ row.otherField === 'driving' ? 'æºå¨è½¦' : 'éæºå¨è½¦' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="sortnum" label="åç±»æåº" min-width="100px"></el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="80px"> |
| | | <template slot-scope="{row}"> |
| | | <el-switch |
| | | @change="handleStatusChange($event, row)" |
| | | v-model="row.status" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949" |
| | | :active-value="0" |
| | | :inactive-value="1" |
| | | ></el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="150" fixed="right"> |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" @click="deleteById(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | :pagination="tableData.pagination" |
| | | ></pagination> |
| | | </template> |
| | | <OperaGoodsCategoryEditWindow ref="operaGoodsCategoryEditWindow" @success="search" /> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import OperaGoodsCategoryEditWindow from '@/components/business/OperaGoodsCategoryEditWindow' |
| | | import { updateStatus } from '@/api/business/goodsCategory' |
| | | |
| | | export default { |
| | | name: 'VehicleType', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination, OperaGoodsCategoryEditWindow }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | name: '', |
| | | type: 1 |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/goodsCategory', |
| | | 'field.id': 'id' |
| | | }) |
| | | this.search() |
| | | }, |
| | | methods: { |
| | | handleEdit (row) { |
| | | this.$refs.operaGoodsCategoryEditWindow.open('ç¼è¾ç©åç级', row, 1) |
| | | }, |
| | | handleStatusChange (val, row) { |
| | | updateStatus({ id: row.id, status: val }).then(res => { |
| | | this.$tip.apiSuccess(res || 'ä¿®æ¹æå') |
| | | }).catch(e => { |
| | | row.status = val === 1 ? 0 : 1 |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | |
| | | Vue.prototype.$isResolve = resolve; |
| | | }) |
| | | |
| | | // Vue.prototype.$baseUrl = 'http://192.168.1.54:10011/' |
| | | // Vue.prototype.$baseUrl = 'http://192.168.1.54:10011/' |
| | | |
| | | // Vue.prototype.$baseUrl = 'https://test.doumee.cn/jinkuai_web/' |
| | | Vue.prototype.$baseUrl = 'https://jinkuai.832smartfarm.com/jinkuai_web/' |
| | | import shareMixin from '@/utils/shareMixin' |
| | | Vue.mixin(shareMixin) |
| | | |
| | | const app = new Vue({ |
| | | store, |
| | | ...App |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/demand-hall/demand-hall", |
| | | "style": { |
| | | "navigationBarTitleText": "æç订å", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/mine/mine", |
| | | "style": { |
| | | "navigationBarTitleText": "æç", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/seleCity/seleCity", |
| | | "path": "pages/itinerary/itinerary", |
| | | "style": { |
| | | "navigationBarTitleText": "åå¸éæ©" |
| | | "navigationBarTitleText": "" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/using-workers/using-workers", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "éæå·¥" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/sorting/sorting", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "忣工" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/packaging-worker/packaging-worker", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "å
è£
å·¥" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/success/success", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "ååæå" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/freight/freight", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "è¿è´§" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/order-details/order-details", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "订å详æ
" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/freight-order/freight-order", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "订å详æ
" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/order-food/order-food", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "订å详æ
" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/login/login", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "ç»å½é¡µ" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/balance-details/balance-details", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "ä½é¢æç»" |
| | | } |
| | | }, |
| | | |
| | | { |
| | | "path" : "pages/rich-text-page/rich-text-page", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "坿æ¬é¡µé¢" |
| | | "path": "pages/message/message", |
| | | "style": { |
| | | "navigationBarTitleText": "æ¶æ¯" |
| | | } |
| | | } |
| | | ], |
| | | "subPackages": [{ |
| | | "root": "packageA", // åå
çæ ¹ç®å½ |
| | | "name": "packageA", // åå
çæ ¹ç®å½ |
| | | "pages":[ |
| | | { |
| | | "path" : "pages/withdrawal/withdrawal", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "æç°" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/withdrawal-successful/withdrawal-successful", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "æç°æå" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/set-up/set-up", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "设置" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/employment-certification/employment-certification", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "ç¨å·¥è®¤è¯" |
| | | } |
| | | }, |
| | | { |
| | | "path" : "pages/certification-results/certification-results", |
| | | "style" : |
| | | { |
| | | "navigationBarTitleText" : "认è¯ç»æ" |
| | | } |
| | | } |
| | | ] |
| | | }], |
| | | "preloadRule":{ |
| | | "pages/mine/mine":{ |
| | | "network": "all", |
| | | "packages": ["packageA"] |
| | | } |
| | | }, |
| | | ], |
| | | "globalStyle": { |
| | | "navigationBarTextStyle": "black", |
| | | "navigationBarTitleText": "", |
| | |
| | | "list": [ |
| | | { |
| | | "pagePath": "pages/index/index", |
| | | "iconPath": "static/icon/nav_home_sel@2x (1).png", |
| | | "iconPath": "static/icon/nav_home@2x.png", |
| | | "selectedIconPath": "static/icon/nav_home_sel@2x.png", |
| | | "text": "é¦é¡µ" |
| | | }, |
| | | { |
| | | "pagePath": "pages/demand-hall/demand-hall", |
| | | "iconPath": "static/icon/nav_order@2x.png", |
| | | "selectedIconPath": "static/icon/nav_order_sel@2x.png", |
| | | "text": "订å" |
| | | "pagePath": "pages/itinerary/itinerary", |
| | | "iconPath": "static/icon/nav_xingcheng@2x.png", |
| | | "selectedIconPath": "static/icon/nav_xingcheng_sel@2x.png", |
| | | "text": "è¡ç¨" |
| | | }, |
| | | { |
| | | "pagePath": "pages/message/message", |
| | | "iconPath": "static/icon/nav_xiaoxi@2x.png", |
| | | "selectedIconPath": "static/icon/nav_xiaoxi_sel@2x.png", |
| | | "text": "æ¶æ¯" |
| | | }, |
| | | { |
| | | "pagePath": "pages/mine/mine", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view> |
| | | |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | |
| | | }; |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view> |
| | | |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | |
| | | }; |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | |
| | | </style> |