Commit 82c7b247 authored by 张子雨's avatar 张子雨

Feat/aging2.0

parent 69a1c77f
...@@ -79,6 +79,7 @@ export default { ...@@ -79,6 +79,7 @@ export default {
{ {
path: '/', path: '/',
component: '../layouts/SecurityLayout', component: '../layouts/SecurityLayout',
title: '商户管理后台',
routes: [ routes: [
{ {
path: '/', path: '/',
...@@ -86,73 +87,87 @@ export default { ...@@ -86,73 +87,87 @@ export default {
authority: ['Admin', 'user'], authority: ['Admin', 'user'],
routes: [ routes: [
{ {
title: '首页',
path: '/', path: '/',
component: './Admin', component: './Admin',
}, },
{ {
title: '商户管理后台',
path: '/orderManage/pendingDeliveryOrder', path: '/orderManage/pendingDeliveryOrder',
name: 'pendingDeliveryOrder', name: 'pendingDeliveryOrder',
component: './orderManage/pendingDeliveryOrder', component: './orderManage/pendingDeliveryOrder',
}, },
{ {
title: '商户管理后台',
path: '/orderManage/deliveryOrder', path: '/orderManage/deliveryOrder',
name: 'deliveryOrder', name: 'deliveryOrder',
component: './orderManage/deliveryOrder', component: './orderManage/deliveryOrder',
}, },
{ {
title: '商户管理后台',
path: '/orderManage/batchDelivery', path: '/orderManage/batchDelivery',
name: 'batchDeliveryOrder', name: 'batchDeliveryOrder',
component: './orderManage/batchDelivery', component: './orderManage/batchDelivery',
}, },
{ {
title: '商户管理后台',
path: '/afterSaleAddress', path: '/afterSaleAddress',
name: 'afterSaleAddress', name: 'afterSaleAddress',
component: './afterSaleAddress', component: './afterSaleAddress',
}, },
{ {
title: '商户管理后台',
path: '/reconciliation', path: '/reconciliation',
name: 'reconciliation', name: 'reconciliation',
component: './reconciliation', component: './reconciliation',
}, },
{ {
title: '商户管理后台',
path: '/reconciliation/detail', path: '/reconciliation/detail',
name: 'reconciliationDetail', name: 'reconciliationDetail',
component: './reconciliation/detail/index', component: './reconciliation/detail/index',
}, },
{ {
title: '商户管理后台',
path: '/settleManage', path: '/settleManage',
name: 'settleManage', name: 'settleManage',
component: './settleManage', component: './settleManage',
}, },
{ {
title: '商户管理后台',
path: '/afterSaleManage', path: '/afterSaleManage',
name: 'afterSaleManage', name: 'afterSaleManage',
icon: 'smile', icon: 'smile',
component: './AfterSaleManage/index', component: './AfterSaleManage/index',
}, },
{ {
title: '商户管理后台',
path: '/auditPending', path: '/auditPending',
name: 'auditPending', name: 'auditPending',
icon: 'smile', icon: 'smile',
component: './AfterSaleManage/Pending', component: './AfterSaleManage/Pending',
}, },
{ {
title: '商户管理后台',
path: '/passAudit', path: '/passAudit',
name: 'passAudit', name: 'passAudit',
icon: 'smile', icon: 'smile',
component: './AfterSaleManage/PassAudit', component: './AfterSaleManage/PassAudit',
}, },
{ {
title: '商户管理后台',
path: '/appeal', path: '/appeal',
name: 'appeal', name: 'appeal',
component: './afterSale/appeal', component: './afterSale/appeal',
}, },
{ {
title: '商户管理后台',
path: '/cancelBillManage', path: '/cancelBillManage',
name: 'cancelBillManage', name: 'cancelBillManage',
component: './cancelBillManage', component: './cancelBillManage',
}, },
{ {
title: '商户管理后台',
path: '/goodsManage', path: '/goodsManage',
name: 'goodsManage', name: 'goodsManage',
icon: 'smile', icon: 'smile',
...@@ -165,18 +180,21 @@ export default { ...@@ -165,18 +180,21 @@ export default {
component: './distributionArea', component: './distributionArea',
}, },
{ {
title: '商户管理后台',
path: '/reconciliationQuery', path: '/reconciliationQuery',
name: 'reconciliationQuery', name: 'reconciliationQuery',
icon: 'smile', icon: 'smile',
component: './ReconciliationQuery', component: './ReconciliationQuery',
}, },
{ {
title: '商户管理后台',
path: '/settlementSheet', path: '/settlementSheet',
name: 'settlementSheet', name: 'settlementSheet',
icon: 'smile', icon: 'smile',
component: './SettlementSheet', component: './SettlementSheet',
}, },
{ {
title: '商户管理后台',
path: '/paymentMange', path: '/paymentMange',
name: 'paymentMange', name: 'paymentMange',
icon: 'smile', icon: 'smile',
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "merchant-manage-ui",
"version": "1.0.0", "version": "1.0.0",
"dependencies": { "dependencies": {
"@ant-design/colors": "^3.1.0", "@ant-design/colors": "^3.1.0",
...@@ -78,7 +78,7 @@ const Admin = () => { ...@@ -78,7 +78,7 @@ const Admin = () => {
}} }}
> >
<strong>{pendingNum?.afterOrderPendingAuditNum || 0}</strong> <strong>{pendingNum?.afterOrderPendingAuditNum || 0}</strong>
<p>退款待审核</p> <p>退款待审核{'<'}24小时</p>
</Link> </Link>
</Col> </Col>
</Row> </Row>
......
...@@ -110,7 +110,7 @@ export default () => { ...@@ -110,7 +110,7 @@ export default () => {
{ {
title: '操作', title: '操作',
hideInSearch: true, hideInSearch: true,
width: 450, width: 300,
dataIndex: 'action', dataIndex: 'action',
fixed: 'right', fixed: 'right',
render: (_, r) => [ render: (_, r) => [
...@@ -122,7 +122,7 @@ export default () => { ...@@ -122,7 +122,7 @@ export default () => {
key="pop" key="pop"
disabled={!r.showRefund} disabled={!r.showRefund}
> >
<Button key="link1" className="mr10" type="primary" disabled={!r.showRefund}> <Button key="link1" className="mr10 mt10" type="primary" disabled={!r.showRefund}>
{r.showRefunded ? '已退款' : '允许退款'} {r.showRefunded ? '已退款' : '允许退款'}
</Button> </Button>
</Popconfirm>, </Popconfirm>,
...@@ -130,19 +130,19 @@ export default () => { ...@@ -130,19 +130,19 @@ export default () => {
key="link2" key="link2"
onClick={() => reject(r)} onClick={() => reject(r)}
type="primary" type="primary"
className="mr10" className="mr10 mt10"
disabled={!r.showRefuse} disabled={!r.showRefuse}
> >
驳回 驳回
</Button>, </Button>,
<Button key="link3" onClick={() => viewDetail(r)} type="primary" className="mr10"> <Button key="link3" onClick={() => viewDetail(r)} type="primary" className="mr10 mt10">
订单详情 订单详情
</Button>, </Button>,
<Button <Button
key="link4" key="link4"
onClick={() => handleCom(r)} onClick={() => handleCom(r)}
type="primary" type="primary"
className="mr10" className="mr10 mt10"
disabled={!r.showLogistics} disabled={!r.showLogistics}
> >
查看物流 查看物流
......
import React, { useState, useRef } from 'react'; import React, { useState, useRef } from 'react';
import { notification, Button } from 'antd'; import { notification, Button, Popconfirm } from 'antd';
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
import moment from 'moment';
import _ from 'lodash';
import { searchList, auditInfoApi, orderDetail } from '../services'; import { searchList, auditInfoApi, orderDetail } from '../services';
import { columnSticData, appealType } from '../data'; import { columnSticData, appealType } from '../data';
import AuditModal from '../components/auditModal'; import AuditModal from '../components/auditModal';
...@@ -19,7 +21,8 @@ export default () => { ...@@ -19,7 +21,8 @@ export default () => {
const [auditInfo, setAuditInfo] = useState({}); const [auditInfo, setAuditInfo] = useState({});
const [appealDetailModal, setAppealDetailModal] = useState(false); const [appealDetailModal, setAppealDetailModal] = useState(false);
const [selectedRow, setSelectedRow] = useState({}); const [selectedRow, setSelectedRow] = useState({});
const [timeString, setTimeString] = useState({});
const [time, setTime] = useState({});
const viewDetail = async ({ serviceNo }) => { const viewDetail = async ({ serviceNo }) => {
const data = await orderDetail({ serviceNo }); const data = await orderDetail({ serviceNo });
setDetailInfo(data || []); setDetailInfo(data || []);
...@@ -53,12 +56,58 @@ export default () => { ...@@ -53,12 +56,58 @@ export default () => {
setAppealDetailModal(true); setAppealDetailModal(true);
setSelectedRow(detailData); setSelectedRow(detailData);
}; };
const renderContent = (record, index, action) => {
if (!time[record.serviceNo]) {
const serviceTime = moment(record.serviceTime).valueOf() + 24 * 3600 * 1000;
const nowTime = moment(record.nowTime).valueOf();
let timeNumber = (serviceTime - nowTime) / 1000;
time[record.serviceNo] = setInterval(() => {
if (timeNumber > 0) {
timeNumber -= 1;
// eslint-disable-next-line radix
const hours = parseInt((timeNumber / 3600) % 24)
.toString()
.padStart(2, '0');
// eslint-disable-next-line radix
const minutes = parseInt((timeNumber / 60) % 60)
.toString()
.padStart(2, '0');
// eslint-disable-next-line radix
const seconds = parseInt(timeNumber % 60)
.toString()
.padStart(2, '0');
const str = `${hours}${minutes}${seconds}秒`;
timeString[record.serviceNo] = str;
const strings = _.cloneDeep(timeString);
setTimeString(strings);
} else {
clearInterval(time[record.serviceNo]);
timeString[record.serviceNo] = '0时0分0秒';
const strings = _.cloneDeep(timeString);
setTimeString(strings);
}
}, 1000);
}
};
const columns = [ const columns = [
{
title: '审核倒计时',
dataIndex: 'serviceTime',
key: 'serviceTime',
hideInSearch: true,
width: 150,
render: (val, record, index, action) => [
<span style={{ color: 'red' }}>
{renderContent(record, index, action)}
{timeString[record.serviceNo]}
</span>,
],
},
{ {
title: '售后状态', title: '售后状态',
dataIndex: 'serviceStatus', dataIndex: 'serviceStatus',
hideInSearch: true, hideInSearch: true,
width: 100, width: 120,
}, },
...columnSticData, ...columnSticData,
{ {
...@@ -66,7 +115,7 @@ export default () => { ...@@ -66,7 +115,7 @@ export default () => {
dataIndex: 'proofs', dataIndex: 'proofs',
hideInSearch: true, hideInSearch: true,
width: 100, width: 100,
render: (_, r) => <a onClick={() => viewProofs(r.proofs)}>查看凭证</a>, render: (val, r) => <a onClick={() => viewProofs(r.proofs)}>查看凭证</a>,
}, },
{ {
title: '售后申诉', title: '售后申诉',
...@@ -87,7 +136,7 @@ export default () => { ...@@ -87,7 +136,7 @@ export default () => {
dataIndex: 'action', dataIndex: 'action',
width: 250, width: 250,
fixed: 'right', fixed: 'right',
render: (_, r) => [ render: (val, r) => [
<Button key="link1" onClick={() => openAudit(r)} className="mr10" type="primary"> <Button key="link1" onClick={() => openAudit(r)} className="mr10" type="primary">
审核 审核
</Button>, </Button>,
......
...@@ -46,10 +46,7 @@ export async function orderDetail(params) { ...@@ -46,10 +46,7 @@ export async function orderDetail(params) {
// 售后审核 // 售后审核
export async function shopAudit(params) { export async function shopAudit(params) {
return request.post('/api/kdsp/op/afs/shop/audit', { return request.post('/api/kdsp/op/afs/shop/audit', {
data: stringify(params), data: params,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
prefix: kdspApi, prefix: kdspApi,
}); });
} }
......
import { Form, Button, Input, Select, notification, Upload, Cascader, InputNumber } from 'antd'; import {
Form,
Button,
Input,
Select,
notification,
Upload,
Cascader,
InputNumber,
Popover,
Divider,
} from 'antd';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { connect } from 'dva'; import { connect } from 'dva';
import styles from '../style.less'; import styles from '../style.less';
...@@ -44,8 +55,8 @@ class goodsManage extends Component { ...@@ -44,8 +55,8 @@ class goodsManage extends Component {
this.props.addSpu(); this.props.addSpu();
}; };
setArea = isAll => { setArea = (isAll, type) => {
this.props.setArea(isAll); this.props.setArea(isAll, type);
}; };
render() { render() {
...@@ -53,6 +64,25 @@ class goodsManage extends Component { ...@@ -53,6 +64,25 @@ class goodsManage extends Component {
const selectW = { width: 250 }; const selectW = { width: 250 };
const iptNumWidth = { width: 118 }; const iptNumWidth = { width: 118 };
const that = this; const that = this;
const content = (
<div>
<Button style={{ border: 'none' }} onClick={() => this.setArea(1, 'distribution')}>
全部商品配送区域设置
</Button>
<br />
<Button style={{ border: 'none' }} onClick={() => this.setArea(0, 'distribution')}>
勾选商品配送区域设置
</Button>
<br />
<Button style={{ border: 'none' }} onClick={() => this.setArea(1, 'after')}>
全部商品售后地址设置
</Button>
<br />
<Button style={{ border: 'none' }} onClick={() => this.setArea(0, 'after')}>
勾选商品售后地址设置
</Button>
</div>
);
// const uploadProps = { // const uploadProps = {
// name: 'file', // name: 'file',
// async customRequest(info) { // async customRequest(info) {
...@@ -138,12 +168,11 @@ class goodsManage extends Component { ...@@ -138,12 +168,11 @@ class goodsManage extends Component {
</Button> </Button>
</FormItem> </FormItem>
<FormItem style={{ float: 'right' }}> <FormItem style={{ float: 'right' }}>
<Button type="primary" className={styles.button} onClick={() => this.setArea(1)}> <Popover content={content} onVisibleChange={this.handleVisibleChange}>
全部配送不支持配置区域 <Button type="primary" className={styles.button}>
</Button> 批量操作
<Button type="primary" className={styles.button} onClick={() => this.setArea(0)}>
批量设置不支持配送区域
</Button> </Button>
</Popover>
<Button type="primary" className={styles.button} onClick={this.addSpu}> <Button type="primary" className={styles.button} onClick={this.addSpu}>
新增商品 新增商品
</Button> </Button>
......
...@@ -3,7 +3,7 @@ import '@ant-design/compatible/assets/index.css'; ...@@ -3,7 +3,7 @@ import '@ant-design/compatible/assets/index.css';
import { Modal, Input, Select, Cascader, Tag, notification } from 'antd'; import { Modal, Input, Select, Cascader, Tag, notification } from 'antd';
import { da } from 'date-fns/locale'; import { da } from 'date-fns/locale';
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { getTemplate } from '../service'; import { getTemplate, getAfterAddress } from '../service';
const { Option } = Select; const { Option } = Select;
...@@ -14,19 +14,29 @@ const TempleatModal = props => { ...@@ -14,19 +14,29 @@ const TempleatModal = props => {
selectedRowKeys, selectedRowKeys,
templateList, templateList,
isALL, isALL,
isType,
total,
} = props; } = props;
const formItemLayout = { const formItemLayout = {
labelCol: { labelCol: {
span: 5, span: 6,
}, },
wrapperCol: { wrapperCol: {
span: 16, span: 16,
}, },
}; };
const handleOk = async () => { const setAfterAddress = async fieldsValue => {
console.log(props); const data = await getAfterAddress({
validateFields(async (error, fieldsValue) => { skuIds: selectedRowKeys || [],
if (!error) { afterAddressId: fieldsValue.templateId.key,
});
if (data.businessCode === '0000') {
notification.success({ message: '配置成功!' });
resetFields();
props.onCancel();
}
};
const setTemplate = async fieldsValue => {
const data = await getTemplate({ const data = await getTemplate({
isAll: isALL, isAll: isALL,
skuIdList: selectedRowKeys, skuIdList: selectedRowKeys,
...@@ -37,31 +47,73 @@ const TempleatModal = props => { ...@@ -37,31 +47,73 @@ const TempleatModal = props => {
resetFields(); resetFields();
props.onCancel(); props.onCancel();
} }
};
const handleOk = async () => {
validateFields(async (error, fieldsValue) => {
if (!error) {
if (isType === 'after') {
setAfterAddress(fieldsValue);
}
if (isType === 'distribution') {
setTemplate(fieldsValue);
}
} }
}); });
}; };
useEffect(() => {}, []); const title = () => {
if (isType === 'distribution') {
if (isALL) {
return '全部商品配送区域设置';
}
return '勾选商品配送区域设置';
}
if (isType === 'after') {
if (isALL) {
return '全部商品售后地址设置';
}
return '勾选商品售后地址设置';
}
return '';
};
return ( return (
<Modal <Modal
title={isALL ? '全部设置不支持配送区域' : '批量设置不支持配送区域'} title={title()}
visible={visible} visible={visible}
width="500px" width="500px"
onCancel={props.onCancel} onCancel={props.onCancel}
onOk={() => handleOk()} onOk={() => handleOk()}
> >
{!isALL && <p>已选择{selectedRowKeys.length}个商品</p>} {!isALL && <p>已选择{selectedRowKeys.length}个商品</p>}
{isALL > 0 && isType === 'after' && <p>已选择{total}个商品</p>}
<Form {...formItemLayout}> <Form {...formItemLayout}>
<Form.Item label="选择模板"> <Form.Item label={isType === 'after' ? '选择售后地址' : '选择模板'}>
{getFieldDecorator('templateId', { {getFieldDecorator('templateId', {
rules: [{ required: true, message: '请选择模板!' }], rules: [
{
required: true,
message: `${isType === 'after' ? '请选择售后地址' : '请选择模板'}`,
},
],
})( })(
<Select placeholder="请选择模板" labelInValue allowClear> <Select
{templateList.map(item => ( placeholder={isType === 'after' ? '选择售后地址' : '选择模板'}
labelInValue
allowClear
>
{isType === 'distribution' &&
templateList.map(item => (
<Option label={item.templateName} value={item.id} key={item.id}> <Option label={item.templateName} value={item.id} key={item.id}>
{item.templateName} {item.templateName}
</Option> </Option>
))} ))}
{isType === 'after' &&
templateList.map(item => (
<Option label={item.addressName} value={item.id} key={item.id}>
{item.addressName}
</Option>
))}
</Select>, </Select>,
)} )}
</Form.Item> </Form.Item>
......
...@@ -30,7 +30,14 @@ import { ...@@ -30,7 +30,14 @@ import {
validateSpuInfo, validateSpuInfo,
createEditData, createEditData,
} from './mixin'; } from './mixin';
import { getSpecList, getJdPicList, getBrandList, addGoods, editGoods } from '../service'; import {
getSpecList,
getJdPicList,
getBrandList,
addGoods,
editGoods,
queryAllAfterAddress,
} from '../service';
import styles from '../style.less'; import styles from '../style.less';
import Upload from '../../components/sortablUpload'; import Upload from '../../components/sortablUpload';
import BatchSetting from './batchSetting'; import BatchSetting from './batchSetting';
...@@ -60,17 +67,27 @@ class goodsManage extends Component { ...@@ -60,17 +67,27 @@ class goodsManage extends Component {
skuNameVisible: false, skuNameVisible: false,
productType: 1, productType: 1,
confirmLoading: false, confirmLoading: false,
afterAddressList: {},
}; };
componentDidMount() { componentDidMount() {
this.getSpecData(); this.getSpecData();
this.getBrandData(); this.getBrandData();
this.getAfterAddressData();
} }
componentWillReceiveProps() { componentWillReceiveProps() {
this.setState({ isCancel: false }); this.setState({ isCancel: false });
} }
// 获取售后地址
getAfterAddressData = async () => {
const data = await queryAllAfterAddress();
if (data) {
this.setState({ afterAddressList: data.data.records });
}
};
// 获取规格列表 // 获取规格列表
getSpecData = async () => { getSpecData = async () => {
try { try {
...@@ -119,7 +136,6 @@ class goodsManage extends Component { ...@@ -119,7 +136,6 @@ class goodsManage extends Component {
i.imageList = colorImg[i.firstSpecValue]; i.imageList = colorImg[i.firstSpecValue];
return i; return i;
}); });
console.log(editData);
this.setState( this.setState(
() => ({ colorImg, editData }), () => ({ colorImg, editData }),
() => { () => {
...@@ -342,8 +358,12 @@ class goodsManage extends Component { ...@@ -342,8 +358,12 @@ class goodsManage extends Component {
specListData, specListData,
} = this.props; } = this.props;
const { editData, productType } = this.state; const { editData, productType } = this.state;
validateFields(async (errors, values) => { validateFields(async (errors, values) => {
if (!values.afterAddressId) {
notification.error({
message: '请选择售后地址',
});
}
let imgErr = false; let imgErr = false;
if (!errors) { if (!errors) {
if (validateSpuInfo(values, initData, editData, productType)) return; if (validateSpuInfo(values, initData, editData, productType)) return;
...@@ -385,6 +405,7 @@ class goodsManage extends Component { ...@@ -385,6 +405,7 @@ class goodsManage extends Component {
type: values.productType, type: values.productType,
specs, specs,
character: values.character, character: values.character,
afterAddressId: values.afterAddressId,
}, },
})); }));
const data = initData.id const data = initData.id
...@@ -494,7 +515,14 @@ class goodsManage extends Component { ...@@ -494,7 +515,14 @@ class goodsManage extends Component {
labelCol: { span: 2 }, labelCol: { span: 2 },
wrapperCol: { span: 22 }, wrapperCol: { span: 22 },
}; };
const { colorImg, productType, normalBrandList, brandList, confirmLoading } = this.state; const {
colorImg,
productType,
normalBrandList,
brandList,
confirmLoading,
afterAddressList,
} = this.state;
const skuSpeFirstKeys = initData.firstSpecList || []; const skuSpeFirstKeys = initData.firstSpecList || [];
const skuSpeSecondKeys = initData.secondSpecList || []; const skuSpeSecondKeys = initData.secondSpecList || [];
const treeDataArray = productType === 2 ? virtualTreeData : treeData; const treeDataArray = productType === 2 ? virtualTreeData : treeData;
...@@ -658,6 +686,28 @@ class goodsManage extends Component { ...@@ -658,6 +686,28 @@ class goodsManage extends Component {
)} )}
</FormItem> </FormItem>
</Col> </Col>
<Col span={10}>
<FormItem label="售后地址" {...formItemLayout}>
{getFieldDecorator('afterAddressId', {
initialValue: this.state.initForm.afterAddressId,
rules: [
{
required: true,
message: '请选择售后地址',
},
],
})(
<Select allowClear style={{ width: 280 }} placeholder="请选择售后地址">
{afterAddressList?.length &&
afterAddressList.map(item => (
<Option key={item.id} value={item.id}>
{item.addressName}
</Option>
))}
</Select>,
)}
</FormItem>
</Col>
{specListData.length {specListData.length
? specListData.map((item, index) => ( ? specListData.map((item, index) => (
<Col span={24}> <Col span={24}>
......
...@@ -11,7 +11,14 @@ import LocalStroage from '@/utils/localStorage'; ...@@ -11,7 +11,14 @@ import LocalStroage from '@/utils/localStorage';
import configApi from '../../../config/env.config'; import configApi from '../../../config/env.config';
import UpdateStock from './UpdateStock'; import UpdateStock from './UpdateStock';
import { spuDetail, categoryList, getVirtualCategory, getTemplateList, specList } from './service'; import {
spuDetail,
categoryList,
getVirtualCategory,
getTemplateList,
specList,
queryAllAfterAddress,
} from './service';
import LogModal from './LogModal'; import LogModal from './LogModal';
import CreateModal from './createModal'; import CreateModal from './createModal';
import { column, JDSHOPID } from './staticdata'; import { column, JDSHOPID } from './staticdata';
...@@ -40,6 +47,7 @@ class goodsManage extends Component { ...@@ -40,6 +47,7 @@ class goodsManage extends Component {
selectedRowKeys: [], selectedRowKeys: [],
isAll: 0, isAll: 0,
templateList: [], templateList: [],
isType: '',
}; };
currentLog = null; currentLog = null;
...@@ -187,20 +195,23 @@ class goodsManage extends Component { ...@@ -187,20 +195,23 @@ class goodsManage extends Component {
}); });
}; };
setArea = async isAll => { setArea = async (isAll, type) => {
// distribution配送区域 after售后地址
if (!this.state.selectedRowKeys.length && !isAll) { if (!this.state.selectedRowKeys.length && !isAll) {
notification.error({ message: '请选择商品' }); notification.error({ message: '请选择商品' });
return; return;
} }
const data = await getTemplateList(); const data = type === 'distribution' ? await getTemplateList() : await queryAllAfterAddress();
if (data.code === '0000' && data.data.length) { const length = type === 'distribution' ? data.data.length : data.data.records.length;
if (data.code === '0000' && length) {
this.setState({ this.setState({
templeatModalVisible: true, templeatModalVisible: true,
isAll, isAll,
templateList: data.data, templateList: type === 'distribution' ? data.data : data.data.records,
isType: type,
}); });
} else { } else {
notification.error({ message: '暂无模板数据,请先添加模板' }); notification.error({ message: '暂无数据' });
} }
}; };
...@@ -283,7 +294,6 @@ class goodsManage extends Component { ...@@ -283,7 +294,6 @@ class goodsManage extends Component {
const { const {
goodsManage: { tableData = {} }, goodsManage: { tableData = {} },
} = this.props; } = this.props;
const rowSelection = { const rowSelection = {
selectedRowKeys: this.state.selectedRowKeys, selectedRowKeys: this.state.selectedRowKeys,
onChange: this.onSelectChange, onChange: this.onSelectChange,
...@@ -303,7 +313,7 @@ class goodsManage extends Component { ...@@ -303,7 +313,7 @@ class goodsManage extends Component {
treeData={this.state.treeData} treeData={this.state.treeData}
shopList={this.shopList} shopList={this.shopList}
addSpu={() => this.setState({ createVisible: true, initData: {} })} addSpu={() => this.setState({ createVisible: true, initData: {} })}
setArea={isALL => this.setArea(isALL)} setArea={(isALL, type) => this.setArea(isALL, type)}
/> />
</Card> </Card>
<Spin spinning={this.state.loading}> <Spin spinning={this.state.loading}>
...@@ -379,11 +389,13 @@ class goodsManage extends Component { ...@@ -379,11 +389,13 @@ class goodsManage extends Component {
<TempleatModal <TempleatModal
visible={this.state.templeatModalVisible} visible={this.state.templeatModalVisible}
selectedRowKeys={this.state.selectedRowKeys} selectedRowKeys={this.state.selectedRowKeys}
total={tableData.total || 0}
onCancel={() => { onCancel={() => {
this.setState({ templeatModalVisible: false, selectedRowKeys: [] }); this.setState({ templeatModalVisible: false, selectedRowKeys: [] });
this.handleSearch(); this.handleSearch();
}} }}
isALL={this.state.isAll} isALL={this.state.isAll}
isType={this.state.isType}
templateList={this.state.templateList} templateList={this.state.templateList}
/> />
</Spin> </Spin>
......
...@@ -4,7 +4,7 @@ import config from '../../../config/env.config'; ...@@ -4,7 +4,7 @@ import config from '../../../config/env.config';
import { stringify } from 'qs'; import { stringify } from 'qs';
import _ from 'lodash'; import _ from 'lodash';
const { goodsApi } = config; const { goodsApi, kdspApi } = config;
const headers = { const headers = {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}; };
...@@ -173,3 +173,27 @@ export async function getTemplateList(params) { ...@@ -173,3 +173,27 @@ export async function getTemplateList(params) {
}); });
return data; return data;
} }
// 查询供应商售后地址
export async function queryAllAfterAddress() {
const params = {
pageSize: 100,
pageNo: 1,
};
const data = request.post('/api/kdsp/supplier/after-sales-addrs-page', {
prefix: kdspApi,
data: stringify(_.omitBy(params, v => !v)),
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
return data;
}
// 商品售后地址设置
export async function getAfterAddress(params) {
const data = await request.post('/api/kdsp/updateSkuAfterAddress', {
data: params,
prefix: goodsApi,
});
return data;
}
import { Upload, Icon, Modal, message, Button } from 'antd'; import { Upload, Icon, Modal, message, Button, notification } from 'antd';
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import config from '../../../../config/env.config'; import config from '../../../../config/env.config';
import styles from '../style.less'; import styles from '../style.less';
...@@ -57,12 +57,19 @@ class PicturesWall extends React.Component { ...@@ -57,12 +57,19 @@ class PicturesWall extends React.Component {
} }
const vm = this; const vm = this;
const name = file.name + file.uid; const name = file.name + file.uid;
const observable = qiniu.upload(file, file.name, token); // eslint-disable-next-line new-cap
const data = file.name + new Date().getTime();
const observable = qiniu.upload(file, data, token);
const observer = { const observer = {
next() { next() {
// ... // ...
}, },
error() { error(t) {
if (t.code === 614) {
notification.error({
message: '文件名重复,请更换文件名。',
});
}
onError(file); onError(file);
// ... // ...
}, },
......
...@@ -169,6 +169,17 @@ const AddressForm = props => { ...@@ -169,6 +169,17 @@ const AddressForm = props => {
onOk={handleSubmit} onOk={handleSubmit}
> >
<Form {...layout} name="formData"> <Form {...layout} name="formData">
<FormItem label="售后地址名称">
{getFieldDecorator('addressName', {
initialValue: formData.addressName,
rules: [
{
required: true,
message: '请输入售后地址名称!',
},
],
})(<Input placeholder="请输入售后地址名称" maxLength={20} />)}
</FormItem>
<FormItem label="供应商名称"> <FormItem label="供应商名称">
{getFieldDecorator('shopId', { {getFieldDecorator('shopId', {
initialValue: formData.shopId, initialValue: formData.shopId,
......
...@@ -33,10 +33,12 @@ const TableList = () => { ...@@ -33,10 +33,12 @@ const TableList = () => {
actionRef.current.reload(); actionRef.current.reload();
}; };
const delAction = async ({ id }) => { const delAction = async ({ id }) => {
const businessCode = await del(id); const data = await del(id);
if (businessCode === '0000') { if (data.businessCode === '0000') {
reload(); reload();
notification.success({ message: '删除成功!' }); notification.success({ message: '删除成功!' });
} else {
notification.error({ message: data.msg || '删除失败' });
} }
}; };
const editAction = async row => { const editAction = async row => {
...@@ -54,6 +56,12 @@ const TableList = () => { ...@@ -54,6 +56,12 @@ const TableList = () => {
} }
}; };
const columns = [ const columns = [
{
title: '售后地址名称',
dataIndex: 'addressName',
key: 'addressName',
hideInSearch: true,
},
{ {
title: '供应商名称', title: '供应商名称',
dataIndex: 'shopId', dataIndex: 'shopId',
......
...@@ -42,14 +42,14 @@ export async function supplier() { ...@@ -42,14 +42,14 @@ export async function supplier() {
} }
export async function del(id) { export async function del(id) {
const { businessCode } = await request.post('/api/kdsp/supplier/after-sales-addrs-delete', { const data = await request.post('/api/kdsp/supplier/after-sales-addrs-delete', {
prefix: config.kdspApi, prefix: config.kdspApi,
data: stringify({ id }), data: stringify({ id }),
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}, },
}); });
return businessCode; return data;
} }
export async function update(params) { export async function update(params) {
......
...@@ -5,12 +5,12 @@ import { Button, notification } from 'antd'; ...@@ -5,12 +5,12 @@ import { Button, notification } from 'antd';
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
import _ from 'lodash'; import _ from 'lodash';
// import { searchList, auditInfoApi, orderDetail } from './service'; // import { searchList, auditInfoApi, orderDetail } from './service';
import moment from 'moment';
import { searchList, orderDetail } from './service'; import { searchList, orderDetail } from './service';
import { column } from './data'; import { column } from './data';
import AuditModal from './components/auditModal'; import AuditModal from './components/auditModal';
import DetailTable from './components/detailTable'; import DetailTable from './components/detailTable';
import { dateDiff } from './common'; import { dateDiff } from './common';
import moment from 'moment';
export default () => { export default () => {
const table = useRef(); const table = useRef();
...@@ -104,6 +104,8 @@ export default () => { ...@@ -104,6 +104,8 @@ export default () => {
timeString[record.orderId] = '0时0分0秒'; timeString[record.orderId] = '0时0分0秒';
const strings = _.cloneDeep(timeString); const strings = _.cloneDeep(timeString);
setTimeString(strings); setTimeString(strings);
// eslint-disable-next-line no-unused-expressions
table.current?.reload?.();
} }
}, 1000); }, 1000);
} }
......
...@@ -48,7 +48,6 @@ const ImageInfo = file => ...@@ -48,7 +48,6 @@ const ImageInfo = file =>
file.width = width; file.width = width;
file.height = height; file.height = height;
file.LtMB = LtMB; file.LtMB = LtMB;
console.log(file);
resolve(file); resolve(file);
}); });
image.addEventListener('error', () => { image.addEventListener('error', () => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment