/* eslint-disable */ import React, { PureComponent, Fragment } from 'react'; import { connect } from 'dva'; import { Card, Form, Input, Button, Modal, message, Table, Divider, Tree, Spin, Row, Col, Select, Icon, InputNumber, DatePicker, TreeSelect } from 'antd'; import { checkTypeWithEnglishAndNumbers } from '../../../helpers/validator' import PageHeaderWrapper from '@/components/PageHeaderWrapper'; import styles from './CouponCardTemplateList.less'; import moment from "moment"; import PaginationHelper from "../../../helpers/PaginationHelper"; const FormItem = Form.Item; const SelectOption = Select.Option; const { TreeNode } = Tree; const RangePicker = DatePicker.RangePicker; const status = ['未知', '正常', '禁用']; const rangeType = { 10: '所有可用', 20: '部分商品可用', 21: '部分商品不可用', 30: '部分分类可用', 31: '部分分类不可用'}; const preferentialType = ['未知', '代金卷', '折扣卷']; const dateType = ['未知', '固定日期', '领取日期']; // 列表 function List ({ dataSource, loading, pagination, searchParams, dispatch, handleModalVisible}) { function handleStatus(record) { Modal.confirm({ title: record.status === 1 ? '确认禁用' : '取消禁用', content: `${record.title}`, onOk() { dispatch({ type: 'couponCardTemplateList/updateStatus', payload: { id: record.id, status: record.status === 1 ? 2 : 1, }, }); }, onCancel() {}, }); } // function handleDelete(record) { // Modal.confirm({ // title: `确认删除?`, // content: `${record.productSpuId}`, // onOk() { // dispatch({ // type: 'couponCardTemplateList/delete', // payload: { // id: record.id, // }, // }); // }, // onCancel() {}, // }); // } const columns = [ { title: '名称', dataIndex: 'title', }, { title: '类型', dataIndex: 'preferentialType', render(val) { return <span>{preferentialType[val]}</span>; }, }, { title: '优惠内容', render(val, record) { let content; // priceAvailable; if (record.priceAvailable === 0) { content = '无门槛,'; } else { content = '满 ' + record.priceAvailable / 100 + ' 元,'; } if (record.preferentialType === 1) { content += '减 ' + record.priceOff / 100 + ' 元'; } else { content += '打' + record.percentOff / 100.0 + '折'; if (record.discountPriceLimit) { content += ', 最多减 ' + record.discountPriceLimit / 100 + ' 元'; } } return content; } }, { title: '可使用商品', dataIndex: 'rangeType', render: val => <span>{rangeType[val]}</span>, }, { title: '有效期', render(val, record) { let content = dateType[record.dateType] + ' '; // priceAvailable; if (record.dateType === 1) { content += moment(new Date(record.validStartTime)).format('YYYY-MM-DD') + '~' + moment(new Date(record.validEndTime)).format('YYYY-MM-DD'); } else if (record.dateType === 2) { content += record.fixedStartTerm + '-' + record.fixedEndTerm + ' 天'; } return content; } }, { title: '已领取/剩余', // 已使用 TODO 芋艿 // 支付金额(元) TODO 芋艿 // 客单价(元) TODO 芋艿 render(val, record) { // debugger; return `${record.statFetchNum} / ` + (record.total - record.statFetchNum); } }, { title: '状态', dataIndex: 'status', render: val => <span>{status[val]}</span>, }, // { // title: '使用说明', // dataIndex: 'description', // }, { title: '创建时间', dataIndex: 'createTime', render: val => <span>{moment(val).format('YYYY-MM-DD HH:mm')}</span>, }, { title: '操作', width: 120, render: (text, record) => { const statusText = record.status === 1 ? '禁用' : '开启'; // TODO 芋艿,此处要改 return ( <Fragment> <a onClick={() => handleModalVisible(true, 'update', record)}>编辑</a> <Divider type="vertical" /> <a className={styles.tableDelete} onClick={() => handleStatus(record)}> {statusText} </a> {/*{*/} {/* record.status === 2 ?*/} {/* <span>*/} {/* <Divider type="vertical" />*/} {/* <a className={styles.tableDelete} onClick={() => handleDelete(record)}>*/} {/* 删除*/} {/* </a>*/} {/* </span> : null*/} {/*}*/} </Fragment> ); }, }, ]; function onPageChange(page) { // 翻页 dispatch({ type: 'couponCardTemplateList/query', payload: { pageNo: page.current, pageSize: page.pageSize, ...searchParams } }) } return ( <Table columns={columns} dataSource={dataSource} loading={loading} rowKey="id" pagination={pagination} onChange={onPageChange} /> ) } // 搜索表单 // TODO 芋艿,有没办法换成上面那种写法 const SearchForm = Form.create()(props => { const { form, form: { getFieldDecorator }, dispatch } = props; function search() { dispatch({ type: 'couponCardTemplateList/query', payload: { ...PaginationHelper.defaultPayload, ...form.getFieldsValue() } }) } // 提交搜索 function handleSubmit(e) { // 阻止默认事件 e.preventDefault(); // 提交搜索 search(); } // 重置搜索 function handleReset() { // 重置表单 form.resetFields(); // 执行搜索 search(); } return ( <Form onSubmit={handleSubmit} layout="inline"> <Row gutter={{ md: 8, lg: 24, xl: 48 }}> <Col md={8} sm={24}> <FormItem label="标题"> {getFieldDecorator('title')(<Input placeholder="请输入" />)} </FormItem> </Col> <Col md={8} sm={24}> <span className={styles.submitButtons}> <Button type="primary" htmlType="submit"> 查询 </Button> <Button style={{ marginLeft: 8 }} onClick={handleReset}> 重置 </Button> </span> </Col> </Row> </Form> ); }); // 添加 or 修改 Form 表单 const AddOrUpdateForm = Form.create()(props => { const { dispatch, modalVisible, form, handleModalVisible, modalType, formVals, searchProductSpuList, formSpuValues, categoryTree} = props; const okHandle = () => { form.validateFields((err, fields) => { if (err) return; let newFields = { ...fields, priceAvailable: fields.priceAvailable ? parseInt(fields.priceAvailable * 100) : undefined, priceOff: fields.priceOff ? parseInt(fields.priceOff * 100) : undefined, discountPriceLimit: fields.discountPriceLimit ? parseInt(fields.discountPriceLimit * 100) : undefined, validStartTime: fields.validStartTime ? fields.validStartTime.format('YYYY-MM-DD') : undefined, validEndTime: fields.validEndTime ? fields.validEndTime.format('YYYY-MM-DD') : undefined, rangeValues: fields.rangeValues && fields.rangeValues.length > 0 ? fields.rangeValues.join(',') : undefined, }; // 添加表单 if (modalType === 'add') { dispatch({ type: 'couponCardTemplateList/add', payload: { body: { ...newFields, }, callback: () => { // 清空表单 form.resetFields(); // 提示 message.success('添加成功'); // 关闭弹窗 handleModalVisible(); }, }, }); // 修改表单 } else { dispatch({ type: 'couponCardTemplateList/update', payload: { body: { id: formVals.id, ...newFields, priceAvailable: undefined, dateType: undefined, validStartTime: undefined, validEndTime: undefined, fixedStartTerm: undefined, fixedEndTerm: undefined, preferentialType: undefined, priceOff: undefined, percentOff: undefined, discountPriceLimit: undefined, }, callback: () => { // 清空表单 form.resetFields(); // 提示 message.success('更新成功'); // 关闭弹窗 handleModalVisible(); }, }, }); } }); }; function onRangeTypeChange(value) { formVals.rangeType = parseInt(value); } function onDateTypeChange(value) { formVals.dateType = parseInt(value); } function onPreferentialTypeChange(value) { formVals.preferentialType = parseInt(value); } const searchProductSpu = (value) => { if (!value) { dispatch({ type: 'couponCardTemplateList/setAll', payload: { searchProductSpuList: [], }, }); return; } dispatch({ type: 'couponCardTemplateList/searchProductSpu', payload: { name: value, }, }); }; // 处理分类筛选 const buildSelectTree = (list) => { return list.map(item => { let children = []; if (item.children) { children = buildSelectTree(item.children); } return { title: item.name, value: item.id, key: item.id, children, selectable: item.pid > 0 }; }); }; let categoryTreeSelect = buildSelectTree(categoryTree); const title = modalType === 'add' ? '新建优惠劵' : '更新优惠劵'; return ( <Modal destroyOnClose title={title} visible={modalVisible} onOk={okHandle} okText='保存' onCancel={() => handleModalVisible()} width={720} > <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="标题"> {form.getFieldDecorator('title', { rules: [{ required: true, message: '请输入标题!' }, {max: 16, min:2, message: '长度为 2-16 位'},], initialValue: formVals.title, })(<Input placeholder="请输入" />)} </FormItem> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="使用说明"> {form.getFieldDecorator('description', { rules: [{ required: false, message: '请输入使用说明!' }, {max: 255, message: '最大长度为 255 位'}, ], initialValue: formVals.description, })(<Input.TextArea placeholder="请输入" />)} </FormItem> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="限领次数"> {form.getFieldDecorator('quota', { rules: [{ required: true, message: '请选择每人限领次数!'}, ], initialValue: formVals.quota, })( <Select placeholder="请选择" style={{ maxWidth: 200, width: '100%' }}> <SelectOption value="1">1 次</SelectOption> <SelectOption value="2">2 次</SelectOption> <SelectOption value="3">3 次</SelectOption> <SelectOption value="4">4 次</SelectOption> <SelectOption value="5">5 次</SelectOption> <SelectOption value="10">10 次</SelectOption> </Select> )} </FormItem> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="发放总量"> {form.getFieldDecorator('total', { rules: [{ required: true, message: '请输入发放总量!' }, {min: 1, type: 'number', message: '最小值为 1'}], initialValue: formVals.total, })(<InputNumber placeholder="请输入" />)} </FormItem> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="使用金额门槛"> {form.getFieldDecorator('priceAvailable', { rules: [{ required: true, message: '请输入使用金额门槛!' },], initialValue: formVals.priceAvailable ? formVals.priceAvailable / 100.0 : undefined, })(<InputNumber disabled={modalType != 'add'} placeholder="请输入" />)} 元 </FormItem> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="可用范围"> {form.getFieldDecorator('rangeType', { rules: [{ required: true, message: '请选择可用范围!'}, // TODO 芋艿,需要修改 ], initialValue: formVals.rangeType ? formVals.rangeType + '' : undefined, })( <Select placeholder="请选择" style={{ maxWidth: 200, width: '100%' }} onChange={onRangeTypeChange} > <SelectOption value="10">所有可用</SelectOption> <SelectOption value="20">部分商品可用</SelectOption> <SelectOption value="21">部分商品不可用</SelectOption> <SelectOption value="30">部分分类可用</SelectOption> <SelectOption value="31">部分分类不可用</SelectOption> </Select> )} </FormItem> {/*{*/} {/* formVals.rangeType == 20 || formVals.rangeType == 21*/} {/* || formVals.rangeType == 30 || formVals.rangeType == 31 ?*/} {/* <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="具体范围">*/} {/* {form.getFieldDecorator('rangeValues', {*/} {/* rules: [{ required: true, message: '请输入具体范围!' }, // TODO 芋艿,做成搜索*/} {/* {maxlength: 255, message: '最大长度为 255 位'},*/} {/* ],*/} {/* initialValue: formVals.rangeValues,*/} {/* })(<Input.TextArea placeholder="请输入" />)}*/} {/* </FormItem>*/} {/* : ''*/} {/*}*/} { formVals.rangeType == 20 || formVals.rangeType == 21? <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="选择商品"> {form.getFieldDecorator('rangeValues', { rules: [{ required: true, message: '请选择商品!' }, ], initialValue: formVals.rangeValues ? formVals.rangeValues.split(',') : undefined, })( <Select // labelInValue // value={formVals.productSpuId} mode={"multiple"} placeholder="请搜索商品" onSearch={searchProductSpu} showSearch={true} filterOption={false} style={{ width: '100%' }} > {searchProductSpuList.map(d => <Option key={d.id} value={d.id + ''}>{d.name}</Option>)} {searchProductSpuList.length === 0 && formSpuValues.length > 0 ? formSpuValues.map(d => <Option key={d.id} value={d.id + ''}>{d.name}</Option>) : ''} </Select> )} </FormItem> : '' } { formVals.rangeType == 30 || formVals.rangeType == 31 ? <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="选择分类"> {form.getFieldDecorator('rangeValues', { rules: [{ required: true, message: '请选择分类!' }, ], initialValue: formVals.rangeValues ? formVals.rangeValues.split(',') : undefined, })( <TreeSelect showSearch multiple style={{ width: 200 }} dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} treeData={categoryTreeSelect} placeholder="请选择分类" /> )} </FormItem> : '' } <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="生效日期类型"> {form.getFieldDecorator('dateType', { rules: [{ required: true, message: '请选择可用范围!'}, // TODO 芋艿,需要修改 ], initialValue: formVals.dateType ? formVals.dateType + '' : undefined, })( <Select disabled={modalType != 'add'} placeholder="请选择" style={{ maxWidth: 200, width: '100%' }} onChange={onDateTypeChange}> <SelectOption value="1">固定日期</SelectOption> <SelectOption value="2">领取日期</SelectOption> </Select> )} </FormItem> { formVals.dateType == 1 ? <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="固定日期"> {form.getFieldDecorator('validStartTime', { rules: [{ required: true, message: '请输入固定日期!' },], initialValue: formVals.validStartTime ? moment(formVals.validStartTime) : undefined, })(<DatePicker disabled={modalType != 'add'} format="YYYY-MM-DD" />)} - {form.getFieldDecorator('validEndTime', { rules: [{ required: true, message: '请输入固定日期!' },], initialValue: formVals.validEndTime ? moment(formVals.validEndTime) : undefined, })(<DatePicker disabled={modalType != 'add'} format="YYYY-MM-DD" />)} </FormItem> : '' } { formVals.dateType == 2 ? <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="领取日期"> {form.getFieldDecorator('fixedStartTerm', { rules: [{ required: true, message: '请输入固定日期!' }, {min: 1, type: 'number', message: '最小值为 1'}], initialValue: formVals.fixedStartTerm, })(<InputNumber disabled={modalType != 'add'} placeholder="请输入" />)} - {form.getFieldDecorator('fixedEndTerm', { rules: [{ required: true, message: '请输入固定日期!' }, {min: 1, type: 'number', message: '最小值为 1'}], initialValue: formVals.fixedEndTerm, })(<InputNumber disabled={modalType != 'add'} placeholder="请输入" />)} 天 </FormItem> : '' } <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="优惠类型"> {form.getFieldDecorator('preferentialType', { rules: [{ required: true, message: '请选择优惠类型!'}, // TODO 芋艿,需要修改 ], initialValue: formVals.preferentialType ? formVals.preferentialType + '' : undefined, })( <Select disabled={modalType != 'add'} placeholder="请选择" style={{ maxWidth: 200, width: '100%' }} onChange={onPreferentialTypeChange}> <SelectOption value="1">代金卷</SelectOption> <SelectOption value="2">折扣卷</SelectOption> </Select> )} </FormItem> { formVals.preferentialType == 1 ? <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="优惠金额"> {form.getFieldDecorator('priceOff', { rules: [{ required: true, message: '请输入优惠金额!' }, {min: 0.01, type: 'number', message: '最小值为 0.01'}], initialValue: formVals.priceOff ? formVals.priceOff / 100.0 : undefined, })(<InputNumber disabled={modalType != 'add'} placeholder="请输入" />)} </FormItem> : '' } { formVals.preferentialType == 2 ? <span> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="折扣百分比"> {form.getFieldDecorator('percentOff', { rules: [{ required: true, message: '请输入折扣百分比!' }, {min: 1, max: 99, type: 'number', message: '范围为 [1, 99]'}, ], initialValue: formVals.percentOff, })(<InputNumber disabled={modalType != 'add'} placeholder="请输入" />)}% </FormItem> <FormItem labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} label="最多优惠"> {form.getFieldDecorator('discountPriceLimit', { rules: [{ required: false, message: '请输入最多优惠!' }, {min: 0.01, type: 'number', message: '最小值为 0.01'}, ], initialValue: formVals.discountPriceLimit ? formVals.discountPriceLimit / 100.0 : undefineds, })(<InputNumber disabled={modalType != 'add'} placeholder="请输入" />)}元 </FormItem> </span> : '' } </Modal> ); }); @connect(({ couponCardTemplateList, productCategoryList }) => ({ // list: productRecommend.list, // pagination: productRecommend.pagination, ...couponCardTemplateList, categoryTree: productCategoryList.list, })) // 主界面 @Form.create() class CouponCardTemplateLists extends PureComponent { componentDidMount() { const { dispatch } = this.props; // 获得优惠劵列表 dispatch({ type: 'couponCardTemplateList/query', payload: { ...PaginationHelper.defaultPayload }, }); } handleModalVisible = (modalVisible, modalType, record) => { const { dispatch } = this.props; // 弹窗,并清空一些缓存 dispatch({ type: 'couponCardTemplateList/setAll', payload: { modalVisible, modalType, formVals: record || {}, searchProductSpuList: [], formSpuValues: [], }, }); // 如果是指定商品,则获得商品列表 if (record && record.rangeType && (record.rangeType === 20 || record.rangeType === 21)) { dispatch({ type: 'couponCardTemplateList/getProductSpuList', payload: { ids: record.rangeValues, }, }); } // 获得商品分类,因为后续可能使用到 // 获得商品分类 dispatch({ type: 'productCategoryList/tree', payload: {}, }); }; render() { // let that = this; const { dispatch, list, listLoading, searchParams, pagination, modalVisible, modalType, formVals, searchProductSpuList, formSpuValues, categoryTree, confirmLoading, } = this.props; // 列表属性 const listProps = { dataSource: list, pagination, searchParams, dispatch, loading: listLoading, confirmLoading, handleModalVisible: this.handleModalVisible, // Function }; // 搜索表单属性 const searchFormProps = { dispatch, }; // 添加 or 更新表单属性 const addOrUpdateFormProps = { modalVisible, modalType, formVals, dispatch, searchProductSpuList, formSpuValues, categoryTree, handleModalVisible: this.handleModalVisible, // Function }; return ( <PageHeaderWrapper> <Card bordered={false}> <div className={styles.tableList}> <div className={styles.tableListForm}> <SearchForm {...searchFormProps} /> </div> <div className={styles.tableListOperator}> <Button icon="plus" type="primary" onClick={() => this.handleModalVisible(true, 'add', {})} > 新建优惠劵 </Button> </div> </div> <List {...listProps} /> </Card> <AddOrUpdateForm {...addOrUpdateFormProps} /> </PageHeaderWrapper> ); } } export default CouponCardTemplateLists;