- 优化订单列表
- 添加订单发货流程
This commit is contained in:
parent
10807b0c6f
commit
2bcaaf2027
@ -2,24 +2,25 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
'/admin-api/': {
|
'/admin-api/': {
|
||||||
|
target: 'http://180.167.213.26:18083/',
|
||||||
// target: 'http://180.167.213.26:18083/',
|
// target: 'http://180.167.213.26:18083/',
|
||||||
target: 'http://127.0.0.1:18083/',
|
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
pathRewrite: {},
|
pathRewrite: {},
|
||||||
},
|
},
|
||||||
'/product-api/': {
|
'/product-api/': {
|
||||||
// target: 'http://180.167.213.26:18083/',
|
target: 'http://180.167.213.26:18083/',
|
||||||
target: 'http://127.0.0.1:18081/',
|
// target: 'http://127.0.0.1:18081/',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
pathRewrite: {},
|
pathRewrite: {},
|
||||||
},
|
},
|
||||||
'/order-api/': {
|
'/order-api/': {
|
||||||
|
// target: 'http://180.167.213.26:18084/',
|
||||||
target: 'http://127.0.0.1:18084/',
|
target: 'http://127.0.0.1:18084/',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
pathRewrite: {},
|
pathRewrite: {},
|
||||||
},
|
},
|
||||||
'/promotion-api/': {
|
'/promotion-api/': {
|
||||||
target: 'http://127.0.0.1:18085/',
|
target: 'http://180.167.213.26:18085/',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
pathRewrite: {},
|
pathRewrite: {},
|
||||||
},
|
},
|
||||||
|
67
admin-web/src/models/order/orderDelivery.js
Normal file
67
admin-web/src/models/order/orderDelivery.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import { message } from 'antd';
|
||||||
|
import { orderItems, getOrderRecipientInfo, orderDeliver } from '../../services/order';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
namespace: 'orderDelivery',
|
||||||
|
|
||||||
|
state: {
|
||||||
|
orderId: null,
|
||||||
|
visible: false,
|
||||||
|
list: [],
|
||||||
|
orderRecipient: {},
|
||||||
|
selectedRowKeys: [],
|
||||||
|
},
|
||||||
|
|
||||||
|
effects: {
|
||||||
|
*getOrderItems({ payload }, { call, put }) {
|
||||||
|
const response1 = yield call(orderItems, payload);
|
||||||
|
const response2 = yield call(getOrderRecipientInfo, payload);
|
||||||
|
|
||||||
|
yield put({
|
||||||
|
type: 'getOrderItemsSuccess',
|
||||||
|
payload: {
|
||||||
|
list: response1.data,
|
||||||
|
orderRecipient: response2.data,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
*deliver({ payload }, { call, put }) {
|
||||||
|
const { code } = yield call(orderDeliver, payload);
|
||||||
|
if (code === 0) {
|
||||||
|
message.info('发货成功!');
|
||||||
|
yield put({
|
||||||
|
type: 'changeVisible',
|
||||||
|
payload: {
|
||||||
|
visible: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
reducers: {
|
||||||
|
getOrderItemsSuccess(state, { payload }) {
|
||||||
|
const { list, orderRecipient } = payload;
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
list,
|
||||||
|
orderRecipient,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
changeVisible(state, { payload }) {
|
||||||
|
const { visible, orderId } = payload;
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
visible,
|
||||||
|
orderId,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
changeSelectedRowKeys(state, { payload }) {
|
||||||
|
const { selectedRowKeys } = payload;
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
selectedRowKeys,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
@ -1,5 +1,163 @@
|
|||||||
// import React, { PureComponent } from 'react';
|
import React from 'react';
|
||||||
//
|
import { Table, Modal, Card, Form, Input, message } from 'antd';
|
||||||
// class OrderDelivery extends PureComponent {}
|
import DictionaryText from '@/components/Dictionary/DictionaryText';
|
||||||
//
|
import DictionarySelect from '@/components/Dictionary/DictionarySelect';
|
||||||
// export default OrderDelivery;
|
import dictionary from '@/utils/dictionary';
|
||||||
|
import styles from './OrderDelivery.less';
|
||||||
|
|
||||||
|
const OrderDelivery = Form.create()(props => {
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: '商品',
|
||||||
|
dataIndex: 'skuName',
|
||||||
|
render: (text, row) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<img className={styles.goodImg} alt={row.skuName} src={row.skuImage} />
|
||||||
|
<span>{row.skuName}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '数量',
|
||||||
|
dataIndex: 'quantity',
|
||||||
|
render: quantity => <span>{quantity}</span>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态',
|
||||||
|
dataIndex: 'status',
|
||||||
|
sorter: true,
|
||||||
|
render: status => <DictionaryText dicKey={dictionary.ORDER_STATUS} dicValue={status} />,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '运输号',
|
||||||
|
dataIndex: 'orderLogisticsId',
|
||||||
|
width: 200,
|
||||||
|
render: orderLogisticsId => {
|
||||||
|
return <span>{orderLogisticsId || '-'}</span>;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const handleCancel = () => {
|
||||||
|
const { dispatch } = props;
|
||||||
|
dispatch({
|
||||||
|
type: 'orderDelivery/changeVisible',
|
||||||
|
payload: {
|
||||||
|
visible: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleOk = e => {
|
||||||
|
e.preventDefault();
|
||||||
|
const { dispatch, form } = props;
|
||||||
|
const { selectedRowKeys, orderId } = props.orderDelivery;
|
||||||
|
form.validateFields((err, fields) => {
|
||||||
|
if (err) return;
|
||||||
|
console.log('fields', fields);
|
||||||
|
|
||||||
|
console.log('selectedRowKeys', selectedRowKeys);
|
||||||
|
if (selectedRowKeys.length <= 0) {
|
||||||
|
message.error('至少选择一个发货的商品!');
|
||||||
|
} else {
|
||||||
|
dispatch({
|
||||||
|
type: 'orderDelivery/deliver',
|
||||||
|
payload: {
|
||||||
|
...fields,
|
||||||
|
orderId,
|
||||||
|
orderItemIds: selectedRowKeys,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const { loading, orderDelivery } = props;
|
||||||
|
const { getFieldDecorator } = props.form;
|
||||||
|
const { list, visible, orderRecipient } = orderDelivery;
|
||||||
|
const { name, mobile, address } = orderRecipient || {};
|
||||||
|
|
||||||
|
// rowSelection objects indicates the need for row selection
|
||||||
|
const rowSelection = {
|
||||||
|
onChange: (selectedRowKeys, selectedRows) => {
|
||||||
|
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
|
||||||
|
props.dispatch({
|
||||||
|
type: 'orderDelivery/changeSelectedRowKeys',
|
||||||
|
payload: {
|
||||||
|
selectedRowKeys,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onSelect: (record, selected, selectedRows) => {
|
||||||
|
console.log(record, selected, selectedRows);
|
||||||
|
},
|
||||||
|
onSelectAll: (selected, selectedRows, changeRows) => {
|
||||||
|
console.log(selected, selectedRows, changeRows);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
destroyOnClose
|
||||||
|
title="发货"
|
||||||
|
visible={visible}
|
||||||
|
onOk={handleOk}
|
||||||
|
okText="保存"
|
||||||
|
onCancel={handleCancel}
|
||||||
|
confirmLoading={loading}
|
||||||
|
width={800}
|
||||||
|
>
|
||||||
|
<Table
|
||||||
|
rowKey="id"
|
||||||
|
columns={columns}
|
||||||
|
dataSource={list}
|
||||||
|
loading={loading}
|
||||||
|
pagination={false}
|
||||||
|
rowSelection={rowSelection}
|
||||||
|
// onSelectRow={handleSelectRows}
|
||||||
|
// onChange={handleStandardTableChange}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Card loading={loading}>
|
||||||
|
<div>
|
||||||
|
<h3>配送信息</h3>{' '}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
收货人: {name} ({mobile})
|
||||||
|
</div>
|
||||||
|
<div>配件方式: 快递 TODO暂时只有一种</div>
|
||||||
|
<div>收件地址: {address}</div>
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
<Card loading={loading}>
|
||||||
|
<div>
|
||||||
|
<h3>发货方式</h3>{' '}
|
||||||
|
</div>
|
||||||
|
<Form>
|
||||||
|
<Form.Item label="物流">
|
||||||
|
{getFieldDecorator('logistics', {
|
||||||
|
rules: [{ required: true, message: '必选!' }],
|
||||||
|
})(
|
||||||
|
<DictionarySelect
|
||||||
|
style={{ minWidth: '100%' }}
|
||||||
|
dicKey={dictionary.LOGISTICS_COMPANY}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label="快递号">
|
||||||
|
{getFieldDecorator('logisticsNo', {
|
||||||
|
rules: [{ required: true, message: '必选!' }],
|
||||||
|
})(<Input placeholder="请输入快递号." />)}
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item>
|
||||||
|
*请仔细填写物流公司及快递单号,发货后24小时内仅支持做一次更正,逾期不可修改
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
</Card>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default OrderDelivery;
|
||||||
|
9
admin-web/src/pages/Order/OrderDelivery.less
Normal file
9
admin-web/src/pages/Order/OrderDelivery.less
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
@import '~antd/lib/style/themes/default.less';
|
||||||
|
@import '~@/utils/utils.less';
|
||||||
|
|
||||||
|
.goodImg {
|
||||||
|
@size: 100px;
|
||||||
|
|
||||||
|
width: @size;
|
||||||
|
height: @size;
|
||||||
|
}
|
@ -1,49 +1,9 @@
|
|||||||
@import '~antd/lib/style/themes/default.less';
|
@import '~antd/lib/style/themes/default.less';
|
||||||
@import '~@/utils/utils.less';
|
@import '~@/utils/utils.less';
|
||||||
|
|
||||||
.tableList {
|
.goodImg {
|
||||||
.tableListOperator {
|
@size: 100;
|
||||||
margin-bottom: 16px;
|
|
||||||
button {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tableListForm {
|
width: @size;
|
||||||
:global {
|
height: @size;
|
||||||
.ant-form-item {
|
|
||||||
display: flex;
|
|
||||||
margin-right: 0;
|
|
||||||
margin-bottom: 24px;
|
|
||||||
> .ant-form-item-label {
|
|
||||||
width: auto;
|
|
||||||
padding-right: 8px;
|
|
||||||
line-height: 32px;
|
|
||||||
}
|
|
||||||
.ant-form-item-control {
|
|
||||||
line-height: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.ant-form-item-control-wrapper {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.submitButtons {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 24px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: @screen-lg) {
|
|
||||||
.tableListForm :global(.ant-form-item) {
|
|
||||||
margin-right: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: @screen-md) {
|
|
||||||
.tableListForm :global(.ant-form-item) {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import { Button, Card, Col, Divider, Form, Input, Row, Tabs, DatePicker, List }
|
|||||||
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
|
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
|
||||||
import DictionaryText from '@/components/Dictionary/DictionaryText';
|
import DictionaryText from '@/components/Dictionary/DictionaryText';
|
||||||
import OrderUpdatePayAmount from './OrderUpdatePayAmount';
|
import OrderUpdatePayAmount from './OrderUpdatePayAmount';
|
||||||
|
import OrderDelivery from './OrderDelivery';
|
||||||
import OrderRemark from './OrderRemark';
|
import OrderRemark from './OrderRemark';
|
||||||
import OrderCancel from './OrderCancel';
|
import OrderCancel from './OrderCancel';
|
||||||
import dictionary from '@/utils/dictionary';
|
import dictionary from '@/utils/dictionary';
|
||||||
@ -18,8 +19,8 @@ const { TabPane } = Tabs;
|
|||||||
|
|
||||||
const OrderContent = props => {
|
const OrderContent = props => {
|
||||||
const { dispatch, item } = props;
|
const { dispatch, item } = props;
|
||||||
const { createTime, status, payAmount } = item;
|
const { createTime, status, payAmount, id } = item;
|
||||||
const { name, mobile } = item.orderRecipient;
|
const { name, mobile } = item.orderRecipient || {};
|
||||||
|
|
||||||
const handleUpdatePayAmount = updateOrderItem => {
|
const handleUpdatePayAmount = updateOrderItem => {
|
||||||
dispatch({
|
dispatch({
|
||||||
@ -33,24 +34,29 @@ const OrderContent = props => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// const handleCancelOrder = ({ orderId }) => {
|
const handleOrderDelivery = () => {
|
||||||
// dispatch({
|
dispatch({
|
||||||
// type: 'orderList/changeOrderCancelVisible',
|
type: 'orderDelivery/changeVisible',
|
||||||
// payload: {
|
payload: {
|
||||||
// orderCancelVisible: true,
|
visible: true,
|
||||||
// orderId,
|
orderId: id,
|
||||||
// },
|
},
|
||||||
// });
|
});
|
||||||
// };
|
|
||||||
//
|
dispatch({
|
||||||
// const handleRenderGoods = () => {};
|
type: 'orderDelivery/getOrderItems',
|
||||||
|
payload: {
|
||||||
|
orderId: id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const renderStatusButtons = () => {
|
const renderStatusButtons = () => {
|
||||||
let res = '';
|
let res = '';
|
||||||
if (status === 1) {
|
if (status === 1) {
|
||||||
res = <Button>取消订单</Button>;
|
res = <Button>取消订单</Button>;
|
||||||
} else if (status === 2) {
|
} else if (status === 2) {
|
||||||
res = <Button>发货</Button>;
|
res = <Button onClick={() => handleOrderDelivery()}>发货</Button>;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
};
|
};
|
||||||
@ -58,7 +64,7 @@ const OrderContent = props => {
|
|||||||
const renderGoods = orderItems => {
|
const renderGoods = orderItems => {
|
||||||
return orderItems.map(({ skuName, skuImage, quantity, price }) => {
|
return orderItems.map(({ skuName, skuImage, quantity, price }) => {
|
||||||
return (
|
return (
|
||||||
<div className={styles.orderGoods}>
|
<div key={skuName} className={styles.orderGoods}>
|
||||||
<img alt={skuName} className={`${styles.image}`} src={skuImage} />
|
<img alt={skuName} className={`${styles.image}`} src={skuImage} />
|
||||||
<div className={styles.contentItem}>
|
<div className={styles.contentItem}>
|
||||||
<div>
|
<div>
|
||||||
@ -95,7 +101,7 @@ const OrderContent = props => {
|
|||||||
<div>
|
<div>
|
||||||
<DictionaryText dicKey={dictionary.ORDER_STATUS} dicValue={status} />
|
<DictionaryText dicKey={dictionary.ORDER_STATUS} dicValue={status} />
|
||||||
</div>
|
</div>
|
||||||
<div>{renderStatusButtons()}</div>
|
<div>{renderStatusButtons(props)}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.contentItem}>
|
<div className={styles.contentItem}>
|
||||||
<div className={styles.columnName}>(实付金额)</div>
|
<div className={styles.columnName}>(实付金额)</div>
|
||||||
@ -243,10 +249,11 @@ const SearchForm = Form.create()(props => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@connect(({ orderList, loading }) => ({
|
@connect(({ orderList, orderDelivery, loading }) => ({
|
||||||
orderList,
|
orderList,
|
||||||
list: orderList.list,
|
list: orderList.list,
|
||||||
loading: loading.models.orderList,
|
loading: loading.models.orderList,
|
||||||
|
orderDelivery,
|
||||||
}))
|
}))
|
||||||
class BasicList extends PureComponent {
|
class BasicList extends PureComponent {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
@ -326,6 +333,8 @@ class BasicList extends PureComponent {
|
|||||||
<OrderUpdatePayAmount {...this.props} />
|
<OrderUpdatePayAmount {...this.props} />
|
||||||
<OrderRemark {...this.props} />
|
<OrderRemark {...this.props} />
|
||||||
<OrderCancel {...this.props} />
|
<OrderCancel {...this.props} />
|
||||||
|
|
||||||
|
<OrderDelivery {...this.props} />
|
||||||
</PageHeaderWrapper>
|
</PageHeaderWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,27 @@ export async function orderPage(params) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function orderItems(params) {
|
||||||
|
return request(`/order-api/admins/order/order_items?${stringify(params)}`, {
|
||||||
|
method: 'GET',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getOrderRecipientInfo(params) {
|
||||||
|
return request(`/order-api/admins/order/order_recipient_info?${stringify(params)}`, {
|
||||||
|
method: 'GET',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function orderDeliver(params) {
|
||||||
|
return request(`/order-api/admins/order/order_deliver`, {
|
||||||
|
method: 'POST',
|
||||||
|
body: {
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export async function updateOrderItemPayAmount(params) {
|
export async function updateOrderItemPayAmount(params) {
|
||||||
return request(`/order-api/admins/order/order_item/update_pay_amount?${stringify(params)}`, {
|
return request(`/order-api/admins/order/order_item/update_pay_amount?${stringify(params)}`, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
|
@ -4,6 +4,7 @@ const DictionaryConstants = {
|
|||||||
GENDER: 'gender',
|
GENDER: 'gender',
|
||||||
ORDER_STATUS: 'order_status',
|
ORDER_STATUS: 'order_status',
|
||||||
ORDER_CANCEL_REASONS: 'order_cancel_reasons',
|
ORDER_CANCEL_REASONS: 'order_cancel_reasons',
|
||||||
|
LOGISTICS_COMPANY: 'logistics_company',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default DictionaryConstants;
|
export default DictionaryConstants;
|
||||||
|
@ -11,7 +11,13 @@ function filterEmptyStr(params) {
|
|||||||
const res = {};
|
const res = {};
|
||||||
for (const key in object) {
|
for (const key in object) {
|
||||||
const val = object[key];
|
const val = object[key];
|
||||||
if (val !== undefined && val !== 'undefined' && val !== null && val !== 'null') {
|
if (
|
||||||
|
new String(val).length > 0 &&
|
||||||
|
val !== undefined &&
|
||||||
|
val !== 'undefined' &&
|
||||||
|
val !== null &&
|
||||||
|
val !== 'null'
|
||||||
|
) {
|
||||||
res[key] = val;
|
res[key] = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user