Blame view

src/pages/order3/SaleTask/index.tsx 15.7 KB
6c7c2fa5   Shinner   编辑车系任务最大位数
1
  import React, { useEffect, useState } from "react";
32942bc1   Shinner   增加零售任务分配菜单静态页面
2
3
4
5
6
7
8
9
10
11
12
13
14
  import {
    Card,
    Table,
    DatePicker,
    Row,
    message,
    Input,
    Button,
    Modal,
  } from "antd";
  import * as API from "./api";
  import { PageHeaderWrapper } from "@ant-design/pro-layout";
  import { history } from "umi";
d24e7d31   Shinner   增加零售任务分配菜单静态页面
15
  import moment, { Moment } from "moment";
32942bc1   Shinner   增加零售任务分配菜单静态页面
16
17
  import useInitial from "@/hooks/useInitail";
  import { Provider, useStore } from "./store";
bdad4eb5   Shinner   调试自动分配接口
18
  import ApprovalProgressModal from "@/pages/stock/AdvanceProgress/components/ApproveModal";
aeeb3492   Shinner   增加预览任务功能
19
20
21
22
  import EntryTaskPreview from "./components/EntryTaskPreview";
  import { OrderTaskApprovalType } from "./entity";
  import AdviserTaskPreview from "./components/AdviserTaskPreview";
  import SeriesTaskPreview from "./components/SeriesTaskPreview";
4d0d5719   Shinner   提交审批增加备注和附件提交
23
  import ApproveModal from "@/pages/order3/Common/ApproveModal";
bdad4eb5   Shinner   调试自动分配接口
24
25
  import SaleTaskAutoAssign from "./components/SaleTaskAutoAssign";
  import SaleTaskBatchSet from "./components/SaleTaskBatchSet";
02999d30   Shinner   零售任务分配入口列表二级表头
26
  import { ColumnsType } from "antd/es/table";
