Commit a0b4cced1264f957f2bffeb1629f22b5e187cac0

Authored by 莫红玲
1 parent 079a6524

活动变更记录报名、签到、抽奖详情展示

config/routers/mkt.ts
... ... @@ -25,7 +25,7 @@ export default [
25 25 },
26 26 /**活动变更查询记录 */
27 27 {
28   - path: '/mkt/prize/record/changes',
  28 + path: '/mkt/prize/record/changes/:activityNo?',
29 29 component: './mkt/ActivityChanges',
30 30 },
31 31 /**查询活动发放奖品列表-运维 */
... ...
src/pages/mkt/ActivityChanges/components/AwardConfigs/CouponGifts.tsx 0 → 100644
  1 +import React, { useEffect, useState } from 'react';
  2 +import { Button, Card, Table } from 'antd';
  3 +import UpsertCoupon from "@/pages/coupon/CouponConfig";
  4 +
  5 +const { Column } = Table;
  6 +
  7 +// 门店范围
  8 +enum ShopLimit {
  9 + "发券门店" = 1,
  10 + "自定义门店",
  11 +}
  12 +
  13 +interface Props {
  14 + value?: ExternalPromotion.Gifts,
  15 + onChange?: Function,
  16 + disabled?: boolean,
  17 +}
  18 +interface Coupon {
  19 + visible: boolean;
  20 + index?: number;
  21 + confNo?: string;
  22 + giftItemId?: number;
  23 +}
  24 +function SignupGifts({ value, onChange, disabled }: Props) {
  25 + const [giftList, setGiftList] = useState<ExternalPromotion.giftItems[]>([]);
  26 + const [coupon, setCoupon] = useState<Coupon>({ visible: false, index: undefined, confNo: undefined });
  27 + useEffect(() => {
  28 + value && value[0].giftItems && setGiftList(value[0].giftItems);
  29 + }, [value]);
  30 +
  31 + return (
  32 + <div>
  33 + <Card
  34 + style={{ display: "block" }}
  35 + >
  36 + <Table
  37 + bordered
  38 + dataSource={giftList}
  39 + rowKey={(record: ExternalPromotion.giftItems, index?: number) => record.classifyCode || record.couponCode}
  40 + >
  41 + <Column
  42 + title="优惠券类型"
  43 + dataIndex="giftName"
  44 + key="giftType"
  45 + width="6%"
  46 + />
  47 + <Column
  48 + title="优惠券别名"
  49 + dataIndex="aliasName"
  50 + key="orgType"
  51 + width="10%"
  52 + render={(text: string) => <span>{text || "--"}</span>}
  53 + />
  54 + <Column
  55 + title="金额"
  56 + dataIndex="discountsAmount"
  57 + key="discountsAmount"
  58 + width="4%"
  59 + />
  60 + <Column
  61 + title="使用条件"
  62 + dataIndex="orgType"
  63 + key="orgType"
  64 + width="10%"
  65 + render={(text: number) => (
  66 + <span>{text ? ShopLimit[text] : "--"}</span>
  67 + )}
  68 + />
  69 + <Column
  70 + title="操作"
  71 + width="4%"
  72 + render={(
  73 + text,
  74 + record: ExternalPromotion.giftItems,
  75 + index: number
  76 + ) => (
  77 + <Button type="link" onClick={() => setCoupon({ ...coupon, visible: true, confNo: record.couponCode })}>查看</Button>
  78 + )}
  79 + />
  80 + </Table>
  81 + </Card>
  82 + <UpsertCoupon
  83 + visible={coupon.visible}
  84 + onCancel={() => setCoupon({ ...coupon, visible: false, confNo: undefined, giftItemId: undefined })}
  85 + disabled
  86 + // onSave={}
  87 + remark="市场活动"
  88 + confNo={coupon.confNo}
  89 + // carSelectApi={bizType == 1 ? getACarList : undefined}
  90 + // changeEditKeys={couponStatus ? ["aliasName", "schemeList"] : undefined}
  91 + // getCouponDetailsApi={couponStatus ? (v: string) => getCouponChangeDetails({ activityNo, confNo: v }) : undefined}
  92 + // saveChangeCouponApi={couponStatus ? (values: any) => saveChangeCoupon({ ...values, activityNo }) : undefined}
  93 + />
  94 + </div>
  95 + );
  96 +}
  97 +
  98 +export default React.memo(SignupGifts);
0 99 \ No newline at end of file
... ...
src/pages/mkt/ActivityChanges/components/AwardConfigs/Coupons.tsx 0 → 100644
  1 +import React, { useState, useEffect } from "react";
  2 +import {
  3 + Table,
  4 + Form,
  5 + Button,
  6 + Modal,
  7 + Input,
  8 + InputNumber,
  9 + Space,
  10 + message,
  11 + Card,
  12 + Popconfirm,
  13 +} from "antd";
  14 +import UpsertCoupon from "@/pages/coupon/CouponConfig";
  15 +
  16 +const { Column } = Table;
  17 +interface Props {
  18 + //按概率/固定奖项人数
  19 + awardWay?: number;
  20 + mulLottery?: boolean; //是否多轮抽奖
  21 + onChange?: Function;
  22 + value?: any[];
  23 + remove?: Function;
  24 + name?: number;
  25 + disabled?: boolean;
  26 +}
  27 +interface Coupon {
  28 + visible: boolean;
  29 + index?: number;
  30 + itemIndex?: number;
  31 + confNo?: string;
  32 + giftItemId?: number;
  33 +}
  34 +
  35 +export default function Coupons({
  36 + awardWay,
  37 + mulLottery,
  38 + value,
  39 + onChange,
  40 + remove,
  41 + name,
  42 + disabled
  43 +}: Props) {
  44 + const [form] = Form.useForm();
  45 + // 保存表格中的数据
  46 + const [savaList, setSaveList] = useState<any[]>([]);
  47 + /** 是否点击过无奖占位 */
  48 + const [noReward, setNoRewad] = useState(false);
  49 + /** 无奖占位按钮能否点击 */
  50 + const [noRewardDisable, setNoRewadDisable] = useState(false);
  51 + //保存索引
  52 + const [itemIndex, setItemIndex] = useState<number>();
  53 + //奖项名称Modal显示
  54 + const [visible, setVisible] = useState(false);
  55 + //优惠券Modal
  56 + const [coupon, setCoupon] = useState<Coupon>({
  57 + visible: false,
  58 + index: undefined,
  59 + confNo: undefined,
  60 + });
  61 + // 保存当前选中的奖项
  62 + const [currentItem, SetCurrentItem] = useState({
  63 + awardName: undefined,
  64 + winningNum: undefined,
  65 + });
  66 + const pattern1 = /^([1-9]\d?|100)$/; //(0,100]之间百分数
  67 + const pattern2 = /^\+?[1-9]\d*$/; // 大于0的整数
  68 +
  69 + useEffect(() => {
  70 + if (visible && currentItem.awardName) {
  71 + //编辑
  72 + form.setFieldsValue({
  73 + ...currentItem,
  74 + });
  75 + }
  76 + }, [visible, currentItem]);
  77 +
  78 + useEffect(() => {
  79 + if (value && value.length) {
  80 + setSaveList([...value]);
  81 + }
  82 + }, [value]);
  83 +
  84 + return (
  85 + <>
  86 + <Card
  87 + style={{ display: "block" }}
  88 + >
  89 + <Table
  90 + dataSource={value}
  91 + rowKey={(record) => record.awardName}
  92 + bordered
  93 + >
  94 + <Column
  95 + title="奖项名称"
  96 + dataIndex="awardName"
  97 + key="awardName"
  98 + width="4%"
  99 + render={(text, record: any, index) => {
  100 + if (text === "谢谢惠顾") {
  101 + return <span>{text}</span>;
  102 + } else {
  103 + return (
  104 + <Button
  105 + type="link"
  106 + // onClick={changeEnable ? () => {
  107 + // // setVisible(true);
  108 + // setNoRewad(false);
  109 + // SetCurrentItem(record);
  110 + // setItemIndex(index);
  111 + // setVisible(true);
  112 + // } : undefined}
  113 + >
  114 + {text || "--"}
  115 + </Button>
  116 + );
  117 + }
  118 + }}
  119 + />
  120 + <Column
  121 + title={awardWay === 1 ? "中奖概率" : "中奖名额"}
  122 + dataIndex="winningNum"
  123 + width="4%"
  124 + render={(text) => (awardWay === 1 ? `${text}%` : text)}
  125 + />
  126 +
  127 + <Column
  128 + title="奖品"
  129 + dataIndex="giftItems"
  130 + key="prize"
  131 + width="10%"
  132 + render={(
  133 + text: ExternalPromotion.giftItems[],
  134 + record,
  135 + index: number
  136 + ) => text &&
  137 + text.length > 0 &&
  138 + text.map((item, itemIndex: number) => (
  139 + <div key={item.couponCode}>
  140 + <Space key={item.couponCode}>
  141 + <Button
  142 + type="link"
  143 + style={{ padding: 0 }}
  144 + onClick={() => {
  145 + setCoupon({
  146 + ...coupon,
  147 + visible: true,
  148 + confNo: item.couponCode,
  149 + index,
  150 + itemIndex,
  151 + });
  152 + }}
  153 + >
  154 + <span style={{ whiteSpace: 'pre-wrap' }}>{itemIndex + 1}.{item.aliasName}</span>
  155 + </Button>
  156 + </Space>
  157 + </div>
  158 + ))}
  159 + />
  160 + </Table>
  161 + </Card>
  162 +
  163 + <Modal
  164 + title={`${currentItem.awardName ? "编辑" : "新增"}奖品`}
  165 + visible={visible}
  166 + afterClose={() => {
  167 + form.resetFields();
  168 + SetCurrentItem({});
  169 + }}
  170 + // onOk={_onOk}
  171 + onCancel={() => {
  172 + setVisible(false);
  173 + form.resetFields();
  174 + SetCurrentItem({});
  175 + }}
  176 + >
  177 + <Form
  178 + form={form}
  179 + name="basic"
  180 + labelCol={{ span: 6 }}
  181 + wrapperCol={{ span: 16 }}
  182 + // onFinish={_onOk}
  183 + autoComplete="off"
  184 + // initialValues={{
  185 + // awardName: (awardWay === 2 && noReward) ? "谢谢惠顾" : "",
  186 + // }}
  187 + >
  188 + <Form.Item
  189 + label="奖项名称:"
  190 + name="awardName"
  191 + rules={[{ required: true, message: "请输入奖项名称" }]}
  192 + // initialValue={(awardWay === 2 && noReward) ? "谢谢惠顾" : ""}
  193 + >
  194 + <Input
  195 + // disabled={(awardWay === 2 && noReward) || !!currentItem.awardName}
  196 + disabled={currentItem.awardName === "谢谢惠顾"}
  197 + style={{ marginLeft: 40 }}
  198 + />
  199 + </Form.Item>
  200 + <Form.Item
  201 + label={
  202 + // !mulLottery
  203 + // ? "中奖概率(%)":
  204 + awardWay === 1
  205 + ? "中奖概率(%)"
  206 + : "中奖名额"
  207 + }
  208 + name="winningNum"
  209 + >
  210 + <InputNumber disabled={!!currentItem.awardName && disabled} style={{ width: "100%", marginLeft: 40 }} />
  211 + </Form.Item>
  212 + </Form>
  213 + </Modal>
  214 +
  215 + {/* 优惠券配置 */}
  216 + <UpsertCoupon
  217 + visible={coupon.visible}
  218 + disabled
  219 + onCancel={() => setCoupon({ ...coupon, visible: false, confNo: undefined })}
  220 + // onSave={_onSava}
  221 + remark="市场活动"
  222 + confNo={coupon.confNo}
  223 + // carSelectApi={bizType == 1 ? getACarList : undefined}
  224 + // changeEditKeys={couponStatus ? ["aliasName", "schemeList"] : undefined}
  225 + // getCouponDetailsApi={couponStatus ? (v: string) => getCouponChangeDetails({ activityNo, confNo: v }) : undefined}
  226 + // saveChangeCouponApi={couponStatus ? (values: any) => saveChangeCoupon({ ...values, activityNo }) : undefined}
  227 + />
  228 + </>
  229 + );
  230 +}
... ...
src/pages/mkt/ActivityChanges/components/AwardConfigs/index.tsx 0 → 100644
  1 +import React, { useState, useEffect } from "react";
  2 +import { Button, Form, InputNumber, Space, Popconfirm, Spin, Divider, Radio, Row } from "antd";
  3 +// import SignupGifts from "./CouponGifts";
  4 +import SignupGifts from "./Coupons";
  5 +
  6 +interface Props {
  7 + data: any;
  8 + mulLottery: boolean;
  9 +}
  10 +export default function Index({ data, mulLottery }: Props) {
  11 + // const { baseInfo, readOnly, getFlowConfig, getACarList } = useStore();
  12 + // const { activityNo, bizType, changeEnable } = baseInfo;
  13 + // const { data, errMsg, loading } = useInitial(getSignUpDetail, {}, { activityNo, change: changeEnable });
  14 + const [form] = Form.useForm();
  15 + const [saveLoading, setSaveLoading] = useState<boolean>(false);
  16 +
  17 + useEffect(() => {
  18 + form.setFieldsValue({
  19 + ...data,
  20 + // ladderReward: data.ladderReward != null ? Number(data.ladderReward) : 0,
  21 + // awardConfigs: data.awardConfigs ? data.awardConfigs : [{ sortOrder: 1, lotteryMinLimit: 1, awardWay: 1, gifts: [{ parcelType: 2, awardName: "报名有礼", winningNum: 100, giftItems: [] }] }]
  22 + });
  23 + }, [data]);
  24 +
  25 + return (
  26 + <>
  27 + <Form form={form}>
  28 + {/* 优惠券部分 */}
  29 + <Divider orientation="left">赠送奖品详情</Divider>
  30 + {/* <Form.Item
  31 + style={{ width: "100%" }}
  32 + label="发券方式"
  33 + name="ladderReward"
  34 + rules={[{ required: true }]}
  35 + >
  36 + <Radio.Group>
  37 + <Radio value={0}>报名成功则送相同优惠券</Radio>
  38 + <Radio value={1}>按报名顺序不同赠送不同优惠券</Radio>
  39 + </Radio.Group>
  40 + </Form.Item> */}
  41 + <Form.Item
  42 + noStyle
  43 + shouldUpdate={(prevValues, currentValues) => prevValues.ladderReward !== currentValues.ladderReward}
  44 + >
  45 + {({ getFieldValue }) => {
  46 + return (
  47 + <Form.List name="awardConfigs">
  48 + {(fields, { add, remove }) => {
  49 + const _Limit = data.awardConfigs && data.awardConfigs[0].lotteryMaxLimit;
  50 + return (
  51 + <>
  52 + {fields.map(({ key, name, ...restField }, index) => {
  53 + return (
  54 + <Space
  55 + key={key}
  56 + style={{ display: "flex", marginBottom: 8 }}
  57 + direction="vertical"
  58 + >
  59 + <>
  60 + {!!_Limit && mulLottery && (
  61 + <>
  62 + <Divider>第{index + 1}轮</Divider>
  63 + <Space key={key} style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 8, height: 35 }} align="baseline">
  64 + <Row style={{ alignItems: 'baseline' }}>
  65 + <span><span style={{ color: 'red' }}>* </span>参与名额:</span>
  66 + <Form.Item
  67 + {...restField}
  68 + name={[name, 'lotteryMinLimit']}
  69 + >
  70 + <InputNumber placeholder="请输入" disabled precision={0} min={1} />
  71 + </Form.Item>
  72 + <span>~</span>
  73 + <Form.Item
  74 + {...restField}
  75 + name={[name, 'lotteryMaxLimit']}
  76 + >
  77 + <InputNumber disabled precision={0} min={0} />
  78 + </Form.Item>
  79 + <span>名</span>
  80 + </Row>
  81 + {/* {!editDisabled(index) && <MinusCircleOutlined onClick={() => remove(name)} style={{ color: 'red' }} />} */}
  82 + </Space>
  83 + </>
  84 + )}
  85 + <Form.Item
  86 + {...restField}
  87 + noStyle
  88 + shouldUpdate={(prevValues, currentValues) => prevValues.awardConfigs !== currentValues.awardConfigs}
  89 + >
  90 + {({ getFieldValue }) => {
  91 + let _awardWay = getFieldValue("awardConfigs")[index];
  92 + return (
  93 + <Form.Item name={[name, "gifts"]}>
  94 + <SignupGifts disabled awardWay={_awardWay.awardWay} />
  95 + </Form.Item>
  96 + );
  97 + }}
  98 + </Form.Item>
  99 + </>
  100 + </Space>
  101 + );
  102 + // )}
  103 + })}
  104 + {/* {!!_mulLottery && (
  105 + <Button
  106 + type="dashed"
  107 + onClick={() => addRewardTimes()}
  108 + block
  109 + icon={<PlusOutlined />}
  110 + disabled={readOnly && !changeEnable}
  111 + >
  112 + 增加名额配置
  113 + </Button>
  114 + )} */}
  115 + </>
  116 + );
  117 + }}
  118 + </Form.List>
  119 + );
  120 + }}
  121 + </Form.Item>
  122 + </Form>
  123 + </>
  124 + );
  125 +}
... ...
src/pages/mkt/ActivityChanges/components/BaseChangeInfo.tsx
1 1 import React from 'react';
  2 +import moment from 'moment';
  3 +import { Image } from "antd";
  4 +import IMGURL from '@/utils/IMGURL';
2 5  
3   -export default function BaseChangeInfo() {
  6 +export default function BaseChangeInfo({data}: Props) {
4 7 return (
5   - <div />
  8 + <div>
  9 + {data.activityName && <div>活动名称:{data.activityName}</div>}
  10 + {data.endTime && <div>活动结束时间:{data.endTime && moment(data.endTime).format('YYYY.MM.DD HH:mm')}</div>}
  11 + {data.couponInvalidTime && <div>优惠券到期时间:{data.couponInvalidTime && moment(data.couponInvalidTime).format('YYYY.MM.DD HH:mm')}</div>}
  12 + {data.bannerId && (
  13 + <div> 活动轮播图:
  14 + <Image
  15 + width={50}
  16 + height={50}
  17 + placeholder
  18 + src={IMGURL.showImage(data.bannerId)}
  19 + />
  20 + </div>
  21 + )}
  22 + {data.bgId && (
  23 + <div> 活动轮播图:
  24 + <Image
  25 + width={50}
  26 + height={50}
  27 + placeholder
  28 + src={IMGURL.showImage(data.bgId)}
  29 + />
  30 + </div>
  31 + )}
  32 + </div>
6 33 );
7 34 }
8 35 \ No newline at end of file
... ...
src/pages/mkt/ActivityChanges/components/ChangesDetail.tsx
1 1 import React, { useEffect, useState } from 'react';
2   -import { Table, Modal, Tag, Space, Radio, Spin, Tabs } from 'antd';
  2 +import { Table, Modal, Space, Radio, Spin, Tabs } from 'antd';
3 3 import { getChangeDetail, ChangeInfoVO } from '../api';
4   -import moment from 'moment';
5 4 import useInitial from '@/hooks/useInitail';
  5 +import BaseChangeInfo from './BaseChangeInfo';
  6 +import ContentItems from './ContentItems';
  7 +import ScopeDetail from './ScopeDetail';
  8 +// import SignInDetail from './SignInDetail';
6 9  
7 10 const Column = Table.Column;
8 11 interface Props {
... ... @@ -24,33 +27,34 @@ function ChangesDetail(props: Props) {
24 27 }
25 28 }, [id]);
26 29  
  30 + const currentTabsList = (key: string) => {
  31 + return isBefore ? data[key]?.changeData : data[key]?.originData;
  32 + };
  33 +
27 34 const renderTabs = (items: ChangeInfoVO) => {
28 35 const resultList = [];
29 36 for (let key in items) {
30 37 if (Object.prototype.hasOwnProperty.call(items, key)) {
31   - console.log(Object.prototype.hasOwnProperty.call(items, key), key);
32 38 if (key === "baseChangeVo") {
33   - resultList.push({ label: "基础信息变更", key, children: `Content of Tab ${id}` });
  39 + resultList.push({ label: "基础信息变更", key, children: <BaseChangeInfo data={currentTabsList(key)} /> });
  40 + }
  41 + if (key === "scopeChangeApproveVo") {
  42 + resultList.push({ label: "活动范围变更", key, children: <ScopeDetail data={currentTabsList(key)} /> });
34 43 }
35 44 if (key === "signUpChangeVo") {
36   - resultList.push({ label: "报名变更", key, children: `Content of Tab ${id}` });
  45 + resultList.push({ label: "报名变更", key, children: <ContentItems type="报名" data={currentTabsList(key)} /> });
37 46 }
38 47 if (key === "signInChangeVo") {
39   - resultList.push({ label: "签到变更", key, children: `Content of Tab ${id}` });
  48 + resultList.push({ label: "签到变更", key, children: <ContentItems type="签到" data={currentTabsList(key)} /> });
40 49 }
41 50 if (key === "mulChangeVo") {
42   - resultList.push({ label: "多轮抽奖变更", key, children: `Content of Tab ${id}` });
  51 + resultList.push({ label: "多轮抽奖变更", key, children: <ContentItems type="多轮抽奖" data={currentTabsList(key)} /> });
43 52 }
44 53 if (key === "outsideChangeVo") {
45 54 resultList.push({
46 55 label: "外拓变更", key, children: `Content of Tab ${id}`
47 56 });
48 57 }
49   - if (key === "scopeChangeApproveVo") {
50   - resultList.push({
51   - label: "活动范围变更", key, children: `Content of Tab ${id}`
52   - });
53   - }
54 58 }
55 59 }
56 60 return resultList;
... ...
src/pages/mkt/ActivityChanges/components/ContentItems.tsx 0 → 100644
  1 +import React from 'react';
  2 +import moment from 'moment';
  3 +import { Image } from "antd";
  4 +import IMGURL from '@/utils/IMGURL';
  5 +import SignupGifts from '@/pages/mkt/ActivityCreate/ExternalPromotion/components/ActivityFlow/SignupGifts';
  6 +import AwardConfigs from '../components/AwardConfigs';
  7 +
  8 +interface Props {
  9 + data: any;
  10 + type: string;
  11 +}
  12 +export default function ContentItems({ data, type }: Props) {
  13 + return (
  14 + <>
  15 + <div>
  16 + {(type === "报名") && (
  17 + <div>
  18 + {data.joinLimitNum && <div> 报名人数限制:{data.joinLimitNum}人</div>}
  19 + {data.signUpPrice && <div> 报名费:{data.signUpPrice}元</div>}
  20 + {data.saleOrderAmount && <div> 活动期间售后工单金额:{data.saleOrderAmount}元</div>}
  21 + </div>
  22 + )}
  23 + {(type === "签到") && (
  24 + <div>
  25 + {data.startTime && <div>签到开始时间:{data.startTime && moment(data.startTime).format('YYYY.MM.DD HH:mm')}</div>}
  26 + {data.endTime && <div>签到结束时间:{data.endTime && moment(data.endTime).format('YYYY.MM.DD HH:mm')}</div>}
  27 + </div>
  28 + )}
  29 + {(type === "多轮抽奖") && (
  30 + <div>
  31 + {!!data.lotteryNumTotal && <div>抽奖总名额限制:{data.lotteryNumTotal}人</div>}
  32 + {!!data.lotteryAmount && <div>抽奖资金要求:{data.lotteryAmount}元</div>}
  33 + {data.startTime && <div>抽奖开始时间:{data.startTime && moment(data.startTime).format('YYYY.MM.DD HH:mm')}</div>}
  34 + {data.endTime && <div>抽奖结束时间:{data.endTime && moment(data.endTime).format('YYYY.MM.DD HH:mm')}</div>}
  35 + </div>
  36 + )}
  37 + </div>
  38 + {data.awardConfigs && <AwardConfigs data={data} mulLottery={type !== "签到"} />}
  39 + </>
  40 + );
  41 +}
0 42 \ No newline at end of file
... ...
src/pages/mkt/ActivityChanges/components/ScopeDetail.tsx 0 → 100644
  1 +import React, { useState, useEffect } from "react";
  2 +import { CheckCircleOutlined } from '@ant-design/icons';
  3 +import {
  4 + Checkbox,
  5 + Form,
  6 + Select,
  7 + Divider,
  8 + Typography,
  9 + Space,
  10 +} from "antd";
  11 +import useInitial from "@/hooks/useInitail";
  12 +import { getShopApi } from "@/common/api";
  13 +import CarSelect from "@/pages/mkt/ActivityCreate/ExternalPromotion/components/ActivityScope/CarSelect";
  14 +import _ from "lodash";
  15 +
  16 +const { Option } = Select;
  17 +
  18 +export default function Index({ data }: Props) {
  19 + const [form] = Form.useForm();
  20 + const { data: shopsList, loading } = useInitial(getShopApi, [], {});
  21 +
  22 + useEffect(() => {
  23 + const result = data.authShops.map((item: { shopId?: number; shopName?: string; }) => ({ label: item.shopName, value: item.shopId, key: item.shopId }));
  24 + form.setFieldsValue({
  25 + ...data,
  26 + authShops: result,
  27 + });
  28 + }, [data]);
  29 +
  30 + return (
  31 + <Form form={form}>
  32 + {data.authCars && (
  33 + <Form.Item
  34 + label="参与门店:"
  35 + name="authShops"
  36 + rules={[{ required: true, message: "请选择门店" }]}
  37 + >
  38 + <Select
  39 + mode="multiple"
  40 + disabled
  41 + optionFilterProp="children"
  42 + loading={loading}
  43 + showSearch
  44 + labelInValue
  45 + >
  46 + {shopsList.map((item) => (
  47 + <Option key={item.id} value={item.id}>
  48 + {item.name}
  49 + </Option>
  50 + ))}
  51 + </Select>
  52 + </Form.Item>
  53 + )}
  54 + {/* 部分车辆*/}
  55 + {data.authCars && (
  56 + <Form.Item
  57 + label="车辆"
  58 + name="authCars"
  59 + rules={[{ required: true, message: "选择车辆信息" }]}
  60 + >
  61 + <CarSelect disabled />
  62 + </Form.Item>
  63 + )}
  64 + <div style={{ marginTop: 30, marginBottom: 15 }}>*活动报名资格:</div>
  65 + {/* 滚动进池客户可享受外促政策 */}
  66 + {data.nonGoalJoin != null && (
  67 + <Form.Item name="nonGoalJoin" valuePropName="checked">
  68 + <Checkbox disabled>
  69 + 非目标客户可享受外促政策
  70 + </Checkbox>
  71 + </Form.Item>
  72 + )}
  73 + {data.publicity != null && (
  74 + <>
  75 + <div style={{ marginTop: 35, color: '#666' }}>*活动页面展示(C端---{'>'}霏车车小程序)</div>
  76 + <Form.Item name="publicity" valuePropName="checked">
  77 + <Checkbox
  78 + disabled
  79 + >
  80 + 在广告区展示
  81 + </Checkbox>
  82 + </Form.Item>
  83 + </>
  84 + )}
  85 + {data.nonGoalBrowse != null && (
  86 + <>
  87 + <div style={{ marginTop: 30, color: '#666' }}>*车系详情中"查看优惠"页面展示活动信息</div>
  88 + <Form.Item name="nonGoalBrowse" valuePropName="checked">
  89 + <Checkbox disabled> 非目标客户可查看</Checkbox>
  90 + </Form.Item>
  91 + </>
  92 + )}
  93 + </Form>
  94 + );
  95 +}
... ...
src/pages/mkt/ActivityChanges/index.tsx
1   -import React, { useState } from 'react';
  1 +import React, { useEffect, useState } from 'react';
2 2 import { Input, Card, Row, Table, Select, Tag, message } from 'antd';
3 3 import { PageHeaderWrapper } from '@ant-design/pro-layout';
4 4 import { getActivityChangeLog, getEvaluateWinListApi, ListVO, PrizeItemList } from './api';
5 5 import moment from 'moment';
6 6 import { debounce } from 'lodash';
  7 +import * as common from '@/typing/common';
7 8 import ChangesDetail from './components/ChangesDetail';
8 9 import useInitial from '@/hooks/useInitail';
9 10  
  11 +interface Props extends common.ConnectProps { }
  12 +
10 13 const Search = Input.Search;
11 14 const Column = Table.Column;
12 15  
... ... @@ -15,12 +18,13 @@ interface ModalParams {
15 18 id?: number;
16 19 }
17 20 const AssistManage = (props: any) => {
18   - const [delay, setDelay] = useState(true);
19   -
  21 + const { match } = props;
  22 + const { activityNo } = match.params;
  23 + const [delay, setDelay] = useState(true);
20 24 const { loading, data, params, setData, setParams } = useInitial(getActivityChangeLog, [], {}, delay);
21 25 const [modalValue, setModaValue] = useState<ModalParams>({ visible: false });
22 26  
23   - const _onSearch = debounce((pa: any) => {
  27 + const _onSearch = debounce((pa: any) => {
24 28 if (!pa.activityNo && !params.activityNo) {
25 29 message.info("请先输入活动编码查询");
26 30 setData([]);
... ... @@ -30,12 +34,19 @@ const AssistManage = (props: any) =&gt; {
30 34 setDelay(false);
31 35 }, 500);
32 36  
  37 + useEffect(() => {
  38 + if (activityNo) {
  39 + setParams({ activityNo }, true);
  40 + setDelay(false);
  41 + }
  42 + }, [activityNo]);
33 43 return (
34 44 <PageHeaderWrapper title="活动变更记录">
35 45 <Card>
36 46 <Row style={{ justifyContent: "start", marginBottom: 20 }}>
37 47 <Search
38 48 allowClear
  49 + value={params.activityNo}
39 50 onChange={e => (e.target.value ? _onSearch({ activityNo: e.target.value }) : setParams({ ...params, activityNo: undefined }))}
40 51 onSearch={v => v && _onSearch({ activityNo: v })}
41 52 style={{ maxWidth: 230, marginRight: 30 }}
... ... @@ -66,17 +77,17 @@ const AssistManage = (props: any) =&gt; {
66 77 <Column
67 78 title="申请时间"
68 79 dataIndex="applyTime"
69   - render={(t) => t&&moment(t).format("YYYY-MM-DD HH:mm")}
  80 + render={(t) => t && moment(t).format("YYYY-MM-DD HH:mm")}
70 81 />
71 82 <Column
72 83 title="审批时间"
73 84 dataIndex="approvalTime"
74   - render={(t) => t&&moment(t).format("YYYY-MM-DD HH:mm")}
  85 + render={(t) => t && moment(t).format("YYYY-MM-DD HH:mm")}
75 86 />
76 87 <Column
77 88 title="审批结果"
78 89 dataIndex="approvalResult"
79   - render={t => (t?"通过":"拒绝")}
  90 + render={t => (t ? "通过" : "拒绝")}
80 91 />
81 92 <Column
82 93 title="变更详情"
... ...
src/pages/mkt/ActivityCreate/ExternalPromotion/components/ActivityScope/CarSelect.tsx
... ... @@ -120,16 +120,18 @@ export default function index({ onChange, value, disabled }: Props) {
120 120 <>
121 121 <Card>
122 122 <div style={{ display: "flex", justifyContent: "flex-end" }}>
123   - <Button
124   - type="link"
125   - disabled={disabled}
126   - onClick={() => {
127   - setVisible(true);
128   - form.resetFields();
129   - }}
130   - >
131   - 新增
132   - </Button>
  123 + {!disabled && (
  124 + <Button
  125 + type="link"
  126 + disabled={disabled}
  127 + onClick={() => {
  128 + setVisible(true);
  129 + form.resetFields();
  130 + }}
  131 + >
  132 + 新增
  133 + </Button>
  134 + )}
133 135 </div>
134 136  
135 137 <Table
... ...
src/pages/mkt/ActivityManage/components/Operation.tsx
... ... @@ -43,6 +43,10 @@ export default function Oparetion(props: Props) {
43 43 function changeBaseInfo() {
44 44 history.push(`/mkt/manage/create/${record.activityNo}/${record.status}/change`);
45 45 }
  46 + /** 变更记录 */
  47 + function changeRecords() {
  48 + history.push(`/mkt/prize/record/changes/${record.activityNo}`);
  49 + }
46 50  
47 51 /** 删除 */
48 52 function deleteItem(row: MarketingManage.Item) {
... ... @@ -105,6 +109,7 @@ export default function Oparetion(props: Props) {
105 109 if ([4, 5].includes(status) && record.changeStatus !== 2) {
106 110 menus = [
107 111 <Button type="primary" ghost size="small" onClick={changeBaseInfo}>变更信息</Button>,
  112 + <Button type="primary" ghost size="small" onClick={changeRecords}>变更记录</Button>,
108 113 // <Button danger ghost size="small" onClick={endActivity}>终止</Button>,
109 114 ];
110 115 }
... ...