@bit-sun/business-component 2.1.21 → 2.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/.editorconfig +16 -16
  2. package/.fatherrc.ts +5 -5
  3. package/.gitlab-ci.yml +179 -179
  4. package/.prettierignore +7 -7
  5. package/.prettierrc +11 -11
  6. package/.umirc.ts +74 -74
  7. package/README.md +27 -27
  8. package/dist/components/Business/BsLayouts/Components/AllFunc/drawContent.d.ts +1 -1
  9. package/dist/components/Business/BsLayouts/Components/AllFunc/index.d.ts +1 -1
  10. package/dist/components/Business/BsLayouts/Components/RightContent/index.d.ts +2 -2
  11. package/dist/components/Business/BsLayouts/Components/SearchFunc/index.d.ts +2 -2
  12. package/dist/components/Business/BsLayouts/index.d.ts +2 -2
  13. package/dist/components/Business/BsSulaQueryTable/utils.d.ts +2 -2
  14. package/dist/index.esm.js +15948 -19270
  15. package/dist/index.js +15945 -19267
  16. package/dist/utils/TableUtils.d.ts +2 -2
  17. package/dist/utils/utils.d.ts +1 -1
  18. package/docs/index.md +21 -21
  19. package/lib/assets/drag.svg +17 -17
  20. package/lib/assets/exportFail.svg +37 -37
  21. package/lib/assets/exportProcessing.svg +28 -28
  22. package/lib/assets/exportSuccess.svg +34 -34
  23. package/lib/assets/label_icon_bottom.svg +25 -25
  24. package/lib/assets/upExport.svg +22 -22
  25. package/package.json +71 -71
  26. package/src/assets/32.svg +27 -27
  27. package/src/assets/addIcon.svg +17 -17
  28. package/src/assets/allfunc.svg +27 -27
  29. package/src/assets/arrowRight.svg +24 -24
  30. package/src/assets/btn-delete.svg +29 -29
  31. package/src/assets/btn-edit.svg +19 -19
  32. package/src/assets/btn-more.svg +17 -17
  33. package/src/assets/btn-submit.svg +19 -19
  34. package/src/assets/caidan.svg +11 -11
  35. package/src/assets/close.svg +26 -26
  36. package/src/assets/drag.svg +17 -17
  37. package/src/assets/exportFail.svg +37 -37
  38. package/src/assets/exportProcessing.svg +28 -28
  39. package/src/assets/exportSuccess.svg +34 -34
  40. package/src/assets/fixed-left-active.svg +11 -11
  41. package/src/assets/fixed-left.svg +15 -15
  42. package/src/assets/fixed-right-active.svg +11 -11
  43. package/src/assets/fixed-right.svg +15 -15
  44. package/src/assets/guanbi.svg +15 -15
  45. package/src/assets/icon-quanping.svg +15 -15
  46. package/src/assets/icon-shezhi.svg +17 -17
  47. package/src/assets/label_icon_bottom.svg +25 -25
  48. package/src/assets/list-no-img.svg +21 -21
  49. package/src/assets/morentouxiang-32.svg +23 -23
  50. package/src/assets/scanning.svg +24 -24
  51. package/src/assets/upExport.svg +22 -22
  52. package/src/components/Business/AddSelectBusiness/index.md +42 -41
  53. package/src/components/Business/AddSelectBusiness/index.tsx +341 -341
  54. package/src/components/Business/BsLayouts/Components/AllFunc/drawContent.tsx +111 -111
  55. package/src/components/Business/BsLayouts/Components/AllFunc/index.less +153 -153
  56. package/src/components/Business/BsLayouts/Components/AllFunc/index.tsx +70 -70
  57. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.less +90 -90
  58. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.tsx +37 -37
  59. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/leftTree.tsx +242 -242
  60. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/rightTree.tsx +384 -384
  61. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/DrawContent.tsx +285 -285
  62. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/customMenuHeader.tsx +74 -74
  63. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/drawContent.less +170 -170
  64. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.less +64 -64
  65. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.tsx +153 -153
  66. package/src/components/Business/BsLayouts/Components/GlobalHeader/index.less +72 -72
  67. package/src/components/Business/BsLayouts/Components/GlobalHeader/index.tsx +157 -157
  68. package/src/components/Business/BsLayouts/Components/RightContent/LoginModal.tsx +85 -85
  69. package/src/components/Business/BsLayouts/Components/RightContent/home.less +218 -218
  70. package/src/components/Business/BsLayouts/Components/RightContent/index.tsx +156 -156
  71. package/src/components/Business/BsLayouts/Components/SearchFunc/index.less +160 -160
  72. package/src/components/Business/BsLayouts/Components/SearchFunc/index.tsx +75 -75
  73. package/src/components/Business/BsLayouts/index.less +79 -79
  74. package/src/components/Business/BsLayouts/index.tsx +1479 -1479
  75. package/src/components/Business/BsLayouts/service.ts +10 -10
  76. package/src/components/Business/BsLayouts/utils.tsx +230 -230
  77. package/src/components/Business/BsSulaQueryTable/index.less +219 -219
  78. package/src/components/Business/BsSulaQueryTable/index.tsx +476 -476
  79. package/src/components/Business/BsSulaQueryTable/setting.tsx +802 -802
  80. package/src/components/Business/BsSulaQueryTable/utils.less +65 -65
  81. package/src/components/Business/BsSulaQueryTable/utils.tsx +688 -688
  82. package/src/components/Business/CommodityEntry/index.md +70 -70
  83. package/src/components/Business/CommodityEntry/index.tsx +80 -80
  84. package/src/components/Business/CommonAlert/index.tsx +23 -23
  85. package/src/components/Business/CommonGuideWrapper/index.less +111 -111
  86. package/src/components/Business/CommonGuideWrapper/index.md +39 -39
  87. package/src/components/Business/CommonGuideWrapper/index.tsx +83 -83
  88. package/src/components/Business/DetailPageWrapper/index.less +79 -79
  89. package/src/components/Business/DetailPageWrapper/index.tsx +335 -335
  90. package/src/components/Business/DetailPageWrapper/utils.tsx +100 -100
  91. package/src/components/Business/HomePageWrapper/index.less +33 -33
  92. package/src/components/Business/HomePageWrapper/index.md +45 -45
  93. package/src/components/Business/HomePageWrapper/index.tsx +162 -162
  94. package/src/components/Business/SearchSelect/BusinessUtils.ts +1586 -1586
  95. package/src/components/Business/SearchSelect/common.ts +53 -53
  96. package/src/components/Business/SearchSelect/index.md +1254 -1254
  97. package/src/components/Business/SearchSelect/index.tsx +51 -51
  98. package/src/components/Business/SearchSelect/utils.ts +100 -100
  99. package/src/components/Business/StateFlow/index.less +130 -130
  100. package/src/components/Business/StateFlow/index.md +60 -60
  101. package/src/components/Business/StateFlow/index.tsx +29 -29
  102. package/src/components/Business/TreeSearchSelect/index.md +126 -126
  103. package/src/components/Business/TreeSearchSelect/index.tsx +34 -34
  104. package/src/components/Business/TreeSearchSelect/utils.ts +60 -60
  105. package/src/components/Business/columnSettingTable/columnSetting.tsx +764 -764
  106. package/src/components/Business/columnSettingTable/index.less +247 -247
  107. package/src/components/Business/columnSettingTable/index.md +357 -357
  108. package/src/components/Business/columnSettingTable/index.tsx +232 -232
  109. package/src/components/Business/columnSettingTable/sulaSettingTable.tsx +240 -240
  110. package/src/components/Business/columnSettingTable/utils.tsx +68 -68
  111. package/src/components/Business/moreTreeTable/index.less +99 -99
  112. package/src/components/Business/moreTreeTable/index.md +508 -508
  113. package/src/components/Business/moreTreeTable/index.tsx +315 -315
  114. package/src/components/Business/moreTreeTable/utils.ts +126 -126
  115. package/src/components/Functional/AddSelect/index.less +367 -367
  116. package/src/components/Functional/AddSelect/index.md +154 -154
  117. package/src/components/Functional/AddSelect/index.tsx +994 -992
  118. package/src/components/Functional/BillEntry/index.less +371 -371
  119. package/src/components/Functional/BillEntry/index.md +39 -39
  120. package/src/components/Functional/BillEntry/index.tsx +671 -671
  121. package/src/components/Functional/DataImport/index.less +63 -63
  122. package/src/components/Functional/DataImport/index.md +44 -44
  123. package/src/components/Functional/DataImport/index.tsx +695 -695
  124. package/src/components/Functional/DataValidation/index.less +63 -63
  125. package/src/components/Functional/DataValidation/index.md +39 -39
  126. package/src/components/Functional/DataValidation/index.tsx +687 -687
  127. package/src/components/Functional/ExportFunctions/ExportIcon/index.md +37 -37
  128. package/src/components/Functional/ExportFunctions/ExportIcon/index.tsx +59 -59
  129. package/src/components/Functional/QueryMutipleInput/index.less +37 -37
  130. package/src/components/Functional/QueryMutipleInput/index.md +33 -33
  131. package/src/components/Functional/QueryMutipleInput/index.tsx +128 -128
  132. package/src/components/Functional/SearchSelect/index.less +115 -115
  133. package/src/components/Functional/SearchSelect/index.md +141 -141
  134. package/src/components/Functional/SearchSelect/index.tsx +813 -813
  135. package/src/components/Functional/SearchSelect/utils.ts +6 -6
  136. package/src/components/Functional/TreeSearchSelect/index.md +47 -47
  137. package/src/components/Functional/TreeSearchSelect/index.tsx +149 -149
  138. package/src/index.ts +32 -32
  139. package/src/styles/bsDefault.less +1906 -1906
  140. package/src/utils/CheckOneUser/index.md +39 -39
  141. package/src/utils/CheckOneUser/index.ts +51 -51
  142. package/src/utils/TableUtils.tsx +18 -18
  143. package/src/utils/checkUtils.ts +39 -39
  144. package/src/utils/enumConfig.ts +10 -10
  145. package/src/utils/index.ts +2 -2
  146. package/src/utils/requestUtils.ts +33 -33
  147. package/src/utils/utils.ts +142 -142
  148. package/tsconfig.json +29 -29
  149. package/typings.d.ts +4 -4
