index.jsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. import React, { useEffect, useState, useRef } from 'react'
  2. import { Tag, Tooltip, Input, Button } from 'antd'
  3. import consts from '@/consts'
  4. import { useModel, connect } from 'umi'
  5. import { queryLock } from '@/services/product'
  6. import LocksDetail from '@/pages/Product/Lock/LockStore/components/LocksDetail'
  7. import ContactDetail from '@/pages/Customer/Client/components/ClientDetail'
  8. import SoftwareDetail from '@/pages/Product/Lock/LockStore/components/SoftwareDetail'
  9. import { useModal } from '@/components/Modal'
  10. import CompanyDetail from '@/pages/Customer/Company/components/CompanyDetail'
  11. import { refactorSortField } from '@/utils/utils'
  12. import ReceiveLock from './components/ReceiveLock'
  13. // import ReceiveNewLock from './components/ReceiveNewLock'
  14. import { PermDataTypeEunm } from '@/pages/Customer/Company/components/PermSelect'
  15. import BasicTable from '@/components/Table'
  16. import { getPermAuthCache } from '@/utils/auth'
  17. import FilterDatePicker from '@/components/Table/src/components/FilterDatePicker'
  18. // import { DownOutlined } from '@ant-design/icons'
  19. // 渲染产品标签
  20. export const ProductLabel = ({ data }) => {
  21. if (!data) return null
  22. let newData
  23. if (!Array.isArray(data)) {
  24. newData = data.split('+')
  25. }
  26. return (
  27. <div className="children:m-2px">
  28. {newData.map((item, idx) => (
  29. <Tag color="purple" key={item + idx}>
  30. {item}
  31. </Tag>
  32. ))}
  33. </div>
  34. )
  35. }
  36. // const longleStatusNum = {
  37. // 1: {
  38. // text: '生成'
  39. // },
  40. // 2: {
  41. // text: '接收'
  42. // },
  43. // 3: {
  44. // text: '借出'
  45. // },
  46. // 4: {
  47. // text: '销售'
  48. // },
  49. // 5: {
  50. // text: '升级'
  51. // },
  52. // 6: {
  53. // text: '更换'
  54. // },
  55. // 7: {
  56. // text: '收回'
  57. // },
  58. // 8: {
  59. // text: '备注'
  60. // },
  61. // 9: {
  62. // text: '赠送'
  63. // }
  64. // }
  65. // 出库状态
  66. const longleStockStatusNum = {
  67. 1: { text: '生成' },
  68. 2: { text: '接收' }
  69. }
  70. // 销售状态
  71. export const longleSellStatusNum = {
  72. 1: { text: '借出' },
  73. 2: { text: '销售' },
  74. 3: { text: '赠送' }
  75. }
  76. // 维护状态
  77. export const longlePreserveStatusNum = {
  78. 1: { text: '升级' },
  79. 2: { text: '更换' },
  80. 3: { text: '收回' }
  81. }
  82. const LockStore = ({ prodList = [], dispatch, shouldUpdate }) => {
  83. const tRef = useRef()
  84. const { toggleDrawer, setDrawerProps, toggleModal, setModalProps } = useModal()
  85. // 刷新
  86. const refreshData = () => {
  87. tRef.current?.reload()
  88. }
  89. const showReceiveLockModal = () => {
  90. setModalProps({
  91. width: '60vw',
  92. modalRender: () => <ReceiveLock refresh={refreshData} />,
  93. onCancel: () => toggleModal()
  94. })
  95. toggleModal()
  96. }
  97. // const showReceiveNewLockModal = () => {
  98. // setModalProps({
  99. // width: '60vw',
  100. // modalRender: () => <ReceiveNewLock refresh={refreshData} />,
  101. // onCancel: () => toggleModal()
  102. // })
  103. // toggleModal()
  104. // }
  105. const { initialState: { permData } = { permData: {} } } = useModel('@@initialState')
  106. const [state, setState] = useState({
  107. data: [],
  108. totalOld: 0, // 待接收锁总数
  109. totalNew: 0,
  110. orderIds: []
  111. })
  112. const handleSearch = value => {
  113. tRef.current?.reloadAndRest()
  114. setState({ ...state, params: { ...state.params, search: value } })
  115. }
  116. useEffect(() => {
  117. // 获取软件锁产品列表
  118. function fetchSoftProducts() {
  119. dispatch({
  120. type: 'lock/fetchProdList'
  121. })
  122. }
  123. if (!prodList?.length) {
  124. fetchSoftProducts()
  125. }
  126. if (shouldUpdate) {
  127. tRef.current.reload()
  128. }
  129. }, [shouldUpdate])
  130. // 展示drawer
  131. const showDrawer = id => {
  132. setDrawerProps({
  133. closable: true,
  134. onClose: () => toggleDrawer(),
  135. bodyStyle: {
  136. height: '100vh'
  137. // overflowY: 'hidden'
  138. },
  139. children: <LocksDetail dataId={id} orderIds={state.orderIds} />
  140. })
  141. toggleDrawer()
  142. }
  143. // 展示DrawerClient
  144. const showDrawerClient = id => {
  145. setDrawerProps({
  146. closable: true,
  147. onClose: () => toggleDrawer(),
  148. bodyStyle: {
  149. height: '100vh',
  150. overflowY: 'hidden'
  151. },
  152. children: <ContactDetail dataId={id} />
  153. })
  154. toggleDrawer()
  155. }
  156. // 展示DrawerResponsible
  157. const showDrawerResponsible = id => {
  158. setDrawerProps({
  159. closable: true,
  160. onClose: () => toggleDrawer(),
  161. bodyStyle: {
  162. height: '100vh',
  163. overflowY: 'hidden'
  164. },
  165. children: <SoftwareDetail dataId={id} />
  166. })
  167. toggleDrawer()
  168. }
  169. // 展示单位详情抽屉
  170. const showCompanyDrawer = id => {
  171. setDrawerProps({
  172. closable: true,
  173. onClose: () => toggleDrawer(),
  174. bodyStyle: {
  175. height: '100vh',
  176. overflowY: 'hidden'
  177. },
  178. children: <CompanyDetail dataId={id} updateKey="longle" />
  179. })
  180. toggleDrawer()
  181. }
  182. const columns = [
  183. {
  184. title: '锁号',
  185. dataIndex: 'keyNum',
  186. width: 90,
  187. fixed: 'left',
  188. render: (keyNum, record) => (
  189. <span
  190. onClick={() => showDrawer(record.id)}
  191. className="text-primary cursor-pointer hover:text-[#967bbd]">
  192. {keyNum}
  193. </span>
  194. )
  195. },
  196. {
  197. title: '产品',
  198. dataIndex: 'product',
  199. key: 'product',
  200. width: 200,
  201. fixed: 'left',
  202. filters: true,
  203. filterMultiple: false,
  204. valueEnum: prodList.reduce((prev, curr) => {
  205. const obj = { ...prev }
  206. obj[curr.title] = {
  207. text: curr.title
  208. }
  209. return obj
  210. }, {}),
  211. render: (_, record) => <ProductLabel data={record.product} />
  212. },
  213. {
  214. title: '出库状态',
  215. dataIndex: 'stockStatus',
  216. key: 'stockStatus',
  217. width: 85,
  218. filters: true,
  219. filterMultiple: false,
  220. valueEnum: {
  221. 1: { text: '生成' },
  222. 2: { text: '接收' }
  223. },
  224. render: (_, { stockStatus }) => {
  225. return <>{longleStockStatusNum[stockStatus]?.text}</>
  226. }
  227. },
  228. {
  229. title: '出库时间',
  230. dataIndex: 'stockTime',
  231. valueType: 'date',
  232. key: 'stockTime',
  233. filterDropdown: filterDropdownProps => <FilterDatePicker {...filterDropdownProps} />,
  234. filters: true,
  235. sorter: true,
  236. width: 100
  237. },
  238. // {
  239. // title: '状态',
  240. // dataIndex: 'status',
  241. // width: 60,
  242. // filters: true,
  243. // onFilter: true,
  244. // valueType: 'select',
  245. // valueEnum: longleStatusNum,
  246. // renderText: (_, { status }) => longleStatusNum[status]?.text
  247. // },
  248. {
  249. title: '销售状态',
  250. dataIndex: 'sellStatus',
  251. key: 'sellStatus',
  252. width: 85,
  253. filters: true,
  254. filterMultiple: false,
  255. valueEnum: {
  256. 99: { text: '未销售' },
  257. 1: { text: '借出' },
  258. 2: { text: '销售' },
  259. 3: { text: '赠送' }
  260. },
  261. render: (_, { sellStatus }) => {
  262. return <>{longleSellStatusNum[sellStatus]?.text}</>
  263. }
  264. },
  265. {
  266. title: '销售时间',
  267. dataIndex: 'sellTime',
  268. key: 'sellTime',
  269. filterDropdown: filterDropdownProps => <FilterDatePicker {...filterDropdownProps} />,
  270. filters: true,
  271. sorter: true,
  272. width: 100
  273. },
  274. {
  275. title: '维护状态',
  276. dataIndex: 'preserveStatus',
  277. key: 'preserveStatus',
  278. width: 85,
  279. filters: true,
  280. filterMultiple: false,
  281. valueEnum: {
  282. 1: { text: '升级' },
  283. 2: { text: '更换' },
  284. 3: { text: '收回' }
  285. },
  286. render: (_, { preserveStatus }) => {
  287. return <>{longlePreserveStatusNum[preserveStatus]?.text}</>
  288. }
  289. },
  290. {
  291. title: '维护时间',
  292. dataIndex: 'preserveTime',
  293. key: 'preserveTime',
  294. valueType: 'date',
  295. width: 90
  296. },
  297. {
  298. title: '客户',
  299. dataIndex: 'client',
  300. key: 'client',
  301. sorter: true,
  302. width: 150,
  303. render: (text, record) => (
  304. <span
  305. onClick={() => showDrawerClient(record.clientId)}
  306. className="text-primary cursor-pointer hover:text-[#967bbd]">
  307. {text}
  308. </span>
  309. )
  310. },
  311. {
  312. title: '单位名称',
  313. dataIndex: 'customerName',
  314. key: 'customerName',
  315. sorter: true,
  316. width: 300,
  317. render: (text, record) => (
  318. <span
  319. onClick={() => showCompanyDrawer(record.customerId)}
  320. className="text-primary cursor-pointer hover:text-[#967bbd]">
  321. {text}
  322. </span>
  323. )
  324. },
  325. {
  326. title: '负责人',
  327. dataIndex: 'responsible',
  328. width: 80,
  329. render: (text, record) => (
  330. <span
  331. onClick={() => showDrawerResponsible(record.responsibleId)}
  332. className="text-primary cursor-pointer hover:text-[#967bbd]">
  333. {text}
  334. </span>
  335. )
  336. },
  337. {
  338. title: '期限',
  339. dataIndex: 'allotedTime',
  340. width: 90
  341. },
  342. {
  343. title: '办事处',
  344. dataIndex: 'category',
  345. width: 90
  346. },
  347. {
  348. title: '纵横部门',
  349. dataIndex: 'departmentName',
  350. width: 90
  351. }
  352. ]
  353. const columnsStateMap = {
  354. preserveStatus: {
  355. show: false
  356. },
  357. preserveTime: {
  358. show: false
  359. }
  360. }
  361. // const dropDownMenClick = ({ key }) => {
  362. // if (key === '1') {
  363. // showReceiveLockModal()
  364. // } else {
  365. // showReceiveNewLockModal()
  366. // }
  367. // }
  368. const [defaultPermAuthCache] = getPermAuthCache(PermDataTypeEunm.PRODUCT)
  369. return (
  370. <BasicTable
  371. rowKey={record => record.id}
  372. mainMenuType="product"
  373. columnStateType="LOCKSTORE"
  374. search={false}
  375. actionRef={tRef}
  376. params={state.params}
  377. columns={columns}
  378. request={async (params, sort, filter) => {
  379. const srotOrder = refactorSortField(sort)
  380. const {
  381. code = -1,
  382. data: { longle = [], total = 0, totalOld = 0, totalNew = 0 } = {
  383. longle: [],
  384. total: 0,
  385. totalOld: 0,
  386. totalNew: 0
  387. }
  388. } = await queryLock({ ...params, ...srotOrder, ...filter })
  389. setState({ ...state, totalOld, totalNew, orderIds: longle.map(item => item.id) })
  390. return {
  391. data: longle,
  392. success: code === consts.RET_CODE.SUCCESS,
  393. total
  394. }
  395. }}
  396. columnsStateMap={columnsStateMap}
  397. headerTitle={
  398. // <Dropdown
  399. // trigger="click"
  400. // overlay={
  401. // <Menu onClick={dropDownMenClick}>
  402. // {state.totalOld ? <Menu.Item key="1">接收旧锁</Menu.Item> : null}
  403. // {state.totalNew ? <Menu.Item key="2">接收新锁</Menu.Item> : null}
  404. // </Menu>
  405. // }>
  406. // <Button>
  407. // 接收锁
  408. // <DownOutlined />
  409. // </Button>
  410. // </Dropdown>
  411. state.totalOld ? (
  412. <Button type="primary" onClick={showReceiveLockModal}>
  413. 接收旧锁({state.totalOld})
  414. </Button>
  415. ) : null
  416. }
  417. toolbar={{
  418. search: (
  419. <Tooltip placement="bottom" title="输入软件锁号">
  420. <Input.Search
  421. style={{ width: '300px' }}
  422. allowClear={true}
  423. placeholder={`在${
  424. permData[PermDataTypeEunm.PRODUCT]?.find(
  425. item => item.value === defaultPermAuthCache
  426. )?.label
  427. }下搜索`}
  428. onSearch={handleSearch}
  429. />
  430. </Tooltip>
  431. )
  432. // actions: [
  433. // <Tooltip title="产品出库时间" key="date">
  434. // <DatePicker.RangePicker
  435. // bordered={false}
  436. // onChange={time => {
  437. // const [time1, time2] = time || [null, null]
  438. // setState({
  439. // ...state,
  440. // params: {
  441. // ...state.params,
  442. // beginTime: time1 ? time1.format('YYYY-MM-DD') : null,
  443. // endTime: time2 ? time2.format('YYYY-MM-DD') : null
  444. // }
  445. // })
  446. // }}
  447. // />
  448. // </Tooltip>
  449. // ]
  450. }}
  451. />
  452. )
  453. }
  454. export default connect(({ lock, refresh }) => ({
  455. prodList: lock.prodList,
  456. shouldUpdate: refresh.software
  457. }))(LockStore)