Commit be9630d30f53c73f79fe4ed1ffcdae9551eef6e6

Authored by zhongnanhuang
1 parent b966b1f3

feat: update 课题组模块开发

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 }) =&gt; { @@ -185,9 +204,62 @@ export default ({ setVisible, onClose }) =&gt; {
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 }) =&gt; { @@ -218,209 +290,215 @@ export default ({ setVisible, onClose }) =&gt; {
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 &#39;@/constants/enum&#39;; @@ -4,7 +4,7 @@ import { RESPONSE_CODE } from &#39;@/constants/enum&#39;;
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 = () =&gt; { @@ -31,7 +31,7 @@ const PrepaidPage = () =&gt; {
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 = () =&gt; { @@ -39,6 +39,8 @@ const PrepaidPage = () =&gt; {
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 = () =&gt; { @@ -256,16 +258,15 @@ const PrepaidPage = () =&gt; {
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 = () =&gt; { @@ -273,31 +274,15 @@ const PrepaidPage = () =&gt; {
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 = () =&gt; { @@ -331,6 +316,7 @@ const PrepaidPage = () =&gt; {
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 = () =&gt; { @@ -359,19 +345,25 @@ const PrepaidPage = () =&gt; {
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 = () =&gt; { @@ -394,9 +386,12 @@ const PrepaidPage = () =&gt; {
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__ */ (() =&gt; { @@ -7770,6 +7758,77 @@ export const postResearchGroupsDelete = /* #__PURE__ */ (() =&gt; {
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 /**