This commit is contained in:
wangchen147 2024-10-24 16:24:18 +08:00
parent 490b56d4f1
commit 000d7ec17e
1156 changed files with 94178 additions and 0 deletions

View File

@ -0,0 +1,70 @@
import request from '@/utils/request'
/***************************************************** 充值订单 ****************************************************/
/**
*
* @param params
* @returns
*/
export function getRechargeOrderList(params: Record<string, any>) {
return request.get(`recharge/order`, {params})
}
/**
*
* @param params
* @returns
*/
export function getRechargeStat(params: Record<string, any>) {
return request.get(`recharge/order/stat`, {params})
}
/**
*
* @param order_id
* @returns
*/
export function getRechargeOrderInfo(order_id: number) {
return request.get(`recharge/order/${order_id}`);
}
/**
*
* @returns
*/
export function getRechargeOrderStatusList() {
return request.get(`recharge/order/status`)
}
/**
* 退
* @returns
*/
export function getRechargeRefund(params: Record<string, any>) {
return request.get(`recharge/refund`, {params})
}
/**
* 退
* @returns
*/
export function getRechargeRefundStatus() {
return request.get(`recharge/refund/status`)
}
/**
* 退
* @returns
*/
export function rechargeRefund(order_id: number) {
return request.put(`recharge/refund/${order_id}`, {}, {showSuccessMessage: true});
}
/**
* 退
* @returns
*/
export function getRechargeRefundStat() {
return request.get(`recharge/refund/stat`);
}

View File

@ -0,0 +1,19 @@
{
"orderInfo":"订单详情",
"orderDiscountMoney":"优惠金额",
"ip":"下单IP",
"payTime":"支付时间",
"remark":"商家留言",
"memberMessage":"买家留言",
"orderNo":"订单编号",
"orderStatus":"订单状态",
"orderNoPlaceholder":"请输入订单编号",
"createTime":"创建时间",
"rechargeMoney":"充值金额",
"orderMoney":"订单金额",
"member":"买家",
"orderFromName":"订单来源",
"payTypeName":"支付方式",
"startDate":"开始时间",
"endDate":"结束时间"
}

View File

@ -0,0 +1,23 @@
{
"totalRechargeRefundMoney":"充值退款(元)",
"totalRechargeMoney":"充值金额(元)",
"rechargeRefundMoney":"充值退款",
"rechargeNo":"充值单号",
"orderStatus":"订单状态",
"rechargeNoPlaceholder":"请输入充值单号",
"createTime":"充值时间",
"rechargeMoney":"充值金额",
"orderMoney":"订单金额",
"member":"会员信息",
"orderFromName":"订单来源",
"payTypeName":"支付方式",
"startDate":"开始时间",
"endDate":"结束时间",
"namePlaceholder":"请选择",
"refundBtn":"退款",
"refundContent":"是否确认退款",
"payTime": "支付时间",
"refundStatus": "退款状态",
"startMoney": "起始金额",
"endMoney": "结束金额"
}

View File

@ -0,0 +1,24 @@
{
"refundNumber":"退款单号",
"userInfo":"用户信息",
"sourceNumber":"来源单号",
"refundAmount":"退款金额",
"refundTime":"退款时间",
"detail": "详情",
"statusName": "状态",
"memberInfo": "会员信息",
"refundSource": "退款来源",
"startDate":"开始时间",
"endDate":"结束时间",
"refundStatus": "退款状态",
"accumulateRefundMoney": "累计退款金额(元)",
"haveRefundMoney": "退款中金额(元)",
"refundSuccessMonry": "退款成功金额(元)",
"refundFailMoney": "退款失败金额(元)",
"memberInfoPlaceholder":"请输入会员编号/昵称/手机号",
"refundNumberPlaceholder":"请输入退款单号",
"orderNumber": "来源单号",
"orderNumberPlaceholder": "请输入来源单号",
"refundDetail": "退款详情",
"nickname": "会员昵称"
}

View File

@ -0,0 +1,103 @@
<template>
<div class="main-container">
<el-form :model="formData" label-width="150px" ref="formRef" class="page-form" v-loading="loading">
<el-card class="box-card !border-none relative" shadow="never" v-if="formData">
<h3 class="panel-title">{{ t('orderInfo') }}</h3>
<el-form-item :label="t('orderNo')">
<div class="input-width">{{ formData.order_no }}</div>
</el-form-item>
<el-form-item :label="t('orderMoney')">
<div class="input-width">{{ formData.order_money }}</div>
</el-form-item>
<el-form-item :label="t('orderDiscountMoney')">
<div class="input-width">{{ formData.order_discount_money }}</div>
</el-form-item>
<el-form-item :label="t('member')">
<div class="input-width">
<div class="flex flex flex-col cursor-pointer" @click="toMember(formData.member_id)">
<span>{{ formData.member.nickname || '' }}</span>
<span>{{ formData.member.mobile || '' }}</span>
</div>
</div>
</el-form-item>
<el-form-item :label="t('ip')">
<div class="input-width">{{ formData.ip }}</div>
</el-form-item>
<el-form-item :label="t('orderFromName')">
<div class="input-width">{{ formData.order_from_name }}</div>
</el-form-item>
<el-form-item :label="t('orderStatus')">
<div class="input-width">{{ formData.order_status_info.name }}</div>
</el-form-item>
<el-form-item :label="t('payTypeName')">
<div class="input-width">{{ formData.pay_type_name }}</div>
</el-form-item>
<el-form-item :label="t('createTime')">
<div class="input-width">{{ formData.create_time || '' }}</div>
</el-form-item>
<el-form-item :label="t('payTime')">
<div class="input-width">{{ formData.pay_time || '' }}</div>
</el-form-item>
<el-form-item :label="t('remark')">
<div class="input-width">{{ formData.remark || '' }}</div>
</el-form-item>
<el-form-item :label="t('memberMessage')">
<div class="input-width">{{ formData.member_message || '' }}</div>
</el-form-item>
</el-card>
</el-form>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { getRechargeOrderInfo } from '@/addon/recharge/api/recharge'
import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const orderId: number = parseInt(route.query.order_id as string)
const loading = ref(true)
const formData: Record<string, any> | null = ref(null)
const setFormData = async (orderId: number = 0) => {
loading.value = true
formData.value = null
await getRechargeOrderInfo(orderId).then(({ data }) => {
formData.value = data
})
loading.value = false
}
if (orderId) setFormData(orderId)
else loading.value = false
const formRef = ref<FormInstance>()
/**
* 会员详情
*/
const toMember = (memberId: number) => {
router.push(`/member/detail?id=${memberId}`)
}
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,297 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-page-title">{{ pageName }}</span>
</div>
<el-card class="box-card !border-none table-search-wra base-bg !px-[35px]" shadow="never">
<el-row class="flex">
<el-col :span="12" class="min-w-[100px]">
<el-statistic :value="rechargeStatistics.recharge_money ? Number.parseFloat(rechargeStatistics.recharge_money).toFixed(2) : '0.00'">
<template #title>
<div class="text-[14px] mb-[9px]">{{ t('totalRechargeMoney') }}</div>
</template>
</el-statistic>
</el-col>
<el-col :span="12" class="min-w-[100px]">
<el-statistic :value="rechargeStatistics.recharge_refund_money ? Number.parseFloat(rechargeStatistics.recharge_refund_money).toFixed(2) : '0.00'">
<template #title>
<div class="text-[14px] mb-[9px]">{{ t('totalRechargeRefundMoney') }}</div>
</template>
</el-statistic>
</el-col>
</el-row>
</el-card>
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="orderTableData.searchParam" ref="searchFormRef">
<el-form-item :label="t('rechargeNo')" prop="order_no">
<el-input v-model="orderTableData.searchParam.order_no" :placeholder="t('rechargeNoPlaceholder')" />
</el-form-item>
<el-form-item :label="t('orderFromName')" prop="order_from">
<el-select v-model="orderTableData.searchParam.order_from" clearable class="input-width">
<el-option :label="t('selectPlaceholder')" value="" />
<el-option :label="item" :value="key" v-for="(item, key) in channelList" :key="key" />
</el-select>
</el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status">
<el-select v-model="orderTableData.searchParam.order_status" clearable class="input-width">
<el-option :label="t('selectPlaceholder')" value="" />
<el-option :label="item['name']" :value="item['status']" v-for="(item,index) in statusList" :key="index"/>
</el-select>
</el-form-item>
<el-form-item :label="t('createTime')" prop="create_time">
<el-date-picker v-model="orderTableData.searchParam.create_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item :label="t('rechargeMoney')">
<div class="region-input">
<el-form-item prop="start_money">
<input type="text" :placeholder="t('startMoney')" v-model="orderTableData.searchParam.start_money">
</el-form-item>
<span class="separator">-</span>
<el-form-item prop="end_money">
<input type="text" :placeholder="t('endMoney')" v-model="orderTableData.searchParam.end_money">
</el-form-item>
</div>
</el-form-item>
<el-form-item :label="t('payTime')">
<el-date-picker v-model="orderTableData.searchParam.pay_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadOrderList()">{{ t('search') }}</el-button>
<el-button @click="searchFormRef?.resetFields()">{{ t('reset') }}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[16px]">
<el-table :data="orderTableData.data" size="large" v-loading="orderTableData.loading">
<template #empty>
<span>{{ !orderTableData.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column :show-overflow-tooltip="true" :label="t('member')" align="left" min-width="140">
<template #default="{ row }">
<div class="flex items-center cursor-pointer " @click="toMember(row.member.member_id)">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.member.headimg" :src="img(row.member.headimg)" alt="">
<img class="w-[50px] h-[50px] rounded-full mr-[10px]" v-else src="@/app/assets/images/member_head.png" alt="">
<div class="flex flex flex-col">
<span>{{ row.member.nickname || '' }}</span>
<span>{{ row.member.mobile || '' }}</span>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="order_no" :show-overflow-tooltip="true" :label="t('rechargeNo')" align="center" min-width="140" />
<el-table-column prop="order_money" :label="t('rechargeMoney')" align="center" min-width="140" />
<el-table-column prop="order_from_name" :label="t('orderFromName')" align="center" min-width="140" />
<el-table-column :label="t('orderStatus')" min-width="120" align="center">
<template #default="{ row }">
{{ row.order_status_info.name }}
</template>
</el-table-column>
<el-table-column prop="pay_type_name" :label="t('payTypeName')" align="center" min-width="140" />
<el-table-column :label="t('createTime')" min-width="180" align="center">
<template #default="{ row }">
{{ row.create_time || '' }}
</template>
</el-table-column>
<el-table-column :label="t('payTime')" min-width="180" align="center">
<template #default="{ row }">
{{ row.pay_time || '' }}
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" align="right" width="130">
<template #default="{ row }">
<el-button type="primary" link @click="infoEvent(row)">{{ t('info') }}</el-button>
<el-button
v-if="[1, 10].includes(row.order_status_info.status) && row.is_enable_refund && row.refund_status == 0"
type="primary" link @click="refundFn(row)">{{ t('refundBtn') }}
</el-button>
<template v-for="(item, index) in row.order_status_info.action" :key="index">
<el-button type="primary" link @click="orderEvent(row, item.class)">{{ item.name }}</el-button>
</template>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="orderTableData.page" v-model:page-size="orderTableData.limit"
layout="total, sizes, prev, pager, next, jumper" :total="orderTableData.total"
@size-change="loadOrderList()" @current-change="loadOrderList" />
</div>
</div>
</el-card>
<!-- 是否退款 -->
<el-dialog v-model="refundShowDialog" :title="t('refundBtn')" width="500px" :destroy-on-close="true">
<p>{{ t('refundContent') }}</p>
<template #footer>
<span class="dialog-footer">
<el-button @click="refundShowDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" @click="confirmRefund" :loading="refundLoading">{{ t('confirm') }}</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import {
getRechargeOrderStatusList,
getRechargeOrderList,
rechargeRefund,
getRechargeStat
} from '@/addon/recharge/api/recharge'
import { getChannelType } from '@/app/api/sys'
import { img } from '@/utils/common'
import { useRouter, useRoute } from 'vue-router'
import { AnyObject } from '@/types/global'
import type { FormInstance } from 'element-plus'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const memberId: number = parseInt(route.query.id as string || '0')
const channelList = ref([])
const setChannelList = async () => {
channelList.value = await (await getChannelType()).data
}
setChannelList()
const orderTableData = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
order_no: '',
order_status: '',
member_id: memberId,
create_time: [],
pay_time: [],
order_from: '',
start_money: '',
end_money: ''
}
})
interface RechargeType {
recharge_money?: string,
recharge_refund_money?: string
}
const rechargeStatistics = ref<RechargeType>({})
const checkRechargeInfo = () => {
getRechargeStat({
member_id: memberId
}).then(res => {
rechargeStatistics.value = res.data
})
}
checkRechargeInfo()
const statusList = ref([])
const searchFormRef = ref<FormInstance>()
const setCategoryList = async () => {
statusList.value = await (await getRechargeOrderStatusList()).data
}
setCategoryList()
const loadOrderList = (page: number = 1) => {
orderTableData.loading = true
orderTableData.page = page
getRechargeOrderList({
page: orderTableData.page,
limit: orderTableData.limit,
...orderTableData.searchParam
}).then(res => {
orderTableData.loading = false
orderTableData.data = res.data.data
orderTableData.total = res.data.total
}).catch(() => {
orderTableData.loading = false
})
}
loadOrderList()
/**
* 订单详情
* @param data
*/
const infoEvent = (data: any) => {
router.push(`/recharge/order/detail?order_id=${data.order_id}`)
}
/**
* 订单操作
*/
const orderEvent = (data: any, type: string) => {
}
/**
* 退款操作
*/
const refundShowDialog = ref(false)
let refundData: AnyObject | null = null
const refundLoading = ref(false)
const refundFn = (data: AnyObject) => {
refundShowDialog.value = true
refundData = data
}
/**
* 确认退款
*/
const confirmRefund = () => {
if (refundLoading.value) return
refundLoading.value = true
rechargeRefund(refundData?.order_id).then(res => {
refundShowDialog.value = false
refundLoading.value = false
loadOrderList()
}).catch(() => {
refundLoading.value = false
})
}
/**
* 会员详情
*/
const toMember = (memberId: number) => {
router.push(`/member/detail?id=${memberId}`)
}
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,249 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-page-title">{{ pageName }}</span>
</div>
<el-card class="box-card !border-none table-search-wra base-bg !px-[35px]" shadow="never">
<el-row class="flex">
<el-col :span="12">
<div class="statistic-card">
<el-statistic :value="refundStat.refund_all_money"></el-statistic>
<div class="statistic-footer">
<div class="footer-item text-[14px] text-[#666]">
<span>{{ t('accumulateRefundMoney') }}</span>
</div>
</div>
</div>
</el-col>
<el-col :span="12">
<div class="statistic-card">
<el-statistic :value="refundStat.refund_have_money"></el-statistic>
<div class="statistic-footer">
<div class="footer-item text-[14px] text-[#666]">
<span>{{ t('haveRefundMoney') }}</span>
</div>
</div>
</div>
</el-col>
</el-row>
</el-card>
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="refundTableData.searchParam" ref="searchFormRef">
<el-form-item :label="t('memberInfo')" prop="keywords">
<el-input v-model="refundTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
</el-form-item>
<el-form-item :label="t('refundNumber')" prop="refund_no">
<el-input v-model="refundTableData.searchParam.refund_no" class="w-[240px]" :placeholder="t('refundNumberPlaceholder')" />
</el-form-item>
<el-form-item :label="t('orderNumber')" prop="order_no">
<el-input v-model="refundTableData.searchParam.order_no" class="w-[240px]" :placeholder="t('orderNumberPlaceholder')" />
</el-form-item>
<el-form-item :label="t('refundStatus')" prop="status">
<el-select v-model="refundTableData.searchParam.status" clearable class="input-width">
<el-option :label="t('selectPlaceholder')" value="" />
<el-option :label="item.name" :value="key" v-for="(item, key) in refundList" :key="key"/>
</el-select>
</el-form-item>
<el-form-item :label="t('refundTime')" prop="create_time">
<el-date-picker v-model="refundTableData.searchParam.create_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadRefundList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item>
</el-form>
</el-card>
<div>
<el-table :data="refundTableData.data" size="large" v-loading="refundTableData.loading">
<template #empty>
<span>{{ !refundTableData.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column :show-overflow-tooltip="true" :label="t('memberInfo')" align="left" min-width="140">
<template #default="{ row }">
<div class="flex items-center cursor-pointer " @click="toMember(row.member.member_id)">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.member.headimg" :src="img(row.member.headimg)" alt="">
<img class="w-[50px] h-[50px] rounded-full mr-[10px]" v-else src="@/app/assets/images/member_head.png" alt="">
<div class="flex flex flex-col">
<span>{{ row.member.nickname || '' }}</span>
<span>{{ row.member.mobile || '' }}</span>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="refund_no" :label="t('refundNumber')" align="center" min-width="200" />
<el-table-column prop="item.item_name" :label="t('refundSource')" align="center" min-width="140" />
<el-table-column prop="money" :label="t('refundAmount')" align="center" min-width="140" />
<el-table-column :label="t('refundTime')" min-width="180" align="center">
<template #default="{ row }">
{{ row.create_time || '' }}
</template>
</el-table-column>
<el-table-column :label="t('statusName')" min-width="180" align="center">
<template #default="{ row }">
{{ row.status_name || '' }}
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" align="right" width="130">
<template #default="{ row }">
<el-button type="primary" link @click="infoEvent(row)">{{ t('info') }}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="refundTableData.page" v-model:page-size="refundTableData.limit"
layout="total, sizes, prev, pager, next, jumper" :total="refundTableData.total"
@size-change="loadRefundList()" @current-change="loadRefundList" />
</div>
</div>
</el-card>
<el-dialog v-model="refundInfoShowDialog" :title="t('refundDetail')" width="500px" :destroy-on-close="true">
<el-form :model="refundInfo" label-width="120px" ref="formRef" class="page-form">
<el-form-item :label="t('nickname')">
<div class="input-width"> {{ refundInfo.member.nickname }}</div>
</el-form-item>
<el-form-item :label="t('refundSource')">
<div class="input-width"> {{ refundInfo.item.item_name }}</div>
</el-form-item>
<el-form-item :label="t('refundAmount')">
<div class="input-width"> {{ refundInfo.money }}</div>
</el-form-item>
<el-form-item :label="t('orderNumber')">
<div class="input-width"> {{ refundInfo.item.order_no }}</div>
</el-form-item>
<el-form-item :label="t('refundNumber')">
<div class="input-width"> {{ refundInfo.refund_no }}</div>
</el-form-item>
<el-form-item :label="t('refundTime')">
<div class="input-width"> {{ refundInfo.create_time }}</div>
</el-form-item>
<el-form-item :label="t('statusName')">
<div class="input-width"> {{ refundInfo.status_name }}</div>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="refundInfoShowDialog = false">{{ t('confirm') }}</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { img } from '@/utils/common'
import { useRouter, useRoute } from 'vue-router'
import { getRechargeRefund, getRechargeRefundStatus, getRechargeRefundStat } from '@/addon/recharge/api/recharge'
import { FormInstance } from 'element-plus'
const router = useRouter()
const route = useRoute()
const pageName = route.meta.title
const searchFormRef = ref<FormInstance>()
const refundTableData = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
refund_no: '',
create_time: [],
status: '',
keywords: '',
order_no: ''
}
})
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadRefundList()
}
/**
* 获取退款列表
*/
const loadRefundList = (page: number = 1) => {
refundTableData.loading = true
refundTableData.page = page
getRechargeRefund({
page: refundTableData.page,
limit: refundTableData.limit,
...refundTableData.searchParam
}).then(res => {
refundTableData.loading = false
refundTableData.data = res.data.data
refundTableData.total = res.data.total
}).catch(() => {
refundTableData.loading = false
})
}
loadRefundList()
const refundList = ref([])
const checkRefundList = () => {
getRechargeRefundStatus().then(res => {
refundList.value = res.data
})
}
checkRefundList()
const refundStat = reactive({
refund_all_money: 0.00,
refund_have_money: 0.00,
refund_fail_money: 0.00
})
const checkRefundStat = () => {
getRechargeRefundStat().then(res => {
refundStat.refund_all_money = res.data.all.money
refundStat.refund_have_money = res.data.have.money
refundStat.refund_fail_money = res.data['-1'].money
})
}
checkRefundStat()
const refundInfoShowDialog = ref<Boolean>(false)
interface RefundInfoType {
member: {
nickname: string
}
item: {
item_name: string
order_no: string
}
money: string
refund_no: string
create_time: string
status_name: string
}
const refundInfo = ref<RefundInfoType>({})
const infoEvent = (info:any) => {
refundInfo.value = info
refundInfoShowDialog.value = true
}
/**
* 会员详情
*/
const toMember = (memberId: number) => {
router.push(`/member/detail?id=${memberId}`)
}
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,11 @@
{
"title": "会员充值",
"desc": "在线充值到会员账户",
"key": "recharge",
"version": "1.0.0",
"author": "niucloud",
"type": "addon",
"support_app": "",
"jar": "recharge.jar",
"mainClass": "com.niu.recharge.WebApplication"
}

