Commit cbb31cedd725f7dbf9860f231947d510f15d4729
1 parent
58558396
fix: 修改隐私页面bug
Showing
2 changed files
with
116 additions
and
14 deletions
src/pages/Prepaid/PrivatePocket/components/AddPrivatePocketModal.tsx
1 | 1 | import { |
2 | + postCanrdApiUserList, | |
2 | 3 | postCanrdPrivatePocketSave, |
3 | 4 | postServiceOrderQuerySalesCode, |
4 | 5 | } from '@/services'; |
5 | 6 | import { getUserInfo } from '@/utils/user'; |
6 | -import { Form, Input, Modal, Select, message } from 'antd'; | |
7 | +import { Form, Modal, Select, message } from 'antd'; | |
7 | 8 | import React, { useEffect, useState } from 'react'; |
8 | 9 | |
9 | 10 | interface AddPrivatePocketModalProps { |
... | ... | @@ -17,6 +18,15 @@ interface SalesCodeItem { |
17 | 18 | userName: string; |
18 | 19 | } |
19 | 20 | |
21 | +interface UserItem { | |
22 | + uid: string; | |
23 | + realName: string; | |
24 | + institution?: string; | |
25 | + nowMoney?: string | number; | |
26 | + phone: string; | |
27 | + [key: string]: any; | |
28 | +} | |
29 | + | |
20 | 30 | const AddPrivatePocketModal: React.FC<AddPrivatePocketModalProps> = ({ |
21 | 31 | visible, |
22 | 32 | onCancel, |
... | ... | @@ -25,6 +35,8 @@ const AddPrivatePocketModal: React.FC<AddPrivatePocketModalProps> = ({ |
25 | 35 | const [form] = Form.useForm(); |
26 | 36 | const [salesCodeList, setSalesCodeList] = useState<SalesCodeItem[]>([]); |
27 | 37 | const [loading, setLoading] = useState<boolean>(false); |
38 | + const [userList, setUserList] = useState<any[]>([]); | |
39 | + const [searchKeywords, setSearchKeywords] = useState<string>(''); | |
28 | 40 | const userInfo = getUserInfo(); |
29 | 41 | const userName = userInfo?.username || ''; |
30 | 42 | |
... | ... | @@ -40,6 +52,30 @@ const AddPrivatePocketModal: React.FC<AddPrivatePocketModalProps> = ({ |
40 | 52 | } |
41 | 53 | }; |
42 | 54 | |
55 | + // Define a function to fetch user list that can be called from multiple places | |
56 | + const fetchUserList = async (keywords: string) => { | |
57 | + try { | |
58 | + const res = await postCanrdApiUserList({ | |
59 | + data: { keywords: keywords, pageSize: 1000000 }, | |
60 | + }); | |
61 | + | |
62 | + if (res?.data?.data) { | |
63 | + setUserList(res.data.data); | |
64 | + } | |
65 | + return res?.data?.data || []; | |
66 | + } catch (error) { | |
67 | + console.error('获取用户列表失败:', error); | |
68 | + return []; | |
69 | + } | |
70 | + }; | |
71 | + | |
72 | + // Initial fetch when component mounts | |
73 | + useEffect(() => { | |
74 | + if (visible) { | |
75 | + fetchUserList(''); | |
76 | + } | |
77 | + }, [visible]); | |
78 | + | |
43 | 79 | useEffect(() => { |
44 | 80 | if (visible) { |
45 | 81 | fetchSalesCodeList(); |
... | ... | @@ -86,9 +122,75 @@ const AddPrivatePocketModal: React.FC<AddPrivatePocketModalProps> = ({ |
86 | 122 | <Form.Item |
87 | 123 | name="account" |
88 | 124 | label="绑定普通账户" |
89 | - rules={[{ required: true, message: '请输入手机号' }]} | |
125 | + rules={[{ required: true, message: '请选择账户' }]} | |
90 | 126 | > |
91 | - <Input placeholder="请输入手机号" /> | |
127 | + <Select | |
128 | + showSearch | |
129 | + placeholder="请选择账户" | |
130 | + optionFilterProp="children" | |
131 | + defaultActiveFirstOption={false} | |
132 | + notFoundContent={null} | |
133 | + filterOption={false} // Disable built-in filtering to use server-side search | |
134 | + onSearch={async (value) => { | |
135 | + setSearchKeywords(value); | |
136 | + // Immediately fetch results when searching | |
137 | + await fetchUserList(value); | |
138 | + }} | |
139 | + onChange={(value) => { | |
140 | + // When a value is selected, find the corresponding phone from userList | |
141 | + // or use the value directly if it's a custom entry | |
142 | + | |
143 | + // Check if this is a custom entry (value is the same as searchKeywords) | |
144 | + if (value === searchKeywords && searchKeywords.trim() !== '') { | |
145 | + form.setFieldsValue({ account: searchKeywords }); | |
146 | + return; | |
147 | + } | |
148 | + | |
149 | + // Find the selected user from userList to get their phone | |
150 | + const selectedUser = userList.find((user) => user.uid === value); | |
151 | + if (selectedUser && selectedUser.phone) { | |
152 | + form.setFieldsValue({ account: selectedUser.phone }); | |
153 | + } | |
154 | + }} | |
155 | + dropdownRender={(menu) => ( | |
156 | + <div> | |
157 | + {menu} | |
158 | + {searchKeywords.trim() !== '' && ( | |
159 | + <div | |
160 | + style={{ | |
161 | + padding: '8px', | |
162 | + cursor: 'pointer', | |
163 | + borderTop: '1px solid #e8e8e8', | |
164 | + }} | |
165 | + onClick={() => { | |
166 | + form.setFieldsValue({ account: searchKeywords }); | |
167 | + }} | |
168 | + > | |
169 | + <span style={{ color: '#333333' }}>{searchKeywords}</span> | |
170 | + {' | '} | |
171 | + <span style={{ color: 'orange' }}>自定义</span> | |
172 | + </div> | |
173 | + )} | |
174 | + </div> | |
175 | + )} | |
176 | + > | |
177 | + {userList.map((user: UserItem) => { | |
178 | + const displayText = `${user.realName || '-'} | ${ | |
179 | + user.institution || '-' | |
180 | + } | ${user.nowMoney || '0'}¥ | ${user.phone || '-'}`; | |
181 | + return ( | |
182 | + <Select.Option | |
183 | + key={user.uid} | |
184 | + value={user.uid} | |
185 | + title={displayText} | |
186 | + > | |
187 | + <div> | |
188 | + <span>{displayText}</span> | |
189 | + </div> | |
190 | + </Select.Option> | |
191 | + ); | |
192 | + })} | |
193 | + </Select> | |
92 | 194 | </Form.Item> |
93 | 195 | <Form.Item |
94 | 196 | name="salesCode" | ... | ... |
src/pages/Prepaid/PrivatePocket/constant.tsx
... | ... | @@ -8,7 +8,7 @@ export const PRIVATE_POCKET_COLUMNS = [ |
8 | 8 | hideInSearch: true, |
9 | 9 | }, |
10 | 10 | { |
11 | - title: '用户账号', | |
11 | + title: '普通账户', | |
12 | 12 | dataIndex: 'account', |
13 | 13 | key: 'account', |
14 | 14 | valueType: 'text', |
... | ... | @@ -17,21 +17,21 @@ export const PRIVATE_POCKET_COLUMNS = [ |
17 | 17 | }, |
18 | 18 | }, |
19 | 19 | { |
20 | - title: '真实姓名', | |
20 | + title: '老师姓名', | |
21 | 21 | dataIndex: 'realName', |
22 | 22 | key: 'realName', |
23 | 23 | valueType: 'text', |
24 | 24 | hideInSearch: true, |
25 | 25 | }, |
26 | 26 | { |
27 | - title: '用户余额', | |
27 | + title: '普通账户余额', | |
28 | 28 | dataIndex: 'nowMoney', |
29 | 29 | key: 'nowMoney', |
30 | 30 | valueType: 'money', |
31 | 31 | hideInSearch: true, |
32 | 32 | }, |
33 | 33 | { |
34 | - title: '隐私余额', | |
34 | + title: '隐私钱包余额', | |
35 | 35 | dataIndex: 'privateMoney', |
36 | 36 | key: 'privateMoney', |
37 | 37 | valueType: 'money', |
... | ... | @@ -47,19 +47,19 @@ export const PRIVATE_POCKET_COLUMNS = [ |
47 | 47 | }, |
48 | 48 | }, |
49 | 49 | { |
50 | - title: '创建人', | |
51 | - dataIndex: 'createByName', | |
52 | - key: 'createByName', | |
53 | - valueType: 'text', | |
54 | - hideInSearch: true, | |
55 | - }, | |
56 | - { | |
57 | 50 | title: '创建时间', |
58 | 51 | dataIndex: 'createTime', |
59 | 52 | key: 'createTime', |
60 | 53 | valueType: 'dateTime', |
61 | 54 | hideInSearch: true, |
62 | 55 | }, |
56 | + { | |
57 | + title: '创建人', | |
58 | + dataIndex: 'createByName', | |
59 | + key: 'createByName', | |
60 | + valueType: 'text', | |
61 | + hideInSearch: true, | |
62 | + }, | |
63 | 63 | // { |
64 | 64 | // title: '更新时间', |
65 | 65 | // dataIndex: 'updateTime', | ... | ... |