| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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/driver/page', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function getById (id) { |
| | | return request.get(`/business/driver/${id}`) |
| | | } |
| | | |
| | | export function updateStatus (data) { |
| | | return request.post('/business/driver/updateStatus', data, { |
| | | trim: true |
| | | }) |
| | | } |
| | | |
| | | export function exportExcel (data) { |
| | | return request.post('/business/driver/exportExcel', data, { |
| | | download: true, |
| | | 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/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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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" |
| | | :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:driver: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="0"></el-option> |
| | | <el-option label="å¯ç¨" :value="1"></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="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="100px"></el-table-column> |
| | | <el-table-column prop="name" label="叿ºå§å" min-width="100px"></el-table-column> |
| | | <el-table-column label="æ§å«" min-width="60px"> |
| | | <template slot-scope="{row}">{{ row.sex === 1 ? 'ç·' : row.sex === 2 ? '女' : '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="phone" 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.amount / 100).toFixed(2) }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="carNo" 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="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> |
| | | </TableLayout> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseTable from '@/components/base/BaseTable' |
| | | import TableLayout from '@/layouts/TableLayout' |
| | | import Pagination from '@/components/common/Pagination' |
| | | import { fetchList, updateStatus, exportExcel } from '@/api/business/driver' |
| | | |
| | | export default { |
| | | name: 'DriverList', |
| | | extends: BaseTable, |
| | | components: { TableLayout, Pagination }, |
| | | data () { |
| | | return { |
| | | searchForm: { |
| | | keyword: '', |
| | | carNo: '', |
| | | status: '', |
| | | sex: '', |
| | | createTime: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/driver', |
| | | '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.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) { |
| | | }, |
| | | 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: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="desc">次ï¼è¶
è¿æ¬¡æ°åï¼ä»æ¥ä¸å¯æ¢å</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="desc">个ï¼è¶
è¿è¯¥æ°éä¸å
许æ¢å<span class="red">ï¼å³è®¢åç¶æ=å¾
åä»¶/é
éä¸ï¼</span></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="desc">åéæªæ¯ä»ï¼è®¢åèªå¨åæ¶</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="desc">天åèªå¨ç¡®è®¤æ¶è´§<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="desc">天åç³»ç»ç»ç®è®¢åï¼å¹¶ç»ä¸åä¸è§è²ææ¯ä¾åæ</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> |