Browse Source

充值明细页接口

Hongxilin
hongxilin 6 months ago
parent
commit
b8d61e309a
  1. 5
      vue/gold-system/src/views/managerecharge/activity.vue
  2. 210
      vue/gold-system/src/views/recharge/adminRecharge.vue
  3. 180
      vue/gold-system/src/views/recharge/allRecharge.vue

5
vue/gold-system/src/views/managerecharge/activity.vue

@ -27,10 +27,9 @@ const getObj = ref({
const addObj = ref({ const addObj = ref({
add: '', add: '',
}) })
//
// //
const delObj = ref({
del: '',
});
const delObj = ref({});
// //
const tableHeight = computed(function () { const tableHeight = computed(function () {
return (getObj.value.pageSize + 1) * 50 + 'px'; return (getObj.value.pageSize + 1) * 50 + 'px';

210
vue/gold-system/src/views/recharge/adminRecharge.vue

@ -2,7 +2,7 @@
import { ref, onMounted, reactive, computed } from "vue"; import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus"; import ElementPlus from "element-plus";
import { AiFillRead } from "vue-icons-plus/ai"; import { AiFillRead } from "vue-icons-plus/ai";
import axios from 'axios';
// //
// //
const admin = ref({ const admin = ref({
@ -13,47 +13,54 @@ const admin = ref({
// //
const tableData = ref([]); const tableData = ref([]);
// ===========================================
// recharge // recharge
const rechargeVo = ref({ const rechargeVo = ref({
name: admin.value.name,
area: admin.value.area,
adminId: admin.value.adminId, adminId: admin.value.adminId,
}); });
// //
const getObj = ref({ const getObj = ref({
pageNum: 1, pageNum: 1,
pageSize: 5, pageSize: 5,
}); });
// //
const total = ref(100)
//
const value = ref('')
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
//
const activeName = ref('all') const activeName = ref('all')
const options = [
//
const payWay = [
{ {
value: 'Option1',
label: 'Option1',
value: '微信',
label: '微信',
}, },
{ {
value: 'Option2',
label: 'Option2',
value: '支付宝',
label: '支付宝',
}, },
{ {
value: 'Option3',
label: 'Option3',
value: '银联',
label: '银联',
}, },
{ {
value: 'Option4',
label: 'Option4',
value: '信用卡',
label: '信用卡',
}, },
{ {
value: 'Option5',
label: 'Option5',
value: '借记卡',
label: '借记卡',
}, },
] ]
// ==========================================================
//
const delObj = ref({});
// //
const tableHeight = computed(function () { const tableHeight = computed(function () {
@ -61,6 +68,7 @@ const tableHeight = computed(function () {
}); });
// //
// ===========================================================================
// //
const get = async function (val) { const get = async function (val) {
try { try {
@ -68,9 +76,19 @@ const get = async function (val) {
if (typeof val === 'number') { if (typeof val === 'number') {
getObj.value.pageNum = val; getObj.value.pageNum = val;
} }
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
}
console.log('搜索参数', getObj.value); console.log('搜索参数', getObj.value);
// POST // POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {...getObj.value,rechargeVo:{...rechargeVo.value}});
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
// //
console.log('请求成功', result); console.log('请求成功', result);
@ -86,28 +104,64 @@ const get = async function (val) {
} }
} }
//
const reset = function () {
rechargeVo.value.activityId = '';
rechargeVo.value.payWay = '';
rechargeVo.value.area = '';
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
get();
}
//
const getToday = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
const endDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6);
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// //
const adminAll = function () { const adminAll = function () {
console.log('adminAll'); console.log('adminAll');
rechargeVo.value.status='';
rechargeVo.value.status = '';
get(); get();
} }
// //
const adminWait = function () { const adminWait = function () {
rechargeVo.value.status=0;
rechargeVo.value.status = 0;
get(); get();
console.log('adminWait'); console.log('adminWait');
} }
// //
const adminPass = function () { const adminPass = function () {
rechargeVo.value.status=1;
rechargeVo.value.status = 1;
get(); get();
console.log('adminPass'); console.log('adminPass');
} }
// //
const adminReject = function () { const adminReject = function () {
rechargeVo.value.status=2;
rechargeVo.value.status = 2;
get(); get();
console.log('adminReject'); console.log('adminReject');
} }
@ -123,12 +177,70 @@ const handleClick = function (tab, event) {
adminReject(); adminReject();
} }
} }
//
const getActivity = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', {});
//
console.log('请求成功', result);
//
activity.value = result.data.data;
console.log('activity', activity.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const getArea = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {});
//
console.log('请求成功', result);
//
allData.value = result.data.data;
console.log('allData', allData.value);
//
area.value = [...new Set(allData.value.map(item => item.area))]
console.log('地区', area.value);
} catch (error) {
console.log('请求失败', error);
//
}
const Delete = function (index, row) {
console.log(index, row)
}
// =================================
//
const del = function (row) {
delObj.value.rechargeId = row.rechargeId;
console.log('delObj1', delObj.value);
}
//
const delConfirm = async function () {
try {
console.log('delObj2', delObj.value);
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge/edit', delObj.value);
console.log('删除成功', result);
//
get();
} catch (error) {
console.log('请求失败', error);
//
}
} }
//
onMounted(async function () {
await get();
getActivity();
await getArea();
})
</script> </script>
<template> <template>
@ -139,17 +251,19 @@ const Delete = function (index, row) {
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text> <el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="value" placeholder="请选择活动名称" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large"
style="width: 240px">
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">充值方式</el-text>
<el-select v-model="value" placeholder="请选择充值方式" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large"
style="width: 240px">
<el-option v-for="item in payWay" :key="item.value" :label="item.label"
:value="item.value" /> :value="item.value" />
</el-select> </el-select>
</div> </div>
@ -158,9 +272,9 @@ const Delete = function (index, row) {
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="value" placeholder="请选择所属地区" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large"
style="width: 240px">
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
@ -171,15 +285,15 @@ const Delete = function (index, row) {
<el-text class="mx-1" size="large">充值时间</el-text> <el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" <el-date-picker v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" /> start-placeholder="起始时间" end-placeholder="结束时间" />
<el-button style="margin-left: 10px;"></el-button>
<el-button></el-button>
<el-button>近7天</el-button>
<el-button style="margin-left: 10px;" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div> </div>
</el-col> </el-col>
<el-col :span="3"> <el-col :span="3">
<div class="head-card-btn"> <div class="head-card-btn">
<el-button>重置</el-button>
<el-button type="primary">查询</el-button>
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()" >查询</el-button>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -197,7 +311,7 @@ const Delete = function (index, row) {
</el-tabs> </el-tabs>
<div> <div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%"> <el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="name" label="姓名" width="100px" />
<el-table-column prop="username" label="姓名" width="100px" />
<el-table-column prop="homilyId" label="精网号" width="150px" /> <el-table-column prop="homilyId" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" /> <el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="activityName" label="活动名称" width="150px" /> <el-table-column prop="activityName" label="活动名称" width="150px" />
@ -205,9 +319,9 @@ const Delete = function (index, row) {
<el-table-column prop="paidGold" label="充值金币" width="100px" /> <el-table-column prop="paidGold" label="充值金币" width="100px" />
<el-table-column prop="freeGold" label="免费金币" width="100px" /> <el-table-column prop="freeGold" label="免费金币" width="100px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip /> <el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeWay" label="支付方式" width="100px" />
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column prop="rechargeVoucher" label="支付凭证" width="150px" /> <el-table-column prop="rechargeVoucher" label="支付凭证" width="150px" />
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="状态" width="100px"> <el-table-column prop="status" label="状态" width="100px">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.status === 1"> <span v-if="scope.row.status === 1">
@ -230,14 +344,14 @@ const Delete = function (index, row) {
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="reason" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="reson" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" label="交款时间" width="200px" /> <el-table-column prop="rechargeTime" label="交款时间" width="200px" />
<el-table-column prop="createTime" label="提交时间" width="200px" /> <el-table-column prop="createTime" label="提交时间" width="200px" />
<el-table-column fixed="right" prop="operation" label="操作" width="150px"> <el-table-column fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope"> <template #default="scope">
<el-popconfirm title="确定将此条活动删除吗?">
<el-popconfirm title="确定将此条活动修改(删除)吗?" @confirm="delConfirm">
<template #reference> <template #reference>
<el-button type="primary" text @click="Delete(scope.$index, scope.row)">
<el-button type="primary" text @click="del(scope.row)">
修改 修改
</el-button> </el-button>
</template> </template>

180
vue/gold-system/src/views/recharge/allRecharge.vue

@ -6,8 +6,8 @@ import axios from 'axios';
// //
// //
const tableData = ref([]); const tableData = ref([]);
// recharge
// ======================================
// rechargeVo
const rechargeVo = ref({}); const rechargeVo = ref({});
// //
const getObj = ref({ const getObj = ref({
@ -16,30 +16,39 @@ const getObj = ref({
}); });
// //
const total = ref(100); const total = ref(100);
//
const value = ref('')
//
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
//
const activeName = ref('all') const activeName = ref('all')
const options = [
//
const payWay = [
{ {
value: 'Option1',
label: 'Option1',
value: '微信',
label: '微信',
}, },
{ {
value: 'Option2',
label: 'Option2',
value: '支付宝',
label: '支付宝',
}, },
{ {
value: 'Option3',
label: 'Option3',
value: '银联',
label: '银联',
}, },
{ {
value: 'Option4',
label: 'Option4',
value: '信用卡',
label: '信用卡',
}, },
{ {
value: 'Option5',
label: 'Option5',
value: '借记卡',
label: '借记卡',
}, },
] ]
@ -50,6 +59,7 @@ const tableHeight = computed(function () {
// //
// ==============================================================
// //
const get = async function (val) { const get = async function (val) {
try { try {
@ -57,9 +67,19 @@ const get = async function (val) {
if (typeof val === 'number') { if (typeof val === 'number') {
getObj.value.pageNum = val; getObj.value.pageNum = val;
} }
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
}
console.log('搜索参数', getObj.value); console.log('搜索参数', getObj.value);
// POST // POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {...getObj.value,rechargeVo:{...rechargeVo.value}});
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
// //
console.log('请求成功', result); console.log('请求成功', result);
@ -74,29 +94,64 @@ const get = async function (val) {
// //
} }
} }
//
const reset=function(){
rechargeVo.value.activityId = '';
rechargeVo.value.payWay = '';
rechargeVo.value.area = '';
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
get();
}
//
const getToday = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
const endDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6);
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// //
const adminAll = function () { const adminAll = function () {
console.log('adminAll'); console.log('adminAll');
rechargeVo.value.status='';
rechargeVo.value.status = '';
get(); get();
} }
// //
const adminWait = function () { const adminWait = function () {
rechargeVo.value.status=0;
rechargeVo.value.status = 0;
get(); get();
console.log('adminWait'); console.log('adminWait');
} }
// //
const adminPass = function () { const adminPass = function () {
rechargeVo.value.status=1;
rechargeVo.value.status = 1;
get(); get();
console.log('adminPass'); console.log('adminPass');
} }
// //
const adminReject = function () { const adminReject = function () {
rechargeVo.value.status=2;
rechargeVo.value.status = 2;
get(); get();
console.log('adminReject'); console.log('adminReject');
} }
@ -112,15 +167,46 @@ const handleClick = function (tab, event) {
adminReject(); adminReject();
} }
} }
//
const getActivity = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', {});
const Delete = function (index, row) {
console.log(index, row)
//
console.log('请求成功', result);
//
activity.value = result.data.data;
console.log('activity', activity.value);
} catch (error) {
console.log('请求失败', error);
//
}
} }
//
const getArea = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {});
//
console.log('请求成功', result);
//
allData.value = result.data.data;
console.log('allData', allData.value);
//
area.value = [...new Set(allData.value.map(item => item.area))]
console.log('地区', area.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
// //
onMounted(async function () { onMounted(async function () {
get();
await get();
getActivity();
await getArea();
}) })
</script> </script>
@ -133,17 +219,19 @@ onMounted(async function () {
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text> <el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="value" placeholder="请选择活动名称" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large"
style="width: 240px">
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">充值方式</el-text>
<el-select v-model="value" placeholder="请选择充值方式" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large"
style="width: 240px">
<el-option v-for="item in payWay" :key="item.value" :label="item.label"
:value="item.value" /> :value="item.value" />
</el-select> </el-select>
</div> </div>
@ -152,9 +240,9 @@ onMounted(async function () {
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="value" placeholder="请选择所属地区" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value" />
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large"
style="width: 240px">
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
@ -165,15 +253,15 @@ onMounted(async function () {
<el-text class="mx-1" size="large">充值时间</el-text> <el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" <el-date-picker v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" /> start-placeholder="起始时间" end-placeholder="结束时间" />
<el-button style="margin-left: 10px;"></el-button>
<el-button></el-button>
<el-button>近7天</el-button>
<el-button style="margin-left: 10px;" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div> </div>
</el-col> </el-col>
<el-col :span="3"> <el-col :span="3">
<div class="head-card-btn"> <div class="head-card-btn">
<el-button>重置</el-button>
<el-button type="primary">查询</el-button>
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()" >查询</el-button>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -196,17 +284,17 @@ onMounted(async function () {
<el-table-column prop="area" label="所属地区" width="100px" /> <el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="activityName" label="活动名称" width="150px" /> <el-table-column prop="activityName" label="活动名称" width="150px" />
<el-table-column prop="rechargeGold" label="充值金额" width="100px" /> <el-table-column prop="rechargeGold" label="充值金额" width="100px" />
<el-table-column prop="rechargeWay" label="充值方式" width="100px" />
<el-table-column prop="paidGold" label="充值金币" width="100px" /> <el-table-column prop="paidGold" label="充值金币" width="100px" />
<el-table-column prop="freeGold" label="免费金币" width="100px" /> <el-table-column prop="freeGold" label="免费金币" width="100px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip /> <el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeWay" label="支付方式" width="100px" />
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column prop="rechargeVoucher" label="支付凭证" width="150px"> <el-table-column prop="rechargeVoucher" label="支付凭证" width="150px">
<template #default="scope"> <template #default="scope">
<el-image :src="scope.row.rechargeVoucher" alt="凭证"
style="width: 50px; height: 50px" />
<el-image :src="scope.row.rechargeVoucher" alt="凭证" style="width: 50px; height: 50px" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="状态" width="100px"> <el-table-column prop="status" label="状态" width="100px">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.status === 1"> <span v-if="scope.row.status === 1">
@ -229,7 +317,7 @@ onMounted(async function () {
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="reason" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="reson" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" label="交款时间" width="200px" /> <el-table-column prop="rechargeTime" label="交款时间" width="200px" />
<el-table-column prop="createTime" label="提交时间" width="200px" /> <el-table-column prop="createTime" label="提交时间" width="200px" />
</el-table> </el-table>

Loading…
Cancel
Save