Commit be9630d30f53c73f79fe4ed1ffcdae9551eef6e6
1 parent
b966b1f3
feat: update 课题组模块开发
Showing
4 changed files
with
417 additions
and
261 deletions
src/pages/ResearchGroup/components/ResearchGroupAddModal.tsx
@@ -3,6 +3,7 @@ import { | @@ -3,6 +3,7 @@ import { | ||
3 | postCanrdApiUserAddressList, | 3 | postCanrdApiUserAddressList, |
4 | postCanrdApiUserList, | 4 | postCanrdApiUserList, |
5 | postResearchGroupsAdd, | 5 | postResearchGroupsAdd, |
6 | + postResearchGroupsDetail, | ||
6 | } from '@/services'; | 7 | } from '@/services'; |
7 | import { getDefaultString, isEmpty } from '@/utils/StringUtil'; | 8 | import { getDefaultString, isEmpty } from '@/utils/StringUtil'; |
8 | import { getRandomNumber } from '@/utils/numberUtil'; | 9 | import { getRandomNumber } from '@/utils/numberUtil'; |
@@ -15,16 +16,34 @@ import { | @@ -15,16 +16,34 @@ import { | ||
15 | ProFormSelect, | 16 | ProFormSelect, |
16 | ProFormText, | 17 | ProFormText, |
17 | } from '@ant-design/pro-components'; | 18 | } from '@ant-design/pro-components'; |
18 | -import { Button, Form, message } from 'antd'; | 19 | +import { Button, Form, Spin, message } from 'antd'; |
19 | import { useEffect, useState } from 'react'; | 20 | import { useEffect, useState } from 'react'; |
20 | import '../index.less'; | 21 | import '../index.less'; |
21 | 22 | ||
22 | // import { cloneDeep } from 'lodash'; | 23 | // import { cloneDeep } from 'lodash'; |
23 | -export default ({ setVisible, onClose }) => { | 24 | +export default ({ setVisible, researchGroupId, onClose }) => { |
24 | const [form] = Form.useForm(); | 25 | const [form] = Form.useForm(); |
25 | const [salesCodeOptions, setSalesCodeOptions] = useState([]); | 26 | const [salesCodeOptions, setSalesCodeOptions] = useState([]); |
26 | const [memberOptions, setMemberOptions] = useState<any[]>([]); | 27 | const [memberOptions, setMemberOptions] = useState<any[]>([]); |
27 | const [accountOptions, setAccountOptions] = useState<any[]>([]); | 28 | const [accountOptions, setAccountOptions] = useState<any[]>([]); |
29 | + const [researchGroupInfo, setResearchGroupInfo] = useState<any>(null); | ||
30 | + const [modalLoading, setModalLoading] = useState(false); | ||
31 | + | ||
32 | + /** | ||
33 | + * 获取课题组信息 | ||
34 | + * @returns | ||
35 | + */ | ||
36 | + const loadResearchGroupInfo = async () => { | ||
37 | + if (researchGroupId === null) { | ||
38 | + return; | ||
39 | + } | ||
40 | + setModalLoading(true); | ||
41 | + let res = await postResearchGroupsDetail({ data: { id: researchGroupId } }); | ||
42 | + if (res && res.result === RESPONSE_CODE.SUCCESS) { | ||
43 | + setResearchGroupInfo(res.data); | ||
44 | + } | ||
45 | + setModalLoading(false); | ||
46 | + }; | ||
28 | 47 | ||
29 | /** | 48 | /** |
30 | * 获取销售代码枚举,在复制和编辑的时候判断是否为旧的代码 | 49 | * 获取销售代码枚举,在复制和编辑的时候判断是否为旧的代码 |
@@ -185,9 +204,62 @@ export default ({ setVisible, onClose }) => { | @@ -185,9 +204,62 @@ export default ({ setVisible, onClose }) => { | ||
185 | return values; | 204 | return values; |
186 | } | 205 | } |
187 | 206 | ||
207 | + /** | ||
208 | + * 设置表单默认信息 | ||
209 | + * @returns | ||
210 | + */ | ||
211 | + const loadFormDefaultValue = async () => { | ||
212 | + if (!researchGroupInfo) { | ||
213 | + return; | ||
214 | + } | ||
215 | + | ||
216 | + let members = researchGroupInfo.members; | ||
217 | + if (members !== null) { | ||
218 | + let newMemberOptions = []; | ||
219 | + for (let member of members) { | ||
220 | + let name = member.memberName; | ||
221 | + let phone = member.memberPhone; | ||
222 | + let id = member.id; | ||
223 | + newMemberOptions.push({ realName: name, phone: phone, value: id }); | ||
224 | + } | ||
225 | + setMemberOptions(newMemberOptions); | ||
226 | + form.setFieldValue( | ||
227 | + 'members', | ||
228 | + members?.map((item: any) => { | ||
229 | + return item.id; | ||
230 | + }), | ||
231 | + ); | ||
232 | + } | ||
233 | + | ||
234 | + let accounts = researchGroupInfo.accounts; | ||
235 | + if (accounts !== null) { | ||
236 | + let accountIds = accounts.map((item: any) => { | ||
237 | + return item.id; | ||
238 | + }); | ||
239 | + let res = await postCanrdApiUserList({ data: { uids: accountIds } }); | ||
240 | + if (res && res.result === RESPONSE_CODE.SUCCESS && res.data) { | ||
241 | + let newAccountOptions = res?.data?.map((item) => { | ||
242 | + item.value = item.id; | ||
243 | + return item; | ||
244 | + }); | ||
245 | + setAccountOptions(newAccountOptions); | ||
246 | + form.setFieldValue('accounts', accountIds); | ||
247 | + } | ||
248 | + } | ||
249 | + | ||
250 | + form.setFieldValue('group', researchGroupInfo.groupName); | ||
251 | + form.setFieldValue('leader', researchGroupInfo.leaderName); | ||
252 | + }; | ||
253 | + | ||
188 | useEffect(() => { | 254 | useEffect(() => { |
189 | loadSalesCodeOptions(); | 255 | loadSalesCodeOptions(); |
256 | + loadResearchGroupInfo(); | ||
190 | }, []); | 257 | }, []); |
258 | + | ||
259 | + useEffect(() => { | ||
260 | + loadFormDefaultValue(); | ||
261 | + }, [researchGroupInfo]); | ||
262 | + | ||
191 | return ( | 263 | return ( |
192 | <div className="research-group-index"> | 264 | <div className="research-group-index"> |
193 | <ModalForm | 265 | <ModalForm |
@@ -218,209 +290,215 @@ export default ({ setVisible, onClose }) => { | @@ -218,209 +290,215 @@ export default ({ setVisible, onClose }) => { | ||
218 | }} | 290 | }} |
219 | onOpenChange={setVisible} | 291 | onOpenChange={setVisible} |
220 | > | 292 | > |
221 | - <ProForm.Group> | ||
222 | - <ProFormText | ||
223 | - name="group" | ||
224 | - label="课题组名称" | ||
225 | - placeholder="请输入课题组名称" | ||
226 | - rules={[{ required: true, message: '请输入课题组名称' }]} | 293 | + <Spin spinning={modalLoading} tip="加载中..."> |
294 | + <ProForm.Group> | ||
295 | + <ProFormText | ||
296 | + name="group" | ||
297 | + label="课题组名称" | ||
298 | + placeholder="请输入课题组名称" | ||
299 | + rules={[{ required: true, message: '请输入课题组名称' }]} | ||
300 | + /> | ||
301 | + <ProFormSelect | ||
302 | + name="leader" | ||
303 | + key="leader" | ||
304 | + width="lg" | ||
305 | + showSearch | ||
306 | + label="负责人" | ||
307 | + placeholder="请输入课题组负责人" | ||
308 | + rules={[{ required: true, message: '请输入课题组负责人' }]} | ||
309 | + options={salesCodeOptions} | ||
310 | + /> | ||
311 | + </ProForm.Group> | ||
312 | + | ||
313 | + <ProFormSelect | ||
314 | + name="accounts" | ||
315 | + key="accounts" | ||
316 | + width="lg" | ||
317 | + showSearch | ||
318 | + label="绑定预存账号(可多选)" | ||
319 | + placeholder="请选择预存账号" | ||
320 | + onChange={(_, option) => { | ||
321 | + autoAccountSelectOptions(option); | ||
322 | + }} | ||
323 | + rules={[{ required: true, message: '请至少选择绑定一个预存账号' }]} | ||
324 | + fieldProps={{ | ||
325 | + mode: 'multiple', | ||
326 | + filterOption() { | ||
327 | + return true; | ||
328 | + }, | ||
329 | + optionItemRender(item: any) { | ||
330 | + let name = | ||
331 | + item.label + | ||
332 | + ' | ' + | ||
333 | + item.institution + | ||
334 | + ' | ' + | ||
335 | + item.nowMoney + | ||
336 | + '¥' + | ||
337 | + ' | ' + | ||
338 | + item.phone; | ||
339 | + return ( | ||
340 | + <div title={name}> | ||
341 | + <span style={{ color: '#333333' }}>{name}</span> | ||
342 | + </div> | ||
343 | + ); | ||
344 | + }, | ||
345 | + }} | ||
346 | + debounceTime={1000} | ||
347 | + request={async (value, {}) => { | ||
348 | + const keywords = value.keyWords; | ||
349 | + const res = await postCanrdApiUserList({ | ||
350 | + data: { keywords: keywords, pageSize: 20 }, | ||
351 | + }); | ||
352 | + let options = res?.data?.data?.map((c: any) => { | ||
353 | + return { | ||
354 | + ...c, | ||
355 | + label: c.realName, | ||
356 | + value: c.uid, | ||
357 | + key: c.uid, | ||
358 | + }; | ||
359 | + }); | ||
360 | + return options; | ||
361 | + }} | ||
227 | /> | 362 | /> |
363 | + | ||
228 | <ProFormSelect | 364 | <ProFormSelect |
229 | - name="leader" | ||
230 | - key="leader" | 365 | + name="members" |
366 | + key="members" | ||
231 | width="lg" | 367 | width="lg" |
232 | showSearch | 368 | showSearch |
233 | - label="负责人" | ||
234 | - placeholder="请输入课题组负责人" | ||
235 | - rules={[{ required: true, message: '请输入课题组负责人' }]} | ||
236 | - options={salesCodeOptions} | 369 | + label="课题组成员" |
370 | + placeholder="请添加课题组成员" | ||
371 | + fieldProps={{ | ||
372 | + mode: 'multiple', | ||
373 | + filterOption() { | ||
374 | + return true; | ||
375 | + }, | ||
376 | + optionItemRender(item: any) { | ||
377 | + let name = item.realName + ' | ' + item.phone; | ||
378 | + return ( | ||
379 | + <div title={name}> | ||
380 | + <span style={{ color: '#333333' }}>{name}</span> | ||
381 | + </div> | ||
382 | + ); | ||
383 | + }, | ||
384 | + }} | ||
385 | + options={memberOptions} | ||
237 | /> | 386 | /> |
238 | - </ProForm.Group> | ||
239 | 387 | ||
240 | - <ProFormSelect | ||
241 | - name="accounts" | ||
242 | - key="accounts" | ||
243 | - width="lg" | ||
244 | - showSearch | ||
245 | - label="绑定预存账号(可多选)" | ||
246 | - placeholder="请选择预存账号" | ||
247 | - onChange={(_, option) => { | ||
248 | - autoAccountSelectOptions(option); | ||
249 | - }} | ||
250 | - rules={[{ required: true, message: '请至少选择绑定一个预存账号' }]} | ||
251 | - fieldProps={{ | ||
252 | - mode: 'multiple', | ||
253 | - filterOption() { | ||
254 | - return true; | ||
255 | - }, | ||
256 | - optionItemRender(item: any) { | ||
257 | - let name = | ||
258 | - item.label + | ||
259 | - ' | ' + | ||
260 | - item.institution + | ||
261 | - ' | ' + | ||
262 | - item.nowMoney + | ||
263 | - '¥' + | ||
264 | - ' | ' + | ||
265 | - item.phone; | ||
266 | - return ( | ||
267 | - <div title={name}> | ||
268 | - <span style={{ color: '#333333' }}>{name}</span> | ||
269 | - </div> | ||
270 | - ); | ||
271 | - }, | ||
272 | - }} | ||
273 | - debounceTime={1000} | ||
274 | - request={async (value, {}) => { | ||
275 | - const keywords = value.keyWords; | ||
276 | - const res = await postCanrdApiUserList({ | ||
277 | - data: { keywords: keywords, pageSize: 20 }, | ||
278 | - }); | ||
279 | - let options = res?.data?.data?.map((c: any) => { | ||
280 | - return { | ||
281 | - ...c, | ||
282 | - label: c.realName, | ||
283 | - value: c.uid, | ||
284 | - key: c.uid, | ||
285 | - }; | ||
286 | - }); | ||
287 | - return options; | ||
288 | - }} | ||
289 | - /> | 388 | + <ProCard |
389 | + title="选择或自定义课题组成员信息" | ||
390 | + bordered | ||
391 | + tooltip="从【客户信息】选择框中可以直接搜索客户,选中后自动添加到【课题组成员】中。也可以自定义输入【客户名称】和【手机号】,点击添加按钮手动添加到【课题组成员】中。" | ||
392 | + > | ||
393 | + <ProForm.Group> | ||
394 | + <ProFormSelect | ||
395 | + key="customerName" | ||
396 | + label="客户信息(选择)" | ||
397 | + width="lg" | ||
398 | + showSearch | ||
399 | + name="customerName" | ||
400 | + placeholder="请选择客户信息" | ||
401 | + onChange={(_, option) => { | ||
402 | + autoFillCustomerInfo(option); | ||
403 | + }} | ||
404 | + fieldProps={{ | ||
405 | + filterOption() { | ||
406 | + return true; | ||
407 | + }, | ||
408 | + optionItemRender(item: any) { | ||
409 | + if (item.type === 'add') { | ||
410 | + return ( | ||
411 | + <div title={item.name + '(新增客户)'}> | ||
412 | + <span style={{ color: '#333333' }}>{item.name}</span> | ||
413 | + {' | '} | ||
414 | + <span style={{ color: 'orange' }}>自定义</span> | ||
415 | + </div> | ||
416 | + ); | ||
417 | + } | ||
290 | 418 | ||
291 | - <ProFormSelect | ||
292 | - name="members" | ||
293 | - key="members" | ||
294 | - width="lg" | ||
295 | - showSearch | ||
296 | - label="课题组成员" | ||
297 | - placeholder="请添加课题组成员" | ||
298 | - fieldProps={{ | ||
299 | - mode: 'multiple', | ||
300 | - filterOption() { | ||
301 | - return true; | ||
302 | - }, | ||
303 | - optionItemRender(item: any) { | ||
304 | - let name = item.realName + ' | ' + item.phone; | ||
305 | - return ( | ||
306 | - <div title={name}> | ||
307 | - <span style={{ color: '#333333' }}>{name}</span> | ||
308 | - </div> | ||
309 | - ); | ||
310 | - }, | ||
311 | - }} | ||
312 | - options={memberOptions} | ||
313 | - /> | 419 | + let title = ''; |
420 | + let spanText = ''; | ||
421 | + let realName = item.realName; | ||
422 | + let phone = item.phone; | ||
314 | 423 | ||
315 | - <ProCard | ||
316 | - title="选择或自定义课题组成员信息" | ||
317 | - bordered | ||
318 | - tooltip="从【客户信息】选择框中可以直接搜索客户,选中后自动添加到【课题组成员】中。也可以自定义输入【客户名称】和【手机号】,点击添加按钮手动添加到【课题组成员】中。" | ||
319 | - > | ||
320 | - <ProForm.Group> | ||
321 | - <ProFormSelect | ||
322 | - key="customerName" | ||
323 | - label="客户信息(选择)" | ||
324 | - width="lg" | ||
325 | - showSearch | ||
326 | - name="customerName" | ||
327 | - placeholder="请选择客户信息" | ||
328 | - onChange={(_, option) => { | ||
329 | - autoFillCustomerInfo(option); | ||
330 | - }} | ||
331 | - fieldProps={{ | ||
332 | - filterOption() { | ||
333 | - return true; | ||
334 | - }, | ||
335 | - optionItemRender(item: any) { | ||
336 | - if (item.type === 'add') { | 424 | + title = |
425 | + getDefaultString(realName) + | ||
426 | + '|' + | ||
427 | + getDefaultString(phone); | ||
428 | + | ||
429 | + spanText = | ||
430 | + getDefaultString(realName) + | ||
431 | + '|' + | ||
432 | + getDefaultString(phone); | ||
337 | return ( | 433 | return ( |
338 | - <div title={item.name + '(新增客户)'}> | ||
339 | - <span style={{ color: '#333333' }}>{item.name}</span> | ||
340 | - {' | '} | ||
341 | - <span style={{ color: 'orange' }}>自定义</span> | 434 | + <div title={title}> |
435 | + <span style={{ color: '#333333' }}>{spanText}</span> | ||
342 | </div> | 436 | </div> |
343 | ); | 437 | ); |
438 | + }, | ||
439 | + }} | ||
440 | + debounceTime={1000} | ||
441 | + request={async (value, {}) => { | ||
442 | + const keywords = value.keyWords; | ||
443 | + if (keywords === '') { | ||
444 | + return []; | ||
344 | } | 445 | } |
446 | + const res = await postCanrdApiUserAddressList({ | ||
447 | + data: { keywords: keywords }, | ||
448 | + }); | ||
449 | + let options = res?.data?.map((c: any) => { | ||
450 | + return { | ||
451 | + ...c, | ||
452 | + label: c.name, | ||
453 | + value: c.id, | ||
454 | + key: c.id, | ||
455 | + }; | ||
456 | + }); | ||
345 | 457 | ||
346 | - let title = ''; | ||
347 | - let spanText = ''; | ||
348 | - let realName = item.realName; | ||
349 | - let phone = item.phone; | ||
350 | - | ||
351 | - title = | ||
352 | - getDefaultString(realName) + '|' + getDefaultString(phone); | 458 | + //对options去重,realName和phone唯一 |
459 | + options = deduplicateOptions(options); | ||
353 | 460 | ||
354 | - spanText = | ||
355 | - getDefaultString(realName) + '|' + getDefaultString(phone); | ||
356 | - return ( | ||
357 | - <div title={title}> | ||
358 | - <span style={{ color: '#333333' }}>{spanText}</span> | ||
359 | - </div> | ||
360 | - ); | ||
361 | - }, | ||
362 | - }} | ||
363 | - debounceTime={1000} | ||
364 | - request={async (value, {}) => { | ||
365 | - const keywords = value.keyWords; | ||
366 | - if (keywords === '') { | ||
367 | - return []; | ||
368 | - } | ||
369 | - const res = await postCanrdApiUserAddressList({ | ||
370 | - data: { keywords: keywords }, | ||
371 | - }); | ||
372 | - let options = res?.data?.map((c: any) => { | ||
373 | - return { | ||
374 | - ...c, | ||
375 | - label: c.name, | ||
376 | - value: c.id, | ||
377 | - key: c.id, | ||
378 | - }; | ||
379 | - }); | 461 | + //第一个商品默认为要新增客户 |
462 | + if (keywords.trim() !== '') { | ||
463 | + options.unshift({ | ||
464 | + name: keywords, | ||
465 | + type: 'add', | ||
466 | + label: keywords, | ||
467 | + value: 3.1415926, | ||
468 | + key: keywords, | ||
469 | + }); | ||
470 | + } | ||
380 | 471 | ||
381 | - //对options去重,realName和phone唯一 | ||
382 | - options = deduplicateOptions(options); | 472 | + return options; |
473 | + }} | ||
474 | + /> | ||
475 | + </ProForm.Group> | ||
383 | 476 | ||
384 | - //第一个商品默认为要新增客户 | ||
385 | - if (keywords.trim() !== '') { | ||
386 | - options.unshift({ | ||
387 | - name: keywords, | ||
388 | - type: 'add', | ||
389 | - label: keywords, | ||
390 | - value: 3.1415926, | ||
391 | - key: keywords, | ||
392 | - }); | ||
393 | - } | ||
394 | - | ||
395 | - return options; | 477 | + <ProForm.Group> |
478 | + <ProFormText | ||
479 | + name="realName" | ||
480 | + label="客户名称(自定义)" | ||
481 | + placeholder="请输入客户名称" | ||
482 | + rules={[{ required: false, message: '请输入客户名称' }]} | ||
483 | + /> | ||
484 | + <ProFormText | ||
485 | + name="phone" | ||
486 | + label="手机号(自定义)" | ||
487 | + width="md" | ||
488 | + placeholder="请输入手机号" | ||
489 | + rules={[{ required: false, message: '请输入手机号' }]} | ||
490 | + /> | ||
491 | + </ProForm.Group> | ||
492 | + <Button | ||
493 | + type="primary" | ||
494 | + onClick={() => { | ||
495 | + addCustomMember(); | ||
396 | }} | 496 | }} |
397 | - /> | ||
398 | - </ProForm.Group> | ||
399 | - | ||
400 | - <ProForm.Group> | ||
401 | - <ProFormText | ||
402 | - name="realName" | ||
403 | - label="客户名称(自定义)" | ||
404 | - placeholder="请输入客户名称" | ||
405 | - rules={[{ required: false, message: '请输入客户名称' }]} | ||
406 | - /> | ||
407 | - <ProFormText | ||
408 | - name="phone" | ||
409 | - label="手机号(自定义)" | ||
410 | - width="md" | ||
411 | - placeholder="请输入手机号" | ||
412 | - rules={[{ required: false, message: '请输入手机号' }]} | ||
413 | - /> | ||
414 | - </ProForm.Group> | ||
415 | - <Button | ||
416 | - type="primary" | ||
417 | - onClick={() => { | ||
418 | - addCustomMember(); | ||
419 | - }} | ||
420 | - > | ||
421 | - 添加 | ||
422 | - </Button> | ||
423 | - </ProCard> | 497 | + > |
498 | + 添加 | ||
499 | + </Button> | ||
500 | + </ProCard> | ||
501 | + </Spin> | ||
424 | </ModalForm> | 502 | </ModalForm> |
425 | </div> | 503 | </div> |
426 | ); | 504 | ); |
src/pages/ResearchGroup/index.tsx
@@ -4,7 +4,7 @@ import { RESPONSE_CODE } from '@/constants/enum'; | @@ -4,7 +4,7 @@ import { RESPONSE_CODE } from '@/constants/enum'; | ||
4 | import {} from '@/pages/Invoice/constant'; | 4 | import {} from '@/pages/Invoice/constant'; |
5 | import { | 5 | import { |
6 | postCanrdApiUserDetail, | 6 | postCanrdApiUserDetail, |
7 | - postPrepaidDelete, | 7 | + postResearchGroupsDelete, |
8 | postResearchGroupsList, | 8 | postResearchGroupsList, |
9 | } from '@/services'; | 9 | } from '@/services'; |
10 | import { formatDateTime } from '@/utils'; | 10 | import { formatDateTime } from '@/utils'; |
@@ -31,7 +31,7 @@ const PrepaidPage = () => { | @@ -31,7 +31,7 @@ const PrepaidPage = () => { | ||
31 | const accountActionRef = useRef<ActionType>(); | 31 | const accountActionRef = useRef<ActionType>(); |
32 | const [researchGroupAddModalVisible, setResearchGroupAddModalVisible] = | 32 | const [researchGroupAddModalVisible, setResearchGroupAddModalVisible] = |
33 | useState(false); | 33 | useState(false); |
34 | - // const [checkVisible, setCheckVisible] = useState(false);; | 34 | + // const [checkVisible, setCheckVisible] = useState(false); |
35 | const [accountInfo, setAccountInfo] = useState({ | 35 | const [accountInfo, setAccountInfo] = useState({ |
36 | realName: '', | 36 | realName: '', |
37 | phone: '', | 37 | phone: '', |
@@ -39,6 +39,8 @@ const PrepaidPage = () => { | @@ -39,6 +39,8 @@ const PrepaidPage = () => { | ||
39 | uid: '', | 39 | uid: '', |
40 | }); | 40 | }); |
41 | const [accountInfoLoading, setAccountInfoLoading] = useState(false); | 41 | const [accountInfoLoading, setAccountInfoLoading] = useState(false); |
42 | + const [perms, setPerms] = useState<string[]>([]); | ||
43 | + const [optRecordId, setOptRecordId] = useState<any>(null); | ||
42 | 44 | ||
43 | const reloadResearchGroupTable = () => { | 45 | const reloadResearchGroupTable = () => { |
44 | researchGroupActionRef.current?.reload(); | 46 | researchGroupActionRef.current?.reload(); |
@@ -256,16 +258,15 @@ const PrepaidPage = () => { | @@ -256,16 +258,15 @@ const PrepaidPage = () => { | ||
256 | width: 120, | 258 | width: 120, |
257 | render: (text, record) => { | 259 | render: (text, record) => { |
258 | let btns = []; | 260 | let btns = []; |
259 | - let opts = record.operations; | ||
260 | - if (opts?.includes('modify')) { | 261 | + if (perms?.includes('modify')) { |
261 | btns.push( | 262 | btns.push( |
262 | <Button | 263 | <Button |
263 | className="p-0" | 264 | className="p-0" |
264 | key="modify" | 265 | key="modify" |
265 | type="link" | 266 | type="link" |
266 | onClick={() => { | 267 | onClick={() => { |
267 | - // setRechargePrepaymentModalVisible(true); | ||
268 | - // setCurrentOptPrepaymentObj(cloneDeep(record)); | 268 | + setResearchGroupAddModalVisible(true); |
269 | + setOptRecordId(record?.id); | ||
269 | }} | 270 | }} |
270 | > | 271 | > |
271 | 编辑 | 272 | 编辑 |
@@ -273,31 +274,15 @@ const PrepaidPage = () => { | @@ -273,31 +274,15 @@ const PrepaidPage = () => { | ||
273 | ); | 274 | ); |
274 | } | 275 | } |
275 | 276 | ||
276 | - if (opts?.includes('audit')) { | ||
277 | - btns.push( | ||
278 | - <Button | ||
279 | - className="p-0" | ||
280 | - key="view" | ||
281 | - type="link" | ||
282 | - onClick={() => { | ||
283 | - // setCurrentOptPrepaymentObj(record); | ||
284 | - // setCheckVisible(true); | ||
285 | - }} | ||
286 | - > | ||
287 | - 审核 | ||
288 | - </Button>, | ||
289 | - ); | ||
290 | - } | ||
291 | - | ||
292 | - if (opts?.includes('delete')) { | 277 | + if (perms?.includes('delete')) { |
293 | btns.push( | 278 | btns.push( |
294 | <ButtonConfirm | 279 | <ButtonConfirm |
295 | key="delete" | 280 | key="delete" |
296 | className="p-0" | 281 | className="p-0" |
297 | - title={'确认删除这条预存记录吗?'} | 282 | + title={'确认删除这个课题组吗?'} |
298 | text="删除" | 283 | text="删除" |
299 | onConfirm={async () => { | 284 | onConfirm={async () => { |
300 | - let res = await postPrepaidDelete({ | 285 | + let res = await postResearchGroupsDelete({ |
301 | data: { ids: [record.id] }, | 286 | data: { ids: [record.id] }, |
302 | }); | 287 | }); |
303 | if (res && res.result === RESPONSE_CODE.SUCCESS) { | 288 | if (res && res.result === RESPONSE_CODE.SUCCESS) { |
@@ -331,6 +316,7 @@ const PrepaidPage = () => { | @@ -331,6 +316,7 @@ const PrepaidPage = () => { | ||
331 | const res = await postResearchGroupsList({ | 316 | const res = await postResearchGroupsList({ |
332 | data: { ...params }, | 317 | data: { ...params }, |
333 | }); | 318 | }); |
319 | + setPerms(res.data.specialPath); | ||
334 | return { | 320 | return { |
335 | data: res?.data?.data || [], | 321 | data: res?.data?.data || [], |
336 | total: res?.data?.total || 0, | 322 | total: res?.data?.total || 0, |
@@ -359,19 +345,25 @@ const PrepaidPage = () => { | @@ -359,19 +345,25 @@ const PrepaidPage = () => { | ||
359 | dateFormatter="string" | 345 | dateFormatter="string" |
360 | headerTitle="课题组列表" | 346 | headerTitle="课题组列表" |
361 | scroll={{ x: 1400 }} | 347 | scroll={{ x: 1400 }} |
362 | - toolBarRender={() => [ | ||
363 | - <Button | ||
364 | - key="button" | ||
365 | - icon={<PlusOutlined />} | ||
366 | - onClick={() => { | ||
367 | - setCurrentOptPrepaymentObj(null); | ||
368 | - setResearchGroupAddModalVisible(true); | ||
369 | - }} | ||
370 | - type="primary" | ||
371 | - > | ||
372 | - 新建 | ||
373 | - </Button>, | ||
374 | - ]} | 348 | + toolBarRender={() => { |
349 | + let btns = []; | ||
350 | + if (perms.includes('add')) { | ||
351 | + btns.push( | ||
352 | + <Button | ||
353 | + key="button" | ||
354 | + icon={<PlusOutlined />} | ||
355 | + onClick={() => { | ||
356 | + setResearchGroupAddModalVisible(true); | ||
357 | + }} | ||
358 | + type="primary" | ||
359 | + > | ||
360 | + 新建 | ||
361 | + </Button>, | ||
362 | + ); | ||
363 | + } | ||
364 | + | ||
365 | + return btns; | ||
366 | + }} | ||
375 | /> | 367 | /> |
376 | ), | 368 | ), |
377 | }, | 369 | }, |
@@ -394,9 +386,12 @@ const PrepaidPage = () => { | @@ -394,9 +386,12 @@ const PrepaidPage = () => { | ||
394 | <ResearchGroupAddModal | 386 | <ResearchGroupAddModal |
395 | setVisible={(val: boolean) => { | 387 | setVisible={(val: boolean) => { |
396 | setResearchGroupAddModalVisible(val); | 388 | setResearchGroupAddModalVisible(val); |
389 | + setOptRecordId(null); | ||
397 | }} | 390 | }} |
391 | + researchGroupId={optRecordId} | ||
398 | onClose={() => { | 392 | onClose={() => { |
399 | setResearchGroupAddModalVisible(false); | 393 | setResearchGroupAddModalVisible(false); |
394 | + setOptRecordId(null); | ||
400 | }} | 395 | }} |
401 | /> | 396 | /> |
402 | )} | 397 | )} |
src/services/definition.ts
@@ -1677,6 +1677,11 @@ export interface ResearchGroupAccountAddRequest { | @@ -1677,6 +1677,11 @@ export interface ResearchGroupAccountAddRequest { | ||
1677 | accountId?: number; | 1677 | accountId?: number; |
1678 | /** | 1678 | /** |
1679 | * @description | 1679 | * @description |
1680 | + * 关联的账号名称 | ||
1681 | + */ | ||
1682 | + accountName?: string; | ||
1683 | + /** | ||
1684 | + * @description | ||
1680 | * 关联的账号手机号 | 1685 | * 关联的账号手机号 |
1681 | */ | 1686 | */ |
1682 | accountPhone?: string; | 1687 | accountPhone?: string; |
@@ -1697,6 +1702,11 @@ export interface ResearchGroupAccountEditRequest { | @@ -1697,6 +1702,11 @@ export interface ResearchGroupAccountEditRequest { | ||
1697 | accountId?: number; | 1702 | accountId?: number; |
1698 | /** | 1703 | /** |
1699 | * @description | 1704 | * @description |
1705 | + * 关联的账号名称 | ||
1706 | + */ | ||
1707 | + accountName?: string; | ||
1708 | + /** | ||
1709 | + * @description | ||
1700 | * 关联的账号手机号 | 1710 | * 关联的账号手机号 |
1701 | */ | 1711 | */ |
1702 | accountPhone?: string; | 1712 | accountPhone?: string; |
@@ -1737,6 +1747,15 @@ export interface ResearchGroupDeleteRequest { | @@ -1737,6 +1747,15 @@ export interface ResearchGroupDeleteRequest { | ||
1737 | ids?: Array<number>; | 1747 | ids?: Array<number>; |
1738 | } | 1748 | } |
1739 | 1749 | ||
1750 | +export interface ResearchGroupDetailRequest { | ||
1751 | + /** | ||
1752 | + * @description | ||
1753 | + * 主键id | ||
1754 | + * @format int64 | ||
1755 | + */ | ||
1756 | + id?: number; | ||
1757 | +} | ||
1758 | + | ||
1740 | export interface ResearchGroupEditRequest { | 1759 | export interface ResearchGroupEditRequest { |
1741 | /** | 1760 | /** |
1742 | * @description | 1761 | * @description |
@@ -1767,6 +1786,11 @@ export interface ResearchGroupEditRequest { | @@ -1767,6 +1786,11 @@ export interface ResearchGroupEditRequest { | ||
1767 | } | 1786 | } |
1768 | 1787 | ||
1769 | export interface ResearchGroupListRequest { | 1788 | export interface ResearchGroupListRequest { |
1789 | + /** | ||
1790 | + * @description | ||
1791 | + * 预存账号手机号 | ||
1792 | + */ | ||
1793 | + accountPhone?: string; | ||
1770 | /** @format int32 */ | 1794 | /** @format int32 */ |
1771 | current?: number; | 1795 | current?: number; |
1772 | /** | 1796 | /** |
src/services/request.ts
@@ -53,6 +53,7 @@ import type { | @@ -53,6 +53,7 @@ import type { | ||
53 | MaterialUnitListRes, | 53 | MaterialUnitListRes, |
54 | MeasureUnitListRes, | 54 | MeasureUnitListRes, |
55 | MessageQueryDTO, | 55 | MessageQueryDTO, |
56 | + ModelAndView, | ||
56 | OrderAddVO, | 57 | OrderAddVO, |
57 | OrderAuditLogQueryVO, | 58 | OrderAuditLogQueryVO, |
58 | OrderBaseInfoQueryVO, | 59 | OrderBaseInfoQueryVO, |
@@ -76,6 +77,7 @@ import type { | @@ -76,6 +77,7 @@ import type { | ||
76 | ReissueInvoiceDto, | 77 | ReissueInvoiceDto, |
77 | ResearchGroupAddRequest, | 78 | ResearchGroupAddRequest, |
78 | ResearchGroupDeleteRequest, | 79 | ResearchGroupDeleteRequest, |
80 | + ResearchGroupDetailRequest, | ||
79 | ResearchGroupEditRequest, | 81 | ResearchGroupEditRequest, |
80 | ResearchGroupListRequest, | 82 | ResearchGroupListRequest, |
81 | ResetPwdVO, | 83 | ResetPwdVO, |
@@ -1614,9 +1616,7 @@ export interface GetErrorResponse { | @@ -1614,9 +1616,7 @@ export interface GetErrorResponse { | ||
1614 | * @description | 1616 | * @description |
1615 | * OK | 1617 | * OK |
1616 | */ | 1618 | */ |
1617 | - 200: { | ||
1618 | - [propertyName: string]: any; | ||
1619 | - }; | 1619 | + 200: ModelAndView; |
1620 | /** | 1620 | /** |
1621 | * @description | 1621 | * @description |
1622 | * Unauthorized | 1622 | * Unauthorized |
@@ -1637,9 +1637,9 @@ export interface GetErrorResponse { | @@ -1637,9 +1637,9 @@ export interface GetErrorResponse { | ||
1637 | export type GetErrorResponseSuccess = GetErrorResponse[200]; | 1637 | export type GetErrorResponseSuccess = GetErrorResponse[200]; |
1638 | /** | 1638 | /** |
1639 | * @description | 1639 | * @description |
1640 | - * error | 1640 | + * errorHtml |
1641 | * @tags basic-error-controller | 1641 | * @tags basic-error-controller |
1642 | - * @produces * | 1642 | + * @produces text/html |
1643 | */ | 1643 | */ |
1644 | export const getError = /* #__PURE__ */ (() => { | 1644 | export const getError = /* #__PURE__ */ (() => { |
1645 | const method = 'get'; | 1645 | const method = 'get'; |
@@ -1663,9 +1663,7 @@ export interface PutErrorResponse { | @@ -1663,9 +1663,7 @@ export interface PutErrorResponse { | ||
1663 | * @description | 1663 | * @description |
1664 | * OK | 1664 | * OK |
1665 | */ | 1665 | */ |
1666 | - 200: { | ||
1667 | - [propertyName: string]: any; | ||
1668 | - }; | 1666 | + 200: ModelAndView; |
1669 | /** | 1667 | /** |
1670 | * @description | 1668 | * @description |
1671 | * Created | 1669 | * Created |
@@ -1691,9 +1689,9 @@ export interface PutErrorResponse { | @@ -1691,9 +1689,9 @@ export interface PutErrorResponse { | ||
1691 | export type PutErrorResponseSuccess = PutErrorResponse[200]; | 1689 | export type PutErrorResponseSuccess = PutErrorResponse[200]; |
1692 | /** | 1690 | /** |
1693 | * @description | 1691 | * @description |
1694 | - * error | 1692 | + * errorHtml |
1695 | * @tags basic-error-controller | 1693 | * @tags basic-error-controller |
1696 | - * @produces * | 1694 | + * @produces text/html |
1697 | * @consumes application/json | 1695 | * @consumes application/json |
1698 | */ | 1696 | */ |
1699 | export const putError = /* #__PURE__ */ (() => { | 1697 | export const putError = /* #__PURE__ */ (() => { |
@@ -1718,9 +1716,7 @@ export interface PostErrorResponse { | @@ -1718,9 +1716,7 @@ export interface PostErrorResponse { | ||
1718 | * @description | 1716 | * @description |
1719 | * OK | 1717 | * OK |
1720 | */ | 1718 | */ |
1721 | - 200: { | ||
1722 | - [propertyName: string]: any; | ||
1723 | - }; | 1719 | + 200: ModelAndView; |
1724 | /** | 1720 | /** |
1725 | * @description | 1721 | * @description |
1726 | * Created | 1722 | * Created |
@@ -1746,9 +1742,9 @@ export interface PostErrorResponse { | @@ -1746,9 +1742,9 @@ export interface PostErrorResponse { | ||
1746 | export type PostErrorResponseSuccess = PostErrorResponse[200]; | 1742 | export type PostErrorResponseSuccess = PostErrorResponse[200]; |
1747 | /** | 1743 | /** |
1748 | * @description | 1744 | * @description |
1749 | - * error | 1745 | + * errorHtml |
1750 | * @tags basic-error-controller | 1746 | * @tags basic-error-controller |
1751 | - * @produces * | 1747 | + * @produces text/html |
1752 | * @consumes application/json | 1748 | * @consumes application/json |
1753 | */ | 1749 | */ |
1754 | export const postError = /* #__PURE__ */ (() => { | 1750 | export const postError = /* #__PURE__ */ (() => { |
@@ -1773,9 +1769,7 @@ export interface DeleteErrorResponse { | @@ -1773,9 +1769,7 @@ export interface DeleteErrorResponse { | ||
1773 | * @description | 1769 | * @description |
1774 | * OK | 1770 | * OK |
1775 | */ | 1771 | */ |
1776 | - 200: { | ||
1777 | - [propertyName: string]: any; | ||
1778 | - }; | 1772 | + 200: ModelAndView; |
1779 | /** | 1773 | /** |
1780 | * @description | 1774 | * @description |
1781 | * No Content | 1775 | * No Content |
@@ -1796,9 +1790,9 @@ export interface DeleteErrorResponse { | @@ -1796,9 +1790,9 @@ export interface DeleteErrorResponse { | ||
1796 | export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; | 1790 | export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; |
1797 | /** | 1791 | /** |
1798 | * @description | 1792 | * @description |
1799 | - * error | 1793 | + * errorHtml |
1800 | * @tags basic-error-controller | 1794 | * @tags basic-error-controller |
1801 | - * @produces * | 1795 | + * @produces text/html |
1802 | */ | 1796 | */ |
1803 | export const deleteError = /* #__PURE__ */ (() => { | 1797 | export const deleteError = /* #__PURE__ */ (() => { |
1804 | const method = 'delete'; | 1798 | const method = 'delete'; |
@@ -1822,9 +1816,7 @@ export interface OptionsErrorResponse { | @@ -1822,9 +1816,7 @@ export interface OptionsErrorResponse { | ||
1822 | * @description | 1816 | * @description |
1823 | * OK | 1817 | * OK |
1824 | */ | 1818 | */ |
1825 | - 200: { | ||
1826 | - [propertyName: string]: any; | ||
1827 | - }; | 1819 | + 200: ModelAndView; |
1828 | /** | 1820 | /** |
1829 | * @description | 1821 | * @description |
1830 | * No Content | 1822 | * No Content |
@@ -1845,9 +1837,9 @@ export interface OptionsErrorResponse { | @@ -1845,9 +1837,9 @@ export interface OptionsErrorResponse { | ||
1845 | export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; | 1837 | export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; |
1846 | /** | 1838 | /** |
1847 | * @description | 1839 | * @description |
1848 | - * error | 1840 | + * errorHtml |
1849 | * @tags basic-error-controller | 1841 | * @tags basic-error-controller |
1850 | - * @produces * | 1842 | + * @produces text/html |
1851 | * @consumes application/json | 1843 | * @consumes application/json |
1852 | */ | 1844 | */ |
1853 | export const optionsError = /* #__PURE__ */ (() => { | 1845 | export const optionsError = /* #__PURE__ */ (() => { |
@@ -1872,9 +1864,7 @@ export interface HeadErrorResponse { | @@ -1872,9 +1864,7 @@ export interface HeadErrorResponse { | ||
1872 | * @description | 1864 | * @description |
1873 | * OK | 1865 | * OK |
1874 | */ | 1866 | */ |
1875 | - 200: { | ||
1876 | - [propertyName: string]: any; | ||
1877 | - }; | 1867 | + 200: ModelAndView; |
1878 | /** | 1868 | /** |
1879 | * @description | 1869 | * @description |
1880 | * No Content | 1870 | * No Content |
@@ -1895,9 +1885,9 @@ export interface HeadErrorResponse { | @@ -1895,9 +1885,9 @@ export interface HeadErrorResponse { | ||
1895 | export type HeadErrorResponseSuccess = HeadErrorResponse[200]; | 1885 | export type HeadErrorResponseSuccess = HeadErrorResponse[200]; |
1896 | /** | 1886 | /** |
1897 | * @description | 1887 | * @description |
1898 | - * error | 1888 | + * errorHtml |
1899 | * @tags basic-error-controller | 1889 | * @tags basic-error-controller |
1900 | - * @produces * | 1890 | + * @produces text/html |
1901 | * @consumes application/json | 1891 | * @consumes application/json |
1902 | */ | 1892 | */ |
1903 | export const headError = /* #__PURE__ */ (() => { | 1893 | export const headError = /* #__PURE__ */ (() => { |
@@ -1922,9 +1912,7 @@ export interface PatchErrorResponse { | @@ -1922,9 +1912,7 @@ export interface PatchErrorResponse { | ||
1922 | * @description | 1912 | * @description |
1923 | * OK | 1913 | * OK |
1924 | */ | 1914 | */ |
1925 | - 200: { | ||
1926 | - [propertyName: string]: any; | ||
1927 | - }; | 1915 | + 200: ModelAndView; |
1928 | /** | 1916 | /** |
1929 | * @description | 1917 | * @description |
1930 | * No Content | 1918 | * No Content |
@@ -1945,9 +1933,9 @@ export interface PatchErrorResponse { | @@ -1945,9 +1933,9 @@ export interface PatchErrorResponse { | ||
1945 | export type PatchErrorResponseSuccess = PatchErrorResponse[200]; | 1933 | export type PatchErrorResponseSuccess = PatchErrorResponse[200]; |
1946 | /** | 1934 | /** |
1947 | * @description | 1935 | * @description |
1948 | - * error | 1936 | + * errorHtml |
1949 | * @tags basic-error-controller | 1937 | * @tags basic-error-controller |
1950 | - * @produces * | 1938 | + * @produces text/html |
1951 | * @consumes application/json | 1939 | * @consumes application/json |
1952 | */ | 1940 | */ |
1953 | export const patchError = /* #__PURE__ */ (() => { | 1941 | export const patchError = /* #__PURE__ */ (() => { |
@@ -7770,6 +7758,77 @@ export const postResearchGroupsDelete = /* #__PURE__ */ (() => { | @@ -7770,6 +7758,77 @@ export const postResearchGroupsDelete = /* #__PURE__ */ (() => { | ||
7770 | return request; | 7758 | return request; |
7771 | })(); | 7759 | })(); |
7772 | 7760 | ||
7761 | +/** @description request parameter type for postResearchGroupsDetail */ | ||
7762 | +export interface PostResearchGroupsDetailOption { | ||
7763 | + /** | ||
7764 | + * @description | ||
7765 | + * request | ||
7766 | + */ | ||
7767 | + body: { | ||
7768 | + /** | ||
7769 | + @description | ||
7770 | + request */ | ||
7771 | + request: ResearchGroupDetailRequest; | ||
7772 | + }; | ||
7773 | +} | ||
7774 | + | ||
7775 | +/** @description response type for postResearchGroupsDetail */ | ||
7776 | +export interface PostResearchGroupsDetailResponse { | ||
7777 | + /** | ||
7778 | + * @description | ||
7779 | + * OK | ||
7780 | + */ | ||
7781 | + 200: ServerResult; | ||
7782 | + /** | ||
7783 | + * @description | ||
7784 | + * Created | ||
7785 | + */ | ||
7786 | + 201: any; | ||
7787 | + /** | ||
7788 | + * @description | ||
7789 | + * Unauthorized | ||
7790 | + */ | ||
7791 | + 401: any; | ||
7792 | + /** | ||
7793 | + * @description | ||
7794 | + * Forbidden | ||
7795 | + */ | ||
7796 | + 403: any; | ||
7797 | + /** | ||
7798 | + * @description | ||
7799 | + * Not Found | ||
7800 | + */ | ||
7801 | + 404: any; | ||
7802 | +} | ||
7803 | + | ||
7804 | +export type PostResearchGroupsDetailResponseSuccess = | ||
7805 | + PostResearchGroupsDetailResponse[200]; | ||
7806 | +/** | ||
7807 | + * @description | ||
7808 | + * 查询课题组信息 | ||
7809 | + * @tags research-groups-controller | ||
7810 | + * @produces * | ||
7811 | + * @consumes application/json | ||
7812 | + */ | ||
7813 | +export const postResearchGroupsDetail = /* #__PURE__ */ (() => { | ||
7814 | + const method = 'post'; | ||
7815 | + const url = '/research/groups/detail'; | ||
7816 | + function request( | ||
7817 | + option: PostResearchGroupsDetailOption, | ||
7818 | + ): Promise<PostResearchGroupsDetailResponseSuccess> { | ||
7819 | + return requester(request.url, { | ||
7820 | + method: request.method, | ||
7821 | + ...option, | ||
7822 | + }) as unknown as Promise<PostResearchGroupsDetailResponseSuccess>; | ||
7823 | + } | ||
7824 | + | ||
7825 | + /** http method */ | ||
7826 | + request.method = method; | ||
7827 | + /** request url */ | ||
7828 | + request.url = url; | ||
7829 | + return request; | ||
7830 | +})(); | ||
7831 | + | ||
7773 | /** @description request parameter type for postResearchGroupsEdit */ | 7832 | /** @description request parameter type for postResearchGroupsEdit */ |
7774 | export interface PostResearchGroupsEditOption { | 7833 | export interface PostResearchGroupsEditOption { |
7775 | /** | 7834 | /** |