2019-03-16 22:15:36 +08:00
|
|
|
|
/* eslint-disable */
|
|
|
|
|
|
2019-03-17 22:50:04 +08:00
|
|
|
|
import React, {PureComponent, Fragment, Component} from 'react';
|
2019-05-02 02:21:52 +08:00
|
|
|
|
// import crypto from 'crypto';
|
|
|
|
|
// import fs from 'fs';
|
2019-03-16 22:15:36 +08:00
|
|
|
|
import { connect } from 'dva';
|
|
|
|
|
import moment from 'moment';
|
2019-05-02 12:47:25 +08:00
|
|
|
|
import {Card, Form, Input, Radio, Button, Modal, Select, Upload, Icon, Spin} from 'antd';
|
2019-03-16 22:15:36 +08:00
|
|
|
|
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
|
|
|
|
|
|
2019-05-02 02:21:52 +08:00
|
|
|
|
// import * as qiniu from 'qiniu-js'
|
|
|
|
|
// import uuid from 'js-uuid';
|
2019-05-02 01:01:35 +08:00
|
|
|
|
|
2019-03-16 22:15:36 +08:00
|
|
|
|
import styles from './ProductSpuAddOrUpdate.less';
|
2019-03-18 19:05:43 +08:00
|
|
|
|
import ProductAttrSelectFormItem from "../../components/Product/ProductAttrSelectFormItem";
|
|
|
|
|
import ProductSkuAddOrUpdateTable from "../../components/Product/ProductSkuAddOrUpdateTable";
|
2019-05-02 12:47:25 +08:00
|
|
|
|
// import {fileGetQiniuToken} from "../../services/admin";
|
2019-05-02 02:21:52 +08:00
|
|
|
|
import PicturesWall from "../../components/Image/PicturesWall";
|
2019-03-16 22:15:36 +08:00
|
|
|
|
|
|
|
|
|
const FormItem = Form.Item;
|
|
|
|
|
const RadioGroup = Radio.Group;
|
2019-03-17 11:55:55 +08:00
|
|
|
|
const Option = Select.Option;
|
2019-03-16 22:15:36 +08:00
|
|
|
|
|
|
|
|
|
// roleList
|
2019-05-02 12:47:25 +08:00
|
|
|
|
@connect(({ productAttrList, productSpuAddOrUpdate, }) => ({
|
2019-03-17 11:55:55 +08:00
|
|
|
|
// list: productSpuList.list.spus,
|
|
|
|
|
// loading: loading.models.productSpuList,
|
2019-03-17 22:50:04 +08:00
|
|
|
|
productAttrList,
|
|
|
|
|
productSpuAddOrUpdate,
|
2019-03-17 11:55:55 +08:00
|
|
|
|
allAttrTree: productAttrList.tree,
|
2019-05-02 12:47:25 +08:00
|
|
|
|
loading: productSpuAddOrUpdate.loading,
|
|
|
|
|
spu: productSpuAddOrUpdate.spu,
|
2019-03-18 19:05:43 +08:00
|
|
|
|
attrTree: productSpuAddOrUpdate.attrTree,
|
|
|
|
|
skus: productSpuAddOrUpdate.skus,
|
2019-03-16 22:15:36 +08:00
|
|
|
|
}))
|
|
|
|
|
|
|
|
|
|
@Form.create()
|
2019-03-17 22:50:04 +08:00
|
|
|
|
class ProductSpuAddOrUpdate extends Component {
|
2019-03-16 22:15:36 +08:00
|
|
|
|
state = {
|
2019-05-02 12:47:25 +08:00
|
|
|
|
// modalVisible: false,
|
2019-03-16 22:15:36 +08:00
|
|
|
|
modalType: 'add', //add update
|
2019-05-02 12:47:25 +08:00
|
|
|
|
// initValues: {},
|
2019-03-16 22:15:36 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
|
const { dispatch } = this.props;
|
2019-05-02 20:18:40 +08:00
|
|
|
|
const that = this;
|
2019-05-02 12:47:25 +08:00
|
|
|
|
// 判断是否是更新
|
|
|
|
|
const params = new URLSearchParams(this.props.location.search);
|
|
|
|
|
if (params.get("id")) {
|
|
|
|
|
let id = params.get("id");
|
|
|
|
|
this.setState({
|
|
|
|
|
modalType: 'update',
|
2019-05-02 20:18:40 +08:00
|
|
|
|
id: id,
|
2019-05-02 12:47:25 +08:00
|
|
|
|
})
|
|
|
|
|
dispatch({
|
|
|
|
|
type: 'productSpuAddOrUpdate/info',
|
|
|
|
|
payload: parseInt(id),
|
2019-05-02 20:18:40 +08:00
|
|
|
|
callback: function (data) {
|
|
|
|
|
that.refs.picturesWall.setUrls(data.picUrls); // TODO 后续找找,有没更合适的做法
|
|
|
|
|
}
|
2019-05-02 12:47:25 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
// 获得规格列表
|
2019-03-16 22:15:36 +08:00
|
|
|
|
dispatch({
|
2019-03-17 11:55:55 +08:00
|
|
|
|
type: 'productAttrList/tree',
|
2019-03-16 22:15:36 +08:00
|
|
|
|
payload: {
|
|
|
|
|
name: '',
|
|
|
|
|
pageNo: 0,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
},
|
|
|
|
|
});
|
2019-05-02 12:47:25 +08:00
|
|
|
|
// 重置表单
|
|
|
|
|
dispatch({
|
|
|
|
|
type: 'productSpuAddOrUpdate/clear',
|
|
|
|
|
})
|
2019-03-16 22:15:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-03-17 11:55:55 +08:00
|
|
|
|
handleAddAttr = e => {
|
|
|
|
|
// alert('你猜');
|
|
|
|
|
const { dispatch } = this.props;
|
|
|
|
|
dispatch({
|
|
|
|
|
type: 'productSpuAddOrUpdate/addAttr',
|
|
|
|
|
payload: {
|
|
|
|
|
},
|
|
|
|
|
});
|
2019-05-02 12:47:25 +08:00
|
|
|
|
};
|
2019-03-17 11:55:55 +08:00
|
|
|
|
|
2019-03-18 19:05:43 +08:00
|
|
|
|
handleSubmit = e => {
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
const { skus, dispatch } = this.props;
|
2019-05-02 20:18:40 +08:00
|
|
|
|
const { modalType, id } = this.state;
|
2019-05-02 02:21:52 +08:00
|
|
|
|
// 获得图片
|
2019-05-02 20:18:40 +08:00
|
|
|
|
let picUrls = this.refs.picturesWall.getUrls(); // TODO 芋艿,后续找找其他做法
|
2019-05-02 02:21:52 +08:00
|
|
|
|
if (picUrls.length === 0) {
|
|
|
|
|
alert('请必须上传一张图片!');
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-03-18 19:05:43 +08:00
|
|
|
|
// 生成 skuStr 格式
|
|
|
|
|
let skuStr = []; // 因为提交是字符串格式
|
|
|
|
|
for (let i in skus) {
|
|
|
|
|
let sku = skus[i];
|
|
|
|
|
if (!sku.price || !sku.quantity) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
let newAttr = {
|
|
|
|
|
attrs: [],
|
2019-04-16 23:26:56 +08:00
|
|
|
|
price: sku.price * 100,
|
2019-03-18 19:05:43 +08:00
|
|
|
|
quantity: sku.quantity,
|
|
|
|
|
}
|
|
|
|
|
for (let j in sku.attrs) {
|
|
|
|
|
newAttr.attrs.push(sku.attrs[j].id);
|
|
|
|
|
}
|
|
|
|
|
skuStr.push(newAttr);
|
|
|
|
|
}
|
|
|
|
|
if (skuStr.length === 0) {
|
|
|
|
|
alert('请设置商品规格!');
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-05-02 02:21:52 +08:00
|
|
|
|
// debugger;
|
2019-03-18 19:05:43 +08:00
|
|
|
|
this.props.form.validateFields((err, values) => {
|
2019-05-02 23:48:20 +08:00
|
|
|
|
// debugger;
|
2019-03-18 19:05:43 +08:00
|
|
|
|
if (!err) {
|
2019-05-02 20:18:40 +08:00
|
|
|
|
if (modalType === 'add') {
|
|
|
|
|
dispatch({
|
|
|
|
|
type: 'productSpuAddOrUpdate/add',
|
|
|
|
|
payload: {
|
|
|
|
|
body: {
|
|
|
|
|
...values,
|
|
|
|
|
picUrls: picUrls.join(','),
|
|
|
|
|
skuStr: JSON.stringify(skuStr)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
} else if (modalType === 'update') {
|
|
|
|
|
dispatch({
|
|
|
|
|
type: 'productSpuAddOrUpdate/update',
|
|
|
|
|
payload: {
|
|
|
|
|
body: {
|
|
|
|
|
...values,
|
|
|
|
|
id,
|
|
|
|
|
picUrls: picUrls.join(','),
|
|
|
|
|
skuStr: JSON.stringify(skuStr)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
2019-03-18 19:05:43 +08:00
|
|
|
|
}
|
2019-03-17 22:50:04 +08:00
|
|
|
|
});
|
2019-03-18 19:05:43 +08:00
|
|
|
|
// console.log(fields);
|
2019-05-02 12:47:25 +08:00
|
|
|
|
};
|
2019-03-18 19:05:43 +08:00
|
|
|
|
|
2019-03-16 22:15:36 +08:00
|
|
|
|
render() {
|
|
|
|
|
// debugger;
|
2019-05-02 12:47:25 +08:00
|
|
|
|
const { form, skus, attrTree, allAttrTree, loading, spu, dispatch } = this.props;
|
2019-03-18 19:05:43 +08:00
|
|
|
|
// const that = this;
|
2019-03-16 22:15:36 +08:00
|
|
|
|
|
2019-03-17 11:55:55 +08:00
|
|
|
|
// 添加规格
|
|
|
|
|
// debugger;
|
|
|
|
|
let attrTreeHTML = [];
|
|
|
|
|
if (attrTree && attrTree.length > 0) {
|
2019-03-18 19:05:43 +08:00
|
|
|
|
// 已选择的的规格集合
|
|
|
|
|
let selectedAttrIds = new Set();
|
2019-03-17 11:55:55 +08:00
|
|
|
|
for (let i in attrTree) {
|
|
|
|
|
let attr = attrTree[i];
|
2019-03-18 19:05:43 +08:00
|
|
|
|
selectedAttrIds.add(attr.id);
|
|
|
|
|
}
|
|
|
|
|
// 创建每个规格下拉框的 HTML
|
|
|
|
|
for (let i in attrTree) {
|
|
|
|
|
let attr = attrTree[i];
|
|
|
|
|
let itemProps = {
|
|
|
|
|
attr: attr,
|
|
|
|
|
allAttrTree: allAttrTree,
|
|
|
|
|
dispatch: dispatch,
|
|
|
|
|
selectedAttrIds: selectedAttrIds,
|
|
|
|
|
index: i // 位置。不然无法正确修改 Model 指定位置的数据
|
|
|
|
|
};
|
|
|
|
|
attrTreeHTML.push(<ProductAttrSelectFormItem {...itemProps} />);
|
2019-03-17 11:55:55 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-02 12:47:25 +08:00
|
|
|
|
|
2019-03-18 19:05:43 +08:00
|
|
|
|
// 规格明细
|
|
|
|
|
let productSkuProps = {
|
|
|
|
|
attrTree: attrTree,
|
|
|
|
|
skus: skus,
|
|
|
|
|
dispatch: dispatch,
|
|
|
|
|
};
|
|
|
|
|
// console.log(productSkuProps);
|
2019-03-17 11:55:55 +08:00
|
|
|
|
|
2019-03-16 22:15:36 +08:00
|
|
|
|
return (
|
|
|
|
|
<PageHeaderWrapper title="">
|
2019-05-02 12:47:25 +08:00
|
|
|
|
<Spin spinning={loading}>
|
|
|
|
|
<Card bordered={false}>
|
|
|
|
|
<Form onSubmit={this.handleSubmit} hideRequiredMark style={{ marginTop: 8 }}>
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="商品名">
|
|
|
|
|
{form.getFieldDecorator('name', {
|
|
|
|
|
rules: [{ required: true, message: '请输入商品名!', min: 2 }],
|
|
|
|
|
initialValue: spu.name,
|
|
|
|
|
})(<Input placeholder="请输入" />)}
|
|
|
|
|
</FormItem>
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="商品卖点">
|
|
|
|
|
{form.getFieldDecorator('sellPoint', {
|
|
|
|
|
rules: [{ required: true, message: '请输入商品卖点!' }],
|
|
|
|
|
initialValue: spu.sellPoint,
|
|
|
|
|
})(<Input placeholder="请输入" />)}
|
|
|
|
|
</FormItem>
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="分类编号">
|
|
|
|
|
{form.getFieldDecorator('cid', {
|
|
|
|
|
rules: [{ required: true, message: '请输入分类编号!' }],
|
|
|
|
|
initialValue: spu.cid, // TODO 芋艿,和面做成下拉框
|
|
|
|
|
})(<Input placeholder="请输入" />)}
|
|
|
|
|
</FormItem>
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="商品主图"
|
|
|
|
|
extra="建议尺寸:800*800PX,单张大小不超过 2M,最多可上传 10 张">
|
|
|
|
|
{/*{form.getFieldDecorator('picUrls', {*/}
|
|
|
|
|
{/* initialValue: '', // TODO 修改 // TODO 芋艿,做成上传组件*/}
|
|
|
|
|
{/*})(<Input placeholder="请输入" />)}*/}
|
|
|
|
|
<PicturesWall ref="picturesWall" maxLength={10} />
|
|
|
|
|
</FormItem>
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="是否上架">
|
|
|
|
|
{form.getFieldDecorator('visible', {
|
|
|
|
|
initialValue: spu.visible,
|
|
|
|
|
})(
|
|
|
|
|
<RadioGroup>
|
|
|
|
|
<Radio value={true}>是</Radio>
|
|
|
|
|
<Radio value={false}>否</Radio>
|
|
|
|
|
</RadioGroup>
|
|
|
|
|
)}
|
|
|
|
|
</FormItem>
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="商品规格">
|
2019-05-02 23:48:20 +08:00
|
|
|
|
<div>
|
|
|
|
|
{attrTreeHTML}
|
|
|
|
|
<Button onClick={this.handleAddAttr}>添加规格项目</Button>
|
|
|
|
|
</div>
|
2019-05-02 12:47:25 +08:00
|
|
|
|
</FormItem>
|
|
|
|
|
{
|
|
|
|
|
attrTree.length > 0 ? <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="规格明细">
|
|
|
|
|
{/*<Table defaultExpandAllRows={true} columns={columns} rowKey="id" />*/}
|
|
|
|
|
<ProductSkuAddOrUpdateTable {...productSkuProps} />
|
|
|
|
|
</FormItem> : ''
|
|
|
|
|
}
|
|
|
|
|
<FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="商品描述">
|
|
|
|
|
{form.getFieldDecorator('description', {
|
|
|
|
|
rules: [{ required: true, message: '请输入商品描述!' }],
|
|
|
|
|
initialValue: spu.description, // TODO 修改
|
|
|
|
|
})(<Input.TextArea placeholder="请输入" />)}
|
|
|
|
|
<Button type="primary" htmlType="submit" style={{ marginLeft: 8 }} onSubmit={this.handleSubmit}>保存</Button>
|
|
|
|
|
</FormItem>
|
|
|
|
|
</Form>
|
|
|
|
|
</Card>
|
|
|
|
|
</Spin>
|
2019-03-16 22:15:36 +08:00
|
|
|
|
</PageHeaderWrapper>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default ProductSpuAddOrUpdate;
|