From d03a9f2ff367dba0d99f5f11680fdf8dc05a542a Mon Sep 17 00:00:00 2001 From: shushujun Date: Thu, 22 Dec 2022 09:33:51 +0800 Subject: [PATCH] 线索目标接通配置 --- config/routers/crm_new.ts | 6 +++++- src/pages/crm_new/CluesConnectTargetEffectively/api.ts | 34 ++++++++++++++++++++++++++++++++++ src/pages/crm_new/CluesConnectTargetEffectively/components/EditModal.tsx | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pages/crm_new/CluesConnectTargetEffectively/components/List.tsx | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pages/crm_new/CluesConnectTargetEffectively/components/ShopModal.tsx | 38 ++++++++++++++++++++++++++++++++++++++ src/pages/crm_new/CluesConnectTargetEffectively/index.tsx | 38 ++++++++++++++++++++++++++++++++++++++ src/pages/crm_new/CluesConnectTargetEffectively/store.ts | 31 +++++++++++++++++++++++++++++++ 7 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 src/pages/crm_new/CluesConnectTargetEffectively/api.ts create mode 100644 src/pages/crm_new/CluesConnectTargetEffectively/components/EditModal.tsx create mode 100644 src/pages/crm_new/CluesConnectTargetEffectively/components/List.tsx create mode 100644 src/pages/crm_new/CluesConnectTargetEffectively/components/ShopModal.tsx create mode 100644 src/pages/crm_new/CluesConnectTargetEffectively/index.tsx create mode 100644 src/pages/crm_new/CluesConnectTargetEffectively/store.ts diff --git a/config/routers/crm_new.ts b/config/routers/crm_new.ts index bf6d361..238278a 100644 --- a/config/routers/crm_new.ts +++ b/config/routers/crm_new.ts @@ -77,8 +77,12 @@ export default [ path: '/crm/threePartyPlatformClue', // 三方平台线索配置 component: './crm_new/ThreePartyPlatformClue', }, - { + { path: '/crm/closeClue', // 暂停区域线索站岗分配 component: './crm_new/Settings/subpages/CloseClue', }, + { + path: '/crm/clueConnect', // 线索有效接通配置 + component: './crm_new/CluesConnectTargetEffectively', + }, ]; \ No newline at end of file diff --git a/src/pages/crm_new/CluesConnectTargetEffectively/api.ts b/src/pages/crm_new/CluesConnectTargetEffectively/api.ts new file mode 100644 index 0000000..554f59f --- /dev/null +++ b/src/pages/crm_new/CluesConnectTargetEffectively/api.ts @@ -0,0 +1,34 @@ +import request from '@/utils/request'; +import { CRM_HOST } from '@/utils/host'; + +export interface Result { + id?: number // 配置id + dialAims?: number // 线索接通目标 + displayName?: string // 显示名称 + shopList?: ShopList[] // 门店列表 +} + +export interface ShopList { + shopId?: number // 门店id + shopName?: string // 门店名称 +} + +/** 查询线索拨通目标配置列表 */ +export function getConfigApi() { + return request.get(`${CRM_HOST}/erp/clue/dial/aims/config/list`); +} + +/** 查询线索拨通目标已配置的门店 */ +export function getHaveShopListApi() { + return request.get(`${CRM_HOST}/erp/clue/dial/aims/config/already/exists/shopIds`); +} + +/** 保存线索拨通目标配置 */ +export function saveConfigApi(params: Result) { + return request.post(`${CRM_HOST}/erp/clue/dial/aims/config/save`, params); +} + +/** 删除线索拨通目标配置 */ +export function deleteConfigApi(id?: number) { + return request.post(`${CRM_HOST}/erp/clue/dial/aims/config/delete`, {id}, {contentType: 'form-urlencoded'}); +} \ No newline at end of file diff --git a/src/pages/crm_new/CluesConnectTargetEffectively/components/EditModal.tsx b/src/pages/crm_new/CluesConnectTargetEffectively/components/EditModal.tsx new file mode 100644 index 0000000..f45d27c --- /dev/null +++ b/src/pages/crm_new/CluesConnectTargetEffectively/components/EditModal.tsx @@ -0,0 +1,124 @@ +import React, { useState, useEffect } from 'react'; +import { Button, Form, message, InputNumber, Select, Modal} from 'antd'; +import ShopSelectNew from '@/components/ShopSelectNew'; +import { useStore } from '../index'; +import { saveConfigApi, getHaveShopListApi } from '../api'; +import { debounce } from 'lodash'; + +const Option = Select.Option; + +export default function Index() { + const [form] = Form.useForm(); + const { current, setCurrent, setLoading } = useStore(); + const [confirm, setConfirm] = useState(false); + const [disabledShopIds, setDisabledShopIds] = useState([]); + + useEffect(() => { + if (current.visible && current.data.id) { + handleSetValue(); + const shopList = current.data.shopList || []; + getHaveShopListApi() + .then(res => { + const shopIdList = res.data || []; + const _shopIds = shopList.map(v => v.shopId) || []; + const disabledShop = shopIdList.filter(v => !(_shopIds.includes(v))) || []; + setDisabledShopIds(disabledShop); + }) + .catch(e => { + message.error(e.message); + }); + } else { + getHaveShopListApi() + .then(res => { + const shopIdList = res.data || []; + setDisabledShopIds(shopIdList); + }) + .catch(e => { + message.error(e.message); + }); + } + }, [current.visible]); + + function handleCancle() { + setCurrent({visible: false, data: {}}); + } + + async function handleSubmit() { + const params = await form.validateFields(); + setConfirm(true); + const _params = { + id: current.data?.id, + dialAims: params.dialAims, + shopList: params.shopList?.map((v: any) => ({shopId: v.value, shopName: v.label})) + }; + saveConfigApi(_params) + .then(res => { + message.success(res.result); + setConfirm(false); + setCurrent({visible: false, data: {}}); + setLoading(true); + }) + .catch(e => { + message.error(e.message); + setConfirm(false); + }); + } + + function handleSetValue() { + form.setFieldsValue({ + dialAims: current.data.dialAims, + shopList: current.data.shopList?.map((v: any) => ({label: v.shopName, value: v.shopId})) + }); + } + + function handleResetValue() { + form.setFieldsValue({shopList: [], dialAims: undefined}); + } + return ( + handleResetValue()} + width="60%" + footer={[ + , + + ]} + > +
+ + + `${value}条/天`} + precision={0} + parser={value => value?.replace('条/天', '')} + /> + + + + + +
+ +
+ ); +} \ No newline at end of file diff --git a/src/pages/crm_new/CluesConnectTargetEffectively/components/List.tsx b/src/pages/crm_new/CluesConnectTargetEffectively/components/List.tsx new file mode 100644 index 0000000..b719e87 --- /dev/null +++ b/src/pages/crm_new/CluesConnectTargetEffectively/components/List.tsx @@ -0,0 +1,63 @@ +import React from "react"; +import { message, Popconfirm, Table, Space } from "antd"; +import { useStore } from '../index'; +import {deleteConfigApi, Result } from '../api'; + +const Column = Table.Column; + +export default function TableList() { + const {data, loading, setLoading, setShopData, setCurrent } = useStore(); + + function handleDelete(id?: number) { + deleteConfigApi(id) + .then(res => { + message.success(res.result); + setLoading(true); + }) + .catch(e => { + message.error(e.message); + }); + } + + return ( +
+ + + setShopData({visible: true, data: record.shopList || []})}>{_text}} + /> + { + return ( + + setCurrent({visible: true, data: record})} style={{ display: "block", color: "#4189FD" }}>编辑 + handleDelete(record.id)} + > + 删除 + + + ); + }} + /> +
+
+ ); +} diff --git a/src/pages/crm_new/CluesConnectTargetEffectively/components/ShopModal.tsx b/src/pages/crm_new/CluesConnectTargetEffectively/components/ShopModal.tsx new file mode 100644 index 0000000..85f0daf --- /dev/null +++ b/src/pages/crm_new/CluesConnectTargetEffectively/components/ShopModal.tsx @@ -0,0 +1,38 @@ +import React, {useEffect, useState} from 'react'; +import {Modal, Button, List} from 'antd'; +import { useStore } from '../index'; + +export default function Index() { + const {shopData, setShopData } = useStore(); + + function handleCancel() { + setShopData({visible: false, data: []}); + } + + return ( + + {item.shopName}} + /> +
+
+
+ ); +} \ No newline at end of file diff --git a/src/pages/crm_new/CluesConnectTargetEffectively/index.tsx b/src/pages/crm_new/CluesConnectTargetEffectively/index.tsx new file mode 100644 index 0000000..991c4b5 --- /dev/null +++ b/src/pages/crm_new/CluesConnectTargetEffectively/index.tsx @@ -0,0 +1,38 @@ +import React, {useState} from 'react'; +import { Card, Button, Row, Col } from 'antd'; +import { PageHeaderWrapper } from '@ant-design/pro-layout'; +import { createStore } from '@/hooks/moz'; +import store from './store'; +import List from './components/List'; +import EditModal from './components/EditModal'; +import ShopModal from './components/ShopModal'; +// import ShopSelectNew from '@/components/ShopSelectNew'; + +export const { Provider, useStore } = createStore(store); + +function Index() { + const { setParams, setCurrent } = useStore(); + const [selected, setSelected] = useState([]); + + function handleOnChange(value: any) { + setParams({shopId: value[0]?.value || undefined}, true); + setSelected(value || []); + } + return ( + 线索有效接通目标}> + + + {/* + + */} + + + + + + + + ); +} + +export default () => ; diff --git a/src/pages/crm_new/CluesConnectTargetEffectively/store.ts b/src/pages/crm_new/CluesConnectTargetEffectively/store.ts new file mode 100644 index 0000000..9ec6617 --- /dev/null +++ b/src/pages/crm_new/CluesConnectTargetEffectively/store.ts @@ -0,0 +1,31 @@ +import React, { useState } from 'react'; +import useInitial from '@/hooks/useInitail'; +import {getConfigApi, Result, ShopList} from './api'; + +interface Current { + visible: boolean + data: Result +} + +interface ShopData { + visible: boolean + data: ShopList[] +} + +export default function useStore() { + const { data, loading, errMsg, setLoading, setParams, params } = useInitial(getConfigApi, [], {}); + const [current, setCurrent] = useState({visible: false, data: {}}); + const [shopData, setShopData] = useState({visible: false, data: []}); + return { + data, + loading, + errMsg, + setLoading, + setParams, + params, + current, + setCurrent, + shopData, + setShopData + }; +} \ No newline at end of file -- libgit2 0.22.2