index.jsx 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. import React, { useEffect, useState, useRef } from 'react'
  2. import { Tag, Tooltip, Input, Button } from 'antd'
  3. import consts from '@/consts'
  4. import { connect } from '@@/plugin-dva'
  5. import { useModel } from '@umijs/max'
  6. import { queryLock } from '@/services/product'
  7. import { generateSortField } from '@/utils/utils'
  8. import { PermDataTypeEunm } from '@/pages/Customer/Company/components/PermSelect'
  9. import BasicTable from '@/components/Table'
  10. import { getPermAuthCache } from '@/utils/auth'
  11. import FilterDatePicker from '@/components/Table/src/components/FilterDatePicker'
  12. import { useModal } from '@/components/ModalStore'
  13. import { PageContainer } from '@ant-design/pro-layout'
  14. // 渲染产品标签
  15. export const ProductLabel = ({ data }) => {
  16. if (!data) return null
  17. let newData
  18. if (!Array.isArray(data)) {
  19. newData = data.split('+')
  20. }
  21. return (
  22. <span className="!children:m-2px">
  23. {newData.map((item, idx) => (
  24. <Tag key={item + idx}>{item}</Tag>
  25. ))}
  26. </span>
  27. )
  28. }
  29. // 出库状态
  30. const longleStockStatusNum = {
  31. 1: { text: '生成' },
  32. 2: { text: '接收' }
  33. }
  34. // 销售状态
  35. export const longleSellStatusNum = {
  36. 1: { text: '借出' },
  37. 2: { text: '销售' },
  38. 3: { text: '赠送' }
  39. }
  40. // 维护状态
  41. export const longlePreserveStatusNum = {
  42. 1: { text: '升级' },
  43. 2: { text: '更换' },
  44. 3: { text: '收回' }
  45. }
  46. const LockStore = ({ prodList = [], dispatch, shouldUpdate }) => {
  47. const tRef = useRef()
  48. const dispatchModal = useModal()
  49. const refreshData = () => {
  50. tRef.current?.reload()
  51. }
  52. const { initialState: { permData } = { permData: {} } } = useModel('@@initialState')
  53. const [state, setState] = useState({
  54. data: [],
  55. totalOld: 0, // 待接收锁总数
  56. totalNew: 0,
  57. orderIds: []
  58. })
  59. const handleSearch = value => {
  60. tRef.current?.reloadAndRest()
  61. setState({ ...state, params: { ...state.params, search: value } })
  62. }
  63. useEffect(() => {
  64. // 获取软件锁产品列表
  65. function fetchSoftProducts() {
  66. dispatch({
  67. type: 'lock/fetchProdList'
  68. })
  69. }
  70. if (!prodList?.length) {
  71. fetchSoftProducts()
  72. }
  73. if (shouldUpdate) {
  74. tRef.current.reload()
  75. }
  76. }, [shouldUpdate])
  77. const columns = [
  78. {
  79. title: '锁号',
  80. dataIndex: 'keyNum',
  81. width: 90,
  82. fixed: 'left',
  83. render: (keyNum, record) => (
  84. <span
  85. onClick={() => dispatchModal('D_LOCK_DETAIL', { dataId: record.id, orderIds: state.orderIds })}
  86. className="text-primary cursor-pointer hover:text-hex-967bbd">
  87. {keyNum}
  88. </span>
  89. )
  90. },
  91. {
  92. title: '产品',
  93. dataIndex: 'product',
  94. key: 'product',
  95. width: 200,
  96. fixed: 'left',
  97. filters: true,
  98. filterMultiple: false,
  99. valueEnum: prodList.reduce((prev, curr) => {
  100. const obj = { ...prev }
  101. obj[curr.title] = {
  102. text: curr.title
  103. }
  104. return obj
  105. }, {}),
  106. render: (_, record) => <ProductLabel data={record.product} />
  107. },
  108. {
  109. title: '出库状态',
  110. dataIndex: 'stockStatus',
  111. key: 'stockStatus',
  112. width: 95,
  113. filters: true,
  114. filterMultiple: false,
  115. valueEnum: {
  116. 1: { text: '生成' },
  117. 2: { text: '接收' }
  118. },
  119. render: (_, { stockStatus }) => {
  120. return <>{longleStockStatusNum[stockStatus]?.text}</>
  121. }
  122. },
  123. {
  124. title: '出库时间',
  125. dataIndex: 'stockTime',
  126. valueType: 'date',
  127. key: 'stockTime',
  128. filterDropdown: filterDropdownProps => <FilterDatePicker {...filterDropdownProps} />,
  129. filters: true,
  130. sorter: true,
  131. width: 110
  132. },
  133. // {
  134. // title: '状态',
  135. // dataIndex: 'status',
  136. // width: 60,
  137. // filters: true,
  138. // onFilter: true,
  139. // valueType: 'select',
  140. // valueEnum: longleStatusNum,
  141. // renderText: (_, { status }) => longleStatusNum[status]?.text
  142. // },
  143. {
  144. title: '销售状态',
  145. dataIndex: 'sellStatus',
  146. key: 'sellStatus',
  147. width: 95,
  148. filters: true,
  149. filterMultiple: false,
  150. valueEnum: {
  151. 99: { text: '未销售' },
  152. 1: { text: '借出' },
  153. 2: { text: '销售' },
  154. 3: { text: '赠送' }
  155. },
  156. render: (_, { sellStatus }) => {
  157. return <>{longleSellStatusNum[sellStatus]?.text}</>
  158. }
  159. },
  160. {
  161. title: '销售时间',
  162. dataIndex: 'sellTime',
  163. key: 'sellTime',
  164. filterDropdown: filterDropdownProps => <FilterDatePicker {...filterDropdownProps} />,
  165. filters: true,
  166. sorter: true,
  167. width: 110
  168. },
  169. {
  170. title: '维护状态',
  171. dataIndex: 'preserveStatus',
  172. key: 'preserveStatus',
  173. width: 95,
  174. filters: true,
  175. filterMultiple: false,
  176. valueEnum: {
  177. 1: { text: '升级' },
  178. 2: { text: '更换' },
  179. 3: { text: '收回' },
  180. 99: { text: '无维护' }
  181. },
  182. render: (_, { preserveStatus }) => {
  183. return <>{longlePreserveStatusNum[preserveStatus]?.text}</>
  184. }
  185. },
  186. {
  187. title: '维护时间',
  188. dataIndex: 'preserveTime',
  189. key: 'preserveTime',
  190. valueType: 'date',
  191. width: 95
  192. },
  193. {
  194. title: '客户',
  195. dataIndex: 'client',
  196. key: 'client',
  197. sorter: true,
  198. width: 150,
  199. render: (text, record) => (
  200. <span
  201. onClick={() => dispatchModal('D_CLIENT_DETAIL', { updateKey: 'longle', dataId: record.clientId })}
  202. className="text-primary cursor-pointer hover:text-hex-967bbd">
  203. {text}
  204. </span>
  205. )
  206. },
  207. {
  208. title: '单位名称',
  209. dataIndex: 'customerName',
  210. key: 'customerName',
  211. sorter: true,
  212. width: 300,
  213. render: (text, record) => (
  214. <span
  215. onClick={() =>
  216. record.customerId &&
  217. dispatchModal('D_COMPANY_DETAIL', { updateKey: 'longle', dataId: record.customerId })
  218. }
  219. className="text-primary cursor-pointer hover:text-hex-967bbd">
  220. {text}
  221. </span>
  222. )
  223. },
  224. {
  225. title: '负责人',
  226. dataIndex: 'responsible',
  227. width: 80,
  228. render: (text, record) => (
  229. <span
  230. onClick={() =>
  231. dispatchModal('D_SOFTWARE_DETAIL', {
  232. updateKey: 'longle',
  233. dataId: record.responsibleId
  234. })
  235. }
  236. className="text-primary cursor-pointer hover:text-hex-967bbd">
  237. {text}
  238. </span>
  239. )
  240. },
  241. {
  242. title: '期限',
  243. dataIndex: 'allotedTime',
  244. width: 90
  245. },
  246. // {
  247. // title: '办事处',
  248. // dataIndex: 'category',
  249. // width: 90
  250. // },
  251. {
  252. title: '纵横部门',
  253. dataIndex: 'departmentName',
  254. width: 90
  255. }
  256. ]
  257. const columnsStateMap = {
  258. preserveStatus: {
  259. show: false
  260. },
  261. preserveTime: {
  262. show: false
  263. }
  264. }
  265. const [defaultPermAuthCache] = getPermAuthCache(PermDataTypeEunm.PRODUCT)
  266. return (
  267. <PageContainer title={false} breadcrumb={false}>
  268. <BasicTable
  269. rowKey={record => record.id}
  270. mainMenuType="product"
  271. columnStateType="LOCKSTORE"
  272. search={false}
  273. actionRef={tRef}
  274. params={state.params}
  275. columns={columns}
  276. request={async (params, sort, filter) => {
  277. const {
  278. code = -1,
  279. data: { longle = [], total = 0, totalOld = 0, totalNew = 0 } = {
  280. longle: [],
  281. total: 0,
  282. totalOld: 0,
  283. totalNew: 0
  284. }
  285. } = await queryLock({ ...params, ...sort, ...filter })
  286. setState({ ...state, totalOld, totalNew, orderIds: longle.map(item => item.id) })
  287. return {
  288. data: longle,
  289. success: code === consts.RET_CODE.SUCCESS,
  290. total
  291. }
  292. }}
  293. columnsStateMap={columnsStateMap}
  294. toolbar={{
  295. search: (
  296. <Tooltip placement="bottom" title="输入软件锁号、客户、单位名称">
  297. <Input.Search
  298. style={{ width: '300px' }}
  299. allowClear={true}
  300. placeholder={`在${
  301. permData[PermDataTypeEunm.PRODUCT]?.find(item => item.value === defaultPermAuthCache)?.label
  302. }下搜索`}
  303. onSearch={handleSearch}
  304. />
  305. </Tooltip>
  306. )
  307. // actions: [
  308. // <Tooltip title="产品出库时间" key="date">
  309. // <DatePicker.RangePicker
  310. // bordered={false}
  311. // onChange={time => {
  312. // const [time1, time2] = time || [null, null]
  313. // setState({
  314. // ...state,
  315. // params: {
  316. // ...state.params,
  317. // beginTime: time1 ? time1.format('YYYY-MM-DD') : null,
  318. // endTime: time2 ? time2.format('YYYY-MM-DD') : null
  319. // }
  320. // })
  321. // }}
  322. // />
  323. // </Tooltip>
  324. // ]
  325. }}
  326. />
  327. </PageContainer>
  328. )
  329. }
  330. export default connect(({ lock, refresh }) => ({
  331. prodList: lock.prodList,
  332. shouldUpdate: refresh.software
  333. }))(LockStore)