main
parent
87049e2c51
commit
6113c85c7b
@ -0,0 +1,58 @@
|
||||
import httpService from "@/request"
|
||||
|
||||
// 任务列表
|
||||
export function taskList(params) {
|
||||
return httpService({
|
||||
url: `/user/taskRelease/list`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 置顶
|
||||
export function topTask(params) {
|
||||
return httpService({
|
||||
url: `/user/taskRelease/topTask`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 取消
|
||||
export function cancelTask(params) {
|
||||
return httpService({
|
||||
url: `/user/taskRelease/cancel`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 撤回
|
||||
export function withdrawTask(params) {
|
||||
return httpService({
|
||||
url: `/user/taskRelease/withdraw`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 确认
|
||||
export function confirmTask(params) {
|
||||
return httpService({
|
||||
url: `/user/taskRelease/confirm`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 获取任务设置
|
||||
export function getSetting(params) {
|
||||
return httpService({
|
||||
url: `/user/settingTaskRelease/getSetting`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 保存任务设置
|
||||
export function Setting(params) {
|
||||
return httpService({
|
||||
url: `/user/settingTaskRelease/setting`,
|
||||
method: 'post',
|
||||
data: params,
|
||||
})
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
<template>
|
||||
<a-cascader
|
||||
:options="cityList"
|
||||
placeholder="请选择"
|
||||
:field-names="{
|
||||
label: 'name',
|
||||
value: 'id',
|
||||
children: 'cityList',
|
||||
}"
|
||||
@change="change"
|
||||
style="width: 60%"
|
||||
></a-cascader>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import store from "@/store";
|
||||
export default {
|
||||
data(){
|
||||
return{
|
||||
cityList:[]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
change(data){
|
||||
this.$emit('onchange',data)
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if(store.getters.getCity.length===0){
|
||||
this.$axios({
|
||||
method:'get',
|
||||
url:process.env.VUE_APP_URL+'manage/city/allCity',//【api不需要communityCode】
|
||||
}).then((response) =>{
|
||||
this.cityList = response.data.data
|
||||
this.setCity(response.data.data);
|
||||
}).catch((error) =>{
|
||||
console.log(error) //请求失败返回的数据
|
||||
})
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<div>
|
||||
<a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
|
||||
<img alt="example" style="width: 100%" :src="previewImage" />
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
previewVisible:{
|
||||
type:Boolean,
|
||||
default:false,
|
||||
},
|
||||
previewImage:{
|
||||
type:String,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return{
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
handleCancel() {
|
||||
this.$emit('handleCancel')
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<div>
|
||||
<a-upload
|
||||
:action="`${$upload}`"
|
||||
accept='.jpg,.JPG,.png,.PNG,.jpeg,.JPEG'
|
||||
list-type="picture-card"
|
||||
:headers="uploadHeaders"
|
||||
:file-list="fileList"
|
||||
@preview="handlePreview"
|
||||
@change="handleChange"
|
||||
>
|
||||
<div v-if="fileList.length < 1">
|
||||
<a-icon type="plus" />
|
||||
<div class="ant-upload-text">上传图片</div>
|
||||
</div>
|
||||
</a-upload>
|
||||
<imgModal :previewVisible='previewVisible' :previewImage='previewImage' @handleCancel='handleCancel'/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import imgModal from "./imgModal.vue"
|
||||
function getBase64(file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
reader.readAsDataURL(file);
|
||||
reader.onload = () => resolve(reader.result);
|
||||
reader.onerror = error => reject(error);
|
||||
});
|
||||
}
|
||||
import store from "@/store";
|
||||
export default {
|
||||
components:{
|
||||
imgModal
|
||||
},
|
||||
data() {
|
||||
return{
|
||||
previewVisible: false,
|
||||
previewImage: '',
|
||||
fileList: [],
|
||||
uploadHeaders: {
|
||||
"admin-login-token": store.getters.getToken
|
||||
}
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
async handlePreview(file) {
|
||||
if (!file.url && !file.preview) {
|
||||
file.preview = await getBase64(file.originFileObj);
|
||||
}
|
||||
this.previewImage = file.url || file.preview;
|
||||
this.previewVisible = true;
|
||||
},
|
||||
handleCancel(){
|
||||
this.previewVisible = false;
|
||||
},
|
||||
handleChange({ fileList }) {
|
||||
this.fileList = fileList
|
||||
if(fileList[0].status==='done'){
|
||||
this.$emit('handleChange',fileList)
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
@ -0,0 +1,166 @@
|
||||
export const pagination = {
|
||||
current: 1,
|
||||
total: 0,
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
}
|
||||
export const searchForm = {
|
||||
status:undefined,
|
||||
rewardType: undefined,
|
||||
type: undefined,
|
||||
keyword:''
|
||||
}
|
||||
export const columns = [
|
||||
{
|
||||
title: "任务单号",
|
||||
width: "12%",
|
||||
dataIndex: "code",
|
||||
},
|
||||
{
|
||||
title: "创建人名称",
|
||||
width: "5%",
|
||||
dataIndex: "createName",
|
||||
},
|
||||
{
|
||||
title: "任务状态",
|
||||
width: "4%",
|
||||
dataIndex: "status",
|
||||
customRender: function (status) {
|
||||
switch (status) {
|
||||
case 1:
|
||||
return '已发布'
|
||||
case 2:
|
||||
return '已接取'
|
||||
case 3:
|
||||
return '服务中'
|
||||
case 4:
|
||||
return '待确认'
|
||||
case 5:
|
||||
return '已完成'
|
||||
case 6:
|
||||
return '已评价'
|
||||
case 9:
|
||||
return '已取消'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "类型",
|
||||
width: "4%",
|
||||
dataIndex: "type",
|
||||
customRender: function (type) {
|
||||
switch (type) {
|
||||
case 1:
|
||||
return '跑腿'
|
||||
case 2:
|
||||
return '家政'
|
||||
case 3:
|
||||
return '维修'
|
||||
case 4:
|
||||
return '家教'
|
||||
case 9:
|
||||
return '其他'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "备注",
|
||||
width: "8%",
|
||||
dataIndex: "remarks",
|
||||
},
|
||||
{
|
||||
title: "接单人名称",
|
||||
width: "5%",
|
||||
dataIndex: "receiverName",
|
||||
},
|
||||
{
|
||||
title: "可接单开始时间",
|
||||
width: "10%",
|
||||
dataIndex: "readyStartTime",
|
||||
},
|
||||
{
|
||||
title: "可接单结束时间",
|
||||
width: "10%",
|
||||
dataIndex: "readyEndTime",
|
||||
},
|
||||
{
|
||||
title: "服务人员",
|
||||
width: "4%",
|
||||
dataIndex: "servicePersonnel",
|
||||
customRender: function (servicePersonnel) {
|
||||
switch (servicePersonnel) {
|
||||
case 1:
|
||||
return '住户'
|
||||
case 2:
|
||||
return '物业'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "联系人",
|
||||
width: "4%",
|
||||
dataIndex: "contact",
|
||||
},
|
||||
{
|
||||
title: "报酬类型",
|
||||
width: "4%",
|
||||
dataIndex: "rewardType",
|
||||
customRender: function (rewardType) {
|
||||
switch (rewardType) {
|
||||
case 1:
|
||||
return '赏金'
|
||||
case 2:
|
||||
return '积分'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "报酬数",
|
||||
width: "4%",
|
||||
dataIndex: "reward",
|
||||
},
|
||||
{
|
||||
title: "创建时间",
|
||||
width: "8%",
|
||||
dataIndex: "createDate",
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
dataIndex: "action",
|
||||
key: "action",
|
||||
width: "300",
|
||||
fixed: "right",
|
||||
scopedSlots: { customRender: "action" },
|
||||
},
|
||||
]
|
||||
export const options = {
|
||||
rewardType: [
|
||||
{
|
||||
id: 1,
|
||||
name:'赏金'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name:'积分'
|
||||
},
|
||||
],
|
||||
type: [
|
||||
{
|
||||
id:1, name:'跑腿'
|
||||
},
|
||||
{
|
||||
id:2, name:'家政'
|
||||
},
|
||||
{
|
||||
id:3, name:'维修'
|
||||
},
|
||||
{
|
||||
id:4, name:'家教'
|
||||
},
|
||||
{
|
||||
id:9, name:'其他'
|
||||
},
|
||||
]
|
||||
}
|
@ -0,0 +1,213 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="cardTitle">
|
||||
<a-space size="large">
|
||||
<span>任务列表</span>
|
||||
<a-radio-group
|
||||
v-model="activeName"
|
||||
button-style="solid"
|
||||
@change="tabsChange"
|
||||
>
|
||||
<a-radio-button value="0"> 全部 </a-radio-button>
|
||||
<a-radio-button value="1"> 已发布 </a-radio-button>
|
||||
<a-radio-button value="2"> 已接取 </a-radio-button>
|
||||
<a-radio-button value="3"> 服务中 </a-radio-button>
|
||||
<a-radio-button value="4"> 待确认 </a-radio-button>
|
||||
<a-radio-button value="5"> 已完成 </a-radio-button>
|
||||
<a-radio-button value="6"> 已评价 </a-radio-button>
|
||||
<a-radio-button value="9"> 已取消 </a-radio-button>
|
||||
</a-radio-group>
|
||||
</a-space>
|
||||
</div>
|
||||
<div class="search-box">
|
||||
<a-row>
|
||||
<a-col :span="20">
|
||||
<a-space size="large">
|
||||
<a-select placeholder="报酬类型" v-model="searchForm.rewardType" style="width: 200px" >
|
||||
<a-select-option v-for="item in options.rewardType" :key="item.id" :value="item.id">{{item.name}}</a-select-option>
|
||||
</a-select>
|
||||
<a-select placeholder="类型" v-model="searchForm.type" style="width: 200px" >
|
||||
<a-select-option v-for="item in options.type" :key="item.id" :value="item.id">{{item.name}}</a-select-option>
|
||||
</a-select>
|
||||
<a-input placeholder="关键字" v-model="searchForm.keyword" style="width: 200px" />
|
||||
<a-button type="primary" @click='getData'>查 询</a-button>
|
||||
<a-button @click='reset'>重 置</a-button>
|
||||
</a-space>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div style="margin-bottom: 16px">
|
||||
<!-- 批量操作 -->
|
||||
<a-select
|
||||
type="primary"
|
||||
v-model="activeAction"
|
||||
:disabled="!hasSelected"
|
||||
:loading="loading"
|
||||
style="width: 120px"
|
||||
@change="Actions"
|
||||
placeholder="请选择操作"
|
||||
>
|
||||
批量
|
||||
<a-select-option v-for="item in ActionsList" :key="item.value">
|
||||
{{ item.label }}
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
<span style="margin-left: 8px">
|
||||
<template v-if="hasSelected">
|
||||
{{ `已选择 ${selectedRowKeys.length} 条` }}
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<a-table
|
||||
:columns="columns"
|
||||
:data-source="tableData"
|
||||
:pagination="pagination"
|
||||
:scroll="{ x: 2500 }"
|
||||
@change="handleTableChange"
|
||||
:row-selection="{
|
||||
selectedRowKeys: selectedRowKeys,
|
||||
onChange: selectionChoosed,
|
||||
}"
|
||||
:row-key="
|
||||
(record, index) => {
|
||||
return index;
|
||||
}
|
||||
"
|
||||
>
|
||||
<span slot="action" slot-scope="text, row">
|
||||
<a-space>
|
||||
<a class="ant-dropdown-link" v-if='row.status===1' @click="top(row)">推荐置顶</a>
|
||||
<a class="ant-dropdown-link" v-if='row.status===2||row.status===3' @click="withdraw(row)">撤回大厅</a>
|
||||
<a class="ant-dropdown-link" v-if='row.status===4' @click="confirm(row)">确认完成</a>
|
||||
<a class="ant-dropdown-link" @click="cancel(row)" v-if='row.status<4'>取消</a>
|
||||
</a-space>
|
||||
</span>
|
||||
</a-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { pagination, searchForm, columns, options } from "./depend/config";
|
||||
import {
|
||||
taskList,
|
||||
topTask,
|
||||
cancelTask,
|
||||
withdrawTask,
|
||||
confirmTask,
|
||||
} from "@/api/operation/task";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
activeName: "0",
|
||||
pagination,
|
||||
searchForm,
|
||||
activeAction: undefined,
|
||||
loading: false,
|
||||
// 选择的index
|
||||
selectedRowKeys: [],
|
||||
tableChoosed: [],
|
||||
// 列
|
||||
columns,options,
|
||||
// 数据
|
||||
tableData: [],
|
||||
ActionsList: [],
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.getData();
|
||||
},
|
||||
methods: {
|
||||
async getData() {
|
||||
let res = await taskList({
|
||||
pageNum: this.pagination.current,
|
||||
size: this.pagination.pageSize,
|
||||
status: this.searchForm.status,
|
||||
rewardType: this.searchForm.rewardType,
|
||||
type: this.searchForm.type,
|
||||
keyword: this.searchForm.keyword,
|
||||
});
|
||||
this.tableData = res.data.rows;
|
||||
this.pagination.total = res.data.total;
|
||||
},
|
||||
tabsChange(e) {
|
||||
if(e.target.value === '0'){
|
||||
this.searchForm.status =undefined
|
||||
this.getData();
|
||||
}
|
||||
this.searchForm.status = e.target.value;
|
||||
this.getData();
|
||||
},
|
||||
handleTableChange(pagination) {
|
||||
console.log(pagination);
|
||||
const pager = { ...this.pagination };
|
||||
pager.current = pagination.current;
|
||||
pager.pageSize = pagination.pageSize;
|
||||
this.pagination = pager;
|
||||
this.getData();
|
||||
},
|
||||
Actions(data) {
|
||||
console.log(data);
|
||||
this.activeAction = undefined;
|
||||
},
|
||||
reset(){
|
||||
this.searchForm = {
|
||||
rewardType: undefined,
|
||||
type: undefined,
|
||||
keyword:''
|
||||
}
|
||||
this.getData()
|
||||
},
|
||||
selectionChoosed(data) {
|
||||
console.log(data);
|
||||
this.tableChoosed = data;
|
||||
},
|
||||
async top(data) {
|
||||
let res = await topTask({ taskId: data.id });
|
||||
if (res.code === 200) {
|
||||
this.$message.success(res.msg);
|
||||
this.getData();
|
||||
} else {
|
||||
this.$message.error(res.msg);
|
||||
}
|
||||
},
|
||||
async cancel(data) {
|
||||
let res = await cancelTask({ taskId: data.id });
|
||||
if (res.code === 200) {
|
||||
this.$message.success(res.msg);
|
||||
this.getData();
|
||||
} else {
|
||||
this.$message.error(res.msg);
|
||||
}
|
||||
},
|
||||
async confirm(data) {
|
||||
let res = await confirmTask({ taskId: data.id });
|
||||
if (res.code === 200) {
|
||||
this.$message.success(res.msg);
|
||||
this.getData();
|
||||
} else {
|
||||
this.$message.error(res.msg);
|
||||
}
|
||||
},
|
||||
async withdraw(data) {
|
||||
let res = await withdrawTask({ taskId: data.id });
|
||||
if (res.code === 200) {
|
||||
this.$message.success(res.msg);
|
||||
this.getData();
|
||||
} else {
|
||||
this.$message.error(res.msg);
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
hasSelected() {
|
||||
return this.selectedRowKeys.length > 0;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
</style>
|
@ -0,0 +1,18 @@
|
||||
export const set = {
|
||||
taskEnable: undefined,
|
||||
releaseEnable: undefined,
|
||||
releaseFreeTime: undefined,
|
||||
releaseDeductType: undefined,
|
||||
releaseTimeoutInterval: undefined,
|
||||
releaseTimeoutValue: undefined,
|
||||
releaseTimeoutMax: undefined,
|
||||
releaseReturnType: undefined,
|
||||
ordersEnable: undefined,
|
||||
ordersFreeTime: undefined,
|
||||
ordersDeductType: undefined,
|
||||
ordersTimeoutInterval: undefined,
|
||||
ordersTimeoutValue: undefined,
|
||||
ordersTimeoutMax: undefined,
|
||||
ordersReturnType: undefined,
|
||||
serviceConfirmTime: undefined,
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
<template>
|
||||
<router-view></router-view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
Loading…
Reference in new issue