Binary file not shown.

View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>niucloud-addon</artifactId>
<groupId>com.niu</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>recharge</artifactId>
<version>1.0.0</version>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
<finalName>recharge</finalName>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/services/*</exclude>
<exclude>META-INF/spring/*</exclude>
<exclude>META-INF/**.factories</exclude>
<exclude>META-INF/**.xml</exclude>
<exclude>META-INF/**.properties</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks />
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.niu</groupId>
<artifactId>niucloud-core</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>

View File

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>niucloud-addon</artifactId>
<groupId>com.niu</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>recharge</artifactId>
<version>1.0.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.niu</groupId>
<artifactId>niucloud-core</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
<build>
<finalName>recharge</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/services/*</exclude>
<exclude>META-INF/spring/*</exclude>
<exclude>META-INF/**.factories</exclude>
<exclude>META-INF/**.xml</exclude>
<exclude>META-INF/**.properties</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
</tasks>
<!-- <copy overwrite="true" file="target/recharge.jar"-->
<!-- tofile="../../webroot/jar/addon/recharge.jar"/>-->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,12 @@
package com.niu.recharge;
import com.niu.core.common.annotation.SpringModuleApplication;
import org.springframework.boot.SpringApplication;
@SpringModuleApplication("recharge")
public class WebAppApplication {
public static void main(String[] args) {
SpringApplication.run(WebAppApplication.class, args);
}
}

View File

@ -0,0 +1,57 @@
package com.niu.recharge.controller.adminapi;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.Result;
import com.niu.recharge.enums.OrderStatusEnum;
import com.niu.recharge.service.admin.IRechargeOrderService;
import com.niu.recharge.service.admin.param.RechargeOrderSearchParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Map;
@RestController
@RequestMapping("adminapi/recharge/order")
public class OrderController {
@Resource
IRechargeOrderService rechargeOrderService;
@GetMapping("")
public Result lists(PageParam pageParam, RechargeOrderSearchParam searchParam) {
return Result.success(rechargeOrderService.list(pageParam, searchParam));
}
/**
* 订单详情
*
* @return
*/
@GetMapping("/{order_id}")
public Result detail(@PathVariable("order_id") Integer orderId) {
return Result.success(rechargeOrderService.detail(orderId));
}
/**
* 订单状态
*
* @return
*/
@GetMapping("/status")
public Result<Map<Integer, Map<String, Object>>> status() {
return Result.success(OrderStatusEnum.getMap());
}
/**
* 订单统计
*
* @return
*/
@GetMapping("/stat")
public Result stat(RechargeOrderSearchParam searchParam) {
return Result.success(rechargeOrderService.stat(searchParam));
}
}

View File

@ -0,0 +1,74 @@
package com.niu.recharge.controller.adminapi;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.Result;
import com.niu.recharge.enums.RefundStatusEnum;
import com.niu.recharge.service.admin.IRechargeRefundService;
import com.niu.recharge.service.admin.param.RechargeRefundSearchParam;
import com.niu.recharge.service.admin.vo.RechargeRefundStatVo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@RestController
@RequestMapping("adminapi/recharge/refund")
public class RefundController {
@Resource
IRechargeRefundService rechargeRefundService;
/**
* 退款列表
*
* @param pageParam
* @param searchParam
* @return
*/
@GetMapping("")
public Result lists(PageParam pageParam, RechargeRefundSearchParam searchParam) {
return Result.success(rechargeRefundService.list(pageParam, searchParam));
}
/**
* 发起退款
*
* @param orderId
* @return
*/
@PutMapping("/{order_id}")
public Result refund(@PathVariable("order_id") Integer orderId) {
rechargeRefundService.refund(orderId);
return Result.success();
}
/**
* 退款详情
*
* @return
*/
@GetMapping("/{refund_id}")
public Result detail(@PathVariable("refund_id") Integer refundId) {
return Result.success(rechargeRefundService.detail(refundId));
}
/**
* 退款状态
*
* @return
*/
@GetMapping("/status")
public Result<Map<Integer, Map<String, Object>>> status() {
return Result.success(RefundStatusEnum.getMap());
}
/**
* 退款统计
*
* @return
*/
@GetMapping("/stat")
public Result<RechargeRefundStatVo> stat(RechargeRefundSearchParam searchParam) {
return Result.success(rechargeRefundService.stat(searchParam));
}
}

View File

@ -0,0 +1,55 @@
package com.niu.recharge.controller.api;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.core.common.domain.Result;
import com.niu.recharge.service.api.IRechargeOrderService;
import com.niu.recharge.service.api.param.RechargeOrderSearchParam;
import com.niu.recharge.service.api.vo.RechargeOrderInfoVo;
import com.niu.recharge.service.api.vo.RechargeOrderListVo;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("api/recharge")
public class RechargeController {
@Resource
IRechargeOrderService rechargeOrderService;
/**
* 充值订单创建
*
* @param param
* @return
*/
@PostMapping("/recharge")
public Result<RechargeOrderCreateVo> create(@Validated @RequestBody RechargeOrderCreateParam param) {
return Result.success(rechargeOrderService.create(param));
}
/**
* 订单列表
*
* @param
* @return
*/
@GetMapping("/recharge")
public Result<PageResult<RechargeOrderListVo>> list(PageParam pageParam, RechargeOrderSearchParam searchParam) {
return Result.success(rechargeOrderService.list(pageParam, searchParam));
}
/**
* 订单详情
* @param orderId
* @return
*/
@GetMapping("/recharge/{order_id}")
public Result<RechargeOrderInfoVo> detail(@PathVariable("order_id") Integer orderId) {
return Result.success(rechargeOrderService.detail(orderId));
}
}

View File

@ -0,0 +1,81 @@
package com.niu.recharge.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeOrder implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="order_id", type= IdType.AUTO)
private Integer orderId;
/** 站点id */
private Integer siteId;
/** 订单编号 */
private String orderNo;
/** 订单来源 */
private String orderFrom;
/** 订单类型 */
private String orderType;
/** 支付流水号 */
private String outTradeNo;
/** 订单状态 */
private Integer orderStatus;
/** 退款状态 */
private Integer refundStatus;
/** 会员id */
private Integer memberId;
/** 会员ip */
private String ip;
/** 会员留言信息 */
private String memberMessage;
/** 订单项目金额 */
private BigDecimal orderItemMoney;
/** 订单优惠金额 */
private BigDecimal orderDiscountMoney;
/** 订单金额 */
private BigDecimal orderMoney;
/** 创建时间 */
private Long createTime;
/** 订单支付时间 */
private Long payTime;
/** 订单关闭时间 */
private Long closeTime;
/** 是否删除(针对后台) */
private Integer isDelete;
/** 是否允许退款 */
private Integer isEnableRefund;
/** 商家留言 */
private String remark;
/** 发票id0表示不开发票 */
private Integer invoiceId;
/** 关闭原因 */
private String closeReason;
}

View File

@ -0,0 +1,60 @@
package com.niu.recharge.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeOrderItem implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="order_item_id", type= IdType.AUTO)
private Integer orderItemId;
/** 订单id */
private Integer orderId;
/** 站点id */
private Integer siteId;
/** 会员id */
private Integer memberId;
/** 项目id */
private Integer itemId;
/** 项目类型 */
private String itemType;
/** 项目名称 */
private String itemName;
/** 项目图片 */
private String itemImage;
/** 项目单价 */
private BigDecimal price;
/** 购买数量 */
private Integer num;
/** 项目总价 */
private BigDecimal itemMoney;
/** 是否退款 */
private Integer isRefund;
/** 退款编号 */
private String refundNo;
/** 退款状态 */
private Integer refundStatus;
/** 创建时间 */
private Long createTime;
}

View File

@ -0,0 +1,56 @@
package com.niu.recharge.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeOrderItemRefund implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="refund_id", type= IdType.AUTO)
private Integer refundId;
private Integer orderItemId;
/** 订单id */
private Integer orderId;
/** 订单编号 */
private String orderNo;
/** 退款编号 */
private String refundNo;
/** 站点id */
private Integer siteId;
/** 会员id */
private Integer memberId;
/** 退货数量 */
private Integer num;
/** 总退款 */
private BigDecimal money;
/** 退款状态 */
private Integer status;
/** 创建时间 */
private Long createTime;
/** 审核时间 */
private Long auditTime;
/** 转账时间 */
private Long transferTime;
/** 项目类型 */
private String itemType;
}

View File

@ -0,0 +1,44 @@
package com.niu.recharge.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeOrderLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
private Integer id;
private Integer orderId;
/** 站点id */
private Integer siteId;
/** 操作内容 */
private String action;
/** 操作人id */
private Integer uid;
/** 操作人名称 */
private String nickName;
/** 订单状态 */
private Integer orderStatus;
/** 操作类型1买家2卖家 3 系统任务 */
private Integer actionWay;
/** 订单状态名称,操作后 */
private String orderStatusName;
/** 操作时间 */
private Long actionTime;
}

View File

@ -0,0 +1,47 @@
package com.niu.recharge.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
WAIT_PAY("待支付", 0),
FINISH("已完成", 1),
CLOSE("已关闭", -1);
private final String name;
private final Integer status;
public static Map<Integer, Map<String, Object>> getMap() {
Map<Integer, Map<String, Object>> map = new HashMap<>();
for(OrderStatusEnum item : OrderStatusEnum.values())
{
Map<String, Object> mapItem = new HashMap<>();
mapItem.put("name", item.getName());
mapItem.put("status", item.getStatus());
map.put(item.getStatus(), mapItem);
}
return map;
}
/**
* 通过status获取当前名称
* @param status
* @return
*/
public static String getNameByStatus(Integer status){
for(OrderStatusEnum item : OrderStatusEnum.values())
{
if(item.getStatus().equals(status))
{
return item.getName();
}
}
return "";
}
}

