selectCorpUser.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. import useNewToken from '@/Hook/useNewToken';
  2. import { App, Button, Input, Popover, Select, Table, Tag, Tooltip } from 'antd';
  3. import React, { useEffect, useState } from 'react';
  4. import './global.less'
  5. import { CloseCircleFilled, SearchOutlined } from '@ant-design/icons';
  6. import { useAjax } from '@/Hook/useAjax';
  7. import { getAdAccountAllOfMember } from '../../API/global';
  8. import { getCorpUserApi, getGroupListApi } from '../../API/corpUserManage';
  9. import { WeTableSelectConfig } from './tableConfig';
  10. interface Props {
  11. value?: { corpUserId: string, name: string, corpName: string, corpId: string }[];
  12. onChange?: (value: { corpUserId: string, name: string, corpName: string, corpId: string }[]) => void;
  13. placeholder?: React.ReactNode
  14. }
  15. /**
  16. * 选择企业微信用户
  17. * @param param0
  18. * @returns
  19. */
  20. const SelectCorpUser: React.FC<Props> = ({ value = [], onChange, placeholder }) => {
  21. /************************************************************/
  22. const { token } = useNewToken()
  23. const { message } = App.useApp()
  24. const [open, setOpen] = useState<boolean>(false);
  25. const [editSelectedRow, setEditSelectedRow] = useState<any[]>([])
  26. const [openNew, setOpenNew] = useState<number>(0);
  27. const [queryForm, setQueryForm] = useState<CORP_USER_ASSIGN_API.GetCorpUserProps>({ pageNum: 1, pageSize: 20, stopUse: false, status: 1 })
  28. const [queryFormNew, setQueryFormNew] = useState<CORP_USER_ASSIGN_API.GetCorpUserProps>({ pageNum: 1, pageSize: 20, stopUse: false, status: 1 })
  29. const allOfMember = useAjax(() => getAdAccountAllOfMember())
  30. const getCorpUser = useAjax((params) => getCorpUserApi(params))
  31. const getGroupList = useAjax(() => getGroupListApi())
  32. /************************************************************/
  33. useEffect(() => {
  34. if (open && !openNew) {
  35. setOpenNew(1)
  36. console.log('editSelectedRow')
  37. setEditSelectedRow(value?.length ? [...value] : [])
  38. }
  39. }, [open, value, openNew])
  40. useEffect(() => {
  41. if (open) {
  42. allOfMember.run()
  43. getGroupList.run()
  44. }
  45. }, [open])
  46. useEffect(() => {
  47. if (open) {
  48. const params = { ...queryForm }
  49. if (params?.corpIds) {
  50. params.corpIds = (params.corpIds as any).split(/[\s,,\n]/).filter((item: string) => item)
  51. } else {
  52. delete params?.corpIds
  53. }
  54. if (params?.corpUserIds) {
  55. params.corpUserIds = (params.corpUserIds as any).split(/[\s,,\n]/).filter((item: string) => item)
  56. } else {
  57. delete params?.corpUserIds
  58. }
  59. getCorpUser.run(params)
  60. }
  61. }, [queryForm, open])
  62. const handleOk = () => {
  63. if (editSelectedRow.length) {
  64. onChange?.([...editSelectedRow])
  65. } else {
  66. message.error('请至少选择一条数据')
  67. }
  68. setOpen(false)
  69. }
  70. return <Popover
  71. placement="bottomLeft"
  72. content={<div className='selectCorpUserBody'>
  73. <div className='selectCorpUserBody_search'>
  74. <Input style={{ width: 150 }} onChange={(e) => setQueryFormNew({ ...queryFormNew, corpIds: e.target.value as any })} value={queryFormNew?.corpIds} placeholder="企微ID(多个,,空格换行)" allowClear />
  75. <Input style={{ width: 150 }} onChange={(e) => setQueryFormNew({ ...queryFormNew, corpUserIds: e.target.value as any })} value={queryFormNew?.corpUserIds} placeholder="客服ID(多个,,空格换行)" allowClear />
  76. <Select
  77. value={queryFormNew?.groupId}
  78. onChange={(e) => setQueryFormNew({ ...queryFormNew, groupId: e })}
  79. showSearch
  80. style={{ width: 100 }}
  81. placeholder="分组"
  82. filterOption={(input, option) =>
  83. ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
  84. }
  85. allowClear
  86. options={getGroupList?.data?.data?.map((item: any) => ({ label: item.groupName, value: item.groupId }))}
  87. />
  88. <Select
  89. value={queryFormNew?.operUserId}
  90. onChange={(e) => setQueryFormNew({ ...queryFormNew, operUserId: e })}
  91. showSearch
  92. style={{ width: 100 }}
  93. placeholder="运营"
  94. filterOption={(input, option) =>
  95. ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
  96. }
  97. allowClear
  98. options={allOfMember?.data?.data?.map((item: any) => ({ label: item.nickname, value: item.userId }))}
  99. />
  100. <Select
  101. value={queryFormNew?.groupOwner}
  102. onChange={(e) => setQueryFormNew({ ...queryFormNew, groupOwner: e })}
  103. showSearch
  104. style={{ width: 100 }}
  105. placeholder="是否群主号"
  106. filterOption={(input, option) =>
  107. ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
  108. }
  109. allowClear
  110. options={[{ label: '是', value: 1 }, { label: '否', value: 0 }]}
  111. />
  112. <Select
  113. value={queryFormNew?.machine}
  114. onChange={(e) => setQueryFormNew({ ...queryFormNew, machine: e })}
  115. showSearch
  116. style={{ width: 100 }}
  117. placeholder="是否机器号"
  118. filterOption={(input, option) =>
  119. ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
  120. }
  121. allowClear
  122. options={[{ label: '是', value: 1 }, { label: '否', value: 0 }]}
  123. />
  124. <Button type="primary" onClick={() => {
  125. setQueryForm({ ...queryFormNew, pageNum: 1 })
  126. }} loading={getCorpUser.loading} icon={<SearchOutlined />}>搜索</Button>
  127. </div>
  128. <div className='selectCorpUserBody_content'>
  129. <Table
  130. columns={WeTableSelectConfig()}
  131. dataSource={getCorpUser?.data?.data?.records}
  132. size='small'
  133. scroll={{ y: 300 }}
  134. rowKey={'corpUserId'}
  135. loading={getCorpUser.loading}
  136. pagination={{
  137. current: getCorpUser?.data?.data?.current || 1,
  138. pageSize: getCorpUser?.data?.data?.size || 20,
  139. total: getCorpUser?.data?.data?.total,
  140. showTotal: (total) => `共 ${total} 条数据`,
  141. showSizeChanger: true
  142. }}
  143. rowSelection={{
  144. type: 'checkbox',
  145. selectedRowKeys: editSelectedRow?.map(item => item.corpUserId),
  146. onSelect: (record: { corpUserId: any; }, selected: any) => {
  147. if (selected) {
  148. setEditSelectedRow([...editSelectedRow, record])
  149. } else {
  150. setEditSelectedRow(editSelectedRow?.filter(item => item.corpUserId !== record.corpUserId))
  151. }
  152. },
  153. onSelectAll: (selected: any, rows: any, changeRows: any[]) => {
  154. if (selected) {
  155. setEditSelectedRow([...editSelectedRow, ...changeRows])
  156. } else {
  157. let newArr = editSelectedRow?.filter(item => changeRows.every(i => i?.corpUserId !== item?.corpUserId))
  158. setEditSelectedRow(newArr)
  159. }
  160. }
  161. }}
  162. onChange={(pagination) => {
  163. setQueryForm({ ...queryForm, pageNum: pagination.current || 1, pageSize: pagination.pageSize || 20 })
  164. }}
  165. />
  166. </div>
  167. <div className='selectCorpUserBody_footer'>
  168. <Button onClick={() => { setOpen(false) }}>取消</Button>
  169. <Button type='primary' onClick={handleOk}>确定</Button>
  170. </div>
  171. </div>}
  172. arrow={false}
  173. open={open}
  174. trigger={'click'}
  175. onOpenChange={(e) => {
  176. setOpen(e)
  177. setOpenNew(0)
  178. }}
  179. >
  180. <div
  181. className='selectCorpUser'
  182. style={{
  183. border: `1px solid ${token.colorBorder}`,
  184. padding: `0px ${token.paddingXS}px`,
  185. borderRadius: token.borderRadius,
  186. height: token.controlHeight,
  187. }}
  188. >
  189. <div className='selectCorpUserContent'>
  190. {open ? <>
  191. {(editSelectedRow && editSelectedRow?.length > 0) ? <>
  192. <Tag
  193. closable
  194. onClose={(e) => {
  195. e.preventDefault();
  196. setEditSelectedRow(editSelectedRow?.filter(item => item.corpUserId !== editSelectedRow?.[0]?.corpUserId))
  197. }}
  198. >
  199. {editSelectedRow?.[0]?.name || editSelectedRow?.[0]?.corpUserId}
  200. </Tag>
  201. {editSelectedRow?.length > 1 && <Tooltip
  202. color="#FFF"
  203. title={<span style={{ color: '#000' }}>
  204. {editSelectedRow?.filter((_, index) => index !== 0)?.map((item) => <Tag
  205. key={item.corpUserId}
  206. closable
  207. onClose={(e) => {
  208. e.stopPropagation()
  209. setEditSelectedRow(editSelectedRow?.filter(item1 => item1.corpUserId !== item.corpUserId))
  210. }}
  211. >{item.name || item?.corpUserId}</Tag>)}</span>
  212. }
  213. >
  214. <Tag>+{editSelectedRow.length - 1} ...</Tag>
  215. </Tooltip>}
  216. </> : <span style={{ color: token.colorTextDisabled }}>{placeholder || '请选择客服号'}</span>}
  217. </> : <>
  218. {(value && value?.length > 0) ? <>
  219. <Tag
  220. closable
  221. onClose={(e) => {
  222. e.preventDefault();
  223. onChange(value?.filter(item => item.corpUserId !== value?.[0]?.corpUserId))
  224. }}
  225. >
  226. {value?.[0]?.name || value?.[0]?.corpUserId}
  227. </Tag>
  228. {value?.length > 1 && <Tooltip
  229. color="#FFF"
  230. title={<span style={{ color: '#000' }}>
  231. {value?.filter((_, index) => index !== 0)?.map((item) => <Tag
  232. key={item.corpUserId}
  233. closable
  234. onClose={(e) => {
  235. e.stopPropagation()
  236. onChange(value?.filter(item1 => item1.corpUserId !== item.corpUserId))
  237. }}
  238. >{item.name || item?.corpUserId}</Tag>)}</span>
  239. }
  240. >
  241. <Tag>+{value.length - 1} ...</Tag>
  242. </Tooltip>}
  243. </> : <span style={{ color: token.colorTextDisabled }}>{placeholder || '请选择客服号'}</span>}
  244. </>}
  245. </div>
  246. {((value && value?.length > 0) || (editSelectedRow && editSelectedRow?.length > 0)) && <div className='selectCorpUserIcon'>
  247. <CloseCircleFilled
  248. className='selectCorpUserIconClear'
  249. style={{ fontSize: token.fontSizeIcon, color: token.colorTextSecondary }}
  250. onClick={(e) => {
  251. e.stopPropagation()
  252. if (open) {
  253. setEditSelectedRow([])
  254. } else {
  255. onChange?.([])
  256. }
  257. }}
  258. />
  259. </div>}
  260. </div>
  261. </Popover>;
  262. };
  263. export default React.memo(SelectCorpUser);