Commit ef0fadb0 authored by 前端-黄佳鑫's avatar 前端-黄佳鑫

🐞 fix(询价报价): 修复bug

parent 70120e1b
import React, { Fragment, useCallback, useEffect, useState } from 'react';
import React, { Fragment, useEffect, useState } from 'react';
import { Button, Tag, Badge, Typography, Space, Drawer } from 'antd';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
......@@ -16,6 +16,7 @@ import GeneralLayout from '@/pages/transaction/components/detailLayout/component
import RecordLyout from '@/pages/transaction/components/detailLayout/components/recordLyout';
import ModalOperate from '@/pages/transaction/components/modalOperate';
import { StandardTable } from 'god';
import { getAuth } from '@/utils/auth'
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
......@@ -207,6 +208,15 @@ const InquiryOfferDetail = () => {
},
]
const handleJump = (val) => {
const { memberId } = getAuth()
if (val.quoteMemberId === memberId) {
window.open(`/memberCenter/tranactionAbility/inquiryOffer/offerSearch/offer/preview?id=${val.id}`)
} else {
window.open(`memberCenter/tranactionAbility/confirmOffer/offerSearch/offer/preview?id=${val.id}`)
}
}
const hitoryColumns: ColumnType<any>[] = [
{
title: '商品ID',
......@@ -264,7 +274,8 @@ const InquiryOfferDetail = () => {
{
title: '报价单',
key: 'quotationNo',
dataIndex: 'quotationNo'
dataIndex: 'quotationNo',
render: (_text, _record) => <Button type='link' onClick={() => handleJump(_record)}>{_text}</Button>
},
{
title: '外部状态',
......@@ -371,7 +382,7 @@ const InquiryOfferDetail = () => {
>
<StandardTable
columns={hitoryColumns}
tableProps={{ rowKey: 'productId' }}
tableProps={{ rowKey: 'id' }}
fetchTableData={fetchTableData}
/>
</Drawer>
......
......@@ -113,29 +113,34 @@ const WaitAddInquiry = () => {
render: (text: any, record: any) => {
return (
<>
<Popconfirm title="确定要提交吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
{record.isSubmit && (
<Popconfirm title="确定要提交吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
<Button
type='link'
>
提交审核
</Button>
</Popconfirm>
)}
{record.isUpdate && (
<Button
type='link'
type="link"
onClick={() => history.push(`/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/edit?id=${record.id}`)}
>
提交审核
编辑
</Button>
</Popconfirm>
<Button
type="link"
disabled={record.interiorState !== 1 && record.interiorState !== 6}
onClick={() => history.push(`/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/edit?id=${record.id}`)}
>
编辑
</Button>
<Popconfirm
title="确定要删除吗?"
okText="是"
cancelText="否"
onConfirm={() => fetchDeleteBatch(record.id)}
disabled={record.interiorState !== 1 && record.externalState !== 1}
>
<Button disabled={record.interiorState !== 1 && record.externalState !== 1} type="link">删除</Button>
</Popconfirm>
)}
{record.isDelete && (
<Popconfirm
title="确定要删除吗?"
okText="是"
cancelText="否"
onConfirm={() => fetchDeleteBatch(record.id)}
>
<Button disabled={record.interiorState !== 1 && record.externalState !== 1} type="link">删除</Button>
</Popconfirm>
)}
</>
)
}
......
......@@ -5,6 +5,7 @@ import CollapseLayout from './components/collapseLayout';
import { isArray, isEmpty } from 'lodash';
import ProductLayout from './components/productLayout';
import CouponsLayout from '@/pages/transaction/marketingAbility/selfManagement/readySubmitExamine/components/couponsLayout';
import { PublicApi } from '@/services/api';
const layout: any = {
labelCol: { style: { width: "100px" } },
......@@ -232,6 +233,7 @@ const CouponsListLayout: React.FC<CouponsListLayoutProps> = (props: any) => {
<Button type="dashed" block icon={<PlusOutlined />} onClick={handleAppend}>添加</Button>
{/* 弹框: 优惠券 */}
<CouponsLayout
fieldApi={PublicApi.getMarketingMerchantActivityDetailGoodsCouponSelect}
visible={tableModalVisible}
onClose={() => toggle(false)}
onSubmit={handleCouponSubmit}
......
......@@ -25,7 +25,7 @@ interface ProductListProps {
activityId?: any,
form?: FormInstance,
/** umi-hooks */
focus$?: EventEmitter<void>,
focus$?: any,
/** 适用商城 */
shopIdList?: number[],
/** 接口 */
......@@ -57,10 +57,12 @@ const ProductListLayout: React.FC<ProductListProps> = (props: any) => {
})
}
focus$ && focus$.useSubscription((val: optionProps) => {
setValue(val.value)
setDataSource([])
});
useEffect(() => {
if (focus$) {
setValue(focus$)
setDataSource([])
}
}, [focus$])
/** 删除一个 */
const handleDelete = (key) => {
......
......@@ -51,6 +51,7 @@ const AddedMarketing = () => {
const [memberType, setMemberType] = useState<any[]>([]);
const [activityId, setActivityId] = useState<number>();
const [value, setValue] = useState<number>();
const [prizeList, setPrizeList] = useState<any[]>([]);
const handleGetShopList = (mall) => {
const checkedList = mall.filter(item => item.checked);
......@@ -98,7 +99,7 @@ const AddedMarketing = () => {
oldMember: (res.allUser.includes(4) ? 1 : 0),
memberLevelList,
shopList: res.shopList,
productList: res.productList.map(item => {
productList: res.productList && res.productList.map(item => {
if (item.couponGroupList) {
return {
...item,
......@@ -178,6 +179,9 @@ const AddedMarketing = () => {
if (data['activityDefinedBO']['attemptEndTime']) {
data['activityDefinedBO']['attemptEndTime'] = moment(data['activityDefinedBO']['attemptEndTime']);
}
if (data['activityDefinedBO']['prizeBOList']) {
setPrizeList(data['activityDefinedBO']['prizeBOList'])
}
form.setFieldsValue({
allUser: [data.newUser && 1, data.oldUser && 2, data.newMember && 3, data.oldMember && 4],
activityDefinedBO: data.activityDefinedBO,
......@@ -197,7 +201,7 @@ const AddedMarketing = () => {
}, [id])
focus$.useSubscription((val: any) => {
setValue(val.value);
setValue(val.value)
form.resetFields(['activityDefinedBO']);
});
......@@ -236,8 +240,8 @@ const AddedMarketing = () => {
<BasicInfoLayout form={form} focus$={focus$} />
<ShopLayout onGetShopList={handleGetShopList} onSetShopList={shopList} />
<RulesLayout form={form} focus$={focus$} />
{value !== 10 && (<ProductListLayout activityId={activityId && { activityId: activityId }} form={form} focus$={focus$} shopIdList={shopIdList} fieldApi={PublicApi.getMarketingMerchantActivityDetailGoodsPage} />)}
{value === 10 && (<PrizeListLayout form={form} />)}
{value !== 10 && (<ProductListLayout activityId={activityId && { activityId: activityId }} form={form} focus$={value} shopIdList={shopIdList} fieldApi={PublicApi.getMarketingMerchantActivityDetailGoodsPage} />)}
{value === 10 && (<PrizeListLayout form={form} prizeList={prizeList} focus$={value} />)}
<PartakeUserLayout onGetLevel={handleGetLevel} onSetLevel={memberLevelList} setMemberType={memberType} />
</Form>
}
......
......@@ -65,7 +65,7 @@ const BasicInfoLayout: React.FC<BasicInfoProps> = (props: any) => {
};
const handleChange = (e, option) => {
focus$.emit(option)
focus$.emit(option);
}
return (
......
......@@ -3,7 +3,8 @@
align-items: center;
:global {
.ant-checkbox+span {
.ant-checkbox+span,
.ant-radio+span {
flex: 1;
margin-left: 20px;
}
......
import React, { useEffect, useState } from 'react';
import { Drawer, Space, Form, Select, Input, Button, Row, Col, Checkbox, Empty, Pagination } from 'antd';
import React, { useEffect, useState, useCallback } from 'react';
import { Drawer, Space, Form, Select, Input, Button, Row, Col, Checkbox, Empty, Pagination, Radio } from 'antd';
import { CaretDownOutlined } from '@ant-design/icons';
import { PublicApi } from '@/services/api';
import CouponItem from '@/pages/transaction/marketingAbility/components/couponItem';
......@@ -15,10 +15,14 @@ interface CouponsLayoutProps {
onSubmit?: (e: any) => void,
/** 已选择的id */
value?: any,
/** 多选&单选 */
mode?: 'checkbox' | 'radio',
/** 接口api */
fieldApi?: () => Promise<unknown>,
}
const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
const { visible, onClose, onSubmit, value } = props;
const { visible, onClose, onSubmit, value, mode = 'checkbox', fieldApi } = props;
const [form] = Form.useForm();
const [state, setState] = useState({
filterSearch: false
......@@ -32,6 +36,8 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
const [chekedId, setCheckedId] = useState<number[]>([]); // 已选择的优惠券
const [selectCouponList, setSelectCouponList] = useState<any[]>([]); // checkbox 勾选到的数据 需要去重
const [couponsList, setCouponsList] = useState<any[]>([]); // 提交的优惠券
const [options, setOptions] = useState<any[]>([]); // 选择附属优惠券查询条件
const changeFilterVisible = () => {
setState({
filterSearch: !state.filterSearch,
......@@ -41,7 +47,7 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
// 提交搜索
const handleSubmit = async () => {
await form.validateFields().then(res => {
PublicApi.getMarketingMerchantActivityDetailGoodsCouponSelect({ ...res, ...params }).then(res => {
fieldApi({ ...res, ...params }).then(res => {
if (res.code !== 1000) {
return
}
......@@ -58,9 +64,24 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
handleSubmit()
}
const handleCondition = useCallback(async () => {
await PublicApi.getMarketingMerchantActivityDetailGoodsCouponSelectCondition().then(res => {
if (res.code !== 1000) {
return
}
setOptions(res.data.map(_item => {
return {
label: _item.name,
value: _item.value
}
}))
})
}, [])
useEffect(() => {
if (visible) {
handleSubmit()
handleSubmit();
handleCondition();
}
}, [visible, params])
......@@ -81,6 +102,7 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
)
}
/** checkbox 选择 */
const _setCheckList = (_e, _item) => {
const ids = [...chekedId];
const selcetLits = [...selectCouponList];
......@@ -93,9 +115,16 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
}
}
/** radio 选择 */
const _setRadioList = (_e) => {
const { value } = _e.target;
const _item = _e.target['data-item'];
setCheckedId([value])
setSelectCouponList([_item])
}
useEffect(() => {
const newData = selectCouponList.filter(_item => chekedId.includes(_item.id));
console.log(newData, 98)
setCouponsList(newData)
}, [chekedId])
......@@ -136,12 +165,7 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
<Select
style={{ width: '160px' }}
placeholder='优惠劵类型'
options={[
{ label: '通用优惠券', value: 1 },
{ label: '品类优惠券', value: 2 },
{ label: '品牌优惠券', value: 3 },
{ label: '商品优惠券', value: 4 },
]}
options={options}
/>
</Form.Item>
<Form.Item
......@@ -168,19 +192,38 @@ const CouponsLayout: React.FC<CouponsLayoutProps> = (props: any) => {
{couponList.length === 0 ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : (
<Row>
{couponList.map((item: any, index: number) => {
return (
<Col span={22} key={`Col_${index}`} style={{ marginBottom: 24 }}>
<Checkbox checked={chekedId.includes(item.id)} value={item.id} className={styles.customsCheckbox} onChange={(_e) => _setCheckList(_e.target.value, item)}>
<CouponItem
fieldListData={item}
/>
</Checkbox>
</Col>
)
})}
<Col span={24} style={{ display: 'flex' ,justifyContent: 'flex-end'}}>
<Pagination size="small" total={total} current={params.current} onChange={handlePagination}/>
{mode === 'checkbox' && (
<>
{couponList.map((item: any, index: number) => {
return (
<Col span={22} key={`Col_${index}`} style={{ marginBottom: 24 }}>
<Checkbox checked={chekedId.includes(item.id)} value={item.id} className={styles.customsCheckbox} onChange={(_e) => _setCheckList(_e.target.value, item)}>
<CouponItem
fieldListData={item}
/>
</Checkbox>
</Col>
)
})}
</>
)}
{mode === 'radio' && (
<Radio.Group style={{ flex: 1 }} onChange={(_e) => _setRadioList(_e)}>
{couponList.map((item: any, index: number) => {
return (
<Col span={22} key={`Col_${index}`} style={{ marginBottom: 24 }}>
<Radio checked={chekedId.includes(item.id)} value={item.id} data-item={item} className={styles.customsCheckbox}>
<CouponItem
fieldListData={item}
/>
</Radio>
</Col>
)
})}
</Radio.Group>
)}
<Col span={24} style={{ display: 'flex', justifyContent: 'flex-end' }}>
<Pagination size="small" total={total} current={params.current} onChange={handlePagination} />
</Col>
</Row>
)}
......
import React, { useEffect, useState } from 'react';
import { Form, Table, Tooltip, Button, Select, Input, Popconfirm } from 'antd';
import { ColumnType } from 'antd/lib/table';
import { PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { EditOutlined, PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import CardLayout from '../card';
import { FormInstance } from 'antd/es/form/Form';
import { isEmpty } from '@antv/util';
import CouponsLayout from '../couponsLayout';
import { PublicApi } from '@/services/api';
const levelList = [
{ value: 1, name: '一等奖' },
......@@ -24,20 +26,42 @@ const typeList = [
interface PrizeListProps {
form?: FormInstance,
/** 回显数据 */
prizeList?: any[],
/** 活动类型 */
focus$?: number,
}
const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
const { form } = props;
const { form, prizeList, focus$ } = props;
const [dataSource, setDataSource] = useState<any[]>([]);
const [levelIds, setLevelIds] = useState<number[]>([]);
const [tableModalVisible, setTableModalVisible] = useState<boolean>(false);
const [_type, setType] = useState<number>();
const [_index_, setIndex] = useState<number>();
const toggle = (flag: boolean) => {
setTableModalVisible(flag)
};
/** 更新form回显 */
const handleSetFieldsValue = (prams: any[]) => {
prams.forEach((_item, index) => {
form.setFieldsValue({
[`level_${index}`]: _item.level,
[`type_${index}`]: _item.type,
[`probability_${index}`]: _item.probability,
[`prize_${index}`]: _item.prize,
})
})
}
/** 选择奖项等级 */
const handleChangeLevel = (e, _index) => {
const fields = [...dataSource];
const ids = [...levelIds];
console.log(ids)
ids[_index] = e;
setLevelIds(ids);
const newData = fields.map((_item, _i) => {
......@@ -52,23 +76,73 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
setDataSource(newData)
}
/** 选择奖品类别 */
const handleChangeType = (e, _index) => {
const fields = [...dataSource];
const newData = fields.map((_item, _i) => {
if (_i === _index) {
return {
..._item,
type: e
}
}
return _item
})
setDataSource(newData)
}
/** 输入中奖概率 */
const handleChangeProbability = (e, _index) => {
const { value } = e.target;
const fields = [...dataSource];
const newData = fields.map((_item, _i) => {
if (_i === _index) {
return {
..._item,
probability: Number(value)
}
}
return _item
})
setDataSource(newData)
}
/** 奖项 */
const handleChangePrize = (e, _index) => {
const { value } = e.target;
const fields = [...dataSource];
const newData = fields.map((_item, _i) => {
if (_i === _index) {
return {
..._item,
prize: value
}
}
return _item
})
setDataSource(newData)
}
/** 删除一条奖项 */
const handleDelete = (_index) => {
const handleDelete = (_index, _record) => {
const fields = [...dataSource];
const ids = [...levelIds];
fields.splice(_index, 1)
fields.forEach((_item, index) => {
form.setFieldsValue({
[`level_${index}`]: _item.level,
[`type_${index}`]: _item.type,
[`probability_${index}`]: _item.probability,
[`prize_${index}`]: _item.prize,
})
})
setLevelIds(ids.splice(_index, 1))
handleSetFieldsValue(fields)
if (_record.level) {
setLevelIds(ids.filter(_item => _item !== _record.level))
}
setDataSource(fields)
}
/** 选择优惠券 */
const handleClickButton = (value, _index) => {
setType(value);
setIndex(_index)
toggle(true);
}
const columns: ColumnType<any>[] = [
{
title: '奖项等级',
......@@ -100,7 +174,7 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
name={`type_${_index}`}
rules={[{ required: true, message: '请选择奖品类别' }]}
>
<Select>
<Select onChange={(e) => handleChangeType(e, _index)}>
{typeList.map(_item => (
<Select.Option key={_item.value} value={_item.value}>{_item.name}</Select.Option>
))}
......@@ -119,9 +193,23 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
<Form.Item
style={{ margin: 0 }}
name={`probability_${_index}`}
rules={[{ required: true, message: '请输入中奖概率' }]}
rules={[{
required: true, validator: (_rule, value) => {
const pattern = /^-?[1-9]\d*(\.\d{1,2})?$/;
if (!value) {
return Promise.reject(new Error('请输入中奖概率'));
}
if (!pattern.test(value)) {
return Promise.reject(new Error(`中奖概率必须大于0最多保留2位小数`));
}
if (Number(value) > 100) {
return Promise.reject(new Error(`中奖概率必须小于或等于100`));
}
return Promise.resolve();
}
}]}
>
<Input style={{ width: 176 }} addonAfter='%' />
<Input style={{ width: 176 }} addonAfter='%' onChange={(e) => handleChangeProbability(e, _index)} />
</Form.Item>
)
},
......@@ -138,9 +226,9 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
<Form.Item
style={{ margin: 0 }}
name={`prize_${_index}`}
rules={[{ required: true, message: '请输选择优惠券' }]}
rules={[{ required: true, message: '请输选择商品' }]}
>
<div>123</div>
<Button icon={<EditOutlined />} type='text' onClick={() => handleClickButton(getFieldValue([`type_${_index}`]), _index)}>选择0元购买抵扣劵</Button>
</Form.Item>
) : getFieldValue([`type_${_index}`]) === 2 ? (
<Form.Item
......@@ -148,23 +236,45 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
name={`prize_${_index}`}
rules={[{ required: true, message: '请输选择优惠券' }]}
>
<div>123</div>
<Button icon={<EditOutlined />} type='text' onClick={() => handleClickButton(getFieldValue([`type_${_index}`]), _index)}>选择优惠券</Button>
</Form.Item>
) : getFieldValue([`type_${_index}`]) === 3 ? (
<Form.Item
style={{ margin: 0 }}
name={`prize_${_index}`}
rules={[{ required: true, message: '请输入金额' }]}
rules={[{
required: true, validator: (_rule, value) => {
const pattern = /^-?[1-9]\d*(\.\d{1,2})?$/;
if (!value) {
return Promise.reject(new Error('请输入金额'));
}
if (!pattern.test(value)) {
return Promise.reject(new Error(`金额必须大于0最多保留2位小数`));
}
return Promise.resolve();
}
}]}
>
<Input addonAfter='元' />
<Input addonAfter='元' onChange={(e) => handleChangePrize(e, _index)} />
</Form.Item>
) : getFieldValue([`type_${_index}`]) === 4 ? (
<Form.Item
style={{ margin: 0 }}
name={`prize_${_index}`}
rules={[{ required: true, message: '请输入积分' }]}
rules={[{
required: true, validator: (_rule, value) => {
const pattern = /^-?[1-9]\d*$/;
if (!value) {
return Promise.reject(new Error('请输入积分'));
}
if (!pattern.test(value)) {
return Promise.reject(new Error(`积分必须大于0`));
}
return Promise.resolve();
}
}]}
>
<Input addonAfter='积分' />
<Input addonAfter='积分' onChange={(e) => handleChangePrize(e, _index)} />
</Form.Item>
) : '无'}
</Form.Item>
......@@ -178,7 +288,7 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
render: (_text, _record, _index) => (
<Popconfirm
title="是否删除?"
onConfirm={() => handleDelete(_index)}
onConfirm={() => handleDelete(_index, _record)}
>
<Button type='link'>删除</Button>
</Popconfirm>
......@@ -196,12 +306,44 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
prize: null,
}
const field = [...dataSource];
setDataSource([...field, field_Obj]);
const newData = [...field, field_Obj];
handleSetFieldsValue(newData)
setDataSource(newData);
}
useEffect(() => {
form.setFieldsValue({
'activityDefinedBO': {
'prizeBOList': dataSource
}
})
}, [dataSource])
useEffect(() => {
if (!isEmpty(prizeList)) {
handleSetFieldsValue(prizeList)
setLevelIds(prizeList.map(_item => {
return _item.level
}))
setDataSource(prizeList)
}
}, [prizeList])
const handleCouponSubmit = (selectRowRecord: any) => {
console.log(selectRowRecord)
toggle(false);
}
useEffect(() => {
if (focus$) {
setLevelIds([])
setDataSource([])
}
}, [focus$])
return (
<CardLayout
id="productListLayout"
id="activityProductLayout"
title="奖品设置"
weight
>
......@@ -210,13 +352,21 @@ const PrizeListLayout: React.FC<PrizeListProps> = (props: any) => {
rules={[{ required: true, message: '请选择奖品设置!' }]}
>
<Table
rowKey={(_record, _index) => _index}
rowKey={(_record, _index) => `table_${_index + 1}`}
columns={columns}
dataSource={dataSource}
pagination={false}
/>
</Form.Item>
<Button style={{ marginBottom: '16px' }} block type="dashed" icon={<PlusOutlined />} onClick={handleApped}>添加新奖项</Button>
{/* 选择优惠券 */}
<CouponsLayout
mode='radio'
fieldApi={_type === 1 ? PublicApi.getMarketingMerchantActivityDetailPrizeCouponSelect : PublicApi.getMarketingMerchantActivityDetailGoodsCouponSelect}
visible={tableModalVisible}
onClose={() => toggle(false)}
onSubmit={handleCouponSubmit}
/>
</CardLayout>
)
}
......
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