@@ -1,671 +1,671 @@
1
- // @ts-nocheck
2
- import { Button, message, Input, InputNumber, Tooltip, Table, Popover, Select } from 'antd';
3
- import React, { useState, useRef, useEffect } from 'react';
4
- import { SearchOutlined, CopyOutlined, CloseCircleOutlined } from '@ant-design/icons';
5
- import { stringify } from 'querystring';
6
- import './index.less';
7
- import axios from 'axios';
8
- import { checkQuantityAccuracy, precisionQuantity } from '@/utils/checkUtils';
9
- import { tableColumnsImage } from '@/components/Business/BsSulaQueryTable/utils';
10
- import { getSkuImg } from '@/utils/TableUtils';
11
-
12
- const InputElement = ({
13
- record, text, currentIndex, inputLength, index, setData, data, item, callSelectItem
14
- }: {
15
- record: any, text: string, currentIndex: any, inputLength: any, index: any, setData: any, data: any, item: any, callSelectItem: any
16
- }) => {
17
- const [hoverVisibled, updateHoverVisibled] = useState(false);
18
- const [searchData, updateSearchData] = useState([]);
19
- const tableRef = useRef(null);
20
- const [value, setValue] = useState(text)
21
- const inputRef = useRef(false);
22
-
23
- const onSerchdata = (name: any) => {
24
- axios
25
- .get(`/items/sku/pager/v2?${stringify({ 'skuCodeAndSkuName': name, 'pageSize': 100, 'qp-combination-eq': false, 'qp-approveStatus-eq': 1, 'qp-status-eq': 1 })}`)
26
- .then(({ data, status }: any) => {
27
- if (status === 200) {
28
- if (data.status === '0') {
29
- const resultData = data.data.items.map((item: any, index: any) => ({
30
- ...item,
31
- index
32
- }));
33
- if (resultData.length === 1) {
34
- callSelectItem({ ...resultData[0], needFocus: true })
35
- setValue(resultData[0][item.dataIndex])
36
- } else {
37
- updateHoverVisibled(true)
38
- updateSearchData(resultData)
39
- }
40
- } else {
41
- updateSearchData([])
42
- }
43
- }
44
- })
45
- }
46
-
47
- const onCallback = (itemData: any) => {
48
- updateHoverVisibled(false)
49
- if (itemData) {
50
- callSelectItem({ ...itemData, needFocus: true })
51
- setValue(itemData[item.dataIndex])
52
- } else {
53
- callSelectItem(null)
54
- }
55
- }
56
-
57
- const SearchDataTable = (hoverVisibled: any) => {
58
- const [selectIndex, setSelectIndex] = useState(0);
59
- const inputRef = useRef(null);
60
-
61
- useEffect(() => {
62
- if (searchData.length && hoverVisibled) {
63
- let dom = tableRef?.current?.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0]
64
- if (dom) {
65
- dom.style.background = '#005CFF30'
66
- }
67
- }
68
- }, [hoverVisibled, tableRef?.current])
69
-
70
- useEffect(() => {
71
- const inter = setInterval(() => {
72
- if (inputRef.current) {
73
- inputRef.current.focus()
74
- }
75
- }, 500)
76
-
77
- return () => {
78
- clearInterval(inter);
79
- }
80
- })
81
-
82
- if (!hoverVisibled) return <></>
83
-
84
- return <div className={'add_select_wrapper_select'} style={{ width: '800px', height: '400px', overflow: 'auto', position: 'relative' }}>
85
- <Input placeholder='请输入skucode或者sku名称' ref={inputRef} style={{ position: 'absolute', zIndex: '-100', height: '22px' }} onKeyDown={(e) => {
86
- let currentIndex = selectIndex
87
- if (e.keyCode === 27) {
88
- e.stopPropagation();
89
- e.preventDefault();
90
- setSelectIndex(0);
91
- onCallback(null)
92
- }
93
- if (e.keyCode === 13) { // enter
94
- onCallback(searchData[currentIndex])
95
- setSelectIndex(0);
96
- }
97
-
98
- if (e.keyCode === 40) { // 向下
99
- let dom = tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex + 1]
100
- if (dom) {
101
- tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex].style.background = ''
102
- setSelectIndex(currentIndex + 1)
103
- dom.style.background = '#005CFF30'
104
- dom.scrollIntoViewIfNeeded(false)
105
- }
106
- } else if (e.keyCode === 38) {
107
- let dom = tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex - 1]
108
- if (dom) {
109
- tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex].style.background = ''
110
- setSelectIndex(currentIndex - 1)
111
- dom.style.background = '#005CFF30'
112
- dom.scrollIntoViewIfNeeded(false)
113
- }
114
- }
115
- }} />
116
- <Table
117
- ref={tableRef}
118
- pagination={false}
119
- // components={
120
- // {
121
- // body: {
122
- // cell: ({index, record, ...props}) => {
123
- // debugger
124
- // return <td {...props} style={selectIndex === record?.index ? {background: '#005CFF30'} : {} } />
125
- // }
126
- // }
127
- // }
128
- // }
129
- onRow={(record, index) => {
130
- return {
131
- onClick: ((record, index, event) => {
132
- let dom = tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[index]
133
- if (dom) {
134
- [...(tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr'))].map(item => {
135
- item.style.background = ''
136
- })
137
- dom.style.background = '#005CFF30'
138
- dom.scrollIntoViewIfNeeded(false)
139
- }
140
- setSelectIndex(index)
141
- }).bind(this, record, index), // 点击行
142
- }
143
- }}
144
- rowClassName={'row-class'}
145
- columns={[{
146
- title: 'SKU编码',
147
- width: 150,
148
- dataIndex: 'skuCode',
149
- },
150
- {
151
- title: 'SKU名称',
152
- width: 200,
153
- ellipsis: {
154
- showTitle: false,
155
- },
156
- render: (text: any) => (
157
- <Tooltip placement="topLeft" title={text}>
158
- {text}
159
- </Tooltip>
160
- ),
161
- dataIndex: 'name',
162
- },
163
- {
164
- title: '图片',
165
- dataIndex: 'itemUrl',
166
- width: 200,
167
- ellipsis: {
168
- showTitle: false,
169
- },
170
- render: (text: any,record: any) => (
171
- <Tooltip placement="topLeft" title={text}>
172
- {tableColumnsImage(getSkuImg(record),{ width: 28, height: 28 })}
173
- </Tooltip>
174
- ),
175
- },
176
- {
177
- title: '国际条码',
178
- width: 100,
179
- ellipsis: {
180
- showTitle: false,
181
- },
182
- dataIndex: 'barCode',
183
- render: (text: any) => (
184
- <Tooltip placement="topLeft" title={text}>
185
- {text}
186
- </Tooltip>
187
- ),
188
- },
189
- {
190
- title: '所属SPU名称',
191
- width: 100,
192
- ellipsis: {
193
- showTitle: false,
194
- },
195
- dataIndex: 'itemName',
196
- render: (text: any) => (
197
- <Tooltip placement="topLeft" title={text}>
198
- {text}
199
- </Tooltip>
200
- ),
201
- },
202
- {
203
- title: '所属SPU编码',
204
- width: 100,
205
- ellipsis: {
206
- showTitle: false,
207
- },
208
- dataIndex: 'itemCode',
209
- render: (text: any) => (
210
- <Tooltip placement="topLeft" title={text}>
211
- {text}
212
- </Tooltip>
213
- ),
214
- },
215
- {
216
- title: '外部编码',
217
- width: 100,
218
- ellipsis: {
219
- showTitle: false,
220
- },
221
- render: (text: any) => (
222
- <Tooltip placement="topLeft" title={text}>
223
- {text}
224
- </Tooltip>
225
- ),
226
- dataIndex: 'externalCode',
227
- }]} dataSource={searchData} />
228
- </div>
229
- }
230
-
231
- let precisionObj={};
232
- const unitAccuracy = record.packingUnitList?.[0]?.unitAccuracy
233
- const isCountUnitAccuracyCheck = item.dataIndex =='count' && unitAccuracy !== undefined
234
- if(isCountUnitAccuracyCheck) {
235
- precisionObj = {
236
- onBlur: (e: any) => {
237
- const { target: { value } } = e;
238
- if(!checkQuantityAccuracy(value,Number(unitAccuracy))) {
239
- record[item.dataIndex] = precisionQuantity(value,Number(unitAccuracy))
240
- const newData = data.map((i: any, innerIndex: number) => {
241
- if(innerIndex == index) {
242
- i[item.dataIndex] = record[item.dataIndex]
243
- }
244
- return i
245
- })
246
- setData(newData)
247
- }
248
- }
249
- // precision: unitAccuracy
250
- }
251
- }
252
-
253
- return (
254
- <Popover placement="bottomLeft" destroyTooltipOnHide={{ keepParent: false }} title="" trigger="" content={SearchDataTable(hoverVisibled)} visible={hoverVisibled} onVisibleChange={(disabled) => { updateHoverVisibled(disabled) }}>
255
- {item.isPrimaryInput ?
256
- <Input
257
- value={value}
258
- ref={inputRef}
259
- placeholder='skucode / sku名称'
260
- keyboard={false}
261
- autoFocus={record.autoFocus}
262
- onChange={(value) => {
263
- record[item.dataIndex] = value.currentTarget.value
264
- setValue(value.currentTarget.value)
265
- // setData(data);
266
- }}
267
- // onFocus={(e)=> {
268
- // let dom1 = e.currentTarget;
269
- // dom1.setSelectionRange(100, 0);
270
- // dom1.select(text);
271
- // }}
272
- onKeyDown={(e) => {
273
- // if (e.keyCode === 13 && e.ctrlKey) {
274
- // handleOk(true)
275
- // document.getElementById("first-query")?.focus()
276
- // }
277
- if (e.keyCode === 8 && e.ctrlKey && index) {
278
- message.success('删除当前行')
279
- e.stopPropagation();
280
- e.preventDefault();
281
- let dom = e.nativeEvent.path[3].children[index]?.getElementsByTagName('input')[currentIndex]
282
- if (dom) {
283
- dom.select();
284
- dom.focus();
285
- dom.scrollIntoViewIfNeeded(false)
286
- }
287
- dom = null
288
- setData(data.filter((item, innerIndex) => innerIndex !== index))
289
- }
290
- if (e.keyCode === 13) { // enter
291
- if (item.isPrimaryInput) {
292
- if (e.currentTarget.value.length < 2) {
293
- message.warning('至少输入两个字符');
294
- } else {
295
- onSerchdata(e.currentTarget.value)
296
- }
297
- }
298
- }
299
- if (e.keyCode === 37 && e.shiftKey) { // 左滑动
300
- e.stopPropagation();
301
- e.preventDefault();
302
- let dom = e.nativeEvent.path[3].children[index + 1]?.getElementsByTagName('input')[currentIndex - 1]
303
- if (dom) {
304
- dom.select();
305
- dom.focus();
306
- dom.scrollIntoViewIfNeeded(false)
307
- }
308
- dom = null
309
- }
310
- if (e.keyCode === 39 && e.shiftKey) { // 右滑
311
- e.stopPropagation();
312
- e.preventDefault();
313
- let dom = e.nativeEvent.path[3].children[index + 1]?.getElementsByTagName('input')[currentIndex + 1]
314
- if (dom) {
315
- dom.select();
316
- dom.focus();
317
- dom.scrollIntoViewIfNeeded(false)
318
- }
319
- dom = null
320
- }
321
- if (e.keyCode === 40) { // 向下
322
- debugger
323
- e.stopPropagation();
324
- e.preventDefault();
325
- let dom = e.nativeEvent.path[3].children[index + 2]?.getElementsByTagName('input')[currentIndex]
326
- if (dom) {
327
- dom.select();
328
- dom.focus();
329
- dom.scrollIntoViewIfNeeded(false)
330
- }
331
- dom = null
332
- } else if (e.keyCode === 38) {
333
- e.stopPropagation();
334
- e.preventDefault();
335
- let dom1 = e.nativeEvent.path[3].children[index]?.getElementsByTagName('input')[currentIndex]
336
- if (dom1) {
337
- // dom1.value=""
338
- // dom1.setSelectionRange(100, 0);
339
- dom1.select();
340
- dom1.focus();
341
- dom1.scrollIntoViewIfNeeded(false)
342
- // dom1.value=record['count']
343
- }
344
- dom1 = null
345
- } else if (e.keyCode === 9 && currentIndex === inputLength - 1 && index === data.length - 1) {
346
- setData([...data, {}])
347
- }
348
- }}
349
- />
350
- :
351
- <InputNumber
352
- // onBlur={() => {updateHoverVisibled(false)}}
353
- value={text || ''}
354
- min={0}
355
- keyboard={false}
356
- {...precisionObj}
357
- onChange={(value) => {
358
- record[item.dataIndex] = value
359
- const newData = data.map((i: any, innerIndex: number) => {
360
- if(innerIndex == index) {
361
- i[item.dataIndex] = record[item.dataIndex]
362
- }
363
- return i
364
- })
365
- setData(newData)
366
- }}
367
- onKeyDown={(e) => {
368
- // if (e.keyCode === 13 && e.ctrlKey) {
369
- // handleOk(true)
370
- // document.getElementById("first-query")?.focus()
371
- // }
372
- if (e.keyCode === 8 && e.ctrlKey && index) {
373
- message.success('删除当前行')
374
- e.stopPropagation();
375
- e.preventDefault();
376
- let dom = e.nativeEvent.path[5].children[index]?.getElementsByTagName('input')[currentIndex]
377
- if (dom) {
378
- dom.select();
379
- dom.focus();
380
- dom.scrollIntoViewIfNeeded(false)
381
- }
382
- dom = null
383
- setData(data.filter((item, innerIndex) => innerIndex !== index))
384
- }
385
- if (e.keyCode === 37 && e.shiftKey) { // 左滑动
386
- e.stopPropagation();
387
- e.preventDefault();
388
- let dom = e.nativeEvent.path[5].children[index + 1]?.getElementsByTagName('input')[currentIndex - 1]
389
- if (dom) {
390
- dom.select();
391
- dom.focus();
392
- dom.scrollIntoViewIfNeeded(false)
393
- }
394
- dom = null
395
- }
396
- if (e.keyCode === 39 && e.shiftKey) { // 右滑
397
- e.stopPropagation();
398
- e.preventDefault();
399
- let dom = e.nativeEvent.path[5].children[index + 1]?.getElementsByTagName('input')[currentIndex + 1]
400
- if (dom) {
401
- dom.select();
402
- dom.focus();
403
- dom.scrollIntoViewIfNeeded(false)
404
- }
405
- dom = null
406
- }
407
- if (e.keyCode === 40) { // 向下
408
- e.stopPropagation();
409
- e.preventDefault();
410
- let dom = e.nativeEvent.path[5].children[index + 2]?.getElementsByTagName('input')[currentIndex]
411
- if (dom) {
412
- dom.select();
413
- dom.focus();
414
- dom.scrollIntoViewIfNeeded(false)
415
- }
416
- dom = null
417
- } else if (e.keyCode === 38) {
418
- e.stopPropagation();
419
- e.preventDefault();
420
- let dom1 = e.nativeEvent.path[5].children[index]?.getElementsByTagName('input')[currentIndex]
421
- if (dom1) {
422
- // dom1.value=""
423
- // dom1.setSelectionRange(100, 0);
424
- dom1.select();
425
- dom1.focus();
426
- dom1.scrollIntoViewIfNeeded(false)
427
- // dom1.value=record['count']
428
- }
429
- dom1 = null
430
- } else if (e.keyCode === 9 && currentIndex === inputLength - 1 && index === data.length - 1) {
431
- e.stopPropagation();
432
- e.preventDefault();
433
- } else if (e.keyCode === 13 && currentIndex === inputLength - 1 && index === data.length - 1 && record['skuCode']) {
434
- setData([...data, { autoFocus: true }])
435
- }
436
- }}
437
- />
438
- }
439
-
440
- </Popover>
441
- )
442
- }
443
-
444
- const BillEntry: React.FC = ({ onSaveCallback, validDataUrl="/items/sku/import/check", isBrandAuth=true, isCheckStockNum=true }) => {
445
- const columns = [
446
- {
447
- title: 'SKU编码',
448
- width: 150,
449
- dataIndex: 'skuCode',
450
- isInputItem: true,
451
- isPrimaryInput: true
452
- },
453
- {
454
- title: 'SKU名称',
455
- width: 200,
456
- ellipsis: {
457
- showTitle: false,
458
- },
459
- render: (text: any) => (
460
- <Tooltip placement="topLeft" title={text}>
461
- {text}
462
- </Tooltip>
463
- ),
464
- dataIndex: 'name',
465
- },
466
- {
467
- title: '图片',
468
- dataIndex: 'itemUrl',
469
- width: 200,
470
- ellipsis: {
471
- showTitle: false,
472
- },
473
- render: (text: any,record: any) => (
474
- <Tooltip placement="topLeft" title={text}>
475
- {tableColumnsImage(getSkuImg(record),{ width: 28, height: 28 })}
476
- </Tooltip>
477
- ),
478
- },
479
- {
480
- title: '单位',
481
- dataIndex: 'selectUnitCode',
482
- width: 100,
483
- render: (text: any, record: any) => {
484
- if (record?.packingUnitList?.length) {
485
- const basePackUnit = record?.packingUnitList[0]
486
- record.selectUnitCode = basePackUnit.unitCode
487
- return basePackUnit.name || basePackUnit.unitCode
488
- }
489
-
490
-
491
- return <></>
492
- },
493
- },
494
- {
495
- title: '数量',
496
- width: 100,
497
- isInputItem: true,
498
- dataIndex: 'count',
499
- },
500
- {
501
- title: '所属SPU编码',
502
- width: 100,
503
- ellipsis: {
504
- showTitle: false,
505
- },
506
- dataIndex: 'itemCode',
507
- render: (text: any) => (
508
- <Tooltip placement="topLeft" title={text}>
509
- {text}
510
- </Tooltip>
511
- ),
512
- },
513
- {
514
- title: '规格',
515
- width: 200,
516
- ellipsis: {
517
- showTitle: false,
518
- },
519
- render: (text: any) => (
520
- <Tooltip placement="topLeft" title={text}>
521
- {text}
522
- </Tooltip>
523
- ),
524
- dataIndex: 'propertyNameAndValue',
525
- }
526
- ]
527
- const [isModalVisible, setIsModalVisible] = useState(false);
528
- const [data, setData] = useState([{ hovered: false }]);
529
- const tableRef = useRef(null)
530
-
531
- const [loading, setLoading] = useState(false);
532
-
533
- const callSelectItem = (index, item) => {
534
- if (item) {
535
- let newData = [].concat(data)
536
- newData[index] = { ...data[index], ...item }
537
- setData(newData)
538
- }
539
- let dom = tableRef?.current?.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[index + 1]
540
- if (dom) {
541
- setTimeout(() => {
542
- dom.getElementsByTagName('input')[item ? 1 : 0]?.select()
543
- dom.getElementsByTagName('input')[item ? 1 : 0]?.focus()
544
- }, 200)
545
- }
546
- }
547
-
548
- const deleteRecord = (record) => {
549
- setData(data.filter(item => item.skuCode !== record.skuCode))
550
- }
551
-
552
- let inputIndex = 0;
553
- let selectColumns = [...columns.map(item => {
554
- const inputLength = columns.filter(item => item.isInputItem || item.isSelectItem).length
555
- const currentIndex = inputIndex
556
- if (item.isInputItem) {
557
- inputIndex++;
558
- return {
559
- ...item,
560
- render: (text, record, index) => {
561
- return (
562
- <InputElement setData={setData} callSelectItem={callSelectItem.bind(this, index)} item={item} isPrimaryInput={item.isPrimaryInput} record={record} text={text} data={data} index={index} inputLength={inputLength} currentIndex={currentIndex} />
563
- );
564
- },
565
- }
566
- } else if (item.isSelectItem) {
567
- inputIndex++;
568
- }
569
-
570
- return item
571
- }), {
572
- title: '操作',
573
- width: 50,
574
- render: (text, record, index) => {
575
- if (index !== 0) {
576
- return (
577
- <span style={{ cursor: 'pointer', color: '#005CFF' }} onClick={() => {
578
- deleteRecord(record)
579
- }}>删除</span>
580
- )
581
- }
582
- }
583
- }]
584
-
585
- const isSkuCanEntry = (resultData) => {
586
- // 处理业务参数
587
- let otherParams={}
588
- if(isBrandAuth){
589
- otherParams = { brandAuth: 'ctl-withAuth' }
590
- }
591
- return axios
592
- .post(validDataUrl, {
593
- ...otherParams,
594
- columns: ["skuCode", "quantity"],
595
- data: resultData.map((i:any) => ({ skuCode: i.skuCode, quality: i.count })),
596
- checkStockNum: isCheckStockNum,
597
- })
598
- .then((result) => {
599
- result = result.data;
600
- if (result.status !== '0') {
601
- message.error(result.msg);
602
- return { flag: false }
603
- } else {
604
- let res = result.data || [];
605
- const errorList = res.filter((i: any) => !i.flag);
606
- return { flag: !errorList?.length, errorList }
607
- }
608
- }).catch(() => {
609
- return { flag:false }
610
- })
611
- }
612
-
613
- const handleSubmit = async () => {
614
- // 加校验逻辑
615
- if (!data?.length) {
616
- message.warning('至少录入一条数据');
617
- return;
618
- }
619
- if (!data?.every((d: any) => d.skuCode && d.name)) {
620
- message.warning('请选择商品!');
621
- return;
622
- }
623
- if (!data?.every((d: any) => d.count)) {
624
- message.warning('请填写商品数量!');
625
- return;
626
- }
627
- const canEntryObject = await isSkuCanEntry(data)
628
- if(canEntryObject?.flag === false) {
629
- const messageInfo = canEntryObject?.errorList?.length && canEntryObject?.errorList.map((i: any) => <div>{i.skuCode}校验失败:{i.checkResults}</div>)
630
- messageInfo && message.warning({ content: messageInfo, duration: 6 });
631
- return;
632
- }
633
-
634
- setLoading(true)
635
- onSaveCallback(data).then(res => {
636
- if(true) {
637
- message.success('保存成功')
638
- }
639
- setLoading(false)
640
- }).catch(Error => {
641
- message.error(Error);
642
- setLoading(false)
643
- })
644
- }
645
-
646
- return (
647
- <div className='add_select'>
648
- <div className='add_select_quick_header'>
649
- <div className='add_select_quick_header_title'><div>快速录入</div><Button type="primary" onClick={() => handleSubmit()} loading={loading}>提交</Button></div>
650
- <span><span>*</span> &nbsp;快捷键:【Tab】-跳格切换;【Shift+←、→】-当前行左、右移动;【 ↑、↓】-当前列上、下移动;【ctrl+Delete】-删除当前行;</span>
651
- </div>
652
- <div className={'add_select_wrapper_select add_select_wrapper_select_quick'}>
653
- <Table
654
- size='small'
655
- scroll={{ y: 240 }}
656
- ref={tableRef}
657
- dataSource={data}
658
- columns={selectColumns}
659
- pagination={false}
660
- rowClassName={'row-class'}
661
- rowClassName={(record: object | null | undefined, index: number) =>
662
- index % 2 === 0 ? 'table_base row-class' : 'table_odd row-class'
663
- }
664
- />
665
- </div>
666
-
667
- </div>
668
- );
669
- };
670
-
671
- export default BillEntry;
1
+ // @ts-nocheck
2
+ import { Button, message, Input, InputNumber, Tooltip, Table, Popover, Select } from 'antd';
3
+ import React, { useState, useRef, useEffect } from 'react';
4
+ import { SearchOutlined, CopyOutlined, CloseCircleOutlined } from '@ant-design/icons';
5
+ import { stringify } from 'querystring';
6
+ import './index.less';
7
+ import axios from 'axios';
8
+ import { checkQuantityAccuracy, precisionQuantity } from '@/utils/checkUtils';
9
+ import { tableColumnsImage } from '@/components/Business/BsSulaQueryTable/utils';
10
+ import { getSkuImg } from '@/utils/TableUtils';
11
+
12
+ const InputElement = ({
13
+ record, text, currentIndex, inputLength, index, setData, data, item, callSelectItem
14
+ }: {
15
+ record: any, text: string, currentIndex: any, inputLength: any, index: any, setData: any, data: any, item: any, callSelectItem: any
16
+ }) => {
17
+ const [hoverVisibled, updateHoverVisibled] = useState(false);
18
+ const [searchData, updateSearchData] = useState([]);
19
+ const tableRef = useRef(null);
20
+ const [value, setValue] = useState(text)
21
+ const inputRef = useRef(false);
22
+
23
+ const onSerchdata = (name: any) => {
24
+ axios
25
+ .get(`/items/sku/pager/v2?${stringify({ 'skuCodeAndSkuName': name, 'pageSize': 100, 'qp-combination-eq': false, 'qp-approveStatus-eq': 1, 'qp-status-eq': 1 })}`)
26
+ .then(({ data, status }: any) => {
27
+ if (status === 200) {
28
+ if (data.status === '0') {
29
+ const resultData = data.data.items.map((item: any, index: any) => ({
30
+ ...item,
31
+ index
32
+ }));
33
+ if (resultData.length === 1) {
34
+ callSelectItem({ ...resultData[0], needFocus: true })
35
+ setValue(resultData[0][item.dataIndex])
36
+ } else {
37
+ updateHoverVisibled(true)
38
+ updateSearchData(resultData)
39
+ }
40
+ } else {
41
+ updateSearchData([])
42
+ }
43
+ }
44
+ })
45
+ }
46
+
47
+ const onCallback = (itemData: any) => {
48
+ updateHoverVisibled(false)
49
+ if (itemData) {
50
+ callSelectItem({ ...itemData, needFocus: true })
51
+ setValue(itemData[item.dataIndex])
52
+ } else {
53
+ callSelectItem(null)
54
+ }
55
+ }
56
+
57
+ const SearchDataTable = (hoverVisibled: any) => {
58
+ const [selectIndex, setSelectIndex] = useState(0);
59
+ const inputRef = useRef(null);
60
+
61
+ useEffect(() => {
62
+ if (searchData.length && hoverVisibled) {
63
+ let dom = tableRef?.current?.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0]
64
+ if (dom) {
65
+ dom.style.background = '#005CFF30'
66
+ }
67
+ }
68
+ }, [hoverVisibled, tableRef?.current])
69
+
70
+ useEffect(() => {
71
+ const inter = setInterval(() => {
72
+ if (inputRef.current) {
73
+ inputRef.current.focus()
74
+ }
75
+ }, 500)
76
+
77
+ return () => {
78
+ clearInterval(inter);
79
+ }
80
+ })
81
+
82
+ if (!hoverVisibled) return <></>
83
+
84
+ return <div className={'add_select_wrapper_select'} style={{ width: '800px', height: '400px', overflow: 'auto', position: 'relative' }}>
85
+ <Input placeholder='请输入skucode或者sku名称' ref={inputRef} style={{ position: 'absolute', zIndex: '-100', height: '22px' }} onKeyDown={(e) => {
86
+ let currentIndex = selectIndex
87
+ if (e.keyCode === 27) {
88
+ e.stopPropagation();
89
+ e.preventDefault();
90
+ setSelectIndex(0);
91
+ onCallback(null)
92
+ }
93
+ if (e.keyCode === 13) { // enter
94
+ onCallback(searchData[currentIndex])
95
+ setSelectIndex(0);
96
+ }
97
+
98
+ if (e.keyCode === 40) { // 向下
99
+ let dom = tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex + 1]
100
+ if (dom) {
101
+ tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex].style.background = ''
102
+ setSelectIndex(currentIndex + 1)
103
+ dom.style.background = '#005CFF30'
104
+ dom.scrollIntoViewIfNeeded(false)
105
+ }
106
+ } else if (e.keyCode === 38) {
107
+ let dom = tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex - 1]
108
+ if (dom) {
109
+ tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[currentIndex].style.background = ''
110
+ setSelectIndex(currentIndex - 1)
111
+ dom.style.background = '#005CFF30'
112
+ dom.scrollIntoViewIfNeeded(false)
113
+ }
114
+ }
115
+ }} />
116
+ <Table
117
+ ref={tableRef}
118
+ pagination={false}
119
+ // components={
120
+ // {
121
+ // body: {
122
+ // cell: ({index, record, ...props}) => {
123
+ // debugger
124
+ // return <td {...props} style={selectIndex === record?.index ? {background: '#005CFF30'} : {} } />
125
+ // }
126
+ // }
127
+ // }
128
+ // }
129
+ onRow={(record, index) => {
130
+ return {
131
+ onClick: ((record, index, event) => {
132
+ let dom = tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[index]
133
+ if (dom) {
134
+ [...(tableRef.current.getElementsByTagName('tbody')[0].getElementsByTagName('tr'))].map(item => {
135
+ item.style.background = ''
136
+ })
137
+ dom.style.background = '#005CFF30'
138
+ dom.scrollIntoViewIfNeeded(false)
139
+ }
140
+ setSelectIndex(index)
141
+ }).bind(this, record, index), // 点击行
142
+ }
143
+ }}
144
+ rowClassName={'row-class'}
145
+ columns={[{
146
+ title: 'SKU编码',
147
+ width: 150,
148
+ dataIndex: 'skuCode',
149
+ },
150
+ {
151
+ title: 'SKU名称',
152
+ width: 200,
153
+ ellipsis: {
154
+ showTitle: false,
155
+ },
156
+ render: (text: any) => (
157
+ <Tooltip placement="topLeft" title={text}>
158
+ {text}
159
+ </Tooltip>
160
+ ),
161
+ dataIndex: 'name',
162
+ },
163
+ {
164
+ title: '图片',
165
+ dataIndex: 'itemUrl',
166
+ width: 200,
167
+ ellipsis: {
168
+ showTitle: false,
169
+ },
170
+ render: (text: any,record: any) => (
171
+ <Tooltip placement="topLeft" title={text}>
172
+ {tableColumnsImage(getSkuImg(record),{ width: 28, height: 28 })}
173
+ </Tooltip>
174
+ ),
175
+ },
176
+ {
177
+ title: '国际条码',
178
+ width: 100,
179
+ ellipsis: {
180
+ showTitle: false,
181
+ },
182
+ dataIndex: 'barCode',
183
+ render: (text: any) => (
184
+ <Tooltip placement="topLeft" title={text}>
185
+ {text}
186
+ </Tooltip>
187
+ ),
188
+ },
189
+ {
190
+ title: '所属SPU名称',
191
+ width: 100,
192
+ ellipsis: {
193
+ showTitle: false,
194
+ },
195
+ dataIndex: 'itemName',
196
+ render: (text: any) => (
197
+ <Tooltip placement="topLeft" title={text}>
198
+ {text}
199
+ </Tooltip>
200
+ ),
201
+ },
202
+ {
203
+ title: '所属SPU编码',
204
+ width: 100,
205
+ ellipsis: {
206
+ showTitle: false,
207
+ },
208
+ dataIndex: 'itemCode',
209
+ render: (text: any) => (
210
+ <Tooltip placement="topLeft" title={text}>
211
+ {text}
212
+ </Tooltip>
213
+ ),
214
+ },
215
+ {
216
+ title: '外部编码',
217
+ width: 100,
218
+ ellipsis: {
219
+ showTitle: false,
220
+ },
221
+ render: (text: any) => (
222
+ <Tooltip placement="topLeft" title={text}>
223
+ {text}
224
+ </Tooltip>
225
+ ),
226
+ dataIndex: 'externalCode',
227
+ }]} dataSource={searchData} />
228
+ </div>
229
+ }
230
+
231
+ let precisionObj={};
232
+ const unitAccuracy = record.packingUnitList?.[0]?.unitAccuracy
233
+ const isCountUnitAccuracyCheck = item.dataIndex =='count' && unitAccuracy !== undefined
234
+ if(isCountUnitAccuracyCheck) {
235
+ precisionObj = {
236
+ onBlur: (e: any) => {
237
+ const { target: { value } } = e;
238
+ if(!checkQuantityAccuracy(value,Number(unitAccuracy))) {
239
+ record[item.dataIndex] = precisionQuantity(value,Number(unitAccuracy))
240
+ const newData = data.map((i: any, innerIndex: number) => {
241
+ if(innerIndex == index) {
242
+ i[item.dataIndex] = record[item.dataIndex]
243
+ }
244
+ return i
245
+ })
246
+ setData(newData)
247
+ }
248
+ }
249
+ // precision: unitAccuracy
250
+ }
251
+ }
252
+
253
+ return (
254
+ <Popover placement="bottomLeft" destroyTooltipOnHide={{ keepParent: false }} title="" trigger="" content={SearchDataTable(hoverVisibled)} visible={hoverVisibled} onVisibleChange={(disabled) => { updateHoverVisibled(disabled) }}>
255
+ {item.isPrimaryInput ?
256
+ <Input
257
+ value={value}
258
+ ref={inputRef}
259
+ placeholder='skucode / sku名称'
260
+ keyboard={false}
261
+ autoFocus={record.autoFocus}
262
+ onChange={(value) => {
263
+ record[item.dataIndex] = value.currentTarget.value
264
+ setValue(value.currentTarget.value)
265
+ // setData(data);
266
+ }}
267
+ // onFocus={(e)=> {
268
+ // let dom1 = e.currentTarget;
269
+ // dom1.setSelectionRange(100, 0);
270
+ // dom1.select(text);
271
+ // }}
272
+ onKeyDown={(e) => {
273
+ // if (e.keyCode === 13 && e.ctrlKey) {
274
+ // handleOk(true)
275
+ // document.getElementById("first-query")?.focus()
276
+ // }
277
+ if (e.keyCode === 8 && e.ctrlKey && index) {
278
+ message.success('删除当前行')
279
+ e.stopPropagation();
280
+ e.preventDefault();
281
+ let dom = e.nativeEvent.path[3].children[index]?.getElementsByTagName('input')[currentIndex]
282
+ if (dom) {
283
+ dom.select();
284
+ dom.focus();
285
+ dom.scrollIntoViewIfNeeded(false)
286
+ }
287
+ dom = null
288
+ setData(data.filter((item, innerIndex) => innerIndex !== index))
289
+ }
290
+ if (e.keyCode === 13) { // enter
291
+ if (item.isPrimaryInput) {
292
+ if (e.currentTarget.value.length < 2) {
293
+ message.warning('至少输入两个字符');
294
+ } else {
295
+ onSerchdata(e.currentTarget.value)
296
+ }
297
+ }
298
+ }
299
+ if (e.keyCode === 37 && e.shiftKey) { // 左滑动
300
+ e.stopPropagation();
301
+ e.preventDefault();
302
+ let dom = e.nativeEvent.path[3].children[index + 1]?.getElementsByTagName('input')[currentIndex - 1]
303
+ if (dom) {
304
+ dom.select();
305
+ dom.focus();
306
+ dom.scrollIntoViewIfNeeded(false)
307
+ }
308
+ dom = null
309
+ }
310
+ if (e.keyCode === 39 && e.shiftKey) { // 右滑
311
+ e.stopPropagation();
312
+ e.preventDefault();
313
+ let dom = e.nativeEvent.path[3].children[index + 1]?.getElementsByTagName('input')[currentIndex + 1]
314
+ if (dom) {
315
+ dom.select();
316
+ dom.focus();
317
+ dom.scrollIntoViewIfNeeded(false)
318
+ }
319
+ dom = null
320
+ }
321
+ if (e.keyCode === 40) { // 向下
322
+ debugger
323
+ e.stopPropagation();
324
+ e.preventDefault();
325
+ let dom = e.nativeEvent.path[3].children[index + 2]?.getElementsByTagName('input')[currentIndex]
326
+ if (dom) {
327
+ dom.select();
328
+ dom.focus();
329
+ dom.scrollIntoViewIfNeeded(false)
330
+ }
331
+ dom = null
332
+ } else if (e.keyCode === 38) {
333
+ e.stopPropagation();
334
+ e.preventDefault();
335
+ let dom1 = e.nativeEvent.path[3].children[index]?.getElementsByTagName('input')[currentIndex]
336
+ if (dom1) {
337
+ // dom1.value=""
338
+ // dom1.setSelectionRange(100, 0);
339
+ dom1.select();
340
+ dom1.focus();
341
+ dom1.scrollIntoViewIfNeeded(false)
342
+ // dom1.value=record['count']
343
+ }
344
+ dom1 = null
345
+ } else if (e.keyCode === 9 && currentIndex === inputLength - 1 && index === data.length - 1) {
346
+ setData([...data, {}])
347
+ }
348
+ }}
349
+ />
350
+ :
351
+ <InputNumber
352
+ // onBlur={() => {updateHoverVisibled(false)}}
353
+ value={text || ''}
354
+ min={0}
355
+ keyboard={false}
356
+ {...precisionObj}
357
+ onChange={(value) => {
358
+ record[item.dataIndex] = value
359
+ const newData = data.map((i: any, innerIndex: number) => {
360
+ if(innerIndex == index) {
361
+ i[item.dataIndex] = record[item.dataIndex]
362
+ }
363
+ return i
364
+ })
365
+ setData(newData)
366
+ }}
367
+ onKeyDown={(e) => {
368
+ // if (e.keyCode === 13 && e.ctrlKey) {
369
+ // handleOk(true)
370
+ // document.getElementById("first-query")?.focus()
371
+ // }
372
+ if (e.keyCode === 8 && e.ctrlKey && index) {
373
+ message.success('删除当前行')
374
+ e.stopPropagation();
375
+ e.preventDefault();
376
+ let dom = e.nativeEvent.path[5].children[index]?.getElementsByTagName('input')[currentIndex]
377
+ if (dom) {
378
+ dom.select();
379
+ dom.focus();
380
+ dom.scrollIntoViewIfNeeded(false)
381
+ }
382
+ dom = null
383
+ setData(data.filter((item, innerIndex) => innerIndex !== index))
384
+ }
385
+ if (e.keyCode === 37 && e.shiftKey) { // 左滑动
386
+ e.stopPropagation();
387
+ e.preventDefault();
388
+ let dom = e.nativeEvent.path[5].children[index + 1]?.getElementsByTagName('input')[currentIndex - 1]
389
+ if (dom) {
390
+ dom.select();
391
+ dom.focus();
392
+ dom.scrollIntoViewIfNeeded(false)
393
+ }
394
+ dom = null
395
+ }
396
+ if (e.keyCode === 39 && e.shiftKey) { // 右滑
397
+ e.stopPropagation();
398
+ e.preventDefault();
399
+ let dom = e.nativeEvent.path[5].children[index + 1]?.getElementsByTagName('input')[currentIndex + 1]
400
+ if (dom) {
401
+ dom.select();
402
+ dom.focus();
403
+ dom.scrollIntoViewIfNeeded(false)
404
+ }
405
+ dom = null
406
+ }
407
+ if (e.keyCode === 40) { // 向下
408
+ e.stopPropagation();
409
+ e.preventDefault();
410
+ let dom = e.nativeEvent.path[5].children[index + 2]?.getElementsByTagName('input')[currentIndex]
411
+ if (dom) {
412
+ dom.select();
413
+ dom.focus();
414
+ dom.scrollIntoViewIfNeeded(false)
415
+ }
416
+ dom = null
417
+ } else if (e.keyCode === 38) {
418
+ e.stopPropagation();
419
+ e.preventDefault();
420
+ let dom1 = e.nativeEvent.path[5].children[index]?.getElementsByTagName('input')[currentIndex]
421
+ if (dom1) {
422
+ // dom1.value=""
423
+ // dom1.setSelectionRange(100, 0);
424
+ dom1.select();
425
+ dom1.focus();
426
+ dom1.scrollIntoViewIfNeeded(false)
427
+ // dom1.value=record['count']
428
+ }
429
+ dom1 = null
430
+ } else if (e.keyCode === 9 && currentIndex === inputLength - 1 && index === data.length - 1) {
431
+ e.stopPropagation();
432
+ e.preventDefault();
433
+ } else if (e.keyCode === 13 && currentIndex === inputLength - 1 && index === data.length - 1 && record['skuCode']) {
434
+ setData([...data, { autoFocus: true }])
435
+ }
436
+ }}
437
+ />
438
+ }
439
+
440
+ </Popover>
441
+ )
442
+ }
443
+
444
+ const BillEntry: React.FC = ({ onSaveCallback, validDataUrl="/items/sku/import/check", isBrandAuth=true, isCheckStockNum=true }) => {
445
+ const columns = [
446
+ {
447
+ title: 'SKU编码',
448
+ width: 150,
449
+ dataIndex: 'skuCode',
450
+ isInputItem: true,
451
+ isPrimaryInput: true
452
+ },
453
+ {
454
+ title: 'SKU名称',
455
+ width: 200,
456
+ ellipsis: {
457
+ showTitle: false,
458
+ },
459
+ render: (text: any) => (
460
+ <Tooltip placement="topLeft" title={text}>
461
+ {text}
462
+ </Tooltip>
463
+ ),
464
+ dataIndex: 'name',
465
+ },
466
+ {
467
+ title: '图片',
468
+ dataIndex: 'itemUrl',
469
+ width: 200,
470
+ ellipsis: {
471
+ showTitle: false,
472
+ },
473
+ render: (text: any,record: any) => (
474
+ <Tooltip placement="topLeft" title={text}>
475
+ {tableColumnsImage(getSkuImg(record),{ width: 28, height: 28 })}
476
+ </Tooltip>
477
+ ),
478
+ },
479
+ {
480
+ title: '单位',
481
+ dataIndex: 'selectUnitCode',
482
+ width: 100,
483
+ render: (text: any, record: any) => {
484
+ if (record?.packingUnitList?.length) {
485
+ const basePackUnit = record?.packingUnitList[0]
486
+ record.selectUnitCode = basePackUnit.unitCode
487
+ return basePackUnit.name || basePackUnit.unitCode
488
+ }
489
+
490
+
491
+ return <></>
492
+ },
493
+ },
494
+ {
495
+ title: '数量',
496
+ width: 100,
497
+ isInputItem: true,
498
+ dataIndex: 'count',
499
+ },
500
+ {
501
+ title: '所属SPU编码',
502
+ width: 100,
503
+ ellipsis: {
504
+ showTitle: false,
505
+ },
506
+ dataIndex: 'itemCode',
507
+ render: (text: any) => (
508
+ <Tooltip placement="topLeft" title={text}>
509
+ {text}
510
+ </Tooltip>
511
+ ),
512
+ },
513
+ {
514
+ title: '规格',
515
+ width: 200,
516
+ ellipsis: {
517
+ showTitle: false,
518
+ },
519
+ render: (text: any) => (
520
+ <Tooltip placement="topLeft" title={text}>
521
+ {text}
522
+ </Tooltip>
523
+ ),
524
+ dataIndex: 'propertyNameAndValue',
525
+ }
526
+ ]
527
+ const [isModalVisible, setIsModalVisible] = useState(false);
528
+ const [data, setData] = useState([{ hovered: false }]);
529
+ const tableRef = useRef(null)
530
+
531
+ const [loading, setLoading] = useState(false);
532
+
533
+ const callSelectItem = (index, item) => {
534
+ if (item) {
535
+ let newData = [].concat(data)
536
+ newData[index] = { ...data[index], ...item }
537
+ setData(newData)
538
+ }
539
+ let dom = tableRef?.current?.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[index + 1]
540
+ if (dom) {
541
+ setTimeout(() => {
542
+ dom.getElementsByTagName('input')[item ? 1 : 0]?.select()
543
+ dom.getElementsByTagName('input')[item ? 1 : 0]?.focus()
544
+ }, 200)
545
+ }
546
+ }
547
+
548
+ const deleteRecord = (record) => {
549
+ setData(data.filter(item => item.skuCode !== record.skuCode))
550
+ }
551
+
552
+ let inputIndex = 0;
553
+ let selectColumns = [...columns.map(item => {
554
+ const inputLength = columns.filter(item => item.isInputItem || item.isSelectItem).length
555
+ const currentIndex = inputIndex
556
+ if (item.isInputItem) {
557
+ inputIndex++;
558
+ return {
559
+ ...item,
560
+ render: (text, record, index) => {
561
+ return (
562
+ <InputElement setData={setData} callSelectItem={callSelectItem.bind(this, index)} item={item} isPrimaryInput={item.isPrimaryInput} record={record} text={text} data={data} index={index} inputLength={inputLength} currentIndex={currentIndex} />
563
+ );
564
+ },
565
+ }
566
+ } else if (item.isSelectItem) {
567
+ inputIndex++;
568
+ }
569
+
570
+ return item
571
+ }), {
572
+ title: '操作',
573
+ width: 50,
574
+ render: (text, record, index) => {
575
+ if (index !== 0) {
576
+ return (
577
+ <span style={{ cursor: 'pointer', color: '#005CFF' }} onClick={() => {
578
+ deleteRecord(record)
579
+ }}>删除</span>
580
+ )
581
+ }
582
+ }
583
+ }]
584
+
585
+ const isSkuCanEntry = (resultData) => {
586
+ // 处理业务参数
587
+ let otherParams={}
588
+ if(isBrandAuth){
589
+ otherParams = { brandAuth: 'ctl-withAuth' }
590
+ }
591
+ return axios
592
+ .post(validDataUrl, {
593
+ ...otherParams,
594
+ columns: ["skuCode", "quantity"],
595
+ data: resultData.map((i:any) => ({ skuCode: i.skuCode, quality: i.count })),
596
+ checkStockNum: isCheckStockNum,
597
+ })
598
+ .then((result) => {
599
+ result = result.data;
600
+ if (result.status !== '0') {
601
+ message.error(result.msg);
602
+ return { flag: false }
603
+ } else {
604
+ let res = result.data || [];
605
+ const errorList = res.filter((i: any) => !i.flag);
606
+ return { flag: !errorList?.length, errorList }
607
+ }
608
+ }).catch(() => {
609
+ return { flag:false }
610
+ })
611
+ }
612
+
613
+ const handleSubmit = async () => {
614
+ // 加校验逻辑
615
+ if (!data?.length) {
616
+ message.warning('至少录入一条数据');
617
+ return;
618
+ }
619
+ if (!data?.every((d: any) => d.skuCode && d.name)) {
620
+ message.warning('请选择商品!');
621
+ return;
622
+ }
623
+ if (!data?.every((d: any) => d.count)) {
624
+ message.warning('请填写商品数量!');
625
+ return;
626
+ }
627
+ const canEntryObject = await isSkuCanEntry(data)
628
+ if(canEntryObject?.flag === false) {
629
+ const messageInfo = canEntryObject?.errorList?.length && canEntryObject?.errorList.map((i: any) => <div>{i.skuCode}校验失败:{i.checkResults}</div>)
630
+ messageInfo && message.warning({ content: messageInfo, duration: 6 });
631
+ return;
632
+ }
633
+
634
+ setLoading(true)
635
+ onSaveCallback(data).then(res => {
636
+ if(true) {
637
+ message.success('保存成功')
638
+ }
639
+ setLoading(false)
640
+ }).catch(Error => {
641
+ message.error(Error);
642
+ setLoading(false)
643
+ })
644
+ }
645
+
646
+ return (
647
+ <div className='add_select'>
648
+ <div className='add_select_quick_header'>
649
+ <div className='add_select_quick_header_title'><div>快速录入</div><Button type="primary" onClick={() => handleSubmit()} loading={loading}>提交</Button></div>
650
+ <span><span>*</span> &nbsp;快捷键:【Tab】-跳格切换;【Shift+←、→】-当前行左、右移动;【 ↑、↓】-当前列上、下移动;【ctrl+Delete】-删除当前行;</span>
651
+ </div>
652
+ <div className={'add_select_wrapper_select add_select_wrapper_select_quick'}>
653
+ <Table
654
+ size='small'
655
+ scroll={{ y: 240 }}
656
+ ref={tableRef}
657
+ dataSource={data}
658
+ columns={selectColumns}
659
+ pagination={false}
660
+ rowClassName={'row-class'}
661
+ rowClassName={(record: object | null | undefined, index: number) =>
662
+ index % 2 === 0 ? 'table_base row-class' : 'table_odd row-class'
663
+ }
664
+ />
665
+ </div>
666
+
667
+ </div>
668
+ );
669
+ };
670
+
671
+ export default BillEntry;