View File

@ -0,0 +1,47 @@
package com.niu.recharge.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
@Getter
@AllArgsConstructor
public enum RefundStatusEnum {
REFUNDING("退款中", 1),
REFUND_FAIL("退款失败", -1),
REFUND_COMPLETED("退款完成", 2);
private final String name;
private final Integer status;
public static Map<Integer, Map<String, Object>> getMap() {
Map<Integer, Map<String, Object>> map = new HashMap<>();
for(RefundStatusEnum item : RefundStatusEnum.values())
{
Map<String, Object> mapItem = new HashMap<>();
mapItem.put("name", item.getName());
mapItem.put("status", item.getStatus());
map.put(item.getStatus(), mapItem);
}
return map;
}
/**
* 通过status获取当前名称
* @param status
* @return
*/
public static String getNameByStatus(Integer status){
for(RefundStatusEnum item : RefundStatusEnum.values())
{
if(item.getStatus().equals(status))
{
return item.getName();
}
}
return "";
}
}

View File

@ -0,0 +1,41 @@
package com.niu.recharge.listener;
import com.niu.core.common.annotation.EventCallback;
import com.niu.core.common.exception.CommonException;
import com.niu.core.event.pay.PayCreateEventDefiner;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.enums.OrderStatusEnum;
import com.niu.recharge.service.core.ICoreRechargeOrderService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 一对多的事件监听且有返回值
*/
@EventCallback("recharge")
@Component
public class PayCreateListener extends PayCreateEventDefiner {
@Resource
ICoreRechargeOrderService coreRechargeOrderService;
@Override
public PayCreateEventDefiner.PayCreateEventResult handleCallback(PayCreateEventDefiner.PayCreateEvent event) {
if (!event.getTradeType().equals("recharge")) return null;
RechargeOrder order = coreRechargeOrderService.orderInfo(event.getTradeId());
if (!order.getOrderStatus().equals(OrderStatusEnum.WAIT_PAY.getStatus())) throw new CommonException("只有待支付的订单可以支付");
PayCreateEventDefiner.PayCreateEventResult result = new PayCreateEventDefiner.PayCreateEventResult();
result.setTradeId(event.getTradeId());
result.setTradeType(event.getTradeType());
result.setMainType("member");
result.setMainId(order.getMemberId());
result.setMoney(order.getOrderMoney());
result.setBody("充值订单");
return result;
}
}

View File

@ -0,0 +1,26 @@
package com.niu.recharge.listener;
import com.niu.core.common.annotation.EventListen;
import com.niu.core.common.component.context.listener.AbstractListener;
import com.niu.core.event.pay.PaySuccessEvent;
import com.niu.recharge.service.core.ICoreRechargeOrderService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 支付成功
*/
@EventListen("recharge")
@Component
public class PaySuccessListener extends AbstractListener {
@Resource
ICoreRechargeOrderService coreRechargeOrderService;
public void handleEvent(PaySuccessEvent event) {
if (event.getTradeType().equals("recharge")) {
coreRechargeOrderService.pay(event.getPay());
}
}
}

View File

@ -0,0 +1,26 @@
package com.niu.recharge.listener;
import com.niu.core.common.annotation.EventListen;
import com.niu.core.common.component.context.listener.AbstractListener;
import com.niu.core.event.refund.RefundSuccessEvent;
import com.niu.recharge.service.core.ICoreRechargeRefundService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 支付成功
*/
@EventListen("recharge")
@Component
public class RefundSuccessListener extends AbstractListener {
@Resource
ICoreRechargeRefundService coreRechargeRefundService;
public void handleEvent(RefundSuccessEvent event) {
if (event.getTradeType().equals("recharge")) {
coreRechargeRefundService.refundComplete(event.getRefund().getRefundNo());
}
}
}

View File

@ -0,0 +1,9 @@
package com.niu.recharge.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.niu.recharge.entity.RechargeOrderItem;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RechargeOrderItemMapper extends BaseMapper<RechargeOrderItem> {
}

View File

@ -0,0 +1,10 @@
package com.niu.recharge.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.niu.recharge.entity.RechargeOrderItemRefund;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RechargeOrderItemRefundMapper extends BaseMapper<RechargeOrderItemRefund> {
}

View File

@ -0,0 +1,10 @@
package com.niu.recharge.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.niu.recharge.entity.RechargeOrderLog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RechargeOrderLogMapper extends BaseMapper<RechargeOrderLog> {
}

View File

@ -0,0 +1,9 @@
package com.niu.recharge.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.niu.recharge.entity.RechargeOrder;
import org.mapstruct.Mapper;
@Mapper
public interface RechargeOrderMapper extends BaseMapper<RechargeOrder> {
}

View File

@ -0,0 +1,32 @@
package com.niu.recharge.service.admin;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.recharge.service.admin.param.RechargeOrderSearchParam;
import com.niu.recharge.service.admin.vo.RechargeOrderInfoVo;
import com.niu.recharge.service.admin.vo.RechargeOrderListVo;
import com.niu.recharge.service.admin.vo.RechargeOrderStatVo;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
public interface IRechargeOrderService {
/**
* 订单列表
*
* @param pageParam
* @param searchParam
* @return
*/
PageResult<RechargeOrderListVo> list(PageParam pageParam, RechargeOrderSearchParam searchParam);
/**
* 充值订单详情
*
* @param orderId
* @return
*/
RechargeOrderInfoVo detail(Integer orderId);
RechargeOrderStatVo stat(RechargeOrderSearchParam searchParam);
}

View File

@ -0,0 +1,33 @@
package com.niu.recharge.service.admin;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.recharge.service.admin.param.RechargeRefundSearchParam;
import com.niu.recharge.service.admin.vo.*;
public interface IRechargeRefundService {
/**
* 退款列表
*
* @param pageParam
* @param searchParam
* @return
*/
PageResult<RechargeRefundListVo> list(PageParam pageParam, RechargeRefundSearchParam searchParam);
/**
* 发起退款
*/
void refund(Integer orderId);
/**
* 充值退款详情
*
* @param refundId
* @return
*/
RechargeRefundInfoVo detail(Integer refundId);
RechargeRefundStatVo stat(RechargeRefundSearchParam searchParam);
}

View File

@ -0,0 +1,149 @@
package com.niu.recharge.service.admin.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.core.common.utils.RequestUtils;
import com.niu.core.common.utils.mapper.QueryMapperUtils;
import com.niu.core.entity.member.Member;
import com.niu.core.mapper.member.MemberMapper;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import com.niu.recharge.enums.RefundStatusEnum;
import com.niu.recharge.mapper.RechargeOrderItemMapper;
import com.niu.recharge.mapper.RechargeOrderMapper;
import com.niu.recharge.service.admin.IRechargeOrderService;
import com.niu.recharge.service.admin.param.RechargeOrderSearchParam;
import com.niu.recharge.service.admin.vo.RechargeOrderInfoVo;
import com.niu.recharge.service.admin.vo.RechargeOrderListVo;
import com.niu.recharge.service.admin.vo.RechargeOrderStatVo;
import com.niu.recharge.service.core.ICoreRechargeOrderService;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
@Service
public class RechargeOrderServiceImpl implements IRechargeOrderService {
@Resource
ICoreRechargeOrderService coreRechargeOrderService;
@Resource
RechargeOrderMapper rechargeOrderMapper;
@Resource
RechargeOrderItemMapper rechargeOrderItemMapper;
@Resource
MemberMapper memberMapper;
/**
* 订单列表
*
* @param pageParam
* @param searchParam
* @return
*/
@Override
public PageResult<RechargeOrderListVo> list(PageParam pageParam, RechargeOrderSearchParam searchParam) {
Integer page = pageParam.getPage();
Integer limit = pageParam.getLimit();
QueryWrapper<RechargeOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("site_id", RequestUtils.siteId());
queryWrapper.orderByDesc("create_time");
if (ObjectUtil.isNotEmpty(searchParam.getOrderNo())) queryWrapper.eq("order_no", searchParam.getOrderNo());
if (ObjectUtil.isNotEmpty(searchParam.getOrderStatus())) queryWrapper.eq("order_status", searchParam.getOrderStatus());
if (ObjectUtil.isNotEmpty(searchParam.getOrderFrom())) queryWrapper.eq("order_from", searchParam.getOrderFrom());
if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper, "create_time", searchParam.getCreateTime());
if (ObjectUtil.isNotEmpty(searchParam.getPayTime())) QueryMapperUtils.buildByTime(queryWrapper, "pay_time", searchParam.getPayTime());
if (searchParam.getStartMoney() > 0) queryWrapper.ge("order_money", searchParam.getStartMoney());
if (searchParam.getEndMoney() > 0) queryWrapper.le("order_money", searchParam.getEndMoney());
IPage<RechargeOrder> iPage = rechargeOrderMapper.selectPage(new Page<RechargeOrder>(page, limit), queryWrapper);
List<RechargeOrderListVo> list = new LinkedList<>();
for(RechargeOrder item : iPage.getRecords()) {
RechargeOrderListVo vo = new RechargeOrderListVo();
BeanUtils.copyProperties(item, vo);
MemberBriefInfoVo memberInfo = new MemberBriefInfoVo();
Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("member_id", item.getMemberId()));
if (member != null) BeanUtils.copyProperties(member, memberInfo);
vo.setMember(memberInfo);
List<RechargeOrderItem> itemList = rechargeOrderItemMapper.selectList(new QueryWrapper<RechargeOrderItem>().eq("order_id", item.getOrderId()));
vo.setItem(itemList);
list.add(vo);
}
return PageResult.build(page, limit, iPage.getTotal()).setData(list);
}
/**
* 充值订单详情
*
* @param orderId
* @return
*/
@Override
public RechargeOrderInfoVo detail(Integer orderId) {
QueryWrapper<RechargeOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("order_id", orderId);
queryWrapper.eq("site_id", RequestUtils.siteId());
RechargeOrder order = rechargeOrderMapper.selectOne(queryWrapper);
if (order == null) return null;
RechargeOrderInfoVo vo = new RechargeOrderInfoVo();
BeanUtils.copyProperties(order, vo);
MemberBriefInfoVo memberInfo = new MemberBriefInfoVo();
Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("member_id", order.getMemberId()));
if (member != null) BeanUtils.copyProperties(member, memberInfo);
vo.setMember(memberInfo);
List<RechargeOrderItem> itemList = rechargeOrderItemMapper.selectList(new QueryWrapper<RechargeOrderItem>().eq("order_id", order.getOrderId()));
vo.setItem(itemList);
return vo;
}
/**
* 统计
*
* @param searchParam
* @return
*/
public RechargeOrderStatVo stat(RechargeOrderSearchParam searchParam) {
RechargeOrderStatVo vo = new RechargeOrderStatVo();
QueryWrapper rechargeMoneyQueryWrapper = new QueryWrapper<RechargeOrder>();
rechargeMoneyQueryWrapper.select("SUM(order_money) AS order_money");
rechargeMoneyQueryWrapper.eq("site_id", RequestUtils.siteId());
rechargeMoneyQueryWrapper.eq("order_status", OrderStatusEnum.FINISH.getStatus());
if (searchParam.getMemberId() > 0) rechargeMoneyQueryWrapper.eq("member_id", searchParam.getMemberId());
rechargeMoneyQueryWrapper.last("limit 1");
RechargeOrder rechargeMoney = rechargeOrderMapper.selectOne(rechargeMoneyQueryWrapper);
if (rechargeMoney != null) vo.setRechargeMoney(rechargeMoney.getOrderMoney());
QueryWrapper refundMoneyQueryWrapper = new QueryWrapper<RechargeOrder>();
refundMoneyQueryWrapper.select("SUM(order_money) AS order_money");
refundMoneyQueryWrapper.eq("site_id", RequestUtils.siteId());
refundMoneyQueryWrapper.eq("refund_status", RefundStatusEnum.REFUND_COMPLETED.getStatus());
if (searchParam.getMemberId() > 0) refundMoneyQueryWrapper.eq("member_id", searchParam.getMemberId());
refundMoneyQueryWrapper.last("limit 1");
RechargeOrder refundeMoney = rechargeOrderMapper.selectOne(refundMoneyQueryWrapper);
if (refundeMoney != null) vo.setRechargeRefundMoney(refundeMoney.getOrderMoney());
return vo;
}
}

View File

