diff --git a/admin-web/config/config.js b/admin-web/config/config.js index 95c640a50..0e63fb05c 100644 --- a/admin-web/config/config.js +++ b/admin-web/config/config.js @@ -65,7 +65,7 @@ if (APP_TYPE === 'site') { export default { // add for transfer to umi base: basePath, - publicPath: basePath, + // publicPath: basePath, plugins, define: { APP_TYPE: APP_TYPE || '', diff --git a/admin-web/config/router.config.js b/admin-web/config/router.config.js index 920467940..932f5bee0 100644 --- a/admin-web/config/router.config.js +++ b/admin-web/config/router.config.js @@ -69,6 +69,11 @@ export default [ name: 'order-list', component: './Order/OrderList', }, + { + path: '/order/order-refunds', + name: 'order-refunds', + component: './Order/OrderRefunds', + }, ], }, // product diff --git a/admin-web/src/components/OrderTable/index.js b/admin-web/src/components/OrderTable/index.js new file mode 100644 index 000000000..2c74867eb --- /dev/null +++ b/admin-web/src/components/OrderTable/index.js @@ -0,0 +1,8 @@ +// import React, { PureComponent } from 'react'; +// import {} from 'antd'; +// +// export default class OrderTable extends PureComponent { +// render() { +// return
cc
; +// } +// } diff --git a/admin-web/src/locales/zh-CN/menu.js b/admin-web/src/locales/zh-CN/menu.js index 111932c6a..9695fe996 100644 --- a/admin-web/src/locales/zh-CN/menu.js +++ b/admin-web/src/locales/zh-CN/menu.js @@ -52,6 +52,7 @@ export default { // 订单 'menu.order': '订单管理', 'menu.order.order-list': '订单管理', + 'menu.order.order-refunds': '退货维权', // 营销相关 - 'menu.promotion.promotion-banner-list': 'Banner 管理' + 'menu.promotion.promotion-banner-list': 'Banner 管理', }; diff --git a/admin-web/src/models/order/orderDelivery.js b/admin-web/src/models/order/orderDelivery.js new file mode 100644 index 000000000..6aa33ebb4 --- /dev/null +++ b/admin-web/src/models/order/orderDelivery.js @@ -0,0 +1,25 @@ +// import { cancelOrder } from '../../services/order'; +// +// export default { +// namespace: 'orderDelivery', +// +// state: { +// orderId: 0, +// visible: false, +// }, +// +// effects: { +// *getLogistics({ payload }, { call, put }) {}, +// }, +// +// reducers: { +// changeVisible(state, { payload }) { +// const { orderId, visible } = payload; +// return { +// ...state, +// orderId, +// visible, +// }; +// }, +// }, +// }; diff --git a/admin-web/src/models/order/orderList.js b/admin-web/src/models/order/orderList.js index babef4370..4a3468e93 100644 --- a/admin-web/src/models/order/orderList.js +++ b/admin-web/src/models/order/orderList.js @@ -1,5 +1,11 @@ import { message } from 'antd'; -import { orderPage, updateOrderItem, updateOrderItemPayAmount } from '../../services/order'; +import { + orderPage, + updateOrderItem, + updateOrderItemPayAmount, + updateRemark, + cancelOrder, +} from '../../services/order'; export default { namespace: 'orderList', @@ -18,6 +24,12 @@ export default { orderId: 0, orderItemId: 0, searchParams: {}, + + remarkVisible: false, + remark: '', + + orderCancelVisible: false, + orderCancelShowOther: false, }, effects: { @@ -70,6 +82,40 @@ export default { }, }); + yield put({ + type: 'queryPage', + payload: { + ...searchParams, + }, + }); + }, + *updateRemake({ payload }, { call, put }) { + const { searchParams, params } = payload; + yield call(updateRemark, params); + yield put({ + type: 'changeRemakeVisible', + payload: { + remarkVisible: false, + }, + }); + + yield put({ + type: 'queryPage', + payload: { + ...searchParams, + }, + }); + }, + *cancelOrder({ payload }, { call, put }) { + const { searchParams, params } = payload; + yield call(cancelOrder, params); + yield put({ + type: 'changeOrderCancelVisible', + payload: { + orderCancelVisible: false, + }, + }); + yield put({ type: 'queryPage', payload: { @@ -99,5 +145,23 @@ export default { ...payload, }; }, + changeRemakeVisible(state, { payload }) { + return { + ...state, + ...payload, + }; + }, + changeOrderCancelVisible(state, { payload }) { + return { + ...state, + ...payload, + }; + }, + changeOrderCancelShowOther(state, { payload }) { + return { + ...state, + ...payload, + }; + }, }, }; diff --git a/admin-web/src/pages/Order/OrderCancel.js b/admin-web/src/pages/Order/OrderCancel.js new file mode 100644 index 000000000..5a58df109 --- /dev/null +++ b/admin-web/src/pages/Order/OrderCancel.js @@ -0,0 +1,84 @@ +import React from 'react'; +import { Form, Input, Modal } from 'antd'; +import DictionarySelect from '@/components/Dictionary/DictionarySelect'; +import dictionary from '@/utils/dictionary'; + +const FormItem = Form.Item; + +// 订单 - 更新支付金额 +const OrderCancel = Form.create()(props => { + const { form, dispatch, loading } = props; + const { orderId, orderCancelVisible, orderCancelShowOther, searchParams } = props.orderList; + const { getFieldDecorator } = props.form; + + const handleOk = e => { + e.preventDefault(); + form.validateFields((err, fields) => { + if (err) return; + dispatch({ + type: 'orderList/cancelOrder', + payload: { + params: { + orderId, + reasons: fields.reasons, + otherReasons: fields.otherReasons, + }, + searchParams, + }, + }); + }); + }; + + const handleCancel = () => { + dispatch({ + type: 'orderList/changeRemakeVisible', + payload: { + remarkVisible: false, + }, + }); + }; + + const handleReasonsChange = key => { + dispatch({ + type: 'orderList/changeOrderCancelShowOther', + payload: { + orderCancelShowOther: key === '20', + }, + }); + }; + + return ( + + + {getFieldDecorator('reasons', { + rules: [{ required: true, message: '请选择取消原因!' }], + })( + + )} + + {orderCancelShowOther ? ( + + {getFieldDecorator('otherReasons', { + rules: [{ required: true, message: '请输填写退款原因!' }], + })()} + + ) : ( + '' + )} + + ); +}); + +export default OrderCancel; diff --git a/admin-web/src/pages/Order/OrderDelivery.js b/admin-web/src/pages/Order/OrderDelivery.js new file mode 100644 index 000000000..f03e59668 --- /dev/null +++ b/admin-web/src/pages/Order/OrderDelivery.js @@ -0,0 +1,5 @@ +// import React, { PureComponent } from 'react'; +// +// class OrderDelivery extends PureComponent {} +// +// export default OrderDelivery; diff --git a/admin-web/src/pages/Order/OrderDetails.js b/admin-web/src/pages/Order/OrderDetails.js new file mode 100644 index 000000000..f1635f53a --- /dev/null +++ b/admin-web/src/pages/Order/OrderDetails.js @@ -0,0 +1,691 @@ +import React, { PureComponent, Fragment } from 'react'; +import { connect } from 'dva'; +import moment from 'moment'; +import router from 'umi/router'; +import { + Row, + Col, + Card, + Form, + Input, + Select, + Icon, + Button, + Dropdown, + Menu, + InputNumber, + DatePicker, + Modal, + message, + Badge, + Divider, + Steps, + Radio, +} from 'antd'; +import StandardTable from '@/components/StandardTable'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import styles from './OrderDetails.less'; + +const FormItem = Form.Item; +const { Step } = Steps; +const { TextArea } = Input; +const { Option } = Select; +const RadioGroup = Radio.Group; +const getValue = obj => + Object.keys(obj) + .map(key => obj[key]) + .join(','); +const statusMap = ['default', 'processing', 'success', 'error']; +const status = ['关闭', '运行中', '已上线', '异常']; + +const CreateForm = Form.create()(props => { + const { modalVisible, form, handleAdd, handleModalVisible } = props; + const okHandle = () => { + form.validateFields((err, fieldsValue) => { + if (err) return; + form.resetFields(); + handleAdd(fieldsValue); + }); + }; + return ( + handleModalVisible()} + > + + {form.getFieldDecorator('desc', { + rules: [{ required: true, message: '请输入至少五个字符的规则描述!', min: 5 }], + })()} + + + ); +}); + +@Form.create() +class UpdateForm extends PureComponent { + static defaultProps = { + handleUpdate: () => {}, + handleUpdateModalVisible: () => {}, + values: {}, + }; + + constructor(props) { + super(props); + + this.state = { + formVals: { + name: props.values.name, + desc: props.values.desc, + key: props.values.key, + target: '0', + template: '0', + type: '1', + time: '', + frequency: 'month', + }, + currentStep: 0, + }; + + this.formLayout = { + labelCol: { span: 7 }, + wrapperCol: { span: 13 }, + }; + } + + handleNext = currentStep => { + const { form, handleUpdate } = this.props; + const { formVals: oldValue } = this.state; + form.validateFields((err, fieldsValue) => { + if (err) return; + const formVals = { ...oldValue, ...fieldsValue }; + this.setState( + { + formVals, + }, + () => { + if (currentStep < 2) { + this.forward(); + } else { + handleUpdate(formVals); + } + } + ); + }); + }; + + backward = () => { + const { currentStep } = this.state; + this.setState({ + currentStep: currentStep - 1, + }); + }; + + forward = () => { + const { currentStep } = this.state; + this.setState({ + currentStep: currentStep + 1, + }); + }; + + renderContent = (currentStep, formVals) => { + const { form } = this.props; + if (currentStep === 1) { + return [ + + {form.getFieldDecorator('target', { + initialValue: formVals.target, + })( + + )} + , + + {form.getFieldDecorator('template', { + initialValue: formVals.template, + })( + + )} + , + + {form.getFieldDecorator('type', { + initialValue: formVals.type, + })( + + + + + )} + , + ]; + } + if (currentStep === 2) { + return [ + + {form.getFieldDecorator('time', { + rules: [{ required: true, message: '请选择开始时间!' }], + })( + + )} + , + + {form.getFieldDecorator('frequency', { + initialValue: formVals.frequency, + })( + + )} + , + ]; + } + return [ + + {form.getFieldDecorator('name', { + rules: [{ required: true, message: '请输入规则名称!' }], + initialValue: formVals.name, + })()} + , + + {form.getFieldDecorator('desc', { + rules: [{ required: true, message: '请输入至少五个字符的规则描述!', min: 5 }], + initialValue: formVals.desc, + })(