From e6c578f5ea2685bfb4b4602c2c2be4c614203115 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 May 2019 18:57:12 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=89=8D=E7=AB=AF=EF=BC=9A=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=8D=95=E5=88=97=E8=A1=A8=20-=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=EF=BC=9A=E9=80=80=E6=AC=BE=E5=8D=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin-web/config/proxy/proxy.dev.js | 12 + admin-web/config/proxy/proxy.prod.js | 10 + admin-web/config/router.config.js | 31 ++ admin-web/src/locales/zh-CN/menu.js | 5 + admin-web/src/models/pay/payRefundList.js | 97 ++++++ .../src/models/pay/payTransactionList.js | 101 ++++++ .../src/models/promotion/fullPrivilegeList.js | 47 +-- .../promotion/timeLimitedDiscountList.js | 36 -- admin-web/src/models/user/userList.js | 89 +++++ admin-web/src/pages/Pay/PayRefundList.js | 319 +++++++++++++++++ admin-web/src/pages/Pay/PayRefundList.less | 15 + admin-web/src/pages/Pay/PayTransactionList.js | 328 ++++++++++++++++++ .../src/pages/Pay/PayTransactionList.less | 15 + admin-web/src/pages/User/UserList.js | 266 ++++++++++++++ admin-web/src/pages/User/UserList.less | 15 + admin-web/src/services/pay.js | 18 + admin-web/src/services/user.js | 9 + .../framework/util/ServiceExceptionUtil.java | 7 +- docs/guides/功能列表/功能列表-管理后台.md | 14 +- .../admins/AdminsPayRefundController.java | 68 ++++ .../AdminsPayTransactionController.java | 50 +++ ...ler.java => UsersPayRefundController.java} | 6 +- ...ava => UsersPayTransactionController.java} | 5 +- .../application/convert/PayRefundConvert.java | 19 + .../vo/admins/AdminsPayRefundDetailVO.java | 21 ++ .../vo/admins/AdminsPayRefundPageVO.java | 25 ++ .../mall/pay/api/PayRefundService.java | 4 + .../mall/pay/api/PayTransactionService.java | 9 + .../iocoder/mall/pay/api/bo/PayRefundBO.java | 102 ++++++ .../mall/pay/api/bo/PayRefundPageBO.java | 25 ++ .../mall/pay/api/bo/PayTransactionBO.java | 7 + .../mall/pay/api/bo/PayTransactionPageBO.java | 25 ++ .../mall/pay/api/constant/PayChannelEnum.java | 6 +- .../mall/pay/api/dto/PayRefundPageDTO.java | 46 +++ .../pay/api/dto/PayTransactionPageDTO.java | 56 +++ .../pay/biz/convert/PayRefundConvert.java | 9 + .../biz/convert/PayTransactionConvert.java | 5 + .../mall/pay/biz/dao/PayRefundMapper.java | 19 + .../pay/biz/dao/PayTransactionMapper.java | 26 ++ .../pay/biz/service/PayRefundServiceImpl.java | 23 +- .../service/PayTransactionServiceImpl.java | 33 +- .../main/resources/config/application.yaml | 5 + .../main/resources/mapper/PayRefundMapper.xml | 53 +++ .../resources/mapper/PayTransactionMapper.xml | 81 +++++ .../admins/AdminsCouponController.java | 14 +- .../users/UsersCouponController.java | 14 +- .../convert/CouponCardConvert.java | 7 +- .../convert/CouponTemplateConvert.java | 34 +- .../mall/promotion/api/CouponService.java | 50 ++- .../biz/service/CouponServiceImpl.java | 132 ++++--- .../src/main/resources/mapper/AdminMapper.xml | 4 +- user/user-application/pom.xml | 6 + .../application/config/MVCConfiguration.java | 3 +- .../admins/AdminsUserController.java | 10 +- .../controller/users/PassportController.java | 18 +- .../users/UserAddressController.java | 4 +- .../controller/users/UserController.java | 12 +- .../vo/admins/AdminsUserPageVO.java | 4 +- .../interceptor/UserAccessLogInterceptor.java | 4 +- .../interceptor/UserSecurityInterceptor.java | 4 +- .../iocoder/mall/user/api/bo/UserPageBO.java | 4 +- .../mall/user/api/dto/UserPageDTO.java | 4 + .../iocoder/mall/user/biz/dao/UserMapper.java | 6 +- .../biz/service/MobileCodeServiceImpl.java | 2 +- .../user/biz/service/OAuth2ServiceImpl.java | 2 +- .../biz/service/UserAccessLogServiceImpl.java | 2 +- .../biz/service/UserAddressServiceImpl.java | 2 +- .../user/biz/service/UserServiceImpl.java | 9 +- .../main/resources/config/application.yaml | 14 +- .../src/main/resources/mapper/UserMapper.xml | 8 +- 70 files changed, 2263 insertions(+), 272 deletions(-) create mode 100644 admin-web/src/models/pay/payRefundList.js create mode 100644 admin-web/src/models/pay/payTransactionList.js create mode 100644 admin-web/src/models/user/userList.js create mode 100644 admin-web/src/pages/Pay/PayRefundList.js create mode 100644 admin-web/src/pages/Pay/PayRefundList.less create mode 100644 admin-web/src/pages/Pay/PayTransactionList.js create mode 100644 admin-web/src/pages/Pay/PayTransactionList.less create mode 100644 admin-web/src/pages/User/UserList.js create mode 100644 admin-web/src/pages/User/UserList.less create mode 100644 admin-web/src/services/pay.js create mode 100644 pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayRefundController.java create mode 100644 pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayTransactionController.java rename pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/{PayRefundController.java => UsersPayRefundController.java} (90%) rename pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/{PayTransactionController.java => UsersPayTransactionController.java} (94%) create mode 100644 pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/convert/PayRefundConvert.java create mode 100644 pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundDetailVO.java create mode 100644 pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundPageVO.java create mode 100644 pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundBO.java create mode 100644 pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundPageBO.java create mode 100644 pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionPageBO.java create mode 100644 pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayRefundPageDTO.java create mode 100644 pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayTransactionPageDTO.java diff --git a/admin-web/config/proxy/proxy.dev.js b/admin-web/config/proxy/proxy.dev.js index f8fc22be5..9f7a52d6f 100644 --- a/admin-web/config/proxy/proxy.dev.js +++ b/admin-web/config/proxy/proxy.dev.js @@ -25,4 +25,16 @@ export default { changeOrigin: true, pathRewrite: {}, }, + '/user-api/': { + // target: 'http://180.167.213.26:18085/', + target: 'http://127.0.0.1:18082/', + changeOrigin: true, + pathRewrite: {}, + }, + '/pay-api/': { + // target: 'http://180.167.213.26:18085/', + target: 'http://127.0.0.1:18084/', + changeOrigin: true, + pathRewrite: {}, + }, }; diff --git a/admin-web/config/proxy/proxy.prod.js b/admin-web/config/proxy/proxy.prod.js index f8cef2eee..a8d5977a2 100644 --- a/admin-web/config/proxy/proxy.prod.js +++ b/admin-web/config/proxy/proxy.prod.js @@ -6,11 +6,21 @@ export default { changeOrigin: true, pathRewrite: {}, }, + '/product-api/': { + target: 'http://api.shop.iocoder.cn:18099/product-api', + changeOrigin: true, + pathRewrite: {}, + }, '/order-api/': { target: 'http://api.shop.iocoder.cn:18099/order-api', changeOrigin: true, pathRewrite: {}, }, + '/promotion-api/': { + target: 'http://api.shop.iocoder.cn:18099/promotion-api', + changeOrigin: true, + pathRewrite: {}, + }, '/pay-api/': { target: 'http://api.shop.iocoder.cn:18099/pay-api', changeOrigin: true, diff --git a/admin-web/config/router.config.js b/admin-web/config/router.config.js index d8426e9e0..476db0680 100644 --- a/admin-web/config/router.config.js +++ b/admin-web/config/router.config.js @@ -58,6 +58,19 @@ export default [ }, ], }, + // user + { + path: '/member', // TODO 芋艿,后面调整 + name: 'user', + icon: 'user', + routes: [ + { + path: '/member/user-list', + name: 'user-list', + component: './User/UserList', + }, + ], + }, // order { path: 'order', @@ -142,6 +155,24 @@ export default [ } ], }, + // pay + { + path: '/pay', + name: 'pay', + icon: 'user', + routes: [ + { + path: '/pay/transaction-list', + name: 'pay-transaction-list', + component: './Pay/PayTransactionList', + }, + { + path: '/pay/refund-list', + name: 'pay-refund-list', + component: './Pay/PayRefundList', + }, + ], + }, { path: '/dashboard', name: 'dashboard', diff --git a/admin-web/src/locales/zh-CN/menu.js b/admin-web/src/locales/zh-CN/menu.js index 86202bdbd..849ae3b8c 100644 --- a/admin-web/src/locales/zh-CN/menu.js +++ b/admin-web/src/locales/zh-CN/menu.js @@ -60,4 +60,9 @@ export default { 'menu.promotion.coupon-card-template-list': '优惠劵管理', 'menu.promotion.time-limit-discount-list': '限时折扣', 'menu.promotion.full-privilege-list': '满减送', + // 会员相关 + 'menu.user.user-list': '会员资料', + // 支付相关 + 'menu.pay.pay-transaction-list': '支付单', + 'menu.pay.pay-refund-list': '退款单', }; diff --git a/admin-web/src/models/pay/payRefundList.js b/admin-web/src/models/pay/payRefundList.js new file mode 100644 index 000000000..067ff8ad4 --- /dev/null +++ b/admin-web/src/models/pay/payRefundList.js @@ -0,0 +1,97 @@ +import { message } from 'antd'; +import { productSpuPage, productSpuUpdateSort } from '../../services/product'; +import {routerRedux} from "dva/router"; +import PaginationHelper from '../../../helpers/PaginationHelper'; +import {getPromotionActivityPage} from "../../services/promotion"; +import {queryPayRefundPage, queryPayTransactionPage} from "../../services/pay"; + +const SEARCH_PARAMS_DEFAULT = { + createBeginTime: undefined, + createEndTime: undefined, + finishBeginTime: undefined, + finishEndTime: undefined, + status: undefined, + payChannel: undefined, +}; + +export default { + namespace: 'payRefundList', + + state: { + // 分页列表相关 + list: [], + listLoading: false, + pagination: PaginationHelper.defaultPaginationConfig, + searchParams: SEARCH_PARAMS_DEFAULT, + + // 添加 or 修改表单相关 + }, + + effects: { + *page({ payload }, { call, put }) { + // const { queryParams } = payload; + // const response = yield call(productSpuPage, payload); + // message.info('查询成功!'); + // yield put({ + // type: 'treeSuccess', + // payload: { + // list: response.data, + // }, + // }); + + // 显示加载中 + yield put({ + type: 'changeListLoading', + payload: true, + }); + + // 请求 + const response = yield call(queryPayRefundPage, payload); + // 响应 + yield put({ + type: 'setAll', + payload: { + list: response.data.list, + pagination: PaginationHelper.formatPagination(response.data, payload), + searchParams: { + createBeginTime: payload.createBeginTime, + createEndTime: payload.createEndTime, + finishBeginTime: payload.finishBeginTime, + finishEndTime: payload.finishEndTime, + status: payload.status, + payChannel: payload.payChannel, + } + }, + }); + + // 隐藏加载中 + yield put({ + type: 'changeListLoading', + payload: false, + }); + }, + }, + + reducers: { + treeSuccess(state, { payload }) { + return { + ...state, + ...payload, + }; + }, + // 修改加载中的状态 + changeListLoading(state, { payload }) { + return { + ...state, + listLoading: payload, + }; + }, + // 设置所有属性 + setAll(state, { payload }) { + return { + ...state, + ...payload, + }; + } + }, +}; diff --git a/admin-web/src/models/pay/payTransactionList.js b/admin-web/src/models/pay/payTransactionList.js new file mode 100644 index 000000000..0c0d2e5fc --- /dev/null +++ b/admin-web/src/models/pay/payTransactionList.js @@ -0,0 +1,101 @@ +import { message } from 'antd'; +import { productSpuPage, productSpuUpdateSort } from '../../services/product'; +import {routerRedux} from "dva/router"; +import PaginationHelper from '../../../helpers/PaginationHelper'; +import {getPromotionActivityPage} from "../../services/promotion"; +import {queryPayTransactionPage} from "../../services/pay"; + +const SEARCH_PARAMS_DEFAULT = { + createBeginTime: undefined, + createEndTime: undefined, + paymentBeginTime: undefined, + paymentEndTime: undefined, + status: undefined, + hasRefund: undefined, + payChannel: undefined, + orderSubject: '', +}; + +export default { + namespace: 'payTransactionList', + + state: { + // 分页列表相关 + list: [], + listLoading: false, + pagination: PaginationHelper.defaultPaginationConfig, + searchParams: SEARCH_PARAMS_DEFAULT, + + // 添加 or 修改表单相关 + }, + + effects: { + *page({ payload }, { call, put }) { + // const { queryParams } = payload; + // const response = yield call(productSpuPage, payload); + // message.info('查询成功!'); + // yield put({ + // type: 'treeSuccess', + // payload: { + // list: response.data, + // }, + // }); + + // 显示加载中 + yield put({ + type: 'changeListLoading', + payload: true, + }); + + // 请求 + const response = yield call(queryPayTransactionPage, payload); + // 响应 + yield put({ + type: 'setAll', + payload: { + list: response.data.list, + pagination: PaginationHelper.formatPagination(response.data, payload), + searchParams: { + createBeginTime: payload.createBeginTime, + createEndTime: payload.createEndTime, + paymentBeginTime: payload.paymentBeginTime, + paymentEndTime: payload.paymentEndTime, + status: payload.status, + hasRefund: payload.hasRefund, + payChannel: payload.payChannel, + orderSubject: payload.orderSubject, + } + }, + }); + + // 隐藏加载中 + yield put({ + type: 'changeListLoading', + payload: false, + }); + }, + }, + + reducers: { + treeSuccess(state, { payload }) { + return { + ...state, + ...payload, + }; + }, + // 修改加载中的状态 + changeListLoading(state, { payload }) { + return { + ...state, + listLoading: payload, + }; + }, + // 设置所有属性 + setAll(state, { payload }) { + return { + ...state, + ...payload, + }; + } + }, +}; diff --git a/admin-web/src/models/promotion/fullPrivilegeList.js b/admin-web/src/models/promotion/fullPrivilegeList.js index a2cda79a7..4248c092b 100644 --- a/admin-web/src/models/promotion/fullPrivilegeList.js +++ b/admin-web/src/models/promotion/fullPrivilegeList.js @@ -5,9 +5,14 @@ import PaginationHelper from '../../../helpers/PaginationHelper'; import {getPromotionActivityPage} from "../../services/promotion"; const SEARCH_PARAMS_DEFAULT = { - title: '', - activityType: 2, - status: 'ALL', + createBeginTime: undefined, + createEndTime: undefined, + paymentBeginTime: undefined, + paymentEndTime: undefined, + status: undefined, + hasRefund: undefined, + payChannel: undefined, + orderSubject: '', }; export default { @@ -63,36 +68,6 @@ export default { payload: false, }); }, - *updateSort({ payload }, { call, put }) { - // 显示加载中 - yield put({ - type: 'changeSortModalLoading', - payload: true, - }); - - // 请求 - const { callback, body } = payload; - // 响应 - const response = yield call(productSpuUpdateSort, body); - if(response.code === 0) { - if (callback) { - callback(response); - } - yield put({ - type: 'page', - payload: { - ...this.state.pagination, - ...this.state.searchParams, - }, - }); - } - - // 隐藏加载中 - yield put({ - type: 'changeSortModalLoading', - payload: false, - }); - }, }, reducers: { @@ -103,12 +78,6 @@ export default { }; }, // 修改加载中的状态 - changeSortModalLoading(state, { payload }) { - return { - ...state, - sortModalLoading: payload, - }; - }, changeListLoading(state, { payload }) { return { ...state, diff --git a/admin-web/src/models/promotion/timeLimitedDiscountList.js b/admin-web/src/models/promotion/timeLimitedDiscountList.js index e69773cfb..d134733fe 100644 --- a/admin-web/src/models/promotion/timeLimitedDiscountList.js +++ b/admin-web/src/models/promotion/timeLimitedDiscountList.js @@ -63,36 +63,6 @@ export default { payload: false, }); }, - *updateSort({ payload }, { call, put }) { - // 显示加载中 - yield put({ - type: 'changeSortModalLoading', - payload: true, - }); - - // 请求 - const { callback, body } = payload; - // 响应 - const response = yield call(productSpuUpdateSort, body); - if(response.code === 0) { - if (callback) { - callback(response); - } - yield put({ - type: 'page', - payload: { - ...this.state.pagination, - ...this.state.searchParams, - }, - }); - } - - // 隐藏加载中 - yield put({ - type: 'changeSortModalLoading', - payload: false, - }); - }, }, reducers: { @@ -103,12 +73,6 @@ export default { }; }, // 修改加载中的状态 - changeSortModalLoading(state, { payload }) { - return { - ...state, - sortModalLoading: payload, - }; - }, changeListLoading(state, { payload }) { return { ...state, diff --git a/admin-web/src/models/user/userList.js b/admin-web/src/models/user/userList.js new file mode 100644 index 000000000..26e312457 --- /dev/null +++ b/admin-web/src/models/user/userList.js @@ -0,0 +1,89 @@ +import { message } from 'antd'; +import { productSpuPage, productSpuUpdateSort } from '../../services/product'; +import {routerRedux} from "dva/router"; +import PaginationHelper from '../../../helpers/PaginationHelper'; +import {getPromotionActivityPage} from "../../services/promotion"; +import {queryUserPage} from "../../services/user"; + +const SEARCH_PARAMS_DEFAULT = { + nickname: '', + status: 1, +}; + +export default { + namespace: 'userList', + + state: { + // 分页列表相关 + list: [], + listLoading: false, + pagination: PaginationHelper.defaultPaginationConfig, + searchParams: SEARCH_PARAMS_DEFAULT, + + // 添加 or 修改表单相关 + }, + + effects: { + *page({ payload }, { call, put }) { + // const { queryParams } = payload; + // const response = yield call(productSpuPage, payload); + // message.info('查询成功!'); + // yield put({ + // type: 'treeSuccess', + // payload: { + // list: response.data, + // }, + // }); + + // 显示加载中 + yield put({ + type: 'changeListLoading', + payload: true, + }); + + // 请求 + const response = yield call(queryUserPage, payload); + // 响应 + yield put({ + type: 'setAll', + payload: { + list: response.data.list, + pagination: PaginationHelper.formatPagination(response.data, payload), + searchParams: { + nickname: payload.nickname, + status: payload.status, + } + }, + }); + + // 隐藏加载中 + yield put({ + type: 'changeListLoading', + payload: false, + }); + }, + }, + + reducers: { + treeSuccess(state, { payload }) { + return { + ...state, + ...payload, + }; + }, + // 修改加载中的状态 + changeListLoading(state, { payload }) { + return { + ...state, + listLoading: payload, + }; + }, + // 设置所有属性 + setAll(state, { payload }) { + return { + ...state, + ...payload, + }; + } + }, +}; diff --git a/admin-web/src/pages/Pay/PayRefundList.js b/admin-web/src/pages/Pay/PayRefundList.js new file mode 100644 index 000000000..03bb590af --- /dev/null +++ b/admin-web/src/pages/Pay/PayRefundList.js @@ -0,0 +1,319 @@ +/* eslint-disable */ + +import React, { PureComponent, Fragment } from 'react'; +import { connect } from 'dva'; +import moment from 'moment'; +import { + Card, + Form, + Input, + Row, + Col, + Button, + Modal, + message, + Table, + Divider, + Tree, + Tabs, + TreeSelect, + Spin, + InputNumber, DatePicker, Select +} from 'antd'; +const TabPane = Tabs.TabPane; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; +const { RangePicker } = DatePicker; + +import styles from './PayRefundList.less'; +import PaginationHelper from "../../../helpers/PaginationHelper"; + +const FormItem = Form.Item; + +const statuses = { + 1: '处理中', + 2: '成功', + 3: '失败', +}; + +const payChannels = { + 100: '微信 App 支付', + 101: '微信 JS API 支付', + 200: '支付宝 App 支付', + 9999: 'ping++', +}; + +// 列表 +function List({ dataSource, loading, pagination, searchParams, dispatch,}) { + + function onPageChange(page) { // 翻页 + dispatch({ + type: 'payRefundList/page', + payload: { + pageNo: page.current, + pageSize: page.pageSize, + ...searchParams + } + }) + } + + const columns = [ + // { + // title: 'id', + // dataIndex: 'id', + // render: text => {text}, + // }, + { + title: '创建时间', + dataIndex: 'createTime', + render: val => {moment(val).format('YYYY-MM-DD HH:mm:ss')}, + width: 120, + }, + { + title: '完成时间', + dataIndex: 'finishTime', + render: val => val ? {moment(val).format('YYYY-MM-DD HH:mm:ss')} : '', + width: 120, + }, + { + title: '渠道流水号', + dataIndex: 'tradeNo', + }, + { + title: '退款金额', + dataIndex: 'price', + render: val => val / 100.0, + }, + { + title: '退款状态', + dataIndex: 'status', + render: val => statuses[val + ''], + }, + { + title: '支付时间', + dataIndex: 'transaction.finishTime', + render: val => val ? {moment(val).format('YYYY-MM-DD HH:mm:ss')} : '', + width: 120, + }, + { + title: '商户订单号', + dataIndex: 'orderId', + }, + { + title: '商品名称', + dataIndex: 'transaction.orderSubject', + }, + { + title: '支付金额', + dataIndex: 'transaction.price', + }, + { + title: '支付渠道', + dataIndex: 'transaction.payChannel', + render: val => payChannels[val + ''], + }, + { + title: '操作', + width: 120, + render: (text, record) => ( + + {/* this.handleModalVisible(true, 'update', record)}>更新*/} + alert('正在开发中')}>详情 + + ), + }, + ]; + + // console.log(pagination); + + return ( +
+ + + ) +} + +// 搜索表单 +const SearchForm = Form.create()(props => { + const { + form, + form: { getFieldDecorator }, + dispatch, + searchParams, + } = props; + + function search() { + const getBeginAndEndTime = (key, beginKey, endKey) => { + let val = form.getFieldsValue()[key]; + if (val && val.length === 2) { + let res = {}; + res[beginKey] = val[0].format('YYYY-MM-DD HH:mm:ss'); + res[endKey] = val[1].format('YYYY-MM-DD HH:mm:ss'); + return res; + } + return {}; + }; + + dispatch({ + type: 'payRefundList/page', + payload: { + ...PaginationHelper.defaultPayload, + ...searchParams, + ...form.getFieldsValue(), + createTime: undefined, + finishTime: undefined, + ...getBeginAndEndTime('createTime', 'createBeginTime', 'createEndTime'), + ...getBeginAndEndTime('finishTime', 'finishBeginTime', 'finishEndTime'), + } + }) + } + + // 提交搜索 + function handleSubmit(e) { + // 阻止默认事件 + e.preventDefault(); + // 提交搜索 + search(); + } + + // 重置搜索 + function handleReset() { + // 重置表单 + form.resetFields(); + // 执行搜索 + search(); + } + + return ( + + + + {getFieldDecorator('createTime')()} + + + {getFieldDecorator('finishTime')()} + + + + + + {getFieldDecorator('payChannel')( + + )} + + + + + {getFieldDecorator('status')( + + )} + + + + + + + + + + + ); +}); + +// payRefundList +@connect(({ payRefundList }) => ({ + ...payRefundList, + // list: payRefundList.list.spus, + // loading: loading.models.payRefundList, +})) + +@Form.create() +class PayTransactionList extends PureComponent { + state = { + modalVisible: false, + modalType: 'add', //add update + initValues: {}, + }; + + componentDidMount() { + const { dispatch, searchParams } = this.props; + // 查询初始数据 + dispatch({ + type: 'payRefundList/page', + payload: { + ...searchParams, + ...PaginationHelper.defaultPayload, + }, + }); + } + + handleSortModalVisible = (sortModalVisible, record) => { + const { dispatch } = this.props; + dispatch({ + type: 'payRefundList/setAll', + payload: { + sortModalVisible, + formVals: record || {} + }, + }); + }; + + render() { + const { dispatch, + list, listLoading, searchParams, pagination, + categoryTree, formVals, } = this.props; + + // 列表属性 + const listProps = { + dataSource: list, + pagination, + searchParams, + dispatch, + categoryTree, + loading: listLoading, + handleSortModalVisible: this.handleSortModalVisible, // Func + }; + + // 搜索表单属性 + const searchFormProps = { + dispatch, + categoryTree, + searchParams, + }; + + return ( + + +
+
+ {/* alert('正在开发中')}*/} + {/*>*/} + {/* 新建限时折扣*/} + {/**/} +
+
+ + +
+
+ ); + } +} + +export default PayTransactionList; diff --git a/admin-web/src/pages/Pay/PayRefundList.less b/admin-web/src/pages/Pay/PayRefundList.less new file mode 100644 index 000000000..ebb45c292 --- /dev/null +++ b/admin-web/src/pages/Pay/PayRefundList.less @@ -0,0 +1,15 @@ +@import '~antd/lib/style/themes/default.less'; +@import '~@/utils/utils.less'; + +.tableList { + .tableListOperator { + margin-bottom: 16px; + button { + margin-right: 8px; + } + } +} + +.tableDelete { + color: red; +} diff --git a/admin-web/src/pages/Pay/PayTransactionList.js b/admin-web/src/pages/Pay/PayTransactionList.js new file mode 100644 index 000000000..1e2146521 --- /dev/null +++ b/admin-web/src/pages/Pay/PayTransactionList.js @@ -0,0 +1,328 @@ +/* eslint-disable */ + +import React, { PureComponent, Fragment } from 'react'; +import { connect } from 'dva'; +import moment from 'moment'; +import { + Card, + Form, + Input, + Row, + Col, + Button, + Modal, + message, + Table, + Divider, + Tree, + Tabs, + TreeSelect, + Spin, + InputNumber, DatePicker, Select +} from 'antd'; +const TabPane = Tabs.TabPane; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; +const { RangePicker } = DatePicker; + +import styles from './PayTransactionList.less'; +import PaginationHelper from "../../../helpers/PaginationHelper"; + +const FormItem = Form.Item; + +const statuses = { + 1: '等待支付', + 2: '支付成功', + 3: '取消支付', +}; + +const payChannels = { + 100: '微信 App 支付', + 101: '微信 JS API 支付', + 200: '支付宝 App 支付', + 9999: 'ping++', +}; + +// 列表 +function List({ dataSource, loading, pagination, searchParams, dispatch,}) { + + function onPageChange(page) { // 翻页 + dispatch({ + type: 'payTransactionList/page', + payload: { + pageNo: page.current, + pageSize: page.pageSize, + ...searchParams + } + }) + } + + const columns = [ + // { + // title: 'id', + // dataIndex: 'id', + // render: text => {text}, + // }, + { + title: '创建时间', + dataIndex: 'createTime', + render: val => {moment(val).format('YYYY-MM-DD HH:mm:ss')}, + width: 120, + }, + { + title: '支付时间', + dataIndex: 'paymentTime', + render: val => val ? {moment(val).format('YYYY-MM-DD HH:mm:ss')} : '', + width: 120, + }, + { + title: '商户订单号', + dataIndex: 'orderId', + }, + { + title: '商品名称', + dataIndex: 'orderSubject', + }, + { + title: '支付金额', + dataIndex: 'price', + render: val => val / 100.0, + }, + { + title: '支付状态', + dataIndex: 'status', + render: val => statuses[val + ''], + }, + { + title: '支付渠道', + dataIndex: 'payChannel', + render: val => payChannels[val + ''], + }, + { + title: '退款情况', + dataIndex: 'refundTotal', + render: val => val && val > 0 ? '有退款' : '无退款' , + }, + { + title: '退款金额', + dataIndex: 'refundTotal', + render: val => val && val > 0 ? val / 100.0 : undefined , + }, + { + title: '操作', + width: 120, + render: (text, record) => ( + + {/* this.handleModalVisible(true, 'update', record)}>更新*/} + alert('正在开发中')}>退款 + + ), + }, + ]; + + // console.log(pagination); + + return ( +
+
+ + ) +} + +// 搜索表单 +const SearchForm = Form.create()(props => { + const { + form, + form: { getFieldDecorator }, + dispatch, + searchParams, + } = props; + + function search() { + const getBeginAndEndTime = (key, beginKey, endKey) => { + let val = form.getFieldsValue()[key]; + if (val && val.length === 2) { + let res = {}; + res[beginKey] = val[0].format('YYYY-MM-DD HH:mm:ss'); + res[endKey] = val[1].format('YYYY-MM-DD HH:mm:ss'); + return res; + } + return {}; + }; + + dispatch({ + type: 'payTransactionList/page', + payload: { + ...PaginationHelper.defaultPayload, + ...searchParams, + ...form.getFieldsValue(), + createTime: undefined, + paymentTime: undefined, + ...getBeginAndEndTime('createTime', 'createBeginTime', 'createEndTime'), + ...getBeginAndEndTime('paymentTime', 'paymentBeginTime', 'paymentEndTime'), + } + }) + } + + // 提交搜索 + function handleSubmit(e) { + // 阻止默认事件 + e.preventDefault(); + // 提交搜索 + search(); + } + + // 重置搜索 + function handleReset() { + // 重置表单 + form.resetFields(); + // 执行搜索 + search(); + } + + return ( + + + + {getFieldDecorator('createTime')()} + + + {getFieldDecorator('paymentTime')()} + + + {getFieldDecorator('orderSubject')()} + + + + + + {getFieldDecorator('payChannel')( + + )} + + + + + {getFieldDecorator('status')( + + )} + + + + + {getFieldDecorator('hasRefund')( + + )} + + + + + + + + + + + ); +}); + +// payTransactionList +@connect(({ payTransactionList }) => ({ + ...payTransactionList, + // list: payTransactionList.list.spus, + // loading: loading.models.payTransactionList, +})) + +@Form.create() +class PayTransactionList extends PureComponent { + state = { + modalVisible: false, + modalType: 'add', //add update + initValues: {}, + }; + + componentDidMount() { + const { dispatch, searchParams } = this.props; + // 查询初始数据 + dispatch({ + type: 'payTransactionList/page', + payload: { + ...searchParams, + ...PaginationHelper.defaultPayload, + }, + }); + } + + handleSortModalVisible = (sortModalVisible, record) => { + const { dispatch } = this.props; + dispatch({ + type: 'payTransactionList/setAll', + payload: { + sortModalVisible, + formVals: record || {} + }, + }); + }; + + render() { + const { dispatch, + list, listLoading, searchParams, pagination, + categoryTree, formVals, } = this.props; + + // 列表属性 + const listProps = { + dataSource: list, + pagination, + searchParams, + dispatch, + categoryTree, + loading: listLoading, + handleSortModalVisible: this.handleSortModalVisible, // Func + }; + + // 搜索表单属性 + const searchFormProps = { + dispatch, + categoryTree, + searchParams, + }; + + return ( + + +
+
+ {/* alert('正在开发中')}*/} + {/*>*/} + {/* 新建限时折扣*/} + {/**/} +
+
+ + +
+
+ ); + } +} + +export default PayTransactionList; diff --git a/admin-web/src/pages/Pay/PayTransactionList.less b/admin-web/src/pages/Pay/PayTransactionList.less new file mode 100644 index 000000000..ebb45c292 --- /dev/null +++ b/admin-web/src/pages/Pay/PayTransactionList.less @@ -0,0 +1,15 @@ +@import '~antd/lib/style/themes/default.less'; +@import '~@/utils/utils.less'; + +.tableList { + .tableListOperator { + margin-bottom: 16px; + button { + margin-right: 8px; + } + } +} + +.tableDelete { + color: red; +} diff --git a/admin-web/src/pages/User/UserList.js b/admin-web/src/pages/User/UserList.js new file mode 100644 index 000000000..4330579e3 --- /dev/null +++ b/admin-web/src/pages/User/UserList.js @@ -0,0 +1,266 @@ +/* eslint-disable */ + +import React, { PureComponent, Fragment } from 'react'; +import { connect } from 'dva'; +import moment from 'moment'; +import { + Card, + Form, + Input, + Row, + Col, + Button, + Modal, + message, + Table, + Divider, + Tree, + Tabs, + TreeSelect, + Spin, + InputNumber, Select +} from 'antd'; +const TabPane = Tabs.TabPane; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import styles from './UserList.less'; +import PaginationHelper from "../../../helpers/PaginationHelper"; + +const FormItem = Form.Item; + +const statuses = { + 1: '开启', + 2: '关闭', +}; + +// 列表 +function List({ dataSource, loading, pagination, searchParams, dispatch,}) { + + function onPageChange(page) { // 翻页 + dispatch({ + type: 'userList/page', + payload: { + pageNo: page.current, + pageSize: page.pageSize, + ...searchParams + } + }) + } + + const columns = [ + // { + // title: 'id', + // dataIndex: 'id', + // render: text => {text}, + // }, + { + title: '昵称', + dataIndex: 'nickname', + }, + { + title: '手机号码', + dataIndex: 'mobile', + }, + { + title: '会员卡', // TODO 芋艿,未来增加 + }, + { + title: '累积交易次数', // TODO 芋艿,未来增加 + }, + { + title: '累计交易额', // TODO 芋艿,未来增加 + }, + { + title: '积分', // TODO 芋艿,未来增加 + }, + { + title: '会员标签', // TODO 芋艿,未来增加 + }, + { + title: '备注', // TODO 芋艿,未来增加 + }, + { + title: '状态', + dataIndex: 'status', + render: val => statuses[val + ''], + }, + { + title: '操作', + width: 300, + render: (text, record) => ( + + {/* this.handleModalVisible(true, 'update', record)}>更新*/} + alert('正在开发中')}>编辑 + + ), + }, + ]; + + // console.log(pagination); + + return ( +
+
+ + ) +} + +// 搜索表单 +const SearchForm = Form.create()(props => { + const { + form, + form: { getFieldDecorator }, + dispatch, + searchParams, + } = props; + + function search() { + dispatch({ + type: 'userList/page', + payload: { + ...PaginationHelper.defaultPayload, + ...searchParams, + ...form.getFieldsValue(), + } + }) + } + + // 提交搜索 + function handleSubmit(e) { + // 阻止默认事件 + e.preventDefault(); + // 提交搜索 + search(); + } + + // 重置搜索 + function handleReset() { + // 重置表单 + form.resetFields(); + // 执行搜索 + search(); + } + + return ( + + + + + {getFieldDecorator('nickname')()} + + + + + {getFieldDecorator('status')( + + )} + + + + + + + + + + + ); +}); + +// userList +@connect(({ userList }) => ({ + ...userList, + // list: userList.list.spus, + // loading: loading.models.userList, +})) + +@Form.create() +class UserList extends PureComponent { + state = { + modalVisible: false, + modalType: 'add', //add update + initValues: {}, + }; + + componentDidMount() { + const { dispatch, searchParams } = this.props; + // 查询初始数据 + dispatch({ + type: 'userList/page', + payload: { + ...searchParams, + ...PaginationHelper.defaultPayload, + }, + }); + } + + handleSortModalVisible = (sortModalVisible, record) => { + const { dispatch } = this.props; + dispatch({ + type: 'userList/setAll', + payload: { + sortModalVisible, + formVals: record || {} + }, + }); + }; + + render() { + const { dispatch, + list, listLoading, searchParams, pagination, + categoryTree, formVals, } = this.props; + + // 列表属性 + const listProps = { + dataSource: list, + pagination, + searchParams, + dispatch, + categoryTree, + loading: listLoading, + handleSortModalVisible: this.handleSortModalVisible, // Func + }; + + // 搜索表单属性 + const searchFormProps = { + dispatch, + categoryTree, + searchParams, + }; + + return ( + + +
+
+ {/* alert('正在开发中')}*/} + {/*>*/} + {/* 新建会员*/} + {/**/} +
+
+ + +
+
+ ); + } +} + +export default UserList; diff --git a/admin-web/src/pages/User/UserList.less b/admin-web/src/pages/User/UserList.less new file mode 100644 index 000000000..ebb45c292 --- /dev/null +++ b/admin-web/src/pages/User/UserList.less @@ -0,0 +1,15 @@ +@import '~antd/lib/style/themes/default.less'; +@import '~@/utils/utils.less'; + +.tableList { + .tableListOperator { + margin-bottom: 16px; + button { + margin-right: 8px; + } + } +} + +.tableDelete { + color: red; +} diff --git a/admin-web/src/services/pay.js b/admin-web/src/services/pay.js new file mode 100644 index 000000000..cb99c499c --- /dev/null +++ b/admin-web/src/services/pay.js @@ -0,0 +1,18 @@ +import { stringify } from '@/utils/request.qs'; +import request from '@/utils/request'; + +// Transaction + +export async function queryPayTransactionPage(params) { + return request(`/pay-api/admins/transaction/page?${stringify(params)}`, { + method: 'GET', + }); +} + +// Refund + +export async function queryPayRefundPage(params) { + return request(`/pay-api/admins/refund/page?${stringify(params)}`, { + method: 'GET', + }); +} diff --git a/admin-web/src/services/user.js b/admin-web/src/services/user.js index 89e03c6f6..2610164df 100644 --- a/admin-web/src/services/user.js +++ b/admin-web/src/services/user.js @@ -1,3 +1,4 @@ +import { stringify } from '@/utils/request.qs'; import request from '@/utils/request'; export async function query() { @@ -7,3 +8,11 @@ export async function query() { export async function queryCurrent() { return request('/api/currentUser'); } + +// User + +export async function queryUserPage(params) { + return request(`/user-api/admins/user/page?${stringify(params)}`, { + method: 'GET', + }); +} diff --git a/common/common-framework/src/main/java/cn/iocoder/common/framework/util/ServiceExceptionUtil.java b/common/common-framework/src/main/java/cn/iocoder/common/framework/util/ServiceExceptionUtil.java index d26800cf7..7a4e886f0 100644 --- a/common/common-framework/src/main/java/cn/iocoder/common/framework/util/ServiceExceptionUtil.java +++ b/common/common-framework/src/main/java/cn/iocoder/common/framework/util/ServiceExceptionUtil.java @@ -71,6 +71,11 @@ public class ServiceExceptionUtil { return new ServiceException(code, message); } + public static ServiceException exception(Integer code, String messagePattern, Object... params) { + String message = doFormat(code, messagePattern, params); + return new ServiceException(code, message); + } + /** * 将错误编号对应的消息使用 params 进行格式化。 * @@ -107,4 +112,4 @@ public class ServiceExceptionUtil { return sbuf.toString(); } -} \ No newline at end of file +} diff --git a/docs/guides/功能列表/功能列表-管理后台.md b/docs/guides/功能列表/功能列表-管理后台.md index 8ba7696d3..59f2f6b65 100644 --- a/docs/guides/功能列表/功能列表-管理后台.md +++ b/docs/guides/功能列表/功能列表-管理后台.md @@ -7,26 +7,28 @@ - [ ] 数据分析【待认领】 - [ ] TODO 未开始 - [ ] 店铺资产【待认领】 - - [ ] TODO 未开始 + - [ ] 支付单 20% 【待认领】 + - [ ] 退款单 20% 【待认领】 + - TODO 需要补充 - [ ] 商品管理 - [x] 发布商品 - [x] 商品列表 - [x] 展示类目 - [ ] 品牌管理【待认领】 - [ ] 订单管理 - - [ ] 销售单 - - [ ] 售后单 + - [ ] 销售单 开发中 + - [ ] 售后单 开发中 - [ ] 订单评价【待认领】 - [ ] 会员管理 - - [ ] 会员资料【待认领】 + - [ ] 会员资料 20%【待认领】 - TODO 需要补充 - [ ] 营销管理 - [x] 首页广告 - [x] 商品推荐 - [x] 优惠劵 - [ ] 优惠码【待认领】 - - [ ] 满减送 - - [ ] 限制折扣 + - [ ] 满减送 20% 【待认领】 + - [ ] 限制折扣 20% 【待认领】 - [ ] 多人拼团【待认领】 - [ ] 系统管理 - [ ] 员工管理 diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayRefundController.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayRefundController.java new file mode 100644 index 000000000..8246b7c8f --- /dev/null +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayRefundController.java @@ -0,0 +1,68 @@ +package cn.iocoder.mall.pay.application.controller.admins; + +import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.pay.api.PayRefundService; +import cn.iocoder.mall.pay.api.PayTransactionService; +import cn.iocoder.mall.pay.api.bo.PayRefundBO; +import cn.iocoder.mall.pay.api.bo.PayRefundPageBO; +import cn.iocoder.mall.pay.api.bo.PayTransactionBO; +import cn.iocoder.mall.pay.api.dto.PayRefundPageDTO; +import cn.iocoder.mall.pay.application.convert.PayRefundConvert; +import cn.iocoder.mall.pay.application.vo.admins.AdminsPayRefundPageVO; +import org.apache.dubbo.config.annotation.Reference; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.common.framework.vo.CommonResult.success; + +@RestController +@RequestMapping("admins/refund") +public class AdminsPayRefundController { + + @Reference(validation = "true", version = "${dubbo.provider.PayRefundService.version}") + private PayRefundService payRefundService; + @Reference(validation = "true", version = "${dubbo.provider.PayTransactionService.version}") + private PayTransactionService payTransactionService; + + @GetMapping("/page") + public CommonResult page(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "createBeginTime", required = false) Date createBeginTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "createEndTime", required = false) Date createEndTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "finishBeginTime", required = false) Date finishBeginTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "finishEndTime", required = false) Date finishEndTime, + @RequestParam(value = "status", required = false) Integer status, + @RequestParam(value = "payChannel", required = false) Integer payChannel, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + PayRefundPageDTO payRefundPageDTO = new PayRefundPageDTO() + .setCreateBeginTime(createBeginTime).setCreateEndTime(createEndTime) + .setFinishBeginTime(finishBeginTime).setFinishEndTime(finishEndTime) + .setStatus(status).setPayChannel(payChannel) + .setPageNo(pageNo).setPageSize(pageSize); + // 执行查询 + PayRefundPageBO refundBOPage = payRefundService.getRefundPage(payRefundPageDTO); + AdminsPayRefundPageVO result = new AdminsPayRefundPageVO() + .setList(PayRefundConvert.INSTANCE.convertList(refundBOPage.getList())) + .setTotal(refundBOPage.getTotal()); + if (result.getList().isEmpty()) { + return success(result); + } + // 拼接结果 + Map transactionMap = payTransactionService.getTransactionList( + result.getList().stream().map(PayRefundBO::getTransactionId).collect(Collectors.toSet())) + .stream().collect(Collectors.toMap(PayTransactionBO::getId, transaction -> transaction)); + result.getList().forEach(refund -> refund.setTransaction(transactionMap.get(refund.getTransactionId()))); + return success(result); + } + +} diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayTransactionController.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayTransactionController.java new file mode 100644 index 000000000..936add244 --- /dev/null +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/admins/AdminsPayTransactionController.java @@ -0,0 +1,50 @@ +package cn.iocoder.mall.pay.application.controller.admins; + +import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.pay.api.PayTransactionService; +import cn.iocoder.mall.pay.api.bo.PayTransactionPageBO; +import cn.iocoder.mall.pay.api.dto.PayTransactionPageDTO; +import org.apache.dubbo.config.annotation.Reference; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; + +import static cn.iocoder.common.framework.vo.CommonResult.success; + +@RestController +@RequestMapping("admins/transaction") +public class AdminsPayTransactionController { + + @Reference(validation = "true", version = "${dubbo.provider.PayTransactionService.version}") + private PayTransactionService payTransactionService; + + @GetMapping("/page") + public CommonResult page(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "createBeginTime", required = false) Date createBeginTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "createEndTime", required = false) Date createEndTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "paymentBeginTime", required = false) Date paymentBeginTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam(value = "paymentEndTime", required = false) Date paymentEndTime, + @RequestParam(value = "status", required = false) Integer status, + @RequestParam(value = "hasRefund", required = false) Boolean hasRefund, + @RequestParam(value = "payChannel", required = false) Integer payChannel, + @RequestParam(value = "orderSubject", required = false) String orderSubject, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + PayTransactionPageDTO payTransactionPageDTO = new PayTransactionPageDTO() + .setCreateBeginTime(createBeginTime).setCreateEndTime(createEndTime) + .setPaymentBeginTime(paymentBeginTime).setPaymentEndTime(paymentEndTime) + .setStatus(status).setHasRefund(hasRefund) + .setPayChannel(payChannel).setOrderSubject(orderSubject) + .setPageNo(pageNo).setPageSize(pageSize); + // 执行查询 + return success(payTransactionService.getTransactionPage(payTransactionPageDTO)); + } + +} diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/PayRefundController.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/UsersPayRefundController.java similarity index 90% rename from pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/PayRefundController.java rename to pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/UsersPayRefundController.java index 614b02228..e83162b22 100644 --- a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/PayRefundController.java +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/UsersPayRefundController.java @@ -3,9 +3,9 @@ package cn.iocoder.mall.pay.application.controller.users; import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.pay.api.PayRefundService; import cn.iocoder.mall.pay.api.constant.PayChannelEnum; +import org.apache.dubbo.config.annotation.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,11 +17,11 @@ import java.io.IOException; @RestController @RequestMapping("users/refund") // TODO 芋艿,理论来说,是用户无关的。这里先酱紫先~ -public class PayRefundController { +public class UsersPayRefundController { private Logger logger = LoggerFactory.getLogger(getClass()); - @Autowired + @Reference(validation = "true", version = "${dubbo.provider.PayRefundService.version}") private PayRefundService payRefundService; @PostMapping(value = "pingxx_refund_success", consumes = MediaType.APPLICATION_JSON_VALUE) diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/PayTransactionController.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/UsersPayTransactionController.java similarity index 94% rename from pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/PayTransactionController.java rename to pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/UsersPayTransactionController.java index ffa43427a..d6cde4bd3 100644 --- a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/PayTransactionController.java +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/controller/users/UsersPayTransactionController.java @@ -20,14 +20,15 @@ import java.io.IOException; @RestController @RequestMapping("users/transaction") // TODO 芋艿,理论来说,是用户无关的。这里先酱紫先~ -public class PayTransactionController { +public class UsersPayTransactionController { private Logger logger = LoggerFactory.getLogger(getClass()); - @Reference(validation = "true") + @Reference(validation = "true", version = "${dubbo.provider.PayTransactionService.version}") private PayTransactionService payTransactionService; @GetMapping("/get") + // TODO result 后面改下 public CommonResult get(@RequestParam("appId") String appId, @RequestParam("orderId") String orderId) { return payTransactionService.getTransaction(UserSecurityContextHolder.getContext().getUserId(), appId, orderId); diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/convert/PayRefundConvert.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/convert/PayRefundConvert.java new file mode 100644 index 000000000..f1894d758 --- /dev/null +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/convert/PayRefundConvert.java @@ -0,0 +1,19 @@ +package cn.iocoder.mall.pay.application.convert; + +import cn.iocoder.mall.pay.api.bo.PayRefundBO; +import cn.iocoder.mall.pay.application.vo.admins.AdminsPayRefundDetailVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface PayRefundConvert { + + PayRefundConvert INSTANCE = Mappers.getMapper(PayRefundConvert.class); + + @Mappings({}) + List convertList(List refunds); + +} diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundDetailVO.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundDetailVO.java new file mode 100644 index 000000000..2d24c60d5 --- /dev/null +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundDetailVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.mall.pay.application.vo.admins; + +import cn.iocoder.mall.pay.api.bo.PayRefundBO; +import cn.iocoder.mall.pay.api.bo.PayTransactionBO; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 支付退款详细 VO + */ +@Data +@Accessors(chain = true) +public class AdminsPayRefundDetailVO extends PayRefundBO { // TODO 芋艿,暂时偷懒下 + + /** + * 支付交易 + */ + private PayTransactionBO transaction; + +} + diff --git a/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundPageVO.java b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundPageVO.java new file mode 100644 index 000000000..2410b42b2 --- /dev/null +++ b/pay/pay-application/src/main/java/cn/iocoder/mall/pay/application/vo/admins/AdminsPayRefundPageVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.mall.pay.application.vo.admins; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 支付退款 Page VO + */ +@Data +@Accessors(chain = true) +public class AdminsPayRefundPageVO implements Serializable { + + /** + * 支付退款数组 + */ + private List list; + /** + * 总量 + */ + private Integer total; + +} diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayRefundService.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayRefundService.java index dc56ee4fe..e652d6542 100644 --- a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayRefundService.java +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayRefundService.java @@ -1,7 +1,9 @@ package cn.iocoder.mall.pay.api; import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.pay.api.bo.PayRefundPageBO; import cn.iocoder.mall.pay.api.bo.PayRefundSubmitBO; +import cn.iocoder.mall.pay.api.dto.PayRefundPageDTO; import cn.iocoder.mall.pay.api.dto.PayRefundSubmitDTO; public interface PayRefundService { @@ -20,4 +22,6 @@ public interface PayRefundService { */ CommonResult updateRefundSuccess(Integer payChannel, String params); + PayRefundPageBO getRefundPage(PayRefundPageDTO payRefundPageDTO); + } diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayTransactionService.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayTransactionService.java index 13f33d0f5..0cba24cd1 100644 --- a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayTransactionService.java +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/PayTransactionService.java @@ -2,10 +2,15 @@ package cn.iocoder.mall.pay.api; import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.pay.api.bo.PayTransactionBO; +import cn.iocoder.mall.pay.api.bo.PayTransactionPageBO; import cn.iocoder.mall.pay.api.bo.PayTransactionSubmitBO; import cn.iocoder.mall.pay.api.dto.PayTransactionCreateDTO; +import cn.iocoder.mall.pay.api.dto.PayTransactionPageDTO; import cn.iocoder.mall.pay.api.dto.PayTransactionSubmitDTO; +import java.util.Collection; +import java.util.List; + public interface PayTransactionService { CommonResult getTransaction(Integer userId, String appId, String orderId); @@ -26,6 +31,10 @@ public interface PayTransactionService { */ CommonResult updateTransactionPaySuccess(Integer payChannel, String params); + List getTransactionList(Collection ids); + + PayTransactionPageBO getTransactionPage(PayTransactionPageDTO payTransactionPageDTO); + CommonResult cancelTransaction(); // TODO 1. params 2. result } diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundBO.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundBO.java new file mode 100644 index 000000000..23f104ca6 --- /dev/null +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundBO.java @@ -0,0 +1,102 @@ +package cn.iocoder.mall.pay.api.bo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 支付退款 BO + */ +@Data +@Accessors(chain = true) +public class PayRefundBO { + + /** + * 编号,自增 + */ + private Integer id; + /** + * 支付交易编号 + */ + private Integer transactionId; + /** + * 生成传输给第三方的退款号 + * + * 唯一索引 + */ + private String refundCode; + /** + * 应用编号 + * + * 不同业务线分配不同的 appId + * 举个例子, + * 1. 电商系统的订单,appId = 1024 + * 2. 活动系统的订单,appId = 2048 + */ + private String appId; + /** + * 业务线的订单编号 + * + * 1. 使用 String 的原因是,业务线可能使用 String 做为编号 + * 2. 每个 appId 下,orderId 唯一 + */ + private String orderId; + /** + * 发起交易的 IP + */ + private String createIp; + /** + * 业务退款描述 + */ + private String orderDescription; + /** + * 退款金额,单位:分。 + * + * TODO 暂时不考虑货币类型。 + */ + private Integer price; + /** + * 退款状态 + * + * @see cn.iocoder.mall.pay.api.constant.PayRefundStatus + */ + private Integer status; + /** + * 回调业务线完成时间 + */ + private Date finishTime; + /** + * 异步通知地址 + */ + private String notifyUrl; + /** + * 扩展内容 + * + * 异步通知的时候填充回调的数据 + */ + private String extensionData; + /** + * 退款渠道 + */ + private Integer refundChannel; + /** + * 第三方退款成功的时间 + */ + private Date refundTime; + /** + * 收到第三方系统通知的时间 + * + * 一般情况下,即第三方系统的异步通知 + */ + private Date notifyTime; + /** + * 第三方的流水号 + */ + private String tradeNo; + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundPageBO.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundPageBO.java new file mode 100644 index 000000000..00f3c1bb2 --- /dev/null +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayRefundPageBO.java @@ -0,0 +1,25 @@ +package cn.iocoder.mall.pay.api.bo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 支付退款 Page BO + */ +@Data +@Accessors(chain = true) +public class PayRefundPageBO implements Serializable { + + /** + * 支付退款数组 + */ + private List list; + /** + * 总量 + */ + private Integer total; + +} diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionBO.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionBO.java index c48900d92..d49a0dadf 100644 --- a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionBO.java +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionBO.java @@ -92,4 +92,11 @@ public class PayTransactionBO implements Serializable { */ private Date createTime; + // ========== 退款相关 ========== + + /** + * 退款总金额 + */ + private Integer refundTotal; + } diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionPageBO.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionPageBO.java new file mode 100644 index 000000000..d91b1a6e9 --- /dev/null +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/bo/PayTransactionPageBO.java @@ -0,0 +1,25 @@ +package cn.iocoder.mall.pay.api.bo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 支付交易 Page BO + */ +@Data +@Accessors(chain = true) +public class PayTransactionPageBO implements Serializable { + + /** + * 支付交易数组 + */ + private List list; + /** + * 总量 + */ + private Integer total; + +} diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/constant/PayChannelEnum.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/constant/PayChannelEnum.java index b39bbcce4..72c6cd3fd 100644 --- a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/constant/PayChannelEnum.java +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/constant/PayChannelEnum.java @@ -6,9 +6,9 @@ package cn.iocoder.mall.pay.api.constant; public enum PayChannelEnum { WEIXIN_APP(100, "wx", "微信 App 支付"), - WEIXIN_PUB(100, "wx", "微信 JS API 支付"), + WEIXIN_PUB(101, "wxjs", "微信 JS API 支付"), - ALIPAY(200, "alipay", "微信支付"), + ALIPAY(200, "alipay", "支付宝 App 支付"), PINGXX(9999, "ping++", "ping++ 支付"), ; @@ -44,4 +44,4 @@ public enum PayChannelEnum { return name; } -} \ No newline at end of file +} diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayRefundPageDTO.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayRefundPageDTO.java new file mode 100644 index 000000000..e1d0dd3f0 --- /dev/null +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayRefundPageDTO.java @@ -0,0 +1,46 @@ +package cn.iocoder.mall.pay.api.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 支付退款分页 DTO + */ +@Data +@Accessors(chain = true) +public class PayRefundPageDTO { + + /** + * 创建时间(开始) + */ + private Date createBeginTime; + /** + * 创建时间(结束) + */ + private Date createEndTime; + /** + * 完成时间(开始) + */ + private Date finishBeginTime; + /** + * 完成时间(结束) + */ + private Date finishEndTime; + /** + * 退款状态 + */ + private Integer status; + /** + * 支付渠道 + */ + private Integer payChannel; + + @NotNull(message = "页码不能为空") + private Integer pageNo; + @NotNull(message = "每页条数不能为空") + private Integer pageSize; + +} diff --git a/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayTransactionPageDTO.java b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayTransactionPageDTO.java new file mode 100644 index 000000000..f77aa3fbb --- /dev/null +++ b/pay/pay-service-api/src/main/java/cn/iocoder/mall/pay/api/dto/PayTransactionPageDTO.java @@ -0,0 +1,56 @@ +package cn.iocoder.mall.pay.api.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 支付交易分页 DTO + */ +@Data +@Accessors(chain = true) +public class PayTransactionPageDTO { + + /** + * 创建时间(开始) + */ + private Date createBeginTime; + /** + * 创建时间(结束) + */ + private Date createEndTime; + /** + * 支付时间(开始) + */ + private Date paymentBeginTime; + /** + * 支付时间(结束) + */ + private Date paymentEndTime; + /** + * 支付状态 + */ + private Integer status; + /** + * 是否有退款 + */ + private Boolean hasRefund; + /** + * 支付渠道 + */ + private Integer payChannel; + /** + * 商品标题 + * + * 模糊匹配 + */ + private String orderSubject; + + @NotNull(message = "页码不能为空") + private Integer pageNo; + @NotNull(message = "每页条数不能为空") + private Integer pageSize; + +} diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayRefundConvert.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayRefundConvert.java index 2e02d14be..66ea96912 100644 --- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayRefundConvert.java +++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayRefundConvert.java @@ -1,11 +1,14 @@ package cn.iocoder.mall.pay.biz.convert; +import cn.iocoder.mall.pay.api.bo.PayRefundBO; import cn.iocoder.mall.pay.api.dto.PayRefundSubmitDTO; import cn.iocoder.mall.pay.biz.dataobject.PayRefundDO; import org.mapstruct.Mapper; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; +import java.util.List; + @Mapper public interface PayRefundConvert { @@ -14,4 +17,10 @@ public interface PayRefundConvert { @Mappings({}) PayRefundDO convert(PayRefundSubmitDTO payRefundSubmitDTO); + @Mappings({}) + PayRefundBO convert(PayRefundDO refund); + + @Mappings({}) + List convertList(List refunds); + } diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayTransactionConvert.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayTransactionConvert.java index d9c9c3809..d034a5d6f 100644 --- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayTransactionConvert.java +++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/convert/PayTransactionConvert.java @@ -9,6 +9,8 @@ import org.mapstruct.Mapper; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; +import java.util.List; + @Mapper public interface PayTransactionConvert { @@ -20,6 +22,9 @@ public interface PayTransactionConvert { @Mappings({}) PayTransactionBO convert(PayTransactionDO payTransactionDO); + @Mappings({}) + List convertList(List list); + @Mappings({}) PayTransactionExtensionDO convert(PayTransactionSubmitDTO payTransactionSubmitDTO); diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayRefundMapper.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayRefundMapper.java index 745596571..2b6e2a40b 100644 --- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayRefundMapper.java +++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayRefundMapper.java @@ -4,6 +4,9 @@ import cn.iocoder.mall.pay.biz.dataobject.PayRefundDO; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.Date; +import java.util.List; + @Repository public interface PayRefundMapper { @@ -16,4 +19,20 @@ public interface PayRefundMapper { PayRefundDO selectByRefundCode(@Param("refundCode") String refundCode); + List selectListByPage(@Param("createBeginTime") Date createBeginTime, + @Param("createEndTime") Date createEndTime, + @Param("finishBeginTime") Date finishBeginTime, + @Param("finishEndTime") Date finishEndTime, + @Param("status") Integer status, + @Param("payChannel") Integer payChannel, + @Param("offset") Integer offset, + @Param("limit") Integer limit); + + Integer selectCountByPage(@Param("createBeginTime") Date createBeginTime, + @Param("createEndTime") Date createEndTime, + @Param("finishBeginTime") Date finishBeginTime, + @Param("finishEndTime") Date finishEndTime, + @Param("status") Integer status, + @Param("payChannel") Integer payChannel); + } diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayTransactionMapper.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayTransactionMapper.java index 3c0d40a15..cd6c8a996 100644 --- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayTransactionMapper.java +++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/dao/PayTransactionMapper.java @@ -4,6 +4,10 @@ import cn.iocoder.mall.pay.biz.dataobject.PayTransactionDO; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.Collection; +import java.util.Date; +import java.util.List; + @Repository public interface PayTransactionMapper { @@ -20,4 +24,26 @@ public interface PayTransactionMapper { PayTransactionDO selectById(@Param("id") Integer id); + List selectListByIds(@Param("ids") Collection ids); + + List selectListByPage(@Param("createBeginTime") Date createBeginTime, + @Param("createEndTime") Date createEndTime, + @Param("paymentBeginTime") Date paymentBeginTime, + @Param("paymentEndTime") Date paymentEndTime, + @Param("status") Integer status, + @Param("hasRefund") Boolean hasRefund, + @Param("payChannel") Integer payChannel, + @Param("orderSubject") String orderSubject, + @Param("offset") Integer offset, + @Param("limit") Integer limit); + + Integer selectCountByPage(@Param("createBeginTime") Date createBeginTime, + @Param("createEndTime") Date createEndTime, + @Param("paymentBeginTime") Date paymentBeginTime, + @Param("paymentEndTime") Date paymentEndTime, + @Param("status") Integer status, + @Param("hasRefund") Boolean hasRefund, + @Param("payChannel") Integer payChannel, + @Param("orderSubject") String orderSubject); + } diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayRefundServiceImpl.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayRefundServiceImpl.java index 9f8a038a2..eb8c8ea94 100644 --- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayRefundServiceImpl.java +++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayRefundServiceImpl.java @@ -5,10 +5,12 @@ import cn.iocoder.common.framework.util.MathUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.pay.api.PayRefundService; +import cn.iocoder.mall.pay.api.bo.PayRefundPageBO; import cn.iocoder.mall.pay.api.bo.PayRefundSubmitBO; import cn.iocoder.mall.pay.api.constant.PayErrorCodeEnum; import cn.iocoder.mall.pay.api.constant.PayRefundStatus; import cn.iocoder.mall.pay.api.constant.PayTransactionStatusEnum; +import cn.iocoder.mall.pay.api.dto.PayRefundPageDTO; import cn.iocoder.mall.pay.api.dto.PayRefundSubmitDTO; import cn.iocoder.mall.pay.biz.client.AbstractPaySDK; import cn.iocoder.mall.pay.biz.client.PaySDKFactory; @@ -30,7 +32,7 @@ import javax.annotation.Resource; import java.util.Date; @Service -@org.apache.dubbo.config.annotation.Service(validation = "true") +@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.PayRefundService.version}") public class PayRefundServiceImpl implements PayRefundService { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -120,6 +122,7 @@ public class PayRefundServiceImpl implements PayRefundService { PayRefundDO updatePayRefundDO = new PayRefundDO() .setId(payRefund.getId()) .setStatus(status) + .setTradeNo(paySuccessResult.getData().getTradeNo()) .setExtensionData(params); int updateCounts = payRefundMapper.update(updatePayRefundDO, PayRefundStatus.WAITING.getValue()); if (updateCounts == 0) { // 校验状态,必须是待支付 @@ -147,6 +150,24 @@ public class PayRefundServiceImpl implements PayRefundService { return CommonResult.success(true); } + @Override + public PayRefundPageBO getRefundPage(PayRefundPageDTO payRefundPageDTO) { + PayRefundPageBO payRefundPageBO = new PayRefundPageBO(); + // 查询分页数据 + int offset = (payRefundPageDTO.getPageNo() - 1) * payRefundPageDTO.getPageSize(); + payRefundPageBO.setList(PayRefundConvert.INSTANCE.convertList(payRefundMapper.selectListByPage( + payRefundPageDTO.getCreateBeginTime(), payRefundPageDTO.getCreateEndTime(), + payRefundPageDTO.getFinishBeginTime(), payRefundPageDTO.getFinishEndTime(), + payRefundPageDTO.getStatus(), payRefundPageDTO.getPayChannel(), + offset, payRefundPageDTO.getPageSize()))); + // 查询分页总数 + payRefundPageBO.setTotal(payRefundMapper.selectCountByPage( + payRefundPageDTO.getCreateBeginTime(), payRefundPageDTO.getCreateEndTime(), + payRefundPageDTO.getFinishBeginTime(), payRefundPageDTO.getFinishEndTime(), + payRefundPageDTO.getStatus(), payRefundPageDTO.getPayChannel())); + return payRefundPageBO; + } + private String generateTransactionCode() { // wx // 2014 diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayTransactionServiceImpl.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayTransactionServiceImpl.java index 16dbe3fa4..374abbba0 100644 --- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayTransactionServiceImpl.java +++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/service/PayTransactionServiceImpl.java @@ -6,18 +6,20 @@ import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.pay.api.PayTransactionService; import cn.iocoder.mall.pay.api.bo.PayTransactionBO; +import cn.iocoder.mall.pay.api.bo.PayTransactionPageBO; import cn.iocoder.mall.pay.api.bo.PayTransactionSubmitBO; import cn.iocoder.mall.pay.api.constant.PayErrorCodeEnum; import cn.iocoder.mall.pay.api.constant.PayTransactionStatusEnum; import cn.iocoder.mall.pay.api.dto.PayTransactionCreateDTO; +import cn.iocoder.mall.pay.api.dto.PayTransactionPageDTO; import cn.iocoder.mall.pay.api.dto.PayTransactionSubmitDTO; import cn.iocoder.mall.pay.biz.client.AbstractPaySDK; import cn.iocoder.mall.pay.biz.client.PaySDKFactory; import cn.iocoder.mall.pay.biz.client.TransactionSuccessBO; import cn.iocoder.mall.pay.biz.convert.PayTransactionConvert; +import cn.iocoder.mall.pay.biz.dao.PayNotifyTaskMapper; import cn.iocoder.mall.pay.biz.dao.PayTransactionExtensionMapper; import cn.iocoder.mall.pay.biz.dao.PayTransactionMapper; -import cn.iocoder.mall.pay.biz.dao.PayNotifyTaskMapper; import cn.iocoder.mall.pay.biz.dataobject.PayAppDO; import cn.iocoder.mall.pay.biz.dataobject.PayTransactionDO; import cn.iocoder.mall.pay.biz.dataobject.PayTransactionExtensionDO; @@ -27,10 +29,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; import java.util.Date; +import java.util.List; @Service -@org.apache.dubbo.config.annotation.Service(validation = "true") +@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.PayTransactionService.version}") public class PayTransactionServiceImpl implements PayTransactionService { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -193,6 +197,31 @@ public class PayTransactionServiceImpl implements PayTransactionService { return CommonResult.success(true); } + @Override + public List getTransactionList(Collection ids) { + return PayTransactionConvert.INSTANCE.convertList(payTransactionMapper.selectListByIds(ids)); + } + + @Override + public PayTransactionPageBO getTransactionPage(PayTransactionPageDTO payTransactionPageDTO) { + PayTransactionPageBO payTransactionPage = new PayTransactionPageBO(); + // 查询分页数据 + int offset = (payTransactionPageDTO.getPageNo() - 1) * payTransactionPageDTO.getPageSize(); + payTransactionPage.setList(PayTransactionConvert.INSTANCE.convertList(payTransactionMapper.selectListByPage( + payTransactionPageDTO.getCreateBeginTime(), payTransactionPageDTO.getCreateEndTime(), + payTransactionPageDTO.getPaymentBeginTime(), payTransactionPageDTO.getPaymentEndTime(), + payTransactionPageDTO.getStatus(), payTransactionPageDTO.getHasRefund(), + payTransactionPageDTO.getPayChannel(), payTransactionPageDTO.getOrderSubject(), + offset, payTransactionPageDTO.getPageSize()))); + // 查询分页总数 + payTransactionPage.setTotal(payTransactionMapper.selectCountByPage( + payTransactionPageDTO.getCreateBeginTime(), payTransactionPageDTO.getCreateEndTime(), + payTransactionPageDTO.getPaymentBeginTime(), payTransactionPageDTO.getPaymentEndTime(), + payTransactionPageDTO.getStatus(), payTransactionPageDTO.getHasRefund(), + payTransactionPageDTO.getPayChannel(), payTransactionPageDTO.getOrderSubject())); + return payTransactionPage; + } + @Override // TODO 芋艿,后面去实现 public CommonResult cancelTransaction() { return null; diff --git a/pay/pay-service-impl/src/main/resources/config/application.yaml b/pay/pay-service-impl/src/main/resources/config/application.yaml index 14146d2bc..70f3aad20 100644 --- a/pay/pay-service-impl/src/main/resources/config/application.yaml +++ b/pay/pay-service-impl/src/main/resources/config/application.yaml @@ -23,6 +23,11 @@ dubbo: name: dubbo scan: base-packages: cn.iocoder.mall.pay.biz.service + provider: + PayTransactionService: + version: 1.0.0 + PayRefundService: + version: 1.0.0 # rocketmq rocketmq: diff --git a/pay/pay-service-impl/src/main/resources/mapper/PayRefundMapper.xml b/pay/pay-service-impl/src/main/resources/mapper/PayRefundMapper.xml index b66ee6052..38e75b4e7 100644 --- a/pay/pay-service-impl/src/main/resources/mapper/PayRefundMapper.xml +++ b/pay/pay-service-impl/src/main/resources/mapper/PayRefundMapper.xml @@ -66,4 +66,57 @@ WHERE id = #{id} + + + + diff --git a/pay/pay-service-impl/src/main/resources/mapper/PayTransactionMapper.xml b/pay/pay-service-impl/src/main/resources/mapper/PayTransactionMapper.xml index e36d5d412..0ed1bf802 100644 --- a/pay/pay-service-impl/src/main/resources/mapper/PayTransactionMapper.xml +++ b/pay/pay-service-impl/src/main/resources/mapper/PayTransactionMapper.xml @@ -75,4 +75,85 @@ WHERE id = #{id} + + + + + + diff --git a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/admins/AdminsCouponController.java b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/admins/AdminsCouponController.java index d0f59695f..00ccc2c15 100644 --- a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/admins/AdminsCouponController.java +++ b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/admins/AdminsCouponController.java @@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.*; import java.util.Date; +import static cn.iocoder.common.framework.vo.CommonResult.success; + @RestController @RequestMapping("admins/coupon") @Api("优惠劵(码)模块") @@ -48,10 +50,10 @@ public class AdminsCouponController { @RequestParam(value = "preferentialType", required = false) Integer preferentialType, @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { - CommonResult result = couponService.getCouponTemplatePage(new CouponTemplatePageDTO() + CouponTemplatePageBO result = couponService.getCouponTemplatePage(new CouponTemplatePageDTO() .setType(type).setTitle(title).setStatus(status).setPreferentialType(preferentialType) .setPageNo(pageNo).setPageSize(pageSize)); - return CouponTemplateConvert.INSTANCE.convert(result); + return success(CouponTemplateConvert.ADMINS.convertPage(result)); } @PostMapping("/template/add_card") @@ -103,9 +105,9 @@ public class AdminsCouponController { .setFixedBeginTerm(fixedBeginTerm).setFixedEndTerm(fixedEndTerm) .setPreferentialType(preferentialType).setPriceOff(priceOff).setPercentOff(percentOff).setDiscountPriceLimit(discountPriceLimit); // 提交请求 - CommonResult result = couponService.addCouponCardTemplate(couponCardTemplateAddDTO); + CouponTemplateBO result = couponService.addCouponCardTemplate(couponCardTemplateAddDTO); // 返回结果 - return CouponTemplateConvert.INSTANCE.convert2(result); + return success(CouponTemplateConvert.ADMINS.convert(result)); } @PostMapping("/template/update_card") @@ -132,7 +134,7 @@ public class AdminsCouponController { .setTitle(title).setDescription(description) .setQuota(quota).setTotal(total) .setRangeType(rangeType).setRangeValues(rangeValues); - return couponService.updateCouponCardTemplate(couponCardTemplateUpdateDTO); + return success(couponService.updateCouponCardTemplate(couponCardTemplateUpdateDTO)); } @PostMapping("/template/update_status") @@ -143,7 +145,7 @@ public class AdminsCouponController { }) public CommonResult templateUpdateStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status) { - return couponService.updateCouponTemplateStatus(AdminSecurityContextHolder.getContext().getAdminId(), id, status); + return success(couponService.updateCouponTemplateStatus(AdminSecurityContextHolder.getContext().getAdminId(), id, status)); } // ========== 优惠劵 ========== diff --git a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/users/UsersCouponController.java b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/users/UsersCouponController.java index c45c5a0b1..e7b1fb5a7 100644 --- a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/users/UsersCouponController.java +++ b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/controller/users/UsersCouponController.java @@ -20,6 +20,8 @@ import io.swagger.annotations.ApiOperation; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.*; +import static cn.iocoder.common.framework.vo.CommonResult.success; + @RestController @RequestMapping("users/coupon") @Api("优惠劵(码)模块") @@ -35,8 +37,8 @@ public class UsersCouponController { @ApiImplicitParam(name = "id", value = "优惠劵(码)模板编号", required = true, example = "10") @PermitAll public CommonResult templateGet(@RequestParam("id") Integer id) { - CouponTemplateBO template = couponService.getCouponTemplate(id).getData(); - return CommonResult.success(CouponTemplateConvert.INSTANCE.convert2(template)); + CouponTemplateBO template = couponService.getCouponTemplate(id); + return success(CouponTemplateConvert.USERS.convert2(template)); } // ========== 优惠劵 ========== @@ -51,18 +53,18 @@ public class UsersCouponController { public CommonResult cardPage(@RequestParam(value = "status", required = false) Integer status, @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { - CommonResult result = couponService.getCouponCardPage(new CouponCardPageDTO() + CouponCardPageBO result = couponService.getCouponCardPage(new CouponCardPageDTO() .setStatus(status).setUserId(UserSecurityContextHolder.getContext().getUserId()) .setPageNo(pageNo).setPageSize(pageSize)); - return CouponCardConvert.INSTANCE.convert2(result); + return success(CouponCardConvert.INSTANCE.convert2(result)); } @PostMapping("/card/add") @ApiOperation(value = "领取优惠劵") @ApiImplicitParam(name = "templateId", value = "优惠劵(码)模板编号", required = true, example = "10") public CommonResult cardAdd(@RequestParam("templateId") Integer templateId) { - CommonResult result = couponService.addCouponCard(UserSecurityContextHolder.getContext().getUserId(), templateId); - return CouponCardConvert.INSTANCE.convert(result); + CouponCardBO result = couponService.addCouponCard(UserSecurityContextHolder.getContext().getUserId(), templateId); + return success(CouponCardConvert.INSTANCE.convert(result)); } // ========== 优惠码 ========== diff --git a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponCardConvert.java b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponCardConvert.java index 2a676dba7..76a8601e7 100644 --- a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponCardConvert.java +++ b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponCardConvert.java @@ -1,6 +1,5 @@ package cn.iocoder.mall.promotion.application.convert; -import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.promotion.api.bo.CouponCardBO; import cn.iocoder.mall.promotion.api.bo.CouponCardPageBO; import cn.iocoder.mall.promotion.application.vo.users.UsersCouponCardPageVO; @@ -15,13 +14,15 @@ public interface CouponCardConvert { CouponCardConvert INSTANCE = Mappers.getMapper(CouponCardConvert.class); @Mappings({}) - CommonResult convert(CommonResult result); + UsersCouponCardVO convert(CouponCardBO result); @Mappings({}) - CommonResult convert2(CommonResult result); + UsersCouponCardPageVO convert2(CouponCardPageBO result); // // @Mappings({}) // List convertList2(List banners); + + } diff --git a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponTemplateConvert.java b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponTemplateConvert.java index e1fc03972..ac6ed4bcf 100644 --- a/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponTemplateConvert.java +++ b/promotion/promotion-application/src/main/java/cn/iocoder/mall/promotion/application/convert/CouponTemplateConvert.java @@ -1,6 +1,5 @@ package cn.iocoder.mall.promotion.application.convert; -import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.promotion.api.bo.CouponTemplateBO; import cn.iocoder.mall.promotion.api.bo.CouponTemplatePageBO; import cn.iocoder.mall.promotion.application.vo.admins.AdminsCouponTemplatePageVO; @@ -15,25 +14,30 @@ import java.util.List; @Mapper public interface CouponTemplateConvert { - CouponTemplateConvert INSTANCE = Mappers.getMapper(CouponTemplateConvert.class); + Users USERS = Mappers.getMapper(Users.class); - @Mappings({}) - AdminsCouponTemplateVO convert(CouponTemplateBO template); + Admins ADMINS = Mappers.getMapper(Admins.class); - @Mappings({}) - CommonResult convert2(CommonResult result); + @Mapper + interface Admins { - @Mappings({}) - CommonResult convert(CommonResult result); + @Mappings({}) + AdminsCouponTemplateVO convert(CouponTemplateBO template); - @Mappings({}) - List convertList(List templates); + @Mappings({}) + AdminsCouponTemplatePageVO convertPage(CouponTemplatePageBO result); - @Mappings({}) - UsersCouponTemplateVO convert2(CouponTemplateBO template); + @Mappings({}) + List convertList(List templates); -// -// @Mappings({}) -// List convertList2(List banners); + } + + @Mapper + interface Users { + + @Mappings({}) + UsersCouponTemplateVO convert2(CouponTemplateBO template); + + } } diff --git a/promotion/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/CouponService.java b/promotion/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/CouponService.java index 2186dc234..18ff6b6b4 100644 --- a/promotion/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/CouponService.java +++ b/promotion/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/CouponService.java @@ -1,7 +1,6 @@ package cn.iocoder.mall.promotion.api; import cn.iocoder.common.framework.validator.InEnum; -import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.promotion.api.bo.*; import cn.iocoder.mall.promotion.api.constant.CouponTemplateStatusEnum; import cn.iocoder.mall.promotion.api.dto.*; @@ -13,9 +12,9 @@ public interface CouponService { // ========== 优惠劵(码)模板 ========== - CommonResult getCouponTemplate(Integer couponTemplateId); + CouponTemplateBO getCouponTemplate(Integer couponTemplateId); - CommonResult getCouponTemplatePage(CouponTemplatePageDTO couponTemplatePageDTO); + CouponTemplatePageBO getCouponTemplatePage(CouponTemplatePageDTO couponTemplatePageDTO); /** * 创建优惠码模板 @@ -23,7 +22,7 @@ public interface CouponService { * @param couponCodeTemplateAddDTO 优惠码模板添加 DTO * @return 优惠码模板 */ - CommonResult addCouponCodeTemplate(CouponCodeTemplateAddDTO couponCodeTemplateAddDTO); + CouponTemplateBO addCouponCodeTemplate(CouponCodeTemplateAddDTO couponCodeTemplateAddDTO); /** * 创建优惠劵模板 @@ -31,7 +30,7 @@ public interface CouponService { * @param couponCardTemplateAddDTO 优惠码模板添加 DTO * @return 优惠劵模板 */ - CommonResult addCouponCardTemplate(CouponCardTemplateAddDTO couponCardTemplateAddDTO); + CouponTemplateBO addCouponCardTemplate(CouponCardTemplateAddDTO couponCardTemplateAddDTO); /** * 更新优惠码模板 @@ -39,7 +38,7 @@ public interface CouponService { * @param couponCodeTemplateUpdateDTO 优惠码模板修改 DTO * @return 是否成功 */ - CommonResult updateCouponCodeTemplate(CouponCodeTemplateUpdateDTO couponCodeTemplateUpdateDTO); + Boolean updateCouponCodeTemplate(CouponCodeTemplateUpdateDTO couponCodeTemplateUpdateDTO); /** * 更新优惠劵模板 @@ -47,71 +46,70 @@ public interface CouponService { * @param couponCardTemplateUpdateDTO 优惠劵模板修改 DTO * @return 是否成功 */ - CommonResult updateCouponCardTemplate(CouponCardTemplateUpdateDTO couponCardTemplateUpdateDTO); + Boolean updateCouponCardTemplate(CouponCardTemplateUpdateDTO couponCardTemplateUpdateDTO); /** * 更新优惠劵(码)模板的状态 * - * @param adminId 操作管理员编号 + * @param adminId 操作管理员编号 * @param couponTemplateId 模板编号 - * @param status 状态 + * @param status 状态 * @return 是否成功 */ - CommonResult updateCouponTemplateStatus(Integer adminId, Integer couponTemplateId, - @InEnum(value = CouponTemplateStatusEnum.class, message = "修改状态必须是 {value}") Integer status); + Boolean updateCouponTemplateStatus(Integer adminId, Integer couponTemplateId, + @InEnum(value = CouponTemplateStatusEnum.class, message = "修改状态必须是 {value}") Integer status); // ========== 优惠劵 ========== - CommonResult getCouponCardPage(CouponCardPageDTO couponCardPageDTO); + CouponCardPageBO getCouponCardPage(CouponCardPageDTO couponCardPageDTO); /** * 基于优惠劵模板,领取优惠劵 * - * @param userId 用户编号 + * @param userId 用户编号 * @param couponTemplateId 优惠劵模板 * @return 优惠劵 */ - CommonResult addCouponCard(Integer userId, Integer couponTemplateId); + CouponCardBO addCouponCard(Integer userId, Integer couponTemplateId); /** * 使用优惠劵下单 * - * @param userId 用户编号 + * @param userId 用户编号 * @param couponCardId 优惠劵编号 * @return 是否成功 */ - CommonResult useCouponCard(Integer userId, + Boolean useCouponCard(Integer userId, @NotNull(message = "优惠劵编号不能为空") Integer couponCardId); /** * 取消优惠劵的使用 * - * @param userId 用户编号 + * @param userId 用户编号 * @param couponCardId 优惠劵编号 * @return 是否成功 */ - CommonResult cancelUseCouponCard(Integer userId, Integer couponCardId); + Boolean cancelUseCouponCard(Integer userId, Integer couponCardId); /** * 获得指定优惠劵 * - * @param userId 用户编号 + * @param userId 用户编号 * @param couponCardId 优惠劵编号 * @return 优惠劵 */ - CommonResult getCouponCardDetail(Integer userId, Integer couponCardId); + CouponCardDetailBO getCouponCardDetail(Integer userId, Integer couponCardId); /** * 获得用户所有优惠劵,并标明是否可用 - * + *

* 注意,spus 是作为条件,判断优惠劵是否可用 * * @param userId 用户编号 - * @param spus 匹配的商品/分类 + * @param spus 匹配的商品/分类 * @return 优惠劵列表 */ - CommonResult> getCouponCardList(Integer userId, List spus); - + List getCouponCardList(Integer userId, List spus); // ========== 优惠码 ========== @@ -119,9 +117,9 @@ public interface CouponService { * 使用优惠码,兑换优惠劵 * * @param userId 用户编号 - * @param code 优惠码 + * @param code 优惠码 * @return 优惠劵 */ - CommonResult useCouponCode(Integer userId, String code); + CouponCardBO useCouponCode(Integer userId, String code); } diff --git a/promotion/promotion-service-impl/src/main/java/cn/iocoder/mall/promotion/biz/service/CouponServiceImpl.java b/promotion/promotion-service-impl/src/main/java/cn/iocoder/mall/promotion/biz/service/CouponServiceImpl.java index c0db34db5..234d1149f 100644 --- a/promotion/promotion-service-impl/src/main/java/cn/iocoder/mall/promotion/biz/service/CouponServiceImpl.java +++ b/promotion/promotion-service-impl/src/main/java/cn/iocoder/mall/promotion/biz/service/CouponServiceImpl.java @@ -4,7 +4,6 @@ import cn.iocoder.common.framework.constant.SysErrorCodeEnum; import cn.iocoder.common.framework.util.DateUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.util.StringUtil; -import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.promotion.api.CouponService; import cn.iocoder.mall.promotion.api.bo.*; import cn.iocoder.mall.promotion.api.constant.*; @@ -35,13 +34,13 @@ public class CouponServiceImpl implements CouponService { // ========== 优惠劵(码)模板 ========== @Override - public CommonResult getCouponTemplate(Integer couponTemplateId) { + public CouponTemplateBO getCouponTemplate(Integer couponTemplateId) { CouponTemplateDO template = couponTemplateMapper.selectById(couponTemplateId); - return CommonResult.success(CouponTemplateConvertImpl.INSTANCE.convert(template)); + return CouponTemplateConvertImpl.INSTANCE.convert(template); } @Override - public CommonResult getCouponTemplatePage(CouponTemplatePageDTO couponTemplatePageDTO) { + public CouponTemplatePageBO getCouponTemplatePage(CouponTemplatePageDTO couponTemplatePageDTO) { CouponTemplatePageBO couponTemplatePageBO = new CouponTemplatePageBO(); // 查询分页数据 int offset = (couponTemplatePageDTO.getPageNo() - 1) * couponTemplatePageDTO.getPageSize(); @@ -53,31 +52,24 @@ public class CouponServiceImpl implements CouponService { couponTemplatePageBO.setTotal(couponTemplateMapper.selectCountByPage( couponTemplatePageDTO.getType(), couponTemplatePageDTO.getTitle(), couponTemplatePageDTO.getStatus(), couponTemplatePageDTO.getPreferentialType())); - return CommonResult.success(couponTemplatePageBO); + return couponTemplatePageBO; } @Override - public CommonResult addCouponCodeTemplate(CouponCodeTemplateAddDTO couponCodeTemplateAddDTO) { + public CouponTemplateBO addCouponCodeTemplate(CouponCodeTemplateAddDTO couponCodeTemplateAddDTO) { return null; } @Override - public CommonResult addCouponCardTemplate(CouponCardTemplateAddDTO couponCardTemplateAddDTO) { + public CouponTemplateBO addCouponCardTemplate(CouponCardTemplateAddDTO couponCardTemplateAddDTO) { // 校验生效日期相关 - CommonResult checkCouponCodeTemplateDateTypeResult = this.checkCouponTemplateDateType( - couponCardTemplateAddDTO.getDateType(), + checkCouponTemplateDateType(couponCardTemplateAddDTO.getDateType(), couponCardTemplateAddDTO.getValidStartTime(), couponCardTemplateAddDTO.getValidEndTime(), couponCardTemplateAddDTO.getFixedBeginTerm(), couponCardTemplateAddDTO.getFixedEndTerm()); - if (checkCouponCodeTemplateDateTypeResult.isError()) { - return CommonResult.error(checkCouponCodeTemplateDateTypeResult); - } // 校验优惠类型 - CommonResult checkCouponTemplateDateTypeResult = this.checkCouponTemplatePreferentialType( + Boolean checkCouponTemplateDateTypeResult = checkCouponTemplatePreferentialType( couponCardTemplateAddDTO.getPreferentialType(), couponCardTemplateAddDTO.getPercentOff(), couponCardTemplateAddDTO.getPriceOff(), couponCardTemplateAddDTO.getPriceAvailable()); - if (checkCouponTemplateDateTypeResult.isError()) { - return CommonResult.error(checkCouponTemplateDateTypeResult); - } // 保存优惠劵模板到数据库 CouponTemplateDO template = CouponTemplateConvert.INSTANCE.convert(couponCardTemplateAddDTO) .setType(CouponTemplateTypeEnum.CARD.getValue()) @@ -86,97 +78,97 @@ public class CouponServiceImpl implements CouponService { template.setCreateTime(new Date()); couponTemplateMapper.insert(template); // 返回成功 - return CommonResult.success(CouponTemplateConvert.INSTANCE.convert(template)); + return CouponTemplateConvert.INSTANCE.convert(template); } @Override - public CommonResult updateCouponCodeTemplate(CouponCodeTemplateUpdateDTO couponCodeTemplateUpdateDTO) { + public Boolean updateCouponCodeTemplate(CouponCodeTemplateUpdateDTO couponCodeTemplateUpdateDTO) { return null; } @Override - public CommonResult updateCouponCardTemplate(CouponCardTemplateUpdateDTO couponCardTemplateUpdateDTO) { + public Boolean updateCouponCardTemplate(CouponCardTemplateUpdateDTO couponCardTemplateUpdateDTO) { // 校验 CouponCardTemplate 存在 CouponTemplateDO template = couponTemplateMapper.selectById(couponCardTemplateUpdateDTO.getId()); if (template == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); } // 校验 CouponCardTemplate 是 CARD if (!CouponTemplateTypeEnum.CARD.getValue().equals(template.getType())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_CARD.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_CARD.getCode()); } // 校验发放数量不能减少 if (couponCardTemplateUpdateDTO.getTotal() < template.getTotal()) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_TOTAL_CAN_NOT_REDUCE.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_TOTAL_CAN_NOT_REDUCE.getCode()); } // 更新优惠劵模板到数据库 CouponTemplateDO updateTemplateDO = CouponTemplateConvert.INSTANCE.convert(couponCardTemplateUpdateDTO); couponTemplateMapper.update(updateTemplateDO); // 返回成功 - return CommonResult.success(true); + return true; } @Override - public CommonResult updateCouponTemplateStatus(Integer adminId, Integer couponTemplateId, Integer status) { + public Boolean updateCouponTemplateStatus(Integer adminId, Integer couponTemplateId, Integer status) { // 校验 CouponCardTemplate 存在 CouponTemplateDO template = couponTemplateMapper.selectById(couponTemplateId); if (template == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); } // 更新到数据库 CouponTemplateDO updateTemplateDO = new CouponTemplateDO().setId(couponTemplateId).setStatus(status); couponTemplateMapper.update(updateTemplateDO); // 返回成功 - return CommonResult.success(true); + return true; } - private CommonResult checkCouponTemplateDateType(Integer dateType, Date validStartTime, Date validEndTime, Integer fixedBeginTerm, Integer fixedEndTerm) { + private Boolean checkCouponTemplateDateType(Integer dateType, Date validStartTime, Date validEndTime, Integer fixedBeginTerm, Integer fixedEndTerm) { if (CouponTemplateDateTypeEnum.FIXED_DATE.getValue().equals(dateType)) { // 固定日期 if (validStartTime == null) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效开始时间不能为空"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效开始时间不能为空"); } if (validEndTime == null) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效结束时间不能为空"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效结束时间不能为空"); } if (validStartTime.after(validEndTime)) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效开始时间不能大于生效结束时间"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效开始时间不能大于生效结束时间"); } } else if (CouponTemplateDateTypeEnum.FIXED_TERM.getValue().equals(dateType)) { // 领取日期 if (fixedBeginTerm == null) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "领取日期开始时间不能为空"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "领取日期开始时间不能为空"); } if (fixedEndTerm == null) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "领取日期结束时间不能为空"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "领取日期结束时间不能为空"); } } else { throw new IllegalArgumentException("未知的生效日期类型:" + dateType); } - return CommonResult.success(true); + return true; } - private CommonResult checkCouponTemplatePreferentialType(Integer preferentialType, Integer percentOff, + private Boolean checkCouponTemplatePreferentialType(Integer preferentialType, Integer percentOff, Integer priceOff, Integer priceAvailable) { if (PreferentialTypeEnum.PRICE.getValue().equals(preferentialType)) { if (priceOff == null) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "优惠金额不能为空"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "优惠金额不能为空"); } if (priceOff >= priceAvailable) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "优惠金额不能d大于等于使用金额门槛"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "优惠金额不能d大于等于使用金额门槛"); } } else if (PreferentialTypeEnum.DISCOUNT.getValue().equals(preferentialType)) { if (percentOff == null) { - return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "折扣百分比不能为空"); + throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "折扣百分比不能为空"); } } else { throw new IllegalArgumentException("未知的优惠类型:" + preferentialType); } - return CommonResult.success(true); + return true; } // ========== 优惠劵 ========== @Override - public CommonResult getCouponCardPage(CouponCardPageDTO couponCardPageDTO) { + public CouponCardPageBO getCouponCardPage(CouponCardPageDTO couponCardPageDTO) { CouponCardPageBO pageBO = new CouponCardPageBO(); // 查询分页数据 int offset = (couponCardPageDTO.getPageNo() - 1) * couponCardPageDTO.getPageSize(); @@ -186,37 +178,37 @@ public class CouponServiceImpl implements CouponService { // 查询分页总数 pageBO.setTotal(couponCardMapper.selectCountByPage( couponCardPageDTO.getUserId(), couponCardPageDTO.getStatus())); - return CommonResult.success(pageBO); + return pageBO; } @Override @Transactional - public CommonResult addCouponCard(Integer userId, Integer couponTemplateId) { + public CouponCardBO addCouponCard(Integer userId, Integer couponTemplateId) { // 校验 CouponCardTemplate 存在 CouponTemplateDO template = couponTemplateMapper.selectById(couponTemplateId); if (template == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); } // 校验 CouponCardTemplate 是 CARD if (!CouponTemplateTypeEnum.CARD.getValue().equals(template.getType())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_CARD.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_CARD.getCode()); } // 校验 CouponCardTemplate 状态是否开启 if (!CouponTemplateStatusEnum.ENABLE.getValue().equals(template.getStatus())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_STATUS_NOT_ENABLE.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_STATUS_NOT_ENABLE.getCode()); } // 校验 CouponCardTemplate 是否到达可领取的上限 if (template.getStatFetchNum() > template.getTotal()) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_TOTAL_NOT_ENOUGH.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_TOTAL_NOT_ENOUGH.getCode()); } // 校验单人可领取优惠劵是否到达上限 if (couponCardMapper.selectCountByUserIdAndTemplateId(userId, couponTemplateId) > template.getQuota()) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode()); } // 增加优惠劵已领取量 int updateTemplateCount = couponTemplateMapper.updateStatFetchNumIncr(couponTemplateId); if (updateTemplateCount == 0) { // 超过 CouponCardTemplate 发放量 - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode()); } // 创建优惠劵 // 1. 基本信息 + 领取情况 @@ -237,85 +229,85 @@ public class CouponServiceImpl implements CouponService { card.setCreateTime(new Date()); couponCardMapper.insert(card); // 返回成功 - return CommonResult.success(CouponCardConvert.INSTANCE.convert(card)); + return CouponCardConvert.INSTANCE.convert(card); } @Override - public CommonResult useCouponCard(Integer userId, Integer couponCardId) { + public Boolean useCouponCard(Integer userId, Integer couponCardId) { // 查询优惠劵 CouponCardDO card = couponCardMapper.selectById(couponCardId); if (card == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_NOT_EXISTS.getCode()); } if (!userId.equals(card.getUserId())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_ERROR_USER.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_ERROR_USER.getCode()); } if (CouponCardStatusEnum.UNUSED.getValue().equals(card.getStatus())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_UNUSED.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_UNUSED.getCode()); } if (DateUtil.isBetween(card.getValidStartTime(), card.getValidEndTime())) { // 为避免定时器没跑,实际优惠劵已经过期 - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_UNUSED.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_UNUSED.getCode()); } // 更新优惠劵已使用 int updateCount = couponCardMapper.updateByIdAndStatus(card.getId(), CouponCardStatusEnum.USED.getValue(), new CouponCardDO().setStatus(CouponCardStatusEnum.USED.getValue()).setUsedTime(new Date())); if (updateCount == 0) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_UNUSED.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_UNUSED.getCode()); } - return CommonResult.success(true); + return true; } @Override - public CommonResult cancelUseCouponCard(Integer userId, Integer couponCardId) { + public Boolean cancelUseCouponCard(Integer userId, Integer couponCardId) { // 查询优惠劵 CouponCardDO card = couponCardMapper.selectById(couponCardId); if (card == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_NOT_EXISTS.getCode()); } if (!userId.equals(card.getUserId())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_ERROR_USER.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_ERROR_USER.getCode()); } if (CouponCardStatusEnum.USED.getValue().equals(card.getStatus())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_USED.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_USED.getCode()); } // 更新优惠劵已使用 int updateCount = couponCardMapper.updateByIdAndStatus(card.getId(), CouponCardStatusEnum.UNUSED.getValue(), new CouponCardDO().setStatus(CouponCardStatusEnum.USED.getValue())); // TODO 芋艿,usedTime 未设置空,后面处理。 if (updateCount == 0) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_USED.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_STATUS_NOT_USED.getCode()); } // 有一点要注意,更新会未使用时,优惠劵可能已经过期了,直接让定时器跑过期,这里不做处理。 - return CommonResult.success(true); + return true; } @Override - public CommonResult getCouponCardDetail(Integer userId, Integer couponCardId) { + public CouponCardDetailBO getCouponCardDetail(Integer userId, Integer couponCardId) { // 查询优惠劵 CouponCardDO card = couponCardMapper.selectById(couponCardId); if (card == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_NOT_EXISTS.getCode()); } if (!userId.equals(card.getUserId())) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_CARD_ERROR_USER.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_CARD_ERROR_USER.getCode()); } // 查询优惠劵模板 CouponTemplateDO template = couponTemplateMapper.selectById(card.getTemplateId()); if (template == null) { - return ServiceExceptionUtil.error(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); + throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.COUPON_TEMPLATE_NOT_EXISTS.getCode()); } // 拼接结果 CouponCardDetailBO detail = CouponCardConvert.INSTANCE.convert2(card); detail.setRangeType(template.getRangeType()); detail.setRangeValues(StringUtil.splitToInt(template.getRangeValues(), ",")); - return CommonResult.success(detail); + return detail; } @Override - public CommonResult> getCouponCardList(Integer userId, List spus) { + public List getCouponCardList(Integer userId, List spus) { // 查询用户未使用的优惠劵列表 List cards = couponCardMapper.selectListByUserIdAndStatus(userId, CouponCardStatusEnum.UNUSED.getValue()); if (cards.isEmpty()) { - return CommonResult.success(Collections.emptyList()); + return Collections.emptyList(); } // 查询优惠劵模板集合 Map templates = couponTemplateMapper.selectListByIds(cards.stream().map(CouponCardDO::getTemplateId).collect(Collectors.toSet())) @@ -328,7 +320,7 @@ public class CouponServiceImpl implements CouponService { return availableCard; }).collect(Collectors.toList()); // 返回结果 - return CommonResult.success(availableCards); + return availableCards; } private void setCouponCardValidTime(CouponCardDO card, CouponTemplateDO template) { @@ -374,7 +366,7 @@ public class CouponServiceImpl implements CouponService { // ========== 优惠码 ========== @Override - public CommonResult useCouponCode(Integer userId, String code) { + public CouponCardBO useCouponCode(Integer userId, String code) { return null; } diff --git a/system/system-service-impl/src/main/resources/mapper/AdminMapper.xml b/system/system-service-impl/src/main/resources/mapper/AdminMapper.xml index 30f45cae5..6a4ecbc7d 100644 --- a/system/system-service-impl/src/main/resources/mapper/AdminMapper.xml +++ b/system/system-service-impl/src/main/resources/mapper/AdminMapper.xml @@ -52,7 +52,7 @@ - \ No newline at end of file +