@ -0,0 +1,162 @@
package com.niu.recharge.service.admin.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.core.common.utils.RequestUtils;
import com.niu.core.common.utils.mapper.QueryMapperUtils;
import com.niu.core.entity.member.Member;
import com.niu.core.mapper.member.MemberMapper;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.entity.RechargeOrderItemRefund;
import com.niu.recharge.enums.RefundStatusEnum;
import com.niu.recharge.mapper.RechargeOrderItemMapper;
import com.niu.recharge.mapper.RechargeOrderItemRefundMapper;
import com.niu.recharge.service.admin.IRechargeRefundService;
import com.niu.recharge.service.admin.param.RechargeRefundSearchParam;
import com.niu.recharge.service.admin.vo.*;
import com.niu.recharge.service.core.ICoreRechargeRefundService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
@Service
public class RechargeRefundServiceImpl implements IRechargeRefundService {
@Resource
RechargeOrderItemRefundMapper rechargeOrderItemRefundMapper;
@Resource
RechargeOrderItemMapper rechargeOrderItemMapper;
@Resource
MemberMapper memberMapper;
@Resource
ICoreRechargeRefundService coreRechargeRefundService;
/**
* 订单列表
*
* @param pageParam
* @param searchParam
* @return
*/
@Override
public PageResult<RechargeRefundListVo> list(PageParam pageParam, RechargeRefundSearchParam searchParam) {
Integer page = pageParam.getPage();
Integer limit = pageParam.getLimit();
QueryWrapper<RechargeOrderItemRefund> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("site_id", RequestUtils.siteId());
queryWrapper.orderByDesc("create_time");
if (ObjectUtil.isNotEmpty(searchParam.getOrderNo())) queryWrapper.eq("order_no", searchParam.getOrderNo());
if (ObjectUtil.isNotEmpty(searchParam.getOrderStatus())) queryWrapper.eq("order_status", searchParam.getOrderStatus());
if (ObjectUtil.isNotEmpty(searchParam.getOrderFrom())) queryWrapper.eq("order_from", searchParam.getOrderFrom());
if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper, "create_time", searchParam.getCreateTime());
if (ObjectUtil.isNotEmpty(searchParam.getPayTime())) QueryMapperUtils.buildByTime(queryWrapper, "pay_time", searchParam.getPayTime());
if (searchParam.getStartMoney() > 0) queryWrapper.ge("order_money", searchParam.getStartMoney());
if (searchParam.getEndMoney() > 0) queryWrapper.le("order_money", searchParam.getEndMoney());
IPage<RechargeOrderItemRefund> iPage = rechargeOrderItemRefundMapper.selectPage(new Page<RechargeOrderItemRefund>(page, limit), queryWrapper);
List<RechargeRefundListVo> list = new LinkedList<>();
for(RechargeOrderItemRefund item : iPage.getRecords()) {
RechargeRefundListVo vo = new RechargeRefundListVo();
BeanUtils.copyProperties(item, vo);
MemberBriefInfoVo memberInfo = new MemberBriefInfoVo();
Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("member_id", item.getMemberId()));
if (member != null) BeanUtils.copyProperties(member, memberInfo);
vo.setMember(memberInfo);
RechargeOrderItem orderItem = rechargeOrderItemMapper.selectOne(new QueryWrapper<RechargeOrderItem>().eq("order_item_id", item.getOrderItemId()));
vo.setItem(orderItem);
list.add(vo);
}
return PageResult.build(page, limit, iPage.getTotal()).setData(list);
}
/**
* 发起退款
*
*/
public void refund(Integer orderId) {
coreRechargeRefundService.create(orderId);
}
/**
* 充值订单详情
*
* @param refundId
* @return
*/
@Override
public RechargeRefundInfoVo detail(Integer refundId) {
QueryWrapper<RechargeOrderItemRefund> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("refund_id", refundId);
queryWrapper.eq("site_id", RequestUtils.siteId());
RechargeOrderItemRefund refund = rechargeOrderItemRefundMapper.selectOne(queryWrapper);
if (refund == null) return null;
RechargeRefundInfoVo vo = new RechargeRefundInfoVo();
BeanUtils.copyProperties(refund, vo);
MemberBriefInfoVo memberInfo = new MemberBriefInfoVo();
Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("member_id", refund.getMemberId()));
if (member != null) BeanUtils.copyProperties(member, memberInfo);
vo.setMember(memberInfo);
RechargeOrderItem item = rechargeOrderItemMapper.selectOne(new QueryWrapper<RechargeOrderItem>().eq("order_item_id", refund.getOrderItemId()));
vo.setItem(item);
return vo;
}
/**
* 统计
*
* @param searchParam
* @return
*/
public RechargeRefundStatVo stat(RechargeRefundSearchParam searchParam) {
RechargeRefundStatVo vo = new RechargeRefundStatVo();
QueryWrapper allMoneyQueryWrapper = new QueryWrapper<RechargeOrderItemRefund>();
allMoneyQueryWrapper.select("SUM(money) AS money");
allMoneyQueryWrapper.eq("site_id", RequestUtils.siteId());
allMoneyQueryWrapper.ne("status", RefundStatusEnum.REFUND_FAIL.getStatus());
if (searchParam.getMemberId() > 0) allMoneyQueryWrapper.eq("member_id", searchParam.getMemberId());
allMoneyQueryWrapper.last("limit 1");
RechargeOrderItemRefund allMoney = rechargeOrderItemRefundMapper.selectOne(allMoneyQueryWrapper);
RechargeRefundStatVo.Stat all = new RechargeRefundStatVo.Stat();
all.setKey("all");
all.setName("累计退款金额(元)");
if (allMoney != null)all.setMoney(allMoney.getMoney());
vo.setAll(all);
QueryWrapper haveMoneyQueryWrapper = new QueryWrapper<RechargeOrderItemRefund>();
haveMoneyQueryWrapper.select("SUM(money) AS money");
haveMoneyQueryWrapper.eq("site_id", RequestUtils.siteId());
haveMoneyQueryWrapper.eq("status", RefundStatusEnum.REFUNDING.getStatus());
if (searchParam.getMemberId() > 0) haveMoneyQueryWrapper.eq("member_id", searchParam.getMemberId());
haveMoneyQueryWrapper.last("limit 1");
RechargeOrderItemRefund haveMoney = rechargeOrderItemRefundMapper.selectOne(haveMoneyQueryWrapper);
RechargeRefundStatVo.Stat have = new RechargeRefundStatVo.Stat();
have.setKey("have");
have.setName("退款中金额(元)");
if (haveMoney != null) have.setMoney(haveMoney.getMoney());
vo.setHave(have);
return vo;
}
}

View File

@ -0,0 +1,27 @@
package com.niu.recharge.service.admin.param;
import lombok.Data;
import java.io.Serializable;
@Data
public class RechargeOrderSearchParam implements Serializable {
private static final long serialVersionUID = 1L;
private String orderNo;
private Integer orderStatus;
private String orderFrom;
private String[] createTime;
private String[] payTime;
private float startMoney;
private float endMoney;
private Integer memberId = 0;
}

View File

@ -0,0 +1,27 @@
package com.niu.recharge.service.admin.param;
import lombok.Data;
import java.io.Serializable;
@Data
public class RechargeRefundSearchParam implements Serializable {
private static final long serialVersionUID = 1L;
private String orderNo;
private Integer orderStatus;
private String orderFrom;
private String[] createTime;
private String[] payTime;
private float startMoney;
private float endMoney;
private Integer memberId = 0;
}

View File

@ -0,0 +1,55 @@
package com.niu.recharge.service.admin.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.core.enums.common.ChannelEnum;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class RechargeOrderInfoVo extends RechargeOrder implements Serializable {
private static final long serialVersionUID = 1L;
private List<RechargeOrderItem> item;
private Status orderStatusInfo;
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal orderMoney;
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long createTime;
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long payTime;
private MemberBriefInfoVo member;
private String orderFromName;
@Data
private static class Status {
private String name;
private Integer status;
}
public Status getOrderStatusInfo() {
Status status = new Status();
status.setStatus(this.getOrderStatus());
status.setName(OrderStatusEnum.getNameByStatus(this.getOrderStatus()));
return status;
}
public String getOrderFromName() {
return ChannelEnum.getNameByCode(this.getOrderFrom());
}
}

View File

@ -0,0 +1,55 @@
package com.niu.recharge.service.admin.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.core.enums.common.ChannelEnum;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class RechargeOrderListVo extends RechargeOrder implements Serializable {
private static final long serialVersionUID = 1L;
private List<RechargeOrderItem> item;
private Status orderStatusInfo;
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal orderMoney;
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long createTime;
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long payTime;
private MemberBriefInfoVo member;
private String orderFromName;
@Data
private static class Status {
private String name;
private Integer status;
}
public Status getOrderStatusInfo() {
Status status = new Status();
status.setStatus(this.getOrderStatus());
status.setName(OrderStatusEnum.getNameByStatus(this.getOrderStatus()));
return status;
}
public String getOrderFromName() {
return ChannelEnum.getNameByCode(this.getOrderFrom());
}
}

View File

@ -0,0 +1,26 @@
package com.niu.recharge.service.admin.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.core.enums.common.ChannelEnum;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class RechargeOrderStatVo implements Serializable {
private static final long serialVersionUID = 1L;
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal rechargeMoney = new BigDecimal(0);
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal rechargeRefundMoney = new BigDecimal(0);
}

View File

@ -0,0 +1,28 @@
package com.niu.recharge.service.admin.vo;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.entity.RechargeOrderItemRefund;
import com.niu.recharge.enums.RefundStatusEnum;
import lombok.Data;
import java.io.Serializable;
@Data
public class RechargeRefundInfoVo extends RechargeOrderItemRefund implements Serializable {
private static final long serialVersionUID = 1L;
private RechargeOrderItem item;
private String statusName;
private MemberBriefInfoVo member;
private String orderFromName;
public String getStatusName() {
return RefundStatusEnum.getNameByStatus(this.getStatus());
}
}

View File

@ -0,0 +1,35 @@
package com.niu.recharge.service.admin.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.core.enums.common.ChannelEnum;
import com.niu.core.service.admin.member.vo.MemberBriefInfoVo;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.entity.RechargeOrderItemRefund;
import com.niu.recharge.enums.OrderStatusEnum;
import com.niu.recharge.enums.RefundStatusEnum;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class RechargeRefundListVo extends RechargeOrderItemRefund implements Serializable {
private static final long serialVersionUID = 1L;
private RechargeOrderItem item;
private String statusName;
private MemberBriefInfoVo member;
private String orderFromName;
public String getStatusName() {
return RefundStatusEnum.getNameByStatus(this.getStatus());
}
}

View File

@ -0,0 +1,28 @@
package com.niu.recharge.service.admin.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeRefundStatVo implements Serializable {
private static final long serialVersionUID = 1L;
private Stat all;
private Stat have;
@Data
public static class Stat {
private String name;
private String key;
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal money = new BigDecimal(0);
}
}

View File

@ -0,0 +1,37 @@
package com.niu.recharge.service.api;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.recharge.service.api.param.RechargeOrderSearchParam;
import com.niu.recharge.service.api.vo.RechargeOrderInfoVo;
import com.niu.recharge.service.api.vo.RechargeOrderListVo;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
import org.springframework.stereotype.Service;
public interface IRechargeOrderService {
/**
* 创建订单
*
* @param param
*/
RechargeOrderCreateVo create(RechargeOrderCreateParam param);
/**
* 订单列表
*
* @param pageParam
* @param searchParam
* @return
*/
PageResult<RechargeOrderListVo> list(PageParam pageParam, RechargeOrderSearchParam searchParam);
/**
* 充值订单详情
*
* @param orderId
* @return
*/
RechargeOrderInfoVo detail(Integer orderId);
}

View File

@ -0,0 +1,109 @@
package com.niu.recharge.service.api.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.niu.core.common.domain.PageParam;
import com.niu.core.common.domain.PageResult;
import com.niu.core.common.utils.RequestUtils;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.mapper.RechargeOrderItemMapper;
import com.niu.recharge.mapper.RechargeOrderMapper;
import com.niu.recharge.service.api.IRechargeOrderService;
import com.niu.recharge.service.api.param.RechargeOrderSearchParam;
import com.niu.recharge.service.api.vo.RechargeOrderInfoVo;
import com.niu.recharge.service.api.vo.RechargeOrderListVo;
import com.niu.recharge.service.core.ICoreRechargeOrderService;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
@Service
public class RechargeOrderServiceImpl implements IRechargeOrderService {
@Resource
ICoreRechargeOrderService coreRechargeOrderService;
@Resource
RechargeOrderMapper rechargeOrderMapper;
@Resource
RechargeOrderItemMapper rechargeOrderItemMapper;
/**
* 创建订单
*
* @param param
* @return
*/
@Override
public RechargeOrderCreateVo create(RechargeOrderCreateParam param) {
param.setMemberId(RequestUtils.memberId());
param.setSiteId(RequestUtils.siteId());
return coreRechargeOrderService.create(param);
}
/**
* 订单列表
*
* @param pageParam
* @param searchParam
* @return
*/
@Override
public PageResult<RechargeOrderListVo> list(PageParam pageParam, RechargeOrderSearchParam searchParam) {
Integer page = pageParam.getPage();
Integer limit = pageParam.getLimit();
QueryWrapper<RechargeOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("site_id", RequestUtils.siteId());
queryWrapper.eq("member_id", RequestUtils.memberId());
queryWrapper.orderByDesc("create_time");
if (ObjectUtil.isNotEmpty(searchParam.getOrderStatus())) queryWrapper.like("order_status", searchParam.getOrderStatus());
IPage<RechargeOrder> iPage = rechargeOrderMapper.selectPage(new Page<RechargeOrder>(page, limit), queryWrapper);
List<RechargeOrderListVo> list = new LinkedList<>();
for(RechargeOrder item : iPage.getRecords()) {
RechargeOrderListVo vo = new RechargeOrderListVo();
BeanUtils.copyProperties(item, vo);
List<RechargeOrderItem> itemList = rechargeOrderItemMapper.selectList(new QueryWrapper<RechargeOrderItem>().eq("order_id", item.getOrderId()));
vo.setItem(itemList);
list.add(vo);
}
return PageResult.build(page,limit,iPage.getTotal()).setData(list);
}
/**
* 充值订单详情
*
* @param orderId
* @return
*/
@Override
public RechargeOrderInfoVo detail(Integer orderId) {
QueryWrapper<RechargeOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("order_id", orderId);
queryWrapper.eq("site_id", RequestUtils.siteId());
queryWrapper.eq("member_id", RequestUtils.memberId());
RechargeOrder order = rechargeOrderMapper.selectOne(queryWrapper);
if (order == null) return null;
RechargeOrderInfoVo vo = new RechargeOrderInfoVo();
BeanUtils.copyProperties(order, vo);
List<RechargeOrderItem> itemList = rechargeOrderItemMapper.selectList(new QueryWrapper<RechargeOrderItem>().eq("order_id", order.getOrderId()));
vo.setItem(itemList);
return vo;
}
}

View File

@ -0,0 +1,13 @@
package com.niu.recharge.service.api.param;
import lombok.Data;
import java.io.Serializable;
@Data
public class RechargeOrderSearchParam implements Serializable {
private static final long serialVersionUID = 1L;
private Integer orderStatus;
}

View File

@ -0,0 +1,43 @@
package com.niu.recharge.service.api.vo;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class RechargeOrderInfoVo extends RechargeOrder implements Serializable {
private static final long serialVersionUID = 1L;
private List<RechargeOrderItem> item;
private Status orderStatusInfo;
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal orderMoney;
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long createTime;
@Data
private static class Status {
private String name;
private Integer status;
}
public Status getOrderStatusInfo() {
Status status = new Status();
status.setStatus(this.getOrderStatus());
status.setName(OrderStatusEnum.getNameByStatus(this.getOrderStatus()));
return status;
}
}

View File

@ -0,0 +1,42 @@
package com.niu.recharge.service.api.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class RechargeOrderListVo extends RechargeOrder implements Serializable {
private static final long serialVersionUID = 1L;
private List<RechargeOrderItem> item;
private Status orderStatusInfo;
@JsonSerialize(using = BeanJsonSerializer.BigDecimalFormatSerializer.class)
private BigDecimal orderMoney;
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long createTime;
@Data
private static class Status {
private String name;
private Integer status;
}
public Status getOrderStatusInfo() {
Status status = new Status();
status.setStatus(this.getOrderStatus());
status.setName(OrderStatusEnum.getNameByStatus(this.getOrderStatus()));
return status;
}
}

View File

@ -0,0 +1,17 @@
package com.niu.recharge.service.core;
import com.niu.core.entity.pay.Pay;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
public interface ICoreRechargeOrderService {
RechargeOrderCreateVo create(RechargeOrderCreateParam param);
void close(Integer orderId);
RechargeOrder orderInfo(Integer orderId);
void pay(Pay pay);
}

View File

@ -0,0 +1,13 @@
package com.niu.recharge.service.core;
public interface ICoreRechargeRefundService {
/**
* 发起退款
*
* @param orderId
*/
void create(Integer orderId);
void refundComplete(String refundNo);
}

View File

@ -0,0 +1,172 @@
package com.niu.recharge.service.core.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.niu.core.common.exception.CommonException;
import com.niu.core.common.utils.NoticeUtils;
import com.niu.core.common.utils.RequestUtils;
import com.niu.core.entity.pay.Pay;
import com.niu.core.enums.member.AccountTypeEnum;
import com.niu.core.service.core.member.ICoreMemberAccountService;
import com.niu.core.service.core.notice.ICoreNoticeService;
import com.niu.core.service.core.pay.ICorePayService;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.enums.OrderStatusEnum;
import com.niu.recharge.mapper.RechargeOrderItemMapper;
import com.niu.recharge.mapper.RechargeOrderMapper;
import com.niu.recharge.service.core.ICoreRechargeOrderService;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Service
public class CoreRechargeOrderServiceImpl implements ICoreRechargeOrderService {
@Resource
RechargeOrderMapper rechargeOrderMapper;
@Resource
RechargeOrderItemMapper rechargeOrderItemMapper;
@Resource
ICorePayService corePayService;
@Resource
ICoreMemberAccountService coreMemberAccountService;
/**
*
* @param param
* @return
*/
@Override
@Transactional
public RechargeOrderCreateVo create(RechargeOrderCreateParam param) {
try {
RechargeOrderCreateVo vo = new RechargeOrderCreateVo();
vo.setTradeType("recharge");
RechargeOrder order = new RechargeOrder();
order.setOrderNo(createOrderNo());
order.setOrderStatus(OrderStatusEnum.WAIT_PAY.getStatus());
order.setOrderFrom(RequestUtils.channel());
order.setSiteId(param.getSiteId());
order.setMemberId(param.getMemberId());
order.setIp(RequestUtils.ip());
order.setMemberMessage(ObjectUtil.defaultIfNull(param.getMemberMessage(), ""));
order.setOrderItemMoney(param.getRechargeMoney());
order.setOrderMoney(param.getRechargeMoney());
order.setOrderType(vo.getTradeType());
order.setCreateTime(System.currentTimeMillis() / 1000);
this.rechargeOrderMapper.insert(order);
RechargeOrderItem orderItem = new RechargeOrderItem();
orderItem.setOrderId(order.getOrderId());
orderItem.setSiteId(param.getSiteId());
orderItem.setMemberId(param.getMemberId());
orderItem.setItemType(vo.getTradeType());
orderItem.setItemName("会员充值");
orderItem.setItemImage("/static/image/icon.png");
orderItem.setNum(1);
orderItem.setPrice(param.getRechargeMoney());
orderItem.setItemMoney(param.getRechargeMoney());
orderItem.setCreateTime(System.currentTimeMillis() / 1000);
this.rechargeOrderItemMapper.insert(orderItem);
vo.setTradeId(order.getOrderId());
return vo;
} catch (Exception e) {
throw new CommonException(e.getMessage());
}
}
/**
* 创建交易号
*
* @return
*/
private String createOrderNo() {
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId();
return DateUtil.format(DateUtil.date(System.currentTimeMillis()), "yyyyMMdd") + id;
}
/**
* 关闭支付
*
* @param orderId
*/
@Override
@Transactional
public void close(Integer orderId) {
RechargeOrder order = orderInfo(orderId);
if (order == null) return;
if (order.getOrderStatus().equals(OrderStatusEnum.WAIT_PAY.getStatus())) {
corePayService.closeByTrade(order.getSiteId(), "recharge", orderId);
}
order.setOrderStatus(OrderStatusEnum.CLOSE.getStatus());
this.rechargeOrderMapper.updateById(order);
}
/**
* 获取订单信息
*
* @param orderId
* @return
*/
public RechargeOrder orderInfo(Integer orderId) {
return this.rechargeOrderMapper.selectById(orderId);
}
/**
* 订单支付
*
* @param pay
*/
@Transactional
public void pay(Pay pay) {
try {
RechargeOrder order = this.orderInfo(pay.getTradeId());
if (order == null) throw new CommonException("订单不存在");
order.setPayTime(System.currentTimeMillis() / 1000);
order.setOrderStatus(OrderStatusEnum.FINISH.getStatus());
order.setIsEnableRefund(1);
order.setOutTradeNo(pay.getOutTradeNo());
this.rechargeOrderMapper.updateById(order);
// 增加会员余额
coreMemberAccountService.addLog(order.getSiteId(), order.getMemberId(), AccountTypeEnum.BALANCE.getType(), order.getOrderMoney().doubleValue(), "recharge", "会员充值", order.getOrderId().toString());
// 发送消息
sendRechargeSuccessNotice(order);
} catch (Exception e) {
e.printStackTrace();
System.out.println("充值订单支付异常");
throw new CommonException(e.getMessage());
}
}
/**
* 发送充值成功消息
* @param order
*/
@Async
private void sendRechargeSuccessNotice(RechargeOrder order) {
Map<String, Object> param = new HashMap<String, Object>();
param.put("order", order);
NoticeUtils.send(order.getSiteId(), "recharge_success", param);
}
}

View File

@ -0,0 +1,155 @@
package com.niu.recharge.service.core.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.niu.core.common.exception.CommonException;
import com.niu.core.common.utils.RequestUtils;
import com.niu.core.entity.member.Member;
import com.niu.core.enums.member.AccountTypeEnum;
import com.niu.core.mapper.member.MemberMapper;
import com.niu.core.service.core.member.ICoreMemberAccountService;
import com.niu.core.service.core.pay.ICorePayService;
import com.niu.core.service.core.pay.ICoreRefundService;
import com.niu.core.service.core.pay.param.PayRefundCreateParam;
import com.niu.core.service.core.pay.param.PayRefundTransferParam;
import com.niu.recharge.entity.RechargeOrder;
import com.niu.recharge.entity.RechargeOrderItem;
import com.niu.recharge.entity.RechargeOrderItemRefund;
import com.niu.recharge.enums.OrderStatusEnum;
import com.niu.recharge.enums.RefundStatusEnum;
import com.niu.recharge.mapper.RechargeOrderItemMapper;
import com.niu.recharge.mapper.RechargeOrderItemRefundMapper;
import com.niu.recharge.mapper.RechargeOrderMapper;
import com.niu.recharge.service.core.ICoreRechargeOrderService;
import com.niu.recharge.service.core.ICoreRechargeRefundService;
import com.niu.recharge.service.core.param.RechargeOrderCreateParam;
import com.niu.recharge.service.core.vo.RechargeOrderCreateVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
@Service
public class CoreRechargeRefundServiceImpl implements ICoreRechargeRefundService {
@Resource
RechargeOrderItemMapper rechargeOrderItemMapper;
@Resource
RechargeOrderMapper rechargeOrderMapper;
@Resource
MemberMapper memberMapper;
@Resource
ICoreRefundService coreRefundService;
@Resource
RechargeOrderItemRefundMapper rechargeOrderItemRefundMapper;
@Resource
ICoreRechargeOrderService coreRechargeOrderService;
@Resource
ICoreMemberAccountService coreMemberAccountService;
/**
*
* @return
*/
@Override
@Transactional
public void create(Integer orderId) {
RechargeOrder order = rechargeOrderMapper.selectOne(new QueryWrapper<RechargeOrder>().eq("order_id", orderId));
if (order == null) throw new CommonException("订单不存在");
if (!order.getIsEnableRefund().equals(1)) throw new CommonException("该订单不允许退款");
if (!order.getOrderStatus().equals(OrderStatusEnum.FINISH.getStatus())) throw new CommonException("订单尚未支付不能进行退款");
RechargeOrderItem orderItem = rechargeOrderItemMapper.selectOne(new QueryWrapper<RechargeOrderItem>().eq("order_id", orderId));
if (!orderItem.getRefundStatus().equals(0)) throw new CommonException("订单已申请退款");
Member member = memberMapper.selectOne(new QueryWrapper<Member>().select("balance").eq("member_id", order.getMemberId()));
if (member == null) throw new CommonException("会员不存在");
if (member.equals(0)) throw new CommonException("会员账户金额为0不允许进行退款");
try {
BigDecimal money = member.getBalance().compareTo(order.getOrderMoney()) == 1 ? order.getOrderMoney() : member.getBalance();
// 创建支付单据
PayRefundCreateParam refundParam = new PayRefundCreateParam();
refundParam.setOutTradeNo(order.getOutTradeNo());
refundParam.setSiteId(order.getSiteId());
refundParam.setTradeType("recharge");
refundParam.setTradeId(orderId.toString());
refundParam.setMoney(money);
String refundNo = coreRefundService.create(refundParam);
// 添加退款记录
RechargeOrderItemRefund model = new RechargeOrderItemRefund();
model.setRefundNo(refundNo);
model.setOrderId(orderId);
model.setOrderItemId(orderItem.getOrderItemId());
model.setNum(orderItem.getNum());
model.setMoney(money);
model.setItemType(orderItem.getItemType());
model.setSiteId(order.getSiteId());
model.setMemberId(order.getMemberId());
model.setCreateTime(System.currentTimeMillis() / 1000);
model.setStatus(RefundStatusEnum.REFUNDING.getStatus());
rechargeOrderItemRefundMapper.insert(model);
order.setRefundStatus(RefundStatusEnum.REFUNDING.getStatus());
rechargeOrderMapper.updateById(order);
orderItem.setRefundNo(refundNo);
orderItem.setRefundStatus(RefundStatusEnum.REFUNDING.getStatus());
rechargeOrderItemMapper.updateById(orderItem);
this.refund(model);
} catch (Exception e) {
throw new CommonException(e.getMessage());
}
}
@Transactional
public void refund(RechargeOrderItemRefund refund) {
// 扣除账户
coreMemberAccountService.addLog(refund.getSiteId(), refund.getMemberId(), AccountTypeEnum.BALANCE.getType(), refund.getMoney().negate().doubleValue(), "recharge_refund", "充值订单退款", refund.getOrderId().toString());
PayRefundTransferParam param = new PayRefundTransferParam();
param.setSiteId(refund.getSiteId());
param.setRefundNo(refund.getRefundNo());
coreRefundService.refund(param);
}
/**
* 退款完成
*
* @param refundNo
*/
@Transactional
public void refundComplete(String refundNo) {
RechargeOrderItemRefund refund = rechargeOrderItemRefundMapper.selectOne(new QueryWrapper<RechargeOrderItemRefund>().eq("refund_no", refundNo));
if (refund == null) return;
if (!refund.getStatus().equals(RefundStatusEnum.REFUNDING.getStatus())) return;
refund.setStatus(RefundStatusEnum.REFUND_COMPLETED.getStatus());
rechargeOrderItemRefundMapper.updateById(refund);
RechargeOrder order = new RechargeOrder();
order.setOrderId(refund.getOrderId());
order.setRefundStatus(RefundStatusEnum.REFUND_COMPLETED.getStatus());
rechargeOrderMapper.updateById(order);
RechargeOrderItem orderItem = new RechargeOrderItem();
orderItem.setOrderItemId(refund.getOrderItemId());
orderItem.setRefundStatus(RefundStatusEnum.REFUND_COMPLETED.getStatus());
rechargeOrderItemMapper.updateById(orderItem);
coreRechargeOrderService.close(refund.getOrderId());
}
}

View File

@ -0,0 +1,42 @@
package com.niu.recharge.service.core.notice.driver;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.niu.core.common.loader.notice.BaseNotice;
import com.niu.core.common.loader.notice.NoticeDataVo;
import com.niu.core.common.component.context.SpringContext;
import com.niu.core.entity.member.Member;
import com.niu.core.mapper.member.MemberMapper;
import com.niu.recharge.entity.RechargeOrder;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class RechargeSuccess extends BaseNotice {
public MemberMapper memberMapper() {
return SpringContext.bean(MemberMapper.class);
}
public NoticeDataVo noticeData(Map<String, Object> vars) {
RechargeOrder order = (RechargeOrder) vars.get("order");
Member member = memberMapper().selectOne(new QueryWrapper<Member>().select("balance").eq("member_id", order.getMemberId()));
Map<String, Object> param = new HashMap<String, Object>();
param.put("balance", member.getBalance());
param.put("price", order.getOrderMoney());
param.put("trade_no", order.getOrderNo());
param.put("time", DateUtil.date(order.getPayTime() * 1000));
param.put("wechat_page", "/addon/recharge/pages/recharge_record_detail?id=" + order.getOrderId());
param.put("weapp_page", "addon/recharge/pages/recharge_record_detail?id=" + order.getOrderId());
NoticeDataVo vo = new NoticeDataVo();
vo.setMemberId(order.getMemberId());
vo.setVars(param);
return vo;
}
}

View File

@ -0,0 +1,20 @@
package com.niu.recharge.service.core.param;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeOrderCreateParam implements Serializable {
private static final long serialVersionUID = 1L;
private String memberMessage;
private BigDecimal rechargeMoney;
private Integer siteId;
private Integer memberId;
}

View File

@ -0,0 +1,17 @@
package com.niu.recharge.service.core.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class RechargeOrderCreateVo implements Serializable {
private static final long serialVersionUID = 1L;
private String tradeType;
private Integer tradeId;
}

View File

@ -0,0 +1,13 @@
{
"name": "recharge",
"title": "会员充值",
"desc": "在线充值到会员账户",
"key": "recharge",
"version": "1.0.0",
"author": "niucloud",
"url": "https://www.niucloud.com",
"type": "addon",
"support_app": "",
"jar": "shop.jar",
"mainClass": "com.niu.recharge.WebApplication"
}

View File

@ -0,0 +1,11 @@
{
"title": "会员充值",
"desc": "在线充值到会员账户",
"key": "recharge",
"version": "1.0.0",
"author": "niucloud",
"type": "addon",
"support_app": "",
"jar": "recharge.jar",
"mainClass": "com.niu.recharge.WebApplication"
}

View File

@ -0,0 +1 @@
shop.test=en_US.shopTest

View File

@ -0,0 +1,2 @@
shop.test=zh_CN.shopTest
shop.name=\u5546\u57CE\u7CFB\u7EDF

View File

@ -0,0 +1,14 @@
{
"balance": {
"recharge": {
"name": "充值",
"inc": 1,
"dec": 0
},
"recharge_refund": {
"name": "充值退款",
"inc": 0,
"dec": 1
}
}
}

View File

@ -0,0 +1,20 @@
{
"BASIC": {
"title": "基础组件",
"list": {
"Article": {
"title": "文章",
"icon": "iconfont iconwenzhangpc",
"path": "edit-article",
"support_page": [],
"uses": 0,
"sort": 10007,
"value": {
"sources": "initial",
"count": 8,
"articleIds": []
}
}
}
}
}

View File

@ -0,0 +1,19 @@
{
"RECHARGE_LINK": {
"title": "会员充值",
"name": "recharge_link",
"addon_info": {
"title": "会员充值",
"key": "recharge"
},
"child_list": [
{
"name": "RECHARGE_INDEX",
"title": "会员充值",
"url": "/addon/recharge/pages/recharge",
"is_share": 1,
"action": ""
}
]
}
}

View File

@ -0,0 +1,6 @@
{
"menu": [
],
"delete": [
]
}

View File

@ -0,0 +1,119 @@
{
"menu": [
{
"menu_name": "会员充值",
"menu_short_name": "会员充值",
"menu_key": "recharge",
"parent_key": "",
"menu_type": 0,
"icon": "element Help",
"api_url": "",
"router_path": "",
"view_path": "",
"methods": "",
"sort": 100,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "充值订单",
"menu_short_name": "充值订单",
"menu_key": "recharge_order",
"parent_key": "recharge",
"menu_type": 0,
"icon": "iconfont iconchongzhidingdan",
"api_url": "",
"router_path": "",
"view_path": "",
"methods": "get",
"sort": 100,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "订单列表",
"menu_short_name": "订单列表",
"menu_key": "recharge_order_list",
"parent_key": "recharge_order",
"menu_type": 1,
"icon": "",
"api_url": "recharge/order",
"router_path": "recharge/order/list",
"view_path": "order/list",
"methods": "get",
"sort": 100,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "退款",
"menu_short_name": "退款",
"menu_key": "recharge_order_refund",
"parent_key": "recharge_order_list",
"menu_type": 2,
"icon": "",
"api_url": "recharge/refund/<order_id>",
"router_path": "",
"view_path": "",
"methods": "put",
"sort": 100,
"status": 1,
"is_show": 0
}
]
},
{
"menu_name": "订单详情",
"menu_short_name": "订单详情",
"menu_key": "recharge_order_detail",
"parent_key": "recharge_order",
"menu_type": 1,
"icon": "",
"api_url": "recharge/order/<order_id>",
"router_path": "recharge/order/detail",
"view_path": "order/detail",
"methods": "get",
"sort": 90,
"status": 1,
"is_show": 0
},
{
"menu_name": "退款记录",
"menu_short_name": "退款记录",
"menu_key": "recharge_order_refund_list",
"parent_key": "recharge_order",
"menu_type": 1,
"icon": "iconfont icontuikuanjilu",
"api_url": "recharge/refund",
"router_path": "recharge/order/refund",
"view_path": "order/refund",
"methods": "get",
"sort": 90,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "退款详情",
"menu_short_name": "退款详情",
"menu_key": "recharge_refund_detail",
"parent_key": "recharge_order_refund_list",
"menu_type": 2,
"icon": "",
"api_url": "recharge/refund/<refund_id>",
"router_path": "",
"view_path": "",
"methods": "get",
"sort": 100,
"status": 1,
"is_show": 0
}
]
}
]
}
]
}
],
"delete": [
]
}

View File

@ -0,0 +1,17 @@
{
"recharge_success": {
"addon": "recharge",
"key": "recharge_success",
"receiver_type": 1,
"name": "充值成功通知",
"title": "会员充值成功后发送",
"async": true,
"variable": {
"price": "充值金额",
"balance": "充值后账户",
"time": "充值时间",
"trade_no": "交易单号"
},
"driver": "com.niu.recharge.service.core.notice.driver.RechargeSuccess"
}
}

View File

@ -0,0 +1,5 @@
{
"recharge_success": {
"content": "您充值金额¥{price}, 充值后金额¥{balance}"
}
}

View File

@ -0,0 +1,14 @@
{
"recharge_success": {
"tid": "30832",
"content": [
["交易单号", "{trade_no}", "character_string7"],
["充值金额", "{price}", "amount2"],
["账户余额", "{balance}", "amount8"],
["充值时间", "{time}", "time4"]
],
"kid_list": [7, 2, 8, 4],
"scene_desc": "充值后提醒",
"tips": "使用该消息请在小程序的服务类目中添加类目:一级类目:商业服务 二级类目:软件/建站/技术开发"
}
}

View File

@ -0,0 +1,11 @@
{
"recharge_success": {
"temp_key": "52552",
"content": [
[ "充值时间", "{time}", "time1" ],
[ "充值金额", "{price}", "amount3" ]
],
"keyword_name_list": ["充值时间", "充值金额"],
"tips": "使用该消息请在公众号的服务类目中添加类目:一级类目:商业服务 二级类目:软件/建站/技术开发"
}
}

View File

@ -0,0 +1,84 @@
DROP TABLE IF EXISTS `{{prefix}}recharge_order`;
CREATE TABLE `{{prefix}}recharge_order` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`site_id` int(11) NOT NULL DEFAULT '0' COMMENT '站点id',
`order_no` varchar(50) NOT NULL DEFAULT '' COMMENT '订单编号',
`order_from` varchar(55) NOT NULL DEFAULT '' COMMENT '订单来源',
`order_type` varchar(50) NOT NULL DEFAULT '' COMMENT '订单类型',
`out_trade_no` varchar(50) NOT NULL DEFAULT '' COMMENT '支付流水号',
`order_status` int(11) NOT NULL DEFAULT '0' COMMENT '订单状态',
`refund_status` int(11) NOT NULL DEFAULT '0' COMMENT '退款状态',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员id',
`ip` varchar(20) NOT NULL DEFAULT '' COMMENT '会员ip',
`member_message` varchar(50) NOT NULL DEFAULT '' COMMENT '会员留言信息',
`order_item_money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单项目金额',
`order_discount_money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单优惠金额',
`order_money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单金额',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`pay_time` int(11) NOT NULL DEFAULT '0' COMMENT '订单支付时间',
`close_time` int(11) NOT NULL DEFAULT '0' COMMENT '订单关闭时间',
`is_delete` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除(针对后台)',
`is_enable_refund` int(11) NOT NULL DEFAULT '0' COMMENT '是否允许退款',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '商家留言',
`invoice_id` int(11) NOT NULL DEFAULT '0' COMMENT '发票id0表示不开发票',
`close_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '关闭原因',
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='订单表';
DROP TABLE IF EXISTS `{{prefix}}recharge_order_item`;
CREATE TABLE `{{prefix}}recharge_order_item` (
`order_item_id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL DEFAULT '0' COMMENT '订单id',
`site_id` int(11) NOT NULL DEFAULT '0' COMMENT '站点id',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '购买会员id',
`item_id` int(11) NOT NULL DEFAULT '0' COMMENT '项目id',
`item_type` varchar(255) NOT NULL DEFAULT '' COMMENT '项目类型',
`item_name` varchar(400) NOT NULL DEFAULT '' COMMENT '项目名称',
`item_image` varchar(2000) NOT NULL DEFAULT '' COMMENT '项目图片',
`price` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '项目单价',
`num` decimal(10,3) NOT NULL DEFAULT 0.000 COMMENT '购买数量',
`item_money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '项目总价',
`is_refund` int(11) NOT NULL DEFAULT '0' COMMENT '是否退款',
`refund_no` varchar(255) NOT NULL DEFAULT '' COMMENT '退款编号',
`refund_status` int(11) NOT NULL DEFAULT '0' COMMENT '退款状态',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='订单商品表';
DROP TABLE IF EXISTS `{{prefix}}recharge_order_item_refund`;
CREATE TABLE `{{prefix}}recharge_order_item_refund` (
`refund_id` int(11) NOT NULL AUTO_INCREMENT,
`order_item_id` int(11) NOT NULL DEFAULT '0' COMMENT '订单id',
`order_id` int(11) NOT NULL DEFAULT '0' COMMENT '订单id',
`order_no` varchar(255) NOT NULL DEFAULT '' COMMENT '订单编号',
`refund_no` varchar(255) NOT NULL DEFAULT '0' COMMENT '退款单号',
`site_id` int(11) NOT NULL DEFAULT '0' COMMENT '站点id',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员id',
`num` decimal(10,3) NOT NULL DEFAULT 0.000 COMMENT '退货数量',
`money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '总退款',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '退款状态',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
`transfer_time` int(11) NOT NULL DEFAULT '0' COMMENT '转账时间',
`item_type` varchar(255) NOT NULL DEFAULT '' COMMENT '项目类型',
PRIMARY KEY (`refund_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='订单退款表';
DROP TABLE IF EXISTS `{{prefix}}recharge_order_log`;
CREATE TABLE `{{prefix}}recharge_order_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL DEFAULT '0' COMMENT '订单id',
`site_id` int(11) NOT NULL DEFAULT '0' COMMENT '站点id',
`action` varchar(255) NOT NULL DEFAULT '' COMMENT '操作内容',
`uid` int(11) NOT NULL DEFAULT '0' COMMENT '操作人id',
`nick_name` varchar(50) NOT NULL DEFAULT '' COMMENT '操作人名称',
`order_status` int(11) NOT NULL DEFAULT '0' COMMENT '订单状态,操作后',
`action_way` bigint(20) NOT NULL DEFAULT '2' COMMENT '操作类型1买家2卖家 3 系统任务',
`order_status_name` varchar(255) NOT NULL DEFAULT '' COMMENT '订单状态名称,操作后',
`action_time` int(11) NOT NULL DEFAULT '0' COMMENT '操作时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='订单操作记录表';

View File

@ -0,0 +1,8 @@
DROP TABLE IF EXISTS `{{prefix}}recharge_order`;
DROP TABLE IF EXISTS `{{prefix}}recharge_order_item`;
DROP TABLE IF EXISTS `{{prefix}}recharge_order_item_refund`;
DROP TABLE IF EXISTS `{{prefix}}recharge_order_log`;

View File

@ -0,0 +1,6 @@
{
"menu": [
],
"delete": [
]
}

View File

@ -0,0 +1,119 @@
{
"menu": [
{
"menu_name": "会员充值",
"menu_short_name": "会员充值",
"menu_key": "recharge",
"parent_key": "",
"menu_type": 0,
"icon": "element Help",
"api_url": "",
"router_path": "",
"view_path": "",
"methods": "",
"sort": 100,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "充值订单",
"menu_short_name": "充值订单",
"menu_key": "recharge_order",
"parent_key": "recharge",
"menu_type": 0,
"icon": "iconfont iconchongzhidingdan",
"api_url": "",
"router_path": "",
"view_path": "",
"methods": "get",
"sort": 100,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "订单列表",
"menu_short_name": "订单列表",
"menu_key": "recharge_order_list",
"parent_key": "recharge_order",
"menu_type": 1,
"icon": "",
"api_url": "recharge/order",
"router_path": "recharge/order/list",
"view_path": "order/list",
"methods": "get",
"sort": 100,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "退款",
"menu_short_name": "退款",
"menu_key": "recharge_order_refund",
"parent_key": "recharge_order_list",
"menu_type": 2,
"icon": "",
"api_url": "recharge/refund/<order_id>",
"router_path": "",
"view_path": "",
"methods": "put",
"sort": 100,
"status": 1,
"is_show": 0
}
]
},
{
"menu_name": "订单详情",
"menu_short_name": "订单详情",
"menu_key": "recharge_order_detail",
"parent_key": "recharge_order",
"menu_type": 1,
"icon": "",
"api_url": "recharge/order/<order_id>",
"router_path": "recharge/order/detail",
"view_path": "order/detail",
"methods": "get",
"sort": 90,
"status": 1,
"is_show": 0
},
{
"menu_name": "退款记录",
"menu_short_name": "退款记录",
"menu_key": "recharge_order_refund_list",
"parent_key": "recharge_order",
"menu_type": 1,
"icon": "iconfont icontuikuanjilu",
"api_url": "recharge/refund",
"router_path": "recharge/order/refund",
"view_path": "order/refund",
"methods": "get",
"sort": 90,
"status": 1,
"is_show": 1,
"children": [
{
"menu_name": "退款详情",
"menu_short_name": "退款详情",
"menu_key": "recharge_refund_detail",
"parent_key": "recharge_order_refund_list",
"menu_type": 2,
"icon": "",
"api_url": "recharge/refund/<refund_id>",
"router_path": "",
"view_path": "",
"methods": "get",
"sort": 100,
"status": 1,
"is_show": 0
}
]
}
]
}
]
}
],
"delete": [
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,22 @@
import request from '@/utils/request'
/**
*
*/
export function createRecharge(data: AnyObject) {
return request.post('recharge/recharge', data, {showErrorMessage: true})
}
/**
*
*/
export function getRechargeList(data: AnyObject) {
return request.get('recharge/recharge', data, {showErrorMessage: true})
}
/**
*
*/
export function getRechargeDetail(id: number) {
return request.get(`recharge/recharge/${id}`, {}, {showErrorMessage: true})
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,3 @@
{
"orderNo": "订单号"
}

View File

@ -0,0 +1,15 @@
{
"recharge": "充值",
"cashOut":"提现",
"balanceDetail": "余额明细",
"accountBalance":"账户余额(元)",
"balance":"余额(元)",
"money":"可提现余额(元)",
"availableBalance": "可用余额",
"rechargeAmountError": "充值金额错误",
"confirm": "确认",
"customRechargeAmount": "自定义充值金额",
"yuan":"元",
"rechargeRecord":"充值记录",
"RechargeMethod":"充值方式"
}

View File

@ -0,0 +1,4 @@
{
"rechargeRecord": "充值记录",
"emptyTip": "暂无充值记录"
}

View File

@ -0,0 +1,4 @@
{
"orderNo": "订单编号",
"createTime": "创建时间"
}

View File

@ -0,0 +1,95 @@
<template>
<view :style="themeColor()">
<view class="overflow-hidden bg-[var(--page-bg-color)] min-h-[100vh] px-[var(--sidebar-m)]" v-show="!loading">
<view class="h-[200rpx] box-border pt-[46rpx] pl-[40rpx] mt-[20rpx] rounded-angle" :style="{backgroundImage: 'url(' + img('static/resource/images/member/point/mask_group.png') + ') ',backgroundSize: '100% 100%',backgroundRepeat: 'no-repeat'}">
<view class="leading-[36rpx] text-[#ffffff] text-[26rpx]">当前余额()</view>
<view class="text-[#fff] ml-[4rpx] text-[56rpx] mt-[16rpx] price-font" v-if="info">
{{info ? moneyFormat(info.balance) : '0.00'}}
</view>
</view>
<view class="top-mar card-template">
<view class="flex items-center border-0 border-b-[2rpx] border-solid border-[var(--temp-bg)] pb-[10rpx] pl-[4rpx]">
<view class="text-[#333] text-[28rpx] iconfont iconrenminbiV6xx price-font"></view>
<view class="pl-[20rpx] flex items-center flex-1">
<input type="digit" class="font-500 text-[54rpx] h-[70rpx] leading-[70rpx] bg-[#fff] price-font" v-model="rechargeAmount" maxlength="7" :placeholder="rechargeAmount?'':t('customRechargeAmount')" placeholder-class="apply-price price-font" :adjust-position="false"/>
</view>
</view>
<view class="flex flex-wrap justify-between px-[10rpx]">
<view v-for="(item,index) in rechargePackage" :key="index"
:class="['flex justify-center items-center w-[180rpx] h-[88rpx] box-border border-[1rpx] text-center rounded-[var(--goods-rounded-big)] mt-[30rpx] border-[#ccc] border-solid',{'border-none text-white':rechargeAmount == item}]"
:style="{'background': rechargeAmount == item?'linear-gradient( 283deg, #FD3923 11%, #FF7630 100%), #FFFFFF':''}"
@click="rechargeAmount = item">
<view class="flex items-end">
<text class="text-[36rpx] font-500 leading-[1] price-font">{{item}}</text>
<text class="text-[20rpx] ml-[6rpx] font-500 leading-[28rpx]">{{t('yuan')}}</text>
</view>
</view>
</view>
</view>
<view class="fixed bottom-[30rpx] left-0 right-0 px-[var(--sidebar-m)]">
<button class="primary-btn-bg h-[80rpx] leading-[80rpx] text-[#fff] text-[26rpx] border-[0] font-500 rounded-[50rpx]" hover-class="none" :loading="rechargeLoading" @click="recharge" >{{t('confirm')}}</button>
<view class="mt-[30rpx] text-center text-[26rpx] font-500 text-primary leading-[36rpx]" @click="redirect({ url: '/addon/recharge/pages/recharge_record' })">
{{t('rechargeRecord')}}
</view>
</view>
<pay ref="payRef" @close="rechargeLoading = false"></pay>
</view>
<loading-page :loading="loading"></loading-page>
</view>
</template>
<script setup lang="ts">
import { ref, computed} from 'vue'
import { t } from '@/locale'
import { redirect, img, debounce, moneyFormat } from '@/utils/common'
import { createRecharge } from '@/addon/recharge/api/recharge'
import { useSubscribeMessage } from '@/hooks/useSubscribeMessage'
import useMemberStore from '@/stores/member'
const rechargePackage = ref([20, 30, 50, 100, 200, 300])
const rechargeAmount = ref<string | number>("");
const rechargeLoading = ref(false)
const payRef = ref(null)
const loading = ref(false);
//
const memberStore = useMemberStore();
const info = computed(() => memberStore.info)
/**
* 发起充值
*/
const recharge = debounce(() => {
if (uni.$u.test.isEmpty(rechargeAmount.value)) {
uni.showToast({title: t('customRechargeAmount'), icon: 'none'})
return
}
if (!uni.$u.test.amount(rechargeAmount.value) || rechargeAmount.value <= 0) {
uni.showToast({title: t('rechargeAmountError'), icon: 'none'})
return
}
if (rechargeLoading.value) return
rechargeLoading.value = true
createRecharge({recharge_money: rechargeAmount.value}).then((res:any) => {
useSubscribeMessage().request('recharge_success')
payRef.value?.open(res.data.trade_type, res.data.trade_id,'/app/pages/member/index')
loading.value = false
rechargeLoading.value = false
}).catch(() => {
rechargeLoading.value = false
loading.value = false
})
})
</script>
<style lang="scss" scoped>
:deep(.apply-price){
color: var(--text-color-light9);
font-size: 26rpx;
font-weight: normal;
line-height: 76rpx;
}
</style>

View File

@ -0,0 +1,82 @@
<template>
<view class="min-h-[100vh] bg-[var(--page-bg-color)] overflow-hidden" :style="themeColor()">
<mescroll-body ref="mescrollRef" @init="mescrollInit" :down="{ use: false }" @up="getListFn" top="">
<view v-for="(order,index) in list" :key="order.order_id" class="sidebar-marign card-template mt-[var(--top-m)]" @click="toDetailFn(order)">
<view class="flex items-center justify-between mb-[20rpx]">
<view class="text-[36rpx] font-500 price-font text-active">{{ order.order_money }}</view>
<view class="leading-[38rpx] text-[26rpx]" v-if="order.order_status_info">{{ order.order_status_info.name }}</view>
</view>
<view class="text-[24rpx] text-[var(--text-color-light6)] mb-[10rpx] leading-[34rpx]">充值方式: {{order.item[0].item_name}}</view>
<view class="text-[24rpx] text-[var(--text-color-light6)] mb-[10rpx] leading-[34rpx]">支付时间: {{order.create_time}}</view>
</view>
<mescroll-empty v-if="!list.length && loading" :option="{tip : t('emptyTip') }"></mescroll-empty>
</mescroll-body>
</view>
</template>
<script setup lang="ts">
import {ref} from 'vue'
import {t} from '@/locale'
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue'
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue'
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
import {getRechargeList} from '@/addon/recharge/api/recharge'
import {redirect} from '@/utils/common'
import {onPageScroll, onReachBottom} from '@dcloudio/uni-app'
const {mescrollInit, downCallback, getMescroll} = useMescroll(onPageScroll, onReachBottom)
const list = ref<Array<any>>([]),
loading = ref<boolean>(false),
mescrollRef = ref(null);
interface mescrollStructure {
num: number,
size: number,
endSuccess: Function,
[propName: string]: any
}
const getListFn = (mescroll: mescrollStructure) => {
loading.value = false;
let data: Object = {
page: mescroll.num,
page_size: mescroll.size
};
interface acceptingDataStructure {
data: acceptingDataItemStructure,
msg: string,
code: number
}
interface acceptingDataItemStructure {
data: object,
[propName: string]: number | string | object
}
getRechargeList(data).then((res: acceptingDataStructure) => {
let newArr = res.data.data;
mescroll.endSuccess(newArr.length);
//
if (mescroll.num == 1) {
list.value = []; //
}
list.value = list.value.concat(newArr);
loading.value = true;
}).catch(() => {
loading.value = true;
mescroll.endErr(); // ,
})
}
const toDetailFn = (data) => {
redirect({url: '/addon/recharge/pages/recharge_record_detail', param: {id: data.order_id}});
}
</script>
<style lang="scss" scoped>
.text-active{
color: #FF0D3E;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<view class="overflow-hidden bg-[var(--page-bg-color)] min-h-[100vh] px-[var(--sidebar-m)]" :style="themeColor()" v-show="loading">
<view class="top-mar card-template !pt-[60rpx] !pb-[40rpx]">
<view class="flex items-center flex-col mb-[80rpx]">
<text class="text-[60rpx] font-bold price-font mb-[20rpx]">{{ rechargeInfo.order_money }}</text>
<text class="text-[28rpx]" :class="{'text-primary': rechargeInfo.order_status_info && rechargeInfo.order_status_info.status == 0}" v-if="rechargeInfo.order_status_info">{{rechargeInfo.order_status_info.name}}</text>
</view>
<view>
<view class="flex justify-between text-[28rpx] mt-[34rpx] leading-[32rpx]" v-if="rechargeInfo.item">
<text class="text-[#333] w-[200rpx]">{{ rechargeInfo.item[0].item_name }}</text>
<text class="text-[#333]">{{ rechargeInfo.order_money }}</text>
</view>
<view class="flex justify-between text-[28rpx] mt-[34rpx] leading-[32rpx]">
<text class="text-[#333] w-[200rpx]">{{t('orderNo')}}</text>
<text class="text-[#333]">{{ rechargeInfo.order_no }}</text>
</view>
<view class="flex justify-between text-[28rpx] mt-[34rpx] leading-[32rpx]">
<text class="text-[#333] w-[200rpx]">{{t('createTime')}}</text>
<text class="text-[#333]">{{ rechargeInfo.create_time }}</text>
</view>
</view>
</view>
</view>
</template>
<script lang="ts" setup>
import {reactive, ref} from 'vue'
import {onLoad} from '@dcloudio/uni-app'
import {t} from '@/locale'
import {getRechargeDetail} from '@/addon/recharge/api/recharge'
const rechargeInfo = ref({});
const loading = ref<boolean>(false);
onLoad((option) => {
let id = option.id || "";
getRechargeDetailFn(id)
})
const getRechargeDetailFn = (id:any) => {
loading.value = false;
getRechargeDetail(id).then((res:any) => {
rechargeInfo.value = res.data;
loading.value = true;
}).catch(() => {
loading.value = true;
})
}
</script>
<style lang="scss">
</style>

View File

@ -0,0 +1,268 @@
import request from '@/utils/request'
/********************************* 物流公司 ***************************************/
/**
*
* @param params
* @returns
*/
export function getCompanyPageList(params: Record<string, any>) {
return request.get(`shop/delivery/company`, { params })
}
/**
*
* @param params
* @returns
*/
export function getCompanyList(params: Record<string, any>) {
return request.get(`shop/delivery/company/list`, { params })
}
/**
*
* @param company_id company_id
* @returns
*/
export function getCompanyInfo(company_id: number) {
return request.get(`shop/delivery/company/${ company_id }`);
}
/**
*
* @param params
* @returns
*/
export function addCompany(params: Record<string, any>) {
return request.post('shop/delivery/company', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editCompany(params: Record<string, any>) {
return request.put(`shop/delivery/company/${ params.company_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param company_id
* @returns
*/
export function deleteCompany(company_id: number) {
return request.delete(`shop/delivery/company/${ company_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/********************************* 运费模版 ***************************************/
/**
*
* @param params
* @returns
*/
export function getShippingTemplatePageList(params: Record<string, any>) {
return request.get(`shop/shipping/template`, { params })
}
/**
*
* @param params
* @returns
*/
export function getShippingTemplateList(params: Record<string, any>) {
return request.get(`shop/shipping/template/list`, { params })
}
/**
*
* @param template_id template_id
* @returns
*/
export function getShippingTemplateInfo(template_id: number) {
return request.get(`shop/shipping/template/${ template_id }`);
}
/**
*
* @param params
* @returns
*/
export function addShippingTemplate(params: Record<string, any>) {
return request.post('shop/shipping/template', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editShippingTemplate(params: Record<string, any>) {
return request.put(`shop/shipping/template/${ params.template_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param template_id
* @returns
*/
export function deleteShippingTemplate(template_id: number) {
return request.delete(`shop/shipping/template/${ template_id }`, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/********************************* 自提门店 ***************************************/
/**
*
* @param params
* @returns
*/
export function getStoreList(params: Record<string, any>) {
return request.get(`shop/delivery/store`, { params })
}
/**
*
* @param store_id store_id
* @returns
*/
export function getStoreInfo(store_id: number) {
return request.get(`shop/delivery/store/${ store_id }`);
}
/**
*
* @param params
* @returns
*/
export function addStore(params: Record<string, any>) {
return request.post('shop/delivery/store', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editStore(params: Record<string, any>) {
return request.put(`shop/delivery/store/${ params.store_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param store_id
* @returns
*/
export function deleteStore(store_id: number) {
return request.delete(`shop/delivery/store/${ store_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/********************************* 物流查询 ***************************************/
/**
*
* @param params
* @returns
*/
export function setDeliverySearch(params: Record<string, any>) {
return request.post('shop/delivery/search', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @returns
*/
export function getDeliverySearch() {
return request.get('shop/delivery/search')
}
/**
*
* @returns
*/
export function getShopDeliveryList() {
return request.get('shop/delivery/deliveryList')
}
/**
*
* @param params
* @returns
*/
export function setShopDeliveryConfig(params: Record<string, any>) {
return request.put(`shop/delivery/setConfig`, params)
}
/**
*
* @param params
* @returns
*/
export function getShopDelivery(params: Record<string, any>) {
return request.get('shop/delivery/staff', { params })
}
/**
*
* @param staff_id
* @returns
*/
export function getShopDeliverInfo(staff_id: number) {
return request.get(`shop/delivery/staff/${ staff_id }`);
}
/**
*
* @param params
* @returns
*/
export function addShopDeliver(params: Record<string, any>) {
return request.post('shop/delivery/staff', params, { showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editShopDeliver(params: Record<string, any>) {
return request.put(`shop/delivery/staff/${ params.deliver_id }`, params, { showSuccessMessage: true })
}
/**
*
* @param staff_id
* @returns
*/
export function deleteShopDeliver(staff_id: number) {
return request.delete(`shop/delivery/staff/${ staff_id }`)
}
/**
*
* @returns
*/
export function getLocal() {
return request.get('shop/local');
}
/**
*
* @param params
* @returns
*/
export function setLocal(params: Record<string, any>) {
return request.put('shop/local', params, { showSuccessMessage: true })
}

View File

@ -0,0 +1,116 @@
import request from '@/utils/request'
/**
*
* @param params
* @returns
*/
export function getElectronicSheetPageList(params: Record<string, any>) {
return request.get(`shop/electronic_sheet`, { params })
}
/**
*
* @param params
* @returns
*/
export function getElectronicSheetList(params: Record<string, any>) {
return request.get(`shop/electronic_sheet/list`, { params })
}
/**
*
* @param id id
* @returns
*/
export function getElectronicSheetInfo(id: number) {
return request.get(`shop/electronic_sheet/${ id }`);
}
/**
*
* @param params
* @returns
*/
export function addElectronicSheet(params: Record<string, any>) {
return request.post('shop/electronic_sheet', params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
* @returns
*/
export function editElectronicSheet(params: Record<string, any>) {
return request.put(`shop/electronic_sheet/${ params.id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param id
* @returns
*/
export function deleteElectronicSheet(id: number) {
return request.delete(`shop/electronic_sheet/${ id }`, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
* @returns
*/
export function setDefaultElectronicSheet(params: Record<string, any>) {
return request.put(`shop/electronic_sheet/setDefault/${ params.id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
* @returns
*/
export function setElectronicSheetConfig(params: Record<string, any>) {
return request.post('shop/electronic_sheet/config', params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @returns
*/
export function getElectronicSheetConfig() {
return request.get(`shop/electronic_sheet/config`)
}
/**
*
* @returns
*/
export function getElectronicSheetPayType() {
return request.get(`shop/electronic_sheet/paytype`)
}
/**
*
* @param params
* @returns
*/
export function printElectronicSheet(params: Record<string, any>) {
return request.post('shop/electronic_sheet/print', params, {
showErrorMessage: true,
showSuccessMessage: true
})
}

View File

@ -0,0 +1,647 @@
import request from '@/utils/request'
/**
*
* @param params
* @returns
*/
export function getGoodsPageList(params: Record<string, any>) {
return request.get(`shop/goods`, { params })
}
/**
*
* @param goods_id goods_id
* @returns
*/
export function getGoodsInfo(goods_id: number) {
return request.get(`shop/goods/${ goods_id }`);
}
/**
*
* @param params
* @returns
*/
export function addGoods(params: Record<string, any>) {
return request.post('shop/goods', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
*/
export function editGoods(params: Record<string, any>) {
return request.put(`shop/goods/${ params.goods_id }`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
* /
* @param params
*/
export function getGoodsInit(params: Record<string, any>) {
return request.get(`shop/goods/init`, { params });
}
/**
*
* @param params
* @returns
*/
export function addVirtualGoods(params: Record<string, any>) {
return request.post('shop/goods/virtual', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
*/
export function editVirtualGoods(params: Record<string, any>) {
return request.put(`shop/goods/virtual/${ params.goods_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
* /
* @param params
*/
export function getVirtualGoodsInit(params: Record<string, any>) {
return request.get(`shop/goods/virtual/init`, { params });
}
/**
*
* @param params
* @returns
*/
export function deleteGoods(params: Record<string, any>) {
return request.put(`shop/goods/delete`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getRecycleGoodsPageList(params: Record<string, any>) {
return request.get(`shop/goods/recycle`, { params })
}
/**
*
* @param params
* @returns
*/
export function recycleGoods(params: Record<string, any>) {
return request.put(`shop/goods/recycle`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
*/
export function editGoodsSort(params: Record<string, any>) {
return request.put(`shop/goods/sort`, params, { showSuccessMessage: true })
}
/**
*
* @param params
*/
export function editGoodsStatus(params: Record<string, any>) {
return request.put(`shop/goods/status`, params, { showSuccessMessage: true })
}
/**
*
* @param params
*/
export function copyGoods(params: Record<string, any>) {
return request.put(`shop/goods/copy/${ params.goods_id }`, params, { showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getGoodsSelectPageList(params: Record<string, any>) {
return request.get(`shop/goods/select`, { params })
}
/**
* SKU规格列表
* @param params
* @returns
*/
export function getGoodsSkuList(params: Record<string, any>) {
return request.get(`shop/goods/sku`, { params })
}
/**
* SKU规格不分页列表
* @param params
* @returns
*/
export function getGoodsSkuNoPageList(params: Record<string, any>) {
return request.get(`shop/goods/selectgoodssku`, { params })
}
/**
* @param params
* @returns
*/
export function getActiveGoodsCount(params: Record<string, any>) {
return request.get(`shop/goods/active/count`, { params })
}
/**
* SKU规格库存
* @param params
* @returns
*/
export function editGoodsListStock(params: Record<string, any>) {
return request.put(`shop/goods/sku/stock`, params, { showSuccessMessage: true })
}
/**
* SKU规格价格
* @param params
* @returns
*/
export function editGoodsListPrice(params: Record<string, any>) {
return request.put(`shop/goods/sku/price`, params, { showSuccessMessage: true })
}
/**
* SKU规格会员价格
* @param params
* @returns
*/
export function editGoodsListMemberPrice(params: Record<string, any>) {
return request.put(`shop/goods/sku/member_price`, params, { showSuccessMessage: true })
}
/**
*
* @returns
*/
export function getGoodsType() {
return request.get(`shop/goods/type`);
}
/**
*
* @param params
* @returns
*/
export function getLabelPageList(params: Record<string, any>) {
return request.get(`shop/goods/label`, { params })
}
/**
*
* @param params
* @returns
*/
export function getLabelList(params: Record<string, any>) {
return request.get(`shop/goods/label/list`, { params })
}
/**
*
* @param label_id label_id
* @returns
*/
export function getLabelInfo(label_id: number) {
return request.get(`shop/goods/label/${ label_id }`);
}
/**
*
* @param params
* @returns
*/
export function addLabel(params: Record<string, any>) {
return request.post('shop/goods/label', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editLabel(params: Record<string, any>) {
return request.put(`shop/goods/label/${ params.label_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param label_id
* @returns
*/
export function deleteLabel(label_id: number) {
return request.delete(`shop/goods/label/${ label_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
*/
export function modifyLabelSort(params: Record<string, any>) {
return request.put(`shop/goods/label/sort`, params, { showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getBrandPageList(params: Record<string, any>) {
return request.get(`shop/goods/brand`, { params })
}
/**
*
* @param params
* @returns
*/
export function getBrandList(params: Record<string, any>) {
return request.get(`shop/goods/brand/list`, { params })
}
/**
*
* @param brand_id brand_id
* @returns
*/
export function getBrandInfo(brand_id: number) {
return request.get(`shop/goods/brand/${ brand_id }`);
}
/**
*
* @param params
* @returns
*/
export function addBrand(params: Record<string, any>) {
return request.post('shop/goods/brand', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editBrand(params: Record<string, any>) {
return request.put(`shop/goods/brand/${ params.brand_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
*/
export function modifyBrandSort(params: Record<string, any>) {
return request.put(`shop/goods/brand/sort`, params, { showSuccessMessage: true })
}
/**
*
* @param brand_id
* @returns
*/
export function deleteBrand(brand_id: number) {
return request.delete(`shop/goods/brand/${ brand_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getServePageList(params: Record<string, any>) {
return request.get(`shop/goods/service`, { params })
}
/**
*
* @param params
* @returns
*/
export function getServeList(params: Record<string, any>) {
return request.get(`shop/goods/service/list`, { params })
}
/**
*
* @param service_id service_id
* @returns
*/
export function getServeInfo(service_id: number) {
return request.get(`shop/goods/service/${ service_id }`);
}
/**
*
* @param params
* @returns
*/
export function addServe(params: Record<string, any>) {
return request.post('shop/goods/service', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editServe(params: Record<string, any>) {
return request.put(`shop/goods/service/${ params.service_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param service_id
* @returns
*/
export function deleteServe(service_id: number) {
return request.delete(`shop/goods/service/${ service_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @returns
*/
export function getCategoryTree() {
return request.get(`shop/goods/tree`)
}
/**
*
* @param params
* @returns
*/
export function getCategoryList(params: Record<string, any>) {
return request.get(`shop/goods/category`, { params })
}
/**
*
* @param category_id category_id
* @returns
*/
export function getCategoryInfo(category_id: number) {
return request.get(`shop/goods/category/${ category_id }`);
}
/**
*
* @param params
* @returns
*/
export function addCategory(params: Record<string, any>) {
return request.post('shop/goods/category', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editCategory(params: Record<string, any>) {
return request.put(`shop/goods/category/${ params.category_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param category_id
* @returns
*/
export function deleteCategory(category_id: number) {
return request.delete(`shop/goods/category/${ category_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function updateCategory(params: Record<string, any>) {
return request.post(`shop/goods/category/update`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function setCategoryConfig(params: Record<string, any>) {
return request.post(`shop/goods/category/config`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @returns
*/
export function getCategoryConfig() {
return request.get(`shop/goods/category/config`);
}
/**
*
* @returns
*/
export function getCategoryTreeComponents() {
return request.get(`shop/goods/category/components`)
}
/**
*
* @param params
* @returns
*/
export function getSupplierList(params: Record<string, any>) {
return request.get(`shop_supplier/supplier/list`, { params })
}
/**
*
* @param params
* @returns
*/
export function getEvaluateList(params: Record<string, any>) {
return request.get(`shop/goods/evaluate`, { params })
}
/**
*
* @param params
* @returns
*/
export function addEvaluate(params: Record<string, any>) {
return request.post('shop/goods/evaluate', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param evaluate_id
* @returns
*/
export function deleteEvaluate(evaluate_id: number) {
return request.delete(`shop/goods/evaluate/${ evaluate_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param evaluate_id
* @returns
*/
export function adoptEvaluate(evaluate_id: number) {
return request.put(`shop/goods/evaluate/adopt/${ evaluate_id }`, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param evaluate_id
* @returns
*/
export function refuseEvaluate(evaluate_id: number) {
return request.put(`shop/goods/evaluate/refuse/${ evaluate_id }`, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
* @returns
*/
export function replyEvaluate(params: Record<string, any>) {
return request.put(`shop/goods/evaluate/reply/${ params.evaluate_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param evaluate_id
* @returns
*/
export function toppingEvaluate(evaluate_id: number) {
return request.put(`shop/goods/evaluate/topping/${ evaluate_id }`, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param evaluate_id
* @returns
*/
export function cancelToppingEvaluate(evaluate_id: number) {
return request.put(`shop/goods/evaluate/cancel_topping/${ evaluate_id }`, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
* @returns
*/
export function getAttrPageList(params: Record<string, any>) {
return request.get(`shop/goods/attr`, { params })
}
/**
*
* @param params
* @returns
*/
export function getAttrList(params: Record<string, any>) {
return request.get(`shop/goods/attr/list`, { params })
}
/**
*
* @param attr_id attr_id
* @returns
*/
export function getAttrInfo(attr_id: number) {
return request.get(`shop/goods/attr/${ attr_id }`);
}
/**
*
* @param params
* @returns
*/
export function addAttr(params: Record<string, any>) {
return request.post('shop/goods/attr', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editAttr(params: Record<string, any>) {
return request.put(`shop/goods/attr/${ params.attr_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param attr_id
* @returns
*/
export function deleteAttr(attr_id: number) {
return request.delete(`shop/goods/attr/${ attr_id }`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
*/
export function modifyAttrSort(params: Record<string, any>) {
return request.put(`shop/goods/attr/sort`, params, { showSuccessMessage: true })
}
/**
*
* @param params
*/
export function modifyAttrName(params: Record<string, any>) {
return request.put(`shop/goods/attr/attr_name`, params, { showSuccessMessage: true })
}
/**
*
* @param params
*/
export function modifyAttrValue(params: Record<string, any>) {
return request.put(`shop/goods/attr/attr_value`, params, { showSuccessMessage: true })
}

View File

@ -0,0 +1,289 @@
import request from '@/utils/request'
/**
*
* @param params
* @returns
*/
export function getMarketingIndex(params: Record<string, any>) {
return request.get(`shop/marketing`, { params })
}
/**
*
* @param params
* @returns
*/
export function getGoodsCategoryList(params: Record<string, any>) {
return request.get(`shop/goods/coupon/init`, { params })
}
/**
*
* @param params
* @returns
*/
export function addCoupon(params: Record<string, any>) {
return request.post(`shop/goods/coupon`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getCouponList(params: Record<string, any>) {
return request.get(`shop/goods/coupon`, { params })
}
/**
*
* @param params
* @returns
*/
export function getCouponRecords(params: Record<string, any>) {
return request.get(`shop/goods/coupon/records`, { params });
}
/**
*
* @param id
* @returns
*/
export function getCouponInfo(id: number) {
return request.get(`shop/goods/coupon/detail/${ id }`);
}
/**
*
* @param params
* @returns
*/
export function editCouponStatus(params: Record<string, any>) {
return request.put(`shop/goods/coupon/setstatus/${ params.status }`, params, { showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editCoupon(params: Record<string, any>) {
return request.put(`shop/goods/coupon/edit/${ params.id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param id
* @returns
*/
export function deleteCoupon(id: number) {
return request.delete(`shop/goods/coupon/${ id }`, { showSuccessMessage: true })
}
/**
*
* @param id
* @returns
*/
export function closeCoupon(id: number) {
return request.put(`shop/goods/coupon/invalid/${ id }`, { showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getSelectedCouponList(params: Record<string, any>) {
return request.get(`shop/goods/coupon/selected`, { params })
}
/************ 限时折扣 ****************/
/**
*
* @param params
* @returns
*/
export function getActiveDiscountPageList(params: Record<string, any>) {
return request.get(`shop/active/discount`, { params })
}
/**
*
* @returns
*/
export function getActiveDiscountStatusList() {
return request.get(`shop/active/status`)
}
/**
*
* @param active_id
* @returns
*/
export function getActiveDiscountInfo(active_id: number) {
return request.get(`shop/active/discount/${ active_id }`);
}
/**
*
* @param params
* @returns
*/
export function addActiveDiscount(params: Record<string, any>) {
return request.post('shop/active/discount', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editActiveDiscount(params: Record<string, any>) {
return request.put(`shop/active/discount/${ params.active_id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param active_id
* @returns
*/
export function closeActiveDiscount(active_id: number) {
return request.put(`shop/active/discount/close/${ active_id }`, {}, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param active_id
* @returns
*/
export function deleteActiveDiscount(active_id: number) {
return request.delete(`shop/active/discount/${ active_id }`, { showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function getActiveDiscountGoodsPageList(params: Record<string, any>) {
return request.get(`shop/active/discount/goods/${ params.active_id }`, { params })
}
/**
*
* @param params
* @returns
*/
export function getActiveDiscountOrderPageList(params: Record<string, any>) {
return request.get(`shop/active/discount/order/${ params.active_id }`, { params })
}
/**
*
* @param params
* @returns
*/
export function getActiveDiscountMemberPageList(params: Record<string, any>) {
return request.get(`shop/active/discount/member/${ params.active_id }`, { params })
}
/**
*
* @returns
*/
export function getActiveDiscountConfig() {
return request.get(`shop/active/discount/config`);
}
/**
*
* @param params
* @returns
*/
export function editActiveDiscountConfig(params: Record<string, any>) {
return request.put(`shop/active/discount/config`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/********** 积分商品 ***********/
/**
*
* @param params
* @returns
*/
export function getActiveExchangePageList(params: Record<string, any>) {
return request.get(`shop/active/exchange`, { params })
}
/**
*
* @param id id
* @returns
*/
export function getActiveExchangeInfo(id: number) {
return request.get(`shop/active/exchange/${ id }`);
}
/**
*
* @param params
* @returns
*/
export function addActiveExchange(params: Record<string, any>) {
return request.post('shop/active/exchange', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param params
* @returns
*/
export function editActiveExchange(params: Record<string, any>) {
return request.put(`shop/active/exchange/${ params.id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param params
* @returns
*/
export function editActiveExchangeStatus(params: Record<string, any>) {
return request.put(`shop/active/exchange/status/${ params.id }`, params, {
showErrorMessage: true,
showSuccessMessage: true
})
}
/**
*
* @param id
* @returns
*/
export function deleteActiveExchange(id: number) {
return request.delete(`shop/active/exchange/${ id }`, { showSuccessMessage: true })
}
/**
*
* @returns
*/
export function getActiveExchangeStatus() {
return request.get(`shop/active/exchange/status`)
}

View File

@ -0,0 +1,237 @@
import request from '@/utils/request'
/**
*
* @returns
*/
export function getConfig() {
return request.get('shop/order/config')
}
/**
*
* @returns
*/
export function setConfig(param: any) {
return request.post('shop/order/config', param, { showSuccessMessage: true })
}
/**
*
* @returns
*/
export function getOrderList(params: Record<string, any>) {
return request.get('shop/order/list', { params })
}
/**
*
* @returns
*/
export function getOrderDetail(order_id: number) {
return request.get(`shop/order/detail/${ order_id }`)
}
/**
*
* @return
*/
export function getOrderStatus() {
return request.get(`shop/order/status`)
}
/**
*
* @return
*/
export function getOrderType() {
return request.get(`shop/order/type`)
}
/**
*
* @return
*/
export function orderClose(order_id: number) {
return request.put(`shop/order/close/${ order_id }`)
}
/**
*
* @return
*/
export function getOrderDeliveryType(params: Record<string, any>) {
return request.get(`shop/order/delivery_type`, { params })
}
/**
*
* @return
*/
export function orderDelivery(params: Record<string, any>) {
return request.put(`shop/order/delivery`, params)
}
/**
*
* @return
*/
export function setShopRemark(params: Record<string, any>) {
return request.put(`shop/order/shop_remark`, params)
}
/**
*
* @return
*/
export function orderFinish(order_id: number) {
return request.put(`shop/order/finish/${ order_id }`)
}
/**
*
* @return
*/
export function deliveryPackage(params: Record<string, any>) {
return request.get(`shop/order/delivery/package`, { params })
}
/**
*
* @return
*/
export function deliveryPackageList(params: Record<string, any>) {
return request.get(`shop/order/delivery/package/list`, { params })
}
/**
* 退
* @param {Record<string, any>} params
* @return
*/
export function orderRefund(params: Record<string, any>) {
return request.get(`shop/order/refund`, { params })
}
/**
* 退
*/
export function orderRefundDetail(refund_id: number) {
return request.get(`shop/order/refund/${ refund_id }`)
}
/**
* 退
* @return
*/
export function auditRefund(params: Record<string, any>) {
return request.put(`shop/order/refund/audit/${ params.order_refund_no }`, params)
}
/**
* 退
* @return
*/
export function refundDelivery(params: Record<string, any>) {
return request.put(`shop/order/refund/delivery/${ params.order_refund_no }`, params)
}
/**
*
*/
export function getInvoiceList(params: Record<string, any>) {
return request.get(`shop/invoice`, { params })
}
/**
*
*/
export function getInvoiceDetail(id: number) {
return request.get(`shop/invoice/${ id }`)
}
/**
*
*/
export function setInvoice(id: number, params: Record<string, any>) {
return request.put(`shop/invoice/${ id }`, params, { showSuccessMessage: true })
}
/**
*
*/
export function getOrderPayType() {
return request.get(`shop/order/pay/type`)
}
/**
*
*/
export function getOrderFrom() {
return request.get(`shop/order/from`)
}
/**
*
* @return
*/
export function orderEditPrice(params: Record<string, any>) {
return request.put(`shop/order/edit_price`, params, { showSuccessMessage: true })
}
/**
*
* @return
*/
export function getOrderEditAddress(params: Record<string, any>) {
return request.get(`shop/order/edit_delivery`, { params })
}
/**
*
* @return
*/
export function getDeliveryList() {
return request.get(`shop/delivery/store/list`)
}
/**
*
* @return
*/
export function orderEditAddress(params: Record<string, any>) {
return request.put(`shop/order/edit_delivery`, params)
}
/**
*
* @return
*/
export function getOrderBatchDeliveryList(params: Record<string, any>) {
return request.get(`shop/order_batch_delivery`, { params })
}
/**
*
* @return
*/
export function addBatchOrderDelivery(params: Record<string, any>) {
return request.put(`shop/order_batch_delivery/add_batch_order_delivery`, params)
}
/**
*
* @return
*/
export function getOrderBatchDeliveryState() {
return request.get(`shop/order_batch_delivery/get_status`)
}
/**
*
* @return
*/
export function getOrderBatchDeliveryType() {
return request.get(`shop/order_batch_delivery/get_type`)
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
/**
*
*/
export function getShopCountList() {
return request.get(`shop/stat/total`)
}
/**
*
*/
export function getShopTodayCountList() {
return request.get(`shop/stat/today`)
}
/**
*
*/
export function getShopYesterdayCountList() {
return request.get(`shop/stat/yesterday`)
}
/**
*
*/
export function getShopStat() {
return request.get(`shop/stat`)
}
/**
*
*/
export function getShopOrderStat() {
return request.get(`shop/stat/order`)
}
/**
*
*/
export function getShopGoodsStat() {
return request.get(`shop/stat/goods`)
}

Some files were not shown because too many files have changed in this diff Show More