32942bc1   Shinner   增加零售任务分配菜单静态页面
27
28
29
30
31
32
33
34
  
  export default () => (
    <Provider>
      <SaleTaskList />
    </Provider>
  );
  
  function SaleTaskList() {
e26233dd   Shinner   更换审批进度组件
35
36
    const { isReadOnly, setShopTaskItem, setIsReadOnly } = useStore();
    const [approve, setApprove] = useState({ visible: false, orderNo: "" });
4d0d5719   Shinner   提交审批增加备注和附件提交
37
    const [approveOpen, setApproveOpen] = useState(false);
32942bc1   Shinner   增加零售任务分配菜单静态页面
38
    const [targetMonth, setTargetMonth] = useState(moment());
aeeb3492   Shinner   增加预览任务功能
39
40
41
42
43
44
    const [etpVisible, setEtpVisible] = useState(false);
    const [previewTaskParams, setPreviewTaskParams] = useState({});
    const [atpVisible, setAtpVisible] = useState(false);
    const [adviserTaskParams, setAdviserTaskParams] = useState({});
    const [stpVisible, setStpVisible] = useState(false);
    const [seriesTaskParams, setSeriesTaskParams] = useState({});
a21e5b52   Shinner   增加零售任务分配菜单静态页面
45
  
bdad4eb5   Shinner   调试自动分配接口
46
47
48
    const [autoVisible, setAutoVisible] = useState(false);
    const [batchVisible, setBatchVisible] = useState(false);
  
32942bc1   Shinner   增加零售任务分配菜单静态页面
49
50
51
52
    const { data, loading, setParams } = useInitial(
      API.getSaleTaskApi,
      {} as API.GetSaleTaskApiRes,
      {
3b0d1ee6   Shinner   增加零售任务分配菜单静态页面
53
        taskDate: targetMonth.valueOf(),
32942bc1   Shinner   增加零售任务分配菜单静态页面
54
55
56
      }
    );
  
d24e7d31   Shinner   增加零售任务分配菜单静态页面
57
    useEffect(() => {
df7d79e7   Shinner   调试零售任务分配接口
58
      setIsReadOnly(!data.canModified);
d24e7d31   Shinner   增加零售任务分配菜单静态页面
59
60
    }, [data]);
  
d24e7d31   Shinner   增加零售任务分配菜单静态页面
61
62
63
64
65
66
    const handleChangeMonth = (date: Moment | null) => {
      setTargetMonth(moment(date));
      setParams({ taskDate: moment(date).valueOf() }, true);
    };
  
    const goToEditPage = (record: API.ShopTaskItem) => {
32942bc1   Shinner   增加零售任务分配菜单静态页面
67
      setShopTaskItem(record);
32942bc1   Shinner   增加零售任务分配菜单静态页面
68
69
      history.push({
        pathname: "/order3/saleTask/edit",
11ea8143   Shinner   调试零售任务分配接口
70
71
72
73
        query: {
          readOnly: isReadOnly ? "1" : "0",
          shopId: String(record.shopId),
          taskDate: String(targetMonth.valueOf()),
d24e7d31   Shinner   增加零售任务分配菜单静态页面
74
        },
32942bc1   Shinner   增加零售任务分配菜单静态页面
75
76
77
      });
    };
  
bdad4eb5   Shinner   调试自动分配接口
78
79
80
81
82
83
84
85
86
87
88
89
90
    // 查看销顾任务
    const goToAdviserPage = (record: API.ShopTaskItem) => {
      history.push({
        pathname: "/order3/saleTask/edit",
        query: {
          readOnly: isReadOnly ? "1" : "0",
          shopId: String(record.shopId),
          taskDate: String(targetMonth.valueOf()),
          currTab: "2",
        },
      });
    };
  
11ea8143   Shinner   调试零售任务分配接口
91
92
    // 查看流程进度
    const viewProcess = () => {
e26233dd   Shinner   更换审批进度组件
93
      setApprove({
11ea8143   Shinner   调试零售任务分配接口
94
        visible: true,
11ea8143   Shinner   调试零售任务分配接口
95
96
97
98
        orderNo: data.approvalNumber,
      });
    };
  
a21e5b52   Shinner   增加零售任务分配菜单静态页面
99
    const cancelSaleTask = () => {
32942bc1   Shinner   增加零售任务分配菜单静态页面
100
101
      Modal.confirm({
        title: "提示",
11ea8143   Shinner   调试零售任务分配接口
102
        content: `确认撤销【${targetMonth.format("YYYY-MM")}】零售任务审批吗?`,
32942bc1   Shinner   增加零售任务分配菜单静态页面
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
        zIndex: 1002,
        onOk: () => {
          API.cancelSaleTask({
            id: data.id,
          })
            .then((res) => {
              message.success("撤销成功");
            })
            .catch((error: any) => {
              message.error(error.message ?? "请求失败");
            })
            .finally(() => {
              setParams({}, true);
            });
        },
      });
    };
  
4d0d5719   Shinner   提交审批增加备注和附件提交
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
    const submitSaleTask = (parmas: any) => {
      const hide = message.loading("提交中", 0);
      API.submitSaleTask({
        id: data.id,
        ...parmas,
      })
        .then((res) => {
          message.success("提交成功");
        })
        .catch((error: any) => {
          message.error(error.message ?? "请求失败");
        })
        .finally(() => {
          hide();
          setParams({}, true);
        });
a21e5b52   Shinner   增加零售任务分配菜单静态页面
137
138
    };
  
aeeb3492   Shinner   增加预览任务功能
139
140
141
142
143
144
145
146
147
    const handlePreviewTask = () => {
      const params: any = {
        id: data.id,
        orderTaskApprovalType: OrderTaskApprovalType.门店维度,
      };
      setPreviewTaskParams(params);
      setEtpVisible(true);
    };
  
bdad4eb5   Shinner   调试自动分配接口
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
    // 销顾任务
    const showAdviserModal = (
      record: API.TaskListItem,
      type: OrderTaskApprovalType
    ) => {
      const params: any = {
        id: data.id,
        taskId: record.id,
        orderTaskApprovalType: OrderTaskApprovalType.门店维度, // 只有门店有查看销顾任务
      };
      switch (type) {
        case OrderTaskApprovalType.门店维度:
          params.shopId = record.dataId;
          break;
        case OrderTaskApprovalType.销售顾问维度:
          params.staffId = record.dataId;
          break;
        case OrderTaskApprovalType.新车一级管理维度:
          params.firstManageId = record.dataId;
          break;
        case OrderTaskApprovalType.新车二级管理维度:
          params.secondManageId = record.dataId;
          break;
        case OrderTaskApprovalType.新车三级管理维度:
          params.thirdManageId = record.dataId;
          break;
        default:
          break;
      }
      setAdviserTaskParams(params);
      setAtpVisible(true);
    };
  
    // 销顾任务--查看车系任务
    const showSeriesModalByAdviser = (record: API.TaskListItem) => {
      const params = { ...adviserTaskParams } as any;
      params.taskId = record.id;
      params.orderTaskApprovalType = OrderTaskApprovalType.车系;
      params.staffId = record.dataId;
      setSeriesTaskParams(params);
      setStpVisible(true);
    };
  
    // 车系任务
    const showSeriesModal = (
      record: API.TaskListItem,
      type: OrderTaskApprovalType
    ) => {
      const params: any = {
        id: data.id,
        taskId: record.id,
        orderTaskApprovalType: OrderTaskApprovalType.车系,
      };
      switch (type) {
        case OrderTaskApprovalType.门店维度:
          params.shopId = record.dataId;
          break;
        case OrderTaskApprovalType.销售顾问维度:
          params.staffId = record.dataId;
          break;
        case OrderTaskApprovalType.新车一级管理维度:
          params.firstManageId = record.dataId;
          break;
        case OrderTaskApprovalType.新车二级管理维度:
          params.secondManageId = record.dataId;
          break;
        case OrderTaskApprovalType.新车三级管理维度:
          params.thirdManageId = record.dataId;
          break;
        default:
          break;
      }
      setSeriesTaskParams(params);
      setStpVisible(true);
    };
  
a60f9f4a   Shinner   调试批量设置接口
224
225
226
227
228
229
230
231
232
    const handleAutoAssignRefresh = () => {
      setAutoVisible(false);
      setParams({}, true);
    };
    const handleBatchSetRefresh = () => {
      setBatchVisible(false);
      setParams({}, true);
    };
  
02999d30   Shinner   零售任务分配入口列表二级表头
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
    const columns: ColumnsType<API.ShopTaskItem> = [
      {
        title: "门店",
        dataIndex: "shopName",
      },
      {
        title: "零售任务(台)",
        width: 100,
        children: [
          {
            title: "合计",
            dataIndex: "taskCount",
            key: "taskCount",
          },
          {
            title: "新能源车",
            dataIndex: "newEnergyTaskCount",
            key: "newEnergyTaskCount",
          },
          {
            title: "传统燃油车",
            dataIndex: "fuelVehicleTaskCount",
            key: "fuelVehicleTaskCount",
          },
          {
            title: "毛利任务(元)",
            children: [
              {
                title: "单车",
                dataIndex: "vehicleGrossProfitTask",
                key: "vehicleGrossProfitTask",
              },
              {
                title: "合计",
                dataIndex: "grossProfitTaskTotal",
                key: "grossProfitTaskTotal",
                render: (text: string, record: API.ShopTaskItem) => {
                  return (
                    record.taskCount * record.vehicleGrossProfitTask
                  ).toFixed(2);
                },
              },
            ],
          },
        ],
      },
      {
        title: "其中(台)",
        children: [
          {
            title: "线索到店零售",
            dataIndex: "clueDealTaskCount",
            key: "clueDealTaskCount",
          },
          {
            title: "首客试驾成交",
            dataIndex: "testDriveTaskCount",
            key: "testDriveTaskCount",
          },
          {
            title: "攻坚车",
            dataIndex: "tackCarTaskCount",
            key: "tackCarTaskCount",
          },
          {
            title: "车系",
            dataIndex: "seriesTaskCount",
            key: "seriesTaskCount",
          },
        ],
      },
      {
        title: "销顾任务",
        render: (text: string, record: API.ShopTaskItem) => {
          return (
            <a
              onClick={() => {
                goToAdviserPage(record);
              }}
            >
              查看
            </a>
          );
        },
      },
      {
        title: "操作",
        render: (text: string, record: API.ShopTaskItem) => {
          return (
            <a
              onClick={() => {
                goToEditPage(record);
              }}
            >
              {isReadOnly ? "查看" : "编辑"}
            </a>
          );
        },
      },
    ];
  
32942bc1   Shinner   增加零售任务分配菜单静态页面
334
335
336
    return (
      <PageHeaderWrapper title="零售任务分配">
        <Card>
bdad4eb5   Shinner   调试自动分配接口
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
          <Row
            align="middle"
            justify="space-between"
            style={{ marginBottom: 20 }}
          >
            <Row align="middle" justify="start" style={{ marginBottom: 20 }}>
              <DatePicker
                placeholder="月度"
                style={{ width: 260 }}
                picker="month"
                value={targetMonth}
                onChange={handleChangeMonth}
                allowClear={false}
              />
              <Input.Search
                allowClear
                placeholder="门店名称"
                style={{ width: 260, marginLeft: 15 }}
                onSearch={(v) => {
                  setParams({ shopName: v }, true);
                }}
              />
            </Row>
            {!isReadOnly && (
              <Row align="middle" justify="start" style={{ marginBottom: 20 }}>
                <Button type="primary" onClick={() => setAutoVisible(true)}>
                  零售任务快捷分配
                </Button>
                <Button
                  type="primary"
                  style={{ marginLeft: 10 }}
                  onClick={() => setBatchVisible(true)}
                >
                  批量设置
                </Button>
              </Row>
            )}
32942bc1   Shinner   增加零售任务分配菜单静态页面
374
375
376
          </Row>
          <Table
            rowKey="id"
02999d30   Shinner   零售任务分配入口列表二级表头
377
            bordered
32942bc1   Shinner   增加零售任务分配菜单静态页面
378
            loading={loading}
02999d30   Shinner   零售任务分配入口列表二级表头
379
            columns={columns}
32942bc1   Shinner   增加零售任务分配菜单静态页面
380
381
            dataSource={data.shopTaskList}
            pagination={false}
df7d79e7   Shinner   调试零售任务分配接口
382
            scroll={{ y: 450 }}
32942bc1   Shinner   增加零售任务分配菜单静态页面
383
            summary={() => {
a21e5b52   Shinner   增加零售任务分配菜单静态页面
384
385
386
              if (!data || !data.shopTaskList || data.shopTaskList.length <= 0) {
                return null;
              }
32942bc1   Shinner   增加零售任务分配菜单静态页面
387
388
389
390
391
392
393
394
395
              return (
                <Table.Summary fixed="bottom">
                  <Table.Summary.Row
                    style={{
                      background: "#FAFAFA",
                      fontSize: 18,
                      fontWeight: 500,
                    }}
                  >
bdad4eb5   Shinner   调试自动分配接口
396
397
                    <Table.Summary.Cell index={1}>合计</Table.Summary.Cell>
                    <Table.Summary.Cell index={2}>
32942bc1   Shinner   增加零售任务分配菜单静态页面
398
399
                      {data.totalTaskCount}
                    </Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
400
                    <Table.Summary.Cell index={3}>
32942bc1   Shinner   增加零售任务分配菜单静态页面
401
402
                      {data.newEnergyTaskCount}
                    </Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
403
                    <Table.Summary.Cell index={4}>
32942bc1   Shinner   增加零售任务分配菜单静态页面
404
405
                      {data.fuelVehicleTaskCount}
                    </Table.Summary.Cell>
02999d30   Shinner   零售任务分配入口列表二级表头
406
407
                    <Table.Summary.Cell index={5}>-</Table.Summary.Cell>
                    <Table.Summary.Cell index={6}>-</Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
408
                    <Table.Summary.Cell index={7}>
eb77f47f   Shinner   增加表单交互
409
                      {data.clueDealTaskCount}
11ea8143   Shinner   调试零售任务分配接口
410
                    </Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
411
                    <Table.Summary.Cell index={8}>
eb77f47f   Shinner   增加表单交互
412
413
                      {data.testDriveTaskCount}
                    </Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
414
                    <Table.Summary.Cell index={9}>
4ddb4140   Shinner   调试零售任务分配接口
415
                      {data.tackCarTaskCount}
11ea8143   Shinner   调试零售任务分配接口
416
                    </Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
417
                    <Table.Summary.Cell index={10}>
eb77f47f   Shinner   增加表单交互
418
419
                      {data.seriesTaskCount}
                    </Table.Summary.Cell>
bdad4eb5   Shinner   调试自动分配接口
420
421
                    <Table.Summary.Cell index={11} />
                    <Table.Summary.Cell index={12} />
32942bc1   Shinner   增加零售任务分配菜单静态页面
422
423
424
425
                  </Table.Summary.Row>
                </Table.Summary>
              );
            }}
02999d30   Shinner   零售任务分配入口列表二级表头
426
          />
df7d79e7   Shinner   调试零售任务分配接口
427
          {data.revoke ? (
d24e7d31   Shinner   增加零售任务分配菜单静态页面
428
            <Row align="middle" justify="center" style={{ marginTop: 50 }}>
df7d79e7   Shinner   调试零售任务分配接口
429
430
431
432
433
434
435
436
              <Button onClick={cancelSaleTask}>撤销</Button>
              <Button
                type="primary"
                style={{ marginLeft: 10 }}
                onClick={viewProcess}
              >
                审批进度
              </Button>
aeeb3492   Shinner   增加预览任务功能
437
438
439
440
441
442
443
              <Button
                type="primary"
                style={{ marginLeft: 10 }}
                onClick={handlePreviewTask}
              >
                预览任务
              </Button>
df7d79e7   Shinner   调试零售任务分配接口
444
445
            </Row>
          ) : (
4c5bad19   Shinner   预览任务按钮显示与是否审批无关;调整样式
446
447
            <Row align="middle" justify="center" style={{ marginTop: 50 }}>
              {!isReadOnly && (
4d0d5719   Shinner   提交审批增加备注和附件提交
448
                <Button type="primary" onClick={() => setApproveOpen(true)}>
d24e7d31   Shinner   增加零售任务分配菜单静态页面
449
                  提交审批
32942bc1   Shinner   增加零售任务分配菜单静态页面
450
                </Button>
4c5bad19   Shinner   预览任务按钮显示与是否审批无关;调整样式
451
452
453
454
455
456
457
458
459
              )}
              <Button
                type="primary"
                style={{ marginLeft: 10 }}
                onClick={handlePreviewTask}
              >
                预览任务
              </Button>
            </Row>
d24e7d31   Shinner   增加零售任务分配菜单静态页面
460
          )}
32942bc1   Shinner   增加零售任务分配菜单静态页面
461
        </Card>
a21e5b52   Shinner   增加零售任务分配菜单静态页面
462
        <Modal
aeeb3492   Shinner   增加预览任务功能
463
464
465
466
          width={1200}
          title="预览任务"
          open={etpVisible}
          onCancel={() => setEtpVisible(false)}
a21e5b52   Shinner   增加零售任务分配菜单静态页面
467
468
469
          destroyOnClose
          footer={null}
        >
aeeb3492   Shinner   增加预览任务功能
470
471
472
473
474
475
476
477
478
          <Row align="middle" justify="start" style={{ marginBottom: 20 }}>
            <DatePicker
              placeholder="月度"
              style={{ width: 230 }}
              picker="month"
              value={targetMonth}
              allowClear={false}
              disabled
            />
6c7c2fa5   Shinner   编辑车系任务最大位数
479
            {/* <Input.Search
aeeb3492   Shinner   增加预览任务功能
480
481
482
483
484
485
              allowClear
              placeholder="门店名称"
              style={{ width: 263, marginLeft: 20 }}
              onSearch={(v) => {
                // todo setParams({ shopName: v }, true);
              }}
6c7c2fa5   Shinner   编辑车系任务最大位数
486
            /> */}
aeeb3492   Shinner   增加预览任务功能
487
488
489
          </Row>
          <EntryTaskPreview
            params={previewTaskParams}
bdad4eb5   Shinner   调试自动分配接口
490
491
            showAdviserModal={showAdviserModal}
            showSeriesModal={showSeriesModal}
aeeb3492   Shinner   增加预览任务功能
492
493
494
495
496
497
498
499
500
501
502
503
          />
        </Modal>
        <Modal
          width={1200}
          title="销顾任务"
          open={atpVisible}
          onCancel={() => setAtpVisible(false)}
          destroyOnClose
          footer={null}
        >
          <AdviserTaskPreview
            params={adviserTaskParams}
bdad4eb5   Shinner   调试自动分配接口
504
            showSeriesModal={showSeriesModalByAdviser}
aeeb3492   Shinner   增加预览任务功能
505
506
507
508
509
510
511
512
513
514
515
          />
        </Modal>
        <Modal
          width={600}
          title="车系任务"
          open={stpVisible}
          onCancel={() => setStpVisible(false)}
          destroyOnClose
          footer={null}
        >
          <SeriesTaskPreview params={seriesTaskParams} />
a21e5b52   Shinner   增加零售任务分配菜单静态页面
516
        </Modal>
bdad4eb5   Shinner   调试自动分配接口
517
518
519
520
        <Modal
          width={800}
          title="零售任务快捷分配"
          open={autoVisible}
90c2447f   Shinner   零售任务快捷分配交互优化
521
          onCancel={() => setAutoVisible(false)}
bdad4eb5   Shinner   调试自动分配接口
522
523
          destroyOnClose
          footer={null}
a60f9f4a   Shinner   调试批量设置接口
524
          maskClosable={false}
bdad4eb5   Shinner   调试自动分配接口
525
526
527
528
        >
          <SaleTaskAutoAssign
            id={data.id}
            value={data.shopTaskList}
90c2447f   Shinner   零售任务快捷分配交互优化
529
            onCancel={() => setAutoVisible(false)}
a60f9f4a   Shinner   调试批量设置接口
530
            onRefresh={handleAutoAssignRefresh}
bdad4eb5   Shinner   调试自动分配接口
531
532
533
534
535
536
          />
        </Modal>
        <Modal
          width={800}
          title="批量设置"
          open={batchVisible}
90c2447f   Shinner   零售任务快捷分配交互优化
537
          onCancel={() => setBatchVisible(false)}
bdad4eb5   Shinner   调试自动分配接口
538
539
          destroyOnClose
          footer={null}
a60f9f4a   Shinner   调试批量设置接口
540
          maskClosable={false}
bdad4eb5   Shinner   调试自动分配接口
541
        >
90c2447f   Shinner   零售任务快捷分配交互优化
542
543
544
545
546
          <SaleTaskBatchSet
            id={data.id}
            onCancel={() => setBatchVisible(false)}
            onRefresh={handleBatchSetRefresh}
          />
bdad4eb5   Shinner   调试自动分配接口
547
        </Modal>
e26233dd   Shinner   更换审批进度组件
548
549
550
551
552
        <ApprovalProgressModal
          visible={approve.visible}
          orderNo={approve.orderNo}
          onCancel={() => setApprove({ visible: false, orderNo: "" })}
        />
4d0d5719   Shinner   提交审批增加备注和附件提交
553
554
555
556
557
        <ApproveModal
          callback={submitSaleTask}
          open={approveOpen}
          setOpen={setApproveOpen}
        />
32942bc1   Shinner   增加零售任务分配菜单静态页面
558
559
560
      </PageHeaderWrapper>
    );
  }