kts-component-invoice-operate 3.2.192 → 3.2.194

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 (244) hide show
  1. package/.dumi/theme/builtins/API.tsx +66 -66
  2. package/.editorconfig +16 -16
  3. package/.fatherrc.ts +4 -4
  4. package/.prettierignore +7 -7
  5. package/.prettierrc +11 -11
  6. package/.umirc.ts +8 -8
  7. package/README.md +9 -9
  8. package/dist/Invoice/ui/digtal/StakeFarmerholder/index.d.ts +3 -0
  9. package/dist/index.esm.js +829 -774
  10. package/dist/index.js +829 -774
  11. package/docs/index.md +5 -5
  12. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  13. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  14. package/docs-dist/static/fork.5431267d.svg +11 -11
  15. package/docs-dist/static/plus.44013ce3.svg +11 -11
  16. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  17. package/index.html +12 -12
  18. package/package.json +62 -62
  19. package/src/Invoice/Invoice-digtal/_test/architecture/index.tsx +21 -21
  20. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +40 -40
  21. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +29 -29
  22. package/src/Invoice/Invoice-digtal/_test/freight/index.tsx +14574 -14574
  23. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  24. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  25. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +18 -18
  26. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -19
  27. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  28. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +55 -55
  29. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +21 -21
  30. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  31. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  32. package/src/Invoice/Invoice-digtal/index.md +41 -41
  33. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +105 -105
  34. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +26 -26
  35. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  36. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IColumnsReplenish/index.ts +10 -10
  37. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IGood/index.ts +33 -33
  38. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/ImportGoods/index.ts +81 -81
  39. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/index.ts +39 -39
  40. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  41. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  42. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  43. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +87 -87
  44. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +81 -81
  45. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  46. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  47. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +131 -131
  48. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  49. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +71 -71
  50. package/src/Invoice/InvoiceController/fns/addFreight.ts +11 -11
  51. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  52. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  53. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  54. package/src/Invoice/InvoiceController/fns/delFreight.ts +38 -38
  55. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  56. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  57. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  58. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  59. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  60. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  61. package/src/Invoice/InvoiceController/fns/saveEditFreight.ts +24 -24
  62. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  63. package/src/Invoice/InvoiceController/fns/setEditFreight.ts +16 -16
  64. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  65. package/src/Invoice/InvoiceController/fns/setFreight.ts +10 -10
  66. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  67. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  68. package/src/Invoice/InvoiceController/index.ts +106 -106
  69. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  70. package/src/Invoice/_test/children/index.tsx +214 -214
  71. package/src/Invoice/_test/deduction/index.tsx +935 -935
  72. package/src/Invoice/_test/draft/index.tsx +40 -40
  73. package/src/Invoice/_test/easiest/index.tsx +5 -5
  74. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  75. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  76. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  77. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  78. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  79. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  80. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  81. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  82. package/src/Invoice/_test/seller/index.tsx +28 -28
  83. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  84. package/src/Invoice/_test/unit/index.tsx +19 -19
  85. package/src/Invoice/index.less +31 -31
  86. package/src/Invoice/index.md +56 -56
  87. package/src/Invoice/index.tsx +190 -190
  88. package/src/Invoice/tools/calculate/index.ts +132 -132
  89. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  90. package/src/Invoice/tools/evaluate/index.ts +7 -7
  91. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  92. package/src/Invoice/tools/itemName/index.ts +55 -55
  93. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  94. package/src/Invoice/tools/mounting/index.ts +13 -13
  95. package/src/Invoice/tools/strringFn/index.ts +40 -40
  96. package/src/Invoice/tools/useToGenerateId/index.ts +10 -10
  97. package/src/Invoice/tools/utils/index.ts +1 -1
  98. package/src/Invoice/tools/utils/money/index.ts +20 -20
  99. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  100. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  101. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  102. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  103. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  104. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  105. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +607 -607
  106. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +647 -647
  107. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +711 -711
  108. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  109. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  110. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Expand/index.tsx +57 -57
  111. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  112. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +49 -49
  113. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  114. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +91 -91
  115. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  116. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  117. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  118. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  119. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  120. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  121. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +99 -99
  122. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  123. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  124. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  125. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +52 -52
  126. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +120 -120
  127. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  128. package/src/Invoice/ui/default/GoodsList/index.less +185 -185
  129. package/src/Invoice/ui/default/GoodsList/index.tsx +205 -205
  130. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +65 -65
  131. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  132. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  133. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  134. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  135. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  136. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  137. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  138. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  139. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  140. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  141. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  142. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  143. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  144. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  145. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  146. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +40 -40
  147. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +71 -71
  148. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  149. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +130 -130
  150. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  151. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  152. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  153. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  154. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +198 -198
  155. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  156. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  157. package/src/Invoice/ui/default/Seller/index.less +113 -113
  158. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  159. package/src/Invoice/ui/default/Sign/index.less +14 -14
  160. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  161. package/src/Invoice/ui/digtal/Architecture/index.less +18 -18
  162. package/src/Invoice/ui/digtal/Architecture/index.tsx +177 -177
  163. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/dist/index.js +616 -616
  164. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/index.tsx +246 -246
  165. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  166. package/src/Invoice/ui/digtal/FreightList/hook/useOnRow/index.tsx +37 -37
  167. package/src/Invoice/ui/digtal/FreightList/hook/useRowSelection/index.tsx +119 -119
  168. package/src/Invoice/ui/digtal/FreightList/hook/useWindowClick/index.tsx +23 -23
  169. package/src/Invoice/ui/digtal/FreightList/index.less +72 -72
  170. package/src/Invoice/ui/digtal/FreightList/index.tsx +129 -129
  171. package/src/Invoice/ui/digtal/FreightList/ui/AddRowButton/index.tsx +64 -64
  172. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  173. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +36 -36
  174. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.less +28 -28
  175. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.tsx +20 -20
  176. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.less +38 -38
  177. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.tsx +108 -108
  178. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +673 -673
  179. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +673 -673
  180. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  181. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  182. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  183. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  184. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +87 -87
  185. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  186. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  187. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  188. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  189. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  190. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  191. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  192. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  193. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  194. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +51 -51
  195. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  196. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  197. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  198. package/src/Invoice/ui/digtal/GoodsList/index.tsx +179 -179
  199. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +67 -67
  200. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -340
  201. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  202. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  203. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  204. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  205. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  206. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  207. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  208. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  209. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +50 -50
  210. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  211. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  212. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  213. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  214. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +52 -52
  215. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  216. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +108 -108
  217. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  218. package/src/Invoice/ui/digtal/InvoiceHeader/index.less +57 -57
  219. package/src/Invoice/ui/digtal/InvoiceHeader/index.tsx +77 -77
  220. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +14 -14
  221. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +192 -192
  222. package/src/Invoice/ui/digtal/Sign/index.less +48 -48
  223. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  224. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +99 -99
  225. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +477 -436
  226. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowDown.svg +2 -2
  227. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowUp.svg +2 -2
  228. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/plus.svg +11 -11
  229. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  230. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +433 -433
  231. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  232. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  233. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  234. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  235. package/src/InvoiceTypeModal/index.less +7 -7
  236. package/src/InvoiceTypeModal/index.md +5 -5
  237. package/src/InvoiceTypeModal/index.tsx +161 -161
  238. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +184 -184
  239. package/src/TaxClassificationCodeModal/index.less +17 -17
  240. package/src/TaxClassificationCodeModal/index.md +6 -6
  241. package/src/TaxClassificationCodeModal/index.tsx +152 -152
  242. package/src/index.ts +13 -13
  243. package/tsconfig.json +31 -31
  244. package/typings.d.ts +3 -3
@@ -1,674 +1,674 @@
1
-
2
- import React from 'react';
3
- import Icon from '@ant-design/icons';
4
- import { Form } from 'kts-components-antd-x3';
5
- import { ReactComponent as PlusSvg } from './svg/plus.svg'
6
- import { AutoComplete, Select, Button, Input, Spin, Tooltip, InputProps } from 'kts-xui';
7
- import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
8
- import { getItemNameWithShorthand } from '../../../../../tools/itemName';
9
- import { IGood, LineAttributeType } from '../../../../../InvoiceController';
10
- import Invoice from '../../../../..';
11
- import TitleText from './ui/TitleText';
12
- import ItemNameInput from './ui/ItemNameInput';
13
- import {
14
- onChangeQuantity,
15
- onChangePriceIncludeTax,
16
- onChangePriceExcludeTax,
17
- onChangeLineAmountIncludeTax,
18
- onChangeLineAmountExcludeTax,
19
- onChangeTaxRate,
20
- onChangeItemName,
21
- onChangeTaxAmount,
22
- } from './autoFillFn';
23
- import Drag from './ui/Drag';
24
- import { nonScientificNotation } from '../../../../../tools/calculate';
25
-
26
- export default (form: WrappedFormUtils) => {
27
- const { getFieldDecorator, getFieldValue } = form;
28
-
29
- const controller = Invoice.useInvoiceController();
30
-
31
- const rootElement = controller.useMemo(s => s.rootElement, []);
32
-
33
- /** 是否含税 */
34
- const isTaxIncluded = controller.useMemo(e => e.goodsListState.isTaxIncluded, []);
35
-
36
- /** 组件模式 */
37
- const model = controller.useMemo(e => e.model, []);
38
-
39
- /** 计算类型 */
40
- const calculateType = controller.useMemo(e => e.goodsListState.calculateType, []);
41
-
42
- /** 是否显示我方 */
43
- const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
44
-
45
- /** 正在编辑的货物 */
46
- const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
47
-
48
- /** 是否启用拖拽 */
49
- const isStart = controller.useMemo((e) => e.goodsListState.drag.isStart, []);
50
-
51
- /** 禁用字段 */
52
- const disableds = controller.useMemo((e) => e.stakeholder.disableds || [], []);
53
-
54
- /** 启用字段 */
55
- const enables = controller.useMemo(s => s.stakeholder.enables || [], []);
56
-
57
- /** 搜索条件 */
58
- const searchValue = controller.useMemo((e) => e.goodsListState.searchValue, []);
59
-
60
- /** 税率列表 */
61
- const taxRateList = controller.useMemo((e) => e.goodsListState.taxRateList, []);
62
-
63
- /** 单位列表 */
64
- const unitList = controller.useMemo((e) => e.goodsListState.unitList, []);
65
-
66
- /** 商品表格补充配置 */
67
- const columnsReplenish = controller.useMemo((e) => e.goodsListState.columnsReplenish, []);
68
-
69
- /** 扣除额 */
70
- const deduction = controller.useMemo((e) => e.goodsListState.deduction, []);
71
-
72
- /** 计算中启动字段 */
73
- const changeField = controller.useMemo((e) => e.calculatingField, []);
74
-
75
- /** 计算中启动字段 */
76
- const setChangeField = React.useCallback((value: string) => controller.run(async s => { s.calculatingField = value }), []);
77
-
78
- const isEnables = React.useCallback(field => enables.indexOf(field) >= 0, [enables])
79
-
80
- const onNumberValueChange = React.useCallback((e) => {
81
- const value = e?.target?.value;
82
- if (value) {
83
- return value.replace(/[^0-9-\.]/g, '');
84
- }
85
- }, [])
86
-
87
- /** 获取补充校验规则 */
88
- const getReplenishRules = React.useCallback((id: string) => {
89
- return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
90
- }, [columnsReplenish])
91
-
92
- /** 金额整数位限制,不传默认9位 */
93
- const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
94
-
95
- /** 表头 */
96
- const columns = React.useMemo(() => {
97
- return [
98
- {
99
- title: ' ',
100
- key: 'drag',
101
- width: 40,
102
- align: 'center',
103
- render: (_: any, record: IGood) => <Drag record={record} />
104
- },
105
- {
106
- title: '序号',
107
- key: 'serialNo',
108
- dataIndex: 'serialNo',
109
- width: 50,
110
- render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
111
- },
112
- {
113
- title: <TitleText required >项目名称</TitleText>,
114
- key: 'itemName',
115
- render: (_: string, record: IGood) => {
116
- if (editGood?.$index === record.$index && !disableds.includes('itemName') && model !== 'prefab') {
117
- return (
118
- <Form.Item>
119
- <div style={{ display: 'flex' }} >
120
- {getFieldDecorator('itemName', {
121
- initialValue: isMyShow ? record.itemNameSelf : record.itemName,
122
- rules: [
123
- ...getReplenishRules('itemName'),
124
- {
125
- validator: async (_, __, callback) => {
126
- await controller.wait();
127
- const value = controller.state.goodsListState.editGood;
128
- if (!value?.itemName && !value?.itemNameSelf) {
129
- callback('项目名称不能为空');
130
- } else {
131
- return;
132
- }
133
- }
134
- }
135
- ]
136
- })(
137
- <ItemNameInput
138
- editGood={editGood}
139
- shorthand={editGood.shorthand}
140
- suffix={
141
- <Tooltip title="点击从商品管理中添加商品信息">
142
- <Button
143
- type="link"
144
- style={{ padding: 0, width: 20, fontSize: 20, fill: '#0074ff' }}
145
- icon={<PlusSvg />}
146
- onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
147
- />
148
- </Tooltip>
149
- }
150
- onChange={() => {
151
- onChangeItemName(controller, form, record);
152
- }}
153
- />
154
- )}
155
- </div>
156
- </Form.Item>
157
- );
158
- } else {
159
- return (
160
- <span>
161
- {record.lineAttribute === LineAttributeType.折扣行 ? <span className='goods-list-digtal-discount-tag'>折扣</span> : <></>}
162
- <MyItemNameDiv
163
- valueT={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemNameSelf || '' }), searchValue)}
164
- valueF={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemName || '' }), searchValue)}
165
- isMyShow={isMyShow}
166
- />
167
- </span>
168
- )
169
- }
170
- },
171
- },
172
- {
173
- title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
174
- key: 'itemModelName',
175
- width: 119,
176
- render: (_: string, record: IGood) => {
177
- if (editGood?.$index === record.$index && !disableds.includes('itemModelName') && model !== 'prefab') {
178
- return (
179
- <Form.Item>
180
- {getFieldDecorator('itemModelName', {
181
- initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
182
- rules: getReplenishRules('itemModelName'),
183
- })(
184
- <MyInput
185
- onChange={async () => {
186
- await controller.wait()
187
- const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
188
- const value = {} as any;
189
- value[key] = form.getFieldsValue().itemModelName;
190
- controller.setEditGood(value);
191
- }}
192
- />,
193
- )}
194
- </Form.Item>
195
- );
196
- } else {
197
- return (
198
- <MyItemNameDiv
199
- valueT={formatSearch(record.itemModelNameSelf, searchValue)}
200
- valueF={formatSearch(record.itemModelName, searchValue)}
201
- isMyShow={isMyShow}
202
- />
203
- )
204
- }
205
- },
206
- },
207
- {
208
- title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
209
- key: 'unit',
210
- width: 70,
211
- render: (_: string, record: IGood) => {
212
- if (editGood?.$index === record.$index && !disableds.includes('unit') && model !== 'prefab') {
213
- return (
214
- <Form.Item>
215
- {getFieldDecorator('unit', {
216
- initialValue: editGood.unit,
217
- rules: getReplenishRules('unit'),
218
- })(
219
- <AutoComplete
220
- style={{ width: '100%' }}
221
- dataSource={unitList}
222
- getPopupContainer={() => rootElement || document.body}
223
- onChange={async () => {
224
- await controller.wait()
225
- controller.setEditGood({ unit: form.getFieldsValue().unit });
226
- }}
227
- />,
228
- )}
229
- </Form.Item>
230
- );
231
- } else {
232
- return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
233
- }
234
- },
235
- },
236
- {
237
- title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
238
- dataIndex: 'quantity',
239
- key: 'quantity',
240
- align: 'right',
241
- width: 149,
242
- render: (value: string, record: IGood) => {
243
- if (editGood?.$index === record.$index && !disableds.includes('quantity') && model !== 'prefab') {
244
- return (
245
- <Form.Item>
246
- {getFieldDecorator('quantity', {
247
- initialValue: nonScientificNotation(editGood.quantity),
248
- getValueFromEvent: onNumberValueChange,
249
- rules: [
250
- ...getReplenishRules('quantity'),
251
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
252
- {
253
- validator: async (_, value, callback) => {
254
- await controller.wait();
255
- const isvalue = !!value || value === 0;
256
- const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
257
- if (isvalue || isPrice === isvalue) return;
258
- callback('请输入数量');
259
- }
260
- }
261
- ],
262
- })(
263
- <MyInput
264
- style={{ textAlign: 'right' }}
265
- maxLength={25}
266
- loading={isCipher(changeField, "quantity")}
267
- onChange={async () => {
268
- setChangeField('quantity');
269
- await onChangeQuantity(controller, form, record);
270
- }}
271
- />,
272
- )}
273
- </Form.Item>
274
- );
275
- } else {
276
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
277
- }
278
- },
279
- },
280
- {
281
- title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
282
- dataIndex: 'priceIncludeTax',
283
- key: 'priceIncludeTax',
284
- align: 'right',
285
- width: 149,
286
- render: (value: string, record: IGood) => {
287
- if (editGood?.$index === record.$index && !disableds.includes('priceIncludeTax') && model !== 'prefab') {
288
- return (
289
- <Form.Item>
290
- {getFieldDecorator('priceIncludeTax', {
291
- initialValue: nonScientificNotation(editGood.priceIncludeTax),
292
- getValueFromEvent: onNumberValueChange,
293
- rules: [
294
- ...getReplenishRules('priceIncludeTax'),
295
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
296
- {
297
- validator: async (_, value, callback) => {
298
- await controller.wait();
299
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
300
- const isvalue = !!value || value === 0;
301
- if (isvalue || isQuantity === isvalue) return;
302
- callback('请输入单价');
303
- }
304
- }
305
- ],
306
- })(
307
- <MyInput
308
- style={{ textAlign: 'right' }}
309
- maxLength={25}
310
- loading={isCipher(changeField, 'priceIncludeTax')}
311
- onChange={() => {
312
- setChangeField('priceIncludeTax');
313
- onChangePriceIncludeTax(controller, form, record);
314
- }}
315
- />,
316
- )}
317
- </Form.Item>
318
- );
319
- } else {
320
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
321
- }
322
- },
323
- },
324
- {
325
- title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
326
- dataIndex: 'priceExcludeTax',
327
- key: 'priceExcludeTax',
328
- align: 'right',
329
- width: 149,
330
- render: (value: string, record: IGood) => {
331
- if (editGood?.$index === record.$index && !disableds.includes('priceExcludeTax') && model !== 'prefab') {
332
- return (
333
- <Form.Item>
334
- {getFieldDecorator('priceExcludeTax', {
335
- initialValue: nonScientificNotation(editGood.priceExcludeTax),
336
- getValueFromEvent: onNumberValueChange,
337
- rules: [
338
- ...getReplenishRules('priceExcludeTax'),
339
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
340
- {
341
- validator: async (_, value, callback) => {
342
- await controller.wait();
343
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
344
- const isvalue = !!value || value === 0;
345
- if (isvalue || isQuantity === isvalue) return;
346
- callback('请输入单价');
347
- }
348
- }
349
- ],
350
- })(
351
- <MyInput
352
- style={{ textAlign: 'right' }}
353
- maxLength={25}
354
- loading={isCipher(changeField, 'priceExcludeTax')}
355
- onChange={() => {
356
- setChangeField('priceExcludeTax');
357
- onChangePriceExcludeTax(controller, form, record);
358
- }}
359
- />,
360
- )}
361
- </Form.Item>
362
- );
363
- } else {
364
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
365
- }
366
- },
367
- },
368
- {
369
- title: <TitleText required >金额(含税)</TitleText>,
370
- dataIndex: 'lineAmountIncludeTax',
371
- key: 'lineAmountIncludeTax',
372
- width: 119,
373
- align: 'right',
374
- render: (value: string, record: IGood) => {
375
- if (editGood?.$index === record.$index && !disableds.includes('lineAmountIncludeTax') && model !== 'prefab') {
376
- return (
377
- <Form.Item>
378
- {getFieldDecorator('lineAmountIncludeTax', {
379
- initialValue: editGood.lineAmountIncludeTax,
380
- getValueFromEvent: onNumberValueChange,
381
- rules: [
382
- ...getReplenishRules('lineAmountIncludeTax'),
383
- { required: true, message: '金额不能为空' },
384
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
385
- {
386
- validator: async (_, value, callback) => {
387
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
388
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
389
- }
390
- }
391
- },
392
- {
393
- validator: async (_, value, callback) => {
394
- if (deduction && parseFloat(value) <= deduction) {
395
- callback('扣除额不能大于等于价税合计');
396
- }
397
- }
398
- },
399
- ],
400
- })(
401
- <MyInput
402
- style={{ textAlign: 'right' }}
403
- loading={isCipher(changeField, 'lineAmountIncludeTax')}
404
- onChange={() => {
405
- setChangeField('lineAmountIncludeTax');
406
- onChangeLineAmountIncludeTax(controller, form, record);
407
- }}
408
- />,
409
- )}
410
- </Form.Item>
411
- );
412
- } else {
413
- return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
414
- }
415
- },
416
- },
417
- {
418
- title: <TitleText required >金额(不含税)</TitleText>,
419
- dataIndex: 'lineAmountExcludeTax',
420
- key: 'lineAmountExcludeTax',
421
- align: 'right',
422
- width: 119,
423
- render: (value: string, record: IGood) => {
424
- if (editGood?.$index === record.$index && !disableds.includes('lineAmountExcludeTax') && model !== 'prefab') {
425
- return (
426
- <Form.Item>
427
- {getFieldDecorator('lineAmountExcludeTax', {
428
- initialValue: editGood.lineAmountExcludeTax,
429
- getValueFromEvent: onNumberValueChange,
430
- rules: [
431
- ...getReplenishRules('lineAmountExcludeTax'),
432
- { required: true, message: '金额不能为空' },
433
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
434
- {
435
- validator: async (_, value: string, callback) => {
436
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
437
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
438
- }
439
- }
440
- },
441
- ],
442
- })(
443
- <MyInput
444
- style={{ textAlign: 'right' }}
445
- loading={isCipher(changeField, 'lineAmountExcludeTax')}
446
- onChange={() => {
447
- setChangeField('lineAmountExcludeTax');
448
- onChangeLineAmountExcludeTax(controller, form, record);
449
- }}
450
- />,
451
- )}
452
- </Form.Item>
453
- );
454
- } else {
455
- return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
456
- }
457
- },
458
- },
459
- {
460
- title: <TitleText required >税率</TitleText>,
461
- dataIndex: 'taxRate',
462
- key: 'taxRate',
463
- align: 'right',
464
- width: 70,
465
- render: (value: string, record: IGood) => {
466
- if (editGood?.$index === record.$index && !disableds.includes('taxRate') && !(model === 'prefab' && calculateType === '3')) {
467
- return (
468
- <Form.Item>
469
- {getFieldDecorator('taxRate', {
470
- initialValue: editGood.taxRate,
471
- rules: [
472
- ...getReplenishRules('taxRate'),
473
- { required: true, message: '请选择税率' },
474
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
475
- ],
476
- })(
477
- <Select
478
- className="kts-invoice-operate-goods-list-table-tax-rate"
479
- // dropdownMenuStyle={{ textAlign: "right" }}
480
- showArrow={false}
481
- style={{ width: '100%' }}
482
- getPopupContainer={() => rootElement || document.body}
483
- onChange={() => {
484
- setChangeField('taxRate');
485
- onChangeTaxRate(controller, form, record);
486
- }}
487
- >
488
- {(record.goodsTaxRateList || taxRateList).map((e, i) => {
489
- return (
490
- <Select.Option key={i} value={e}>
491
- {e}%
492
- </Select.Option>
493
- );
494
- })}
495
- </Select>,
496
- )}
497
- </Form.Item>
498
- );
499
- } else {
500
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : `${value}%`}</span>;
501
- }
502
- },
503
- },
504
- {
505
- title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
506
- dataIndex: 'taxAmount',
507
- key: 'taxAmount',
508
- align: 'right',
509
- width: 119,
510
- render: (value: string, record: IGood) => {
511
- if (editGood?.$index === record.$index && !disableds.includes('taxAmount')) {
512
- return getFieldDecorator('taxAmount', {
513
- initialValue: editGood.taxAmount,
514
- rules: [
515
- ...getReplenishRules('taxAmount'),
516
- { required: true, message: '税额不能为空' },
517
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '税额必须为数字' },
518
- ],
519
- })(
520
- isEnables('taxAmount')
521
- ? <MyInput
522
- style={{ textAlign: 'right' }}
523
- loading={isCipher(changeField, 'taxAmount')}
524
- onChange={() => {
525
- setChangeField('taxAmount');
526
- onChangeTaxAmount(controller, form, record);
527
- }}
528
- />
529
- : <MyDiv loading={isCipher(changeField, 'taxAmount')} />
530
- );
531
- } else {
532
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : parseFloat(value).toFixed(2)}</span>;
533
- }
534
- },
535
- },
536
- ]
537
- // 含税不含税
538
- .filter((e) => {
539
- if (isTaxIncluded) {
540
- return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
541
- } else {
542
- return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
543
- }
544
- })
545
- // 是否启动拖拽
546
- .filter(e => e.key !== 'drag' || isStart)
547
- // 只读
548
- .filter(e => {
549
- if (model === 'readOnly') {
550
- return e.key !== 'operating';
551
- } else {
552
- return true;
553
- }
554
- })
555
- .map((e) => {
556
- return {
557
- ...e,
558
- ellipsis: true,
559
- };
560
- }) as any[];
561
- }, [isTaxIncluded, editGood, controller, taxRateList, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, isStart, calculateType]);
562
-
563
- // React.useEffect(() => {
564
- // clearTimeout(t)
565
- // const t = setTimeout(() => { setChangeField('') }, 1000);
566
- // return () => { clearTimeout(t) }
567
- // }, [changeField]);
568
-
569
- return columns;
570
- };
571
-
572
- /** 字段 */
573
- function isCipher(name?: string, field?: string) {
574
- if (!name || !field) return false;
575
- return name !== field;
576
- }
577
-
578
- class MyInput extends React.Component<InputProps & { loading?: boolean }> {
579
- render() {
580
- if (this.props.loading) {
581
- return (
582
- <Spin size="small">
583
- <Input {...this.props} autoComplete="off" />
584
- </Spin>
585
- )
586
- } else {
587
- return <Input {...this.props} autoComplete="off" />
588
- }
589
- }
590
- }
591
-
592
- class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
593
-
594
- render() {
595
- if (this.props.loading) {
596
- return (
597
- <Spin size="small">
598
- <span style={{ padding: '0 10px' }}>{this.props.value}</span>
599
- </Spin>
600
- )
601
- } else {
602
- return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
603
- }
604
- }
605
- }
606
-
607
- class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
608
- render(): React.ReactNode {
609
-
610
- const { isMyShow, valueT, valueF } = this.props;
611
-
612
- if (isMyShow) {
613
- if (valueT) {
614
- return (
615
- <Tooltip title={valueT}>
616
- <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
617
- </Tooltip>
618
- )
619
- } else {
620
- return (
621
- <Tooltip title={valueF}>
622
- <span style={MyItemNameStyle}>{valueF}</span>
623
- </Tooltip>
624
- )
625
- }
626
- } else {
627
- if (valueF) {
628
- return (
629
- <Tooltip title={valueF}>
630
- <span style={MyItemNameStyle}>{valueF}</span>
631
- </Tooltip>
632
- )
633
- } else {
634
- return (
635
- <Tooltip title={valueT} style={MyItemNameStyle}>
636
- <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
637
- </Tooltip>
638
- )
639
- }
640
- }
641
- }
642
- }
643
-
644
- /** 格式搜索结果 */
645
- function formatSearch(value?: string, search?: string) {
646
- if (!value || !search) return value;
647
-
648
- const __html = ucoding(value).split(new RegExp(ucoding(search), 'g')).map(e => dcoding(e)).join(`<span class="kts-invoice-operate-goods-list-table-search-protrude" >${search}</span>`);
649
- return <span dangerouslySetInnerHTML={{ __html }} />
650
- }
651
-
652
- /** 编码 */
653
- function ucoding(v: string): string {
654
- return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
655
- }
656
-
657
- /** 解码 */
658
- function dcoding(v: string): string {
659
- return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
660
- }
661
-
662
- /** 是否免税 */
663
- function isDutyFree(record: IGood): boolean {
664
- return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
665
- }
666
-
667
- const MyItemNameStyle: any = {
668
- padding: '0px 10px',
669
- whiteSpace: 'nowrap',
670
- overflow: 'hidden',
671
- width: "100%",
672
- display: 'block',
673
- textOverflow: 'ellipsis'
1
+
2
+ import React from 'react';
3
+ import Icon from '@ant-design/icons';
4
+ import { Form } from 'kts-components-antd-x3';
5
+ import { ReactComponent as PlusSvg } from './svg/plus.svg'
6
+ import { AutoComplete, Select, Button, Input, Spin, Tooltip, InputProps } from 'kts-xui';
7
+ import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
8
+ import { getItemNameWithShorthand } from '../../../../../tools/itemName';
9
+ import { IGood, LineAttributeType } from '../../../../../InvoiceController';
10
+ import Invoice from '../../../../..';
11
+ import TitleText from './ui/TitleText';
12
+ import ItemNameInput from './ui/ItemNameInput';
13
+ import {
14
+ onChangeQuantity,
15
+ onChangePriceIncludeTax,
16
+ onChangePriceExcludeTax,
17
+ onChangeLineAmountIncludeTax,
18
+ onChangeLineAmountExcludeTax,
19
+ onChangeTaxRate,
20
+ onChangeItemName,
21
+ onChangeTaxAmount,
22
+ } from './autoFillFn';
23
+ import Drag from './ui/Drag';
24
+ import { nonScientificNotation } from '../../../../../tools/calculate';
25
+
26
+ export default (form: WrappedFormUtils) => {
27
+ const { getFieldDecorator, getFieldValue } = form;
28
+
29
+ const controller = Invoice.useInvoiceController();
30
+
31
+ const rootElement = controller.useMemo(s => s.rootElement, []);
32
+
33
+ /** 是否含税 */
34
+ const isTaxIncluded = controller.useMemo(e => e.goodsListState.isTaxIncluded, []);
35
+
36
+ /** 组件模式 */
37
+ const model = controller.useMemo(e => e.model, []);
38
+
39
+ /** 计算类型 */
40
+ const calculateType = controller.useMemo(e => e.goodsListState.calculateType, []);
41
+
42
+ /** 是否显示我方 */
43
+ const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
44
+
45
+ /** 正在编辑的货物 */
46
+ const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
47
+
48
+ /** 是否启用拖拽 */
49
+ const isStart = controller.useMemo((e) => e.goodsListState.drag.isStart, []);
50
+
51
+ /** 禁用字段 */
52
+ const disableds = controller.useMemo((e) => e.stakeholder.disableds || [], []);
53
+
54
+ /** 启用字段 */
55
+ const enables = controller.useMemo(s => s.stakeholder.enables || [], []);
56
+
57
+ /** 搜索条件 */
58
+ const searchValue = controller.useMemo((e) => e.goodsListState.searchValue, []);
59
+
60
+ /** 税率列表 */
61
+ const taxRateList = controller.useMemo((e) => e.goodsListState.taxRateList, []);
62
+
63
+ /** 单位列表 */
64
+ const unitList = controller.useMemo((e) => e.goodsListState.unitList, []);
65
+
66
+ /** 商品表格补充配置 */
67
+ const columnsReplenish = controller.useMemo((e) => e.goodsListState.columnsReplenish, []);
68
+
69
+ /** 扣除额 */
70
+ const deduction = controller.useMemo((e) => e.goodsListState.deduction, []);
71
+
72
+ /** 计算中启动字段 */
73
+ const changeField = controller.useMemo((e) => e.calculatingField, []);
74
+
75
+ /** 计算中启动字段 */
76
+ const setChangeField = React.useCallback((value: string) => controller.run(async s => { s.calculatingField = value }), []);
77
+
78
+ const isEnables = React.useCallback(field => enables.indexOf(field) >= 0, [enables])
79
+
80
+ const onNumberValueChange = React.useCallback((e) => {
81
+ const value = e?.target?.value;
82
+ if (value) {
83
+ return value.replace(/[^0-9-\.]/g, '');
84
+ }
85
+ }, [])
86
+
87
+ /** 获取补充校验规则 */
88
+ const getReplenishRules = React.useCallback((id: string) => {
89
+ return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
90
+ }, [columnsReplenish])
91
+
92
+ /** 金额整数位限制,不传默认9位 */
93
+ const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
94
+
95
+ /** 表头 */
96
+ const columns = React.useMemo(() => {
97
+ return [
98
+ {
99
+ title: ' ',
100
+ key: 'drag',
101
+ width: 40,
102
+ align: 'center',
103
+ render: (_: any, record: IGood) => <Drag record={record} />
104
+ },
105
+ {
106
+ title: '序号',
107
+ key: 'serialNo',
108
+ dataIndex: 'serialNo',
109
+ width: 50,
110
+ render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
111
+ },
112
+ {
113
+ title: <TitleText required >项目名称</TitleText>,
114
+ key: 'itemName',
115
+ render: (_: string, record: IGood) => {
116
+ if (editGood?.$index === record.$index && !disableds.includes('itemName') && model !== 'prefab') {
117
+ return (
118
+ <Form.Item>
119
+ <div style={{ display: 'flex' }} >
120
+ {getFieldDecorator('itemName', {
121
+ initialValue: isMyShow ? record.itemNameSelf : record.itemName,
122
+ rules: [
123
+ ...getReplenishRules('itemName'),
124
+ {
125
+ validator: async (_, __, callback) => {
126
+ await controller.wait();
127
+ const value = controller.state.goodsListState.editGood;
128
+ if (!value?.itemName && !value?.itemNameSelf) {
129
+ callback('项目名称不能为空');
130
+ } else {
131
+ return;
132
+ }
133
+ }
134
+ }
135
+ ]
136
+ })(
137
+ <ItemNameInput
138
+ editGood={editGood}
139
+ shorthand={editGood.shorthand}
140
+ suffix={
141
+ <Tooltip title="点击从商品管理中添加商品信息">
142
+ <Button
143
+ type="link"
144
+ style={{ padding: 0, width: 20, fontSize: 20, fill: '#0074ff' }}
145
+ icon={<PlusSvg />}
146
+ onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
147
+ />
148
+ </Tooltip>
149
+ }
150
+ onChange={() => {
151
+ onChangeItemName(controller, form, record);
152
+ }}
153
+ />
154
+ )}
155
+ </div>
156
+ </Form.Item>
157
+ );
158
+ } else {
159
+ return (
160
+ <span>
161
+ {record.lineAttribute === LineAttributeType.折扣行 ? <span className='goods-list-digtal-discount-tag'>折扣</span> : <></>}
162
+ <MyItemNameDiv
163
+ valueT={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemNameSelf || '' }), searchValue)}
164
+ valueF={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemName || '' }), searchValue)}
165
+ isMyShow={isMyShow}
166
+ />
167
+ </span>
168
+ )
169
+ }
170
+ },
171
+ },
172
+ {
173
+ title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
174
+ key: 'itemModelName',
175
+ width: 119,
176
+ render: (_: string, record: IGood) => {
177
+ if (editGood?.$index === record.$index && !disableds.includes('itemModelName') && model !== 'prefab') {
178
+ return (
179
+ <Form.Item>
180
+ {getFieldDecorator('itemModelName', {
181
+ initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
182
+ rules: getReplenishRules('itemModelName'),
183
+ })(
184
+ <MyInput
185
+ onChange={async () => {
186
+ await controller.wait()
187
+ const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
188
+ const value = {} as any;
189
+ value[key] = form.getFieldsValue().itemModelName;
190
+ controller.setEditGood(value);
191
+ }}
192
+ />,
193
+ )}
194
+ </Form.Item>
195
+ );
196
+ } else {
197
+ return (
198
+ <MyItemNameDiv
199
+ valueT={formatSearch(record.itemModelNameSelf, searchValue)}
200
+ valueF={formatSearch(record.itemModelName, searchValue)}
201
+ isMyShow={isMyShow}
202
+ />
203
+ )
204
+ }
205
+ },
206
+ },
207
+ {
208
+ title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
209
+ key: 'unit',
210
+ width: 70,
211
+ render: (_: string, record: IGood) => {
212
+ if (editGood?.$index === record.$index && !disableds.includes('unit') && model !== 'prefab') {
213
+ return (
214
+ <Form.Item>
215
+ {getFieldDecorator('unit', {
216
+ initialValue: editGood.unit,
217
+ rules: getReplenishRules('unit'),
218
+ })(
219
+ <AutoComplete
220
+ style={{ width: '100%' }}
221
+ dataSource={unitList}
222
+ getPopupContainer={() => rootElement || document.body}
223
+ onChange={async () => {
224
+ await controller.wait()
225
+ controller.setEditGood({ unit: form.getFieldsValue().unit });
226
+ }}
227
+ />,
228
+ )}
229
+ </Form.Item>
230
+ );
231
+ } else {
232
+ return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
233
+ }
234
+ },
235
+ },
236
+ {
237
+ title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
238
+ dataIndex: 'quantity',
239
+ key: 'quantity',
240
+ align: 'right',
241
+ width: 149,
242
+ render: (value: string, record: IGood) => {
243
+ if (editGood?.$index === record.$index && !disableds.includes('quantity') && model !== 'prefab') {
244
+ return (
245
+ <Form.Item>
246
+ {getFieldDecorator('quantity', {
247
+ initialValue: nonScientificNotation(editGood.quantity),
248
+ getValueFromEvent: onNumberValueChange,
249
+ rules: [
250
+ ...getReplenishRules('quantity'),
251
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
252
+ {
253
+ validator: async (_, value, callback) => {
254
+ await controller.wait();
255
+ const isvalue = !!value || value === 0;
256
+ const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
257
+ if (isvalue || isPrice === isvalue) return;
258
+ callback('请输入数量');
259
+ }
260
+ }
261
+ ],
262
+ })(
263
+ <MyInput
264
+ style={{ textAlign: 'right' }}
265
+ maxLength={25}
266
+ loading={isCipher(changeField, "quantity")}
267
+ onChange={async () => {
268
+ setChangeField('quantity');
269
+ await onChangeQuantity(controller, form, record);
270
+ }}
271
+ />,
272
+ )}
273
+ </Form.Item>
274
+ );
275
+ } else {
276
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
277
+ }
278
+ },
279
+ },
280
+ {
281
+ title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
282
+ dataIndex: 'priceIncludeTax',
283
+ key: 'priceIncludeTax',
284
+ align: 'right',
285
+ width: 149,
286
+ render: (value: string, record: IGood) => {
287
+ if (editGood?.$index === record.$index && !disableds.includes('priceIncludeTax') && model !== 'prefab') {
288
+ return (
289
+ <Form.Item>
290
+ {getFieldDecorator('priceIncludeTax', {
291
+ initialValue: nonScientificNotation(editGood.priceIncludeTax),
292
+ getValueFromEvent: onNumberValueChange,
293
+ rules: [
294
+ ...getReplenishRules('priceIncludeTax'),
295
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
296
+ {
297
+ validator: async (_, value, callback) => {
298
+ await controller.wait();
299
+ const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
300
+ const isvalue = !!value || value === 0;
301
+ if (isvalue || isQuantity === isvalue) return;
302
+ callback('请输入单价');
303
+ }
304
+ }
305
+ ],
306
+ })(
307
+ <MyInput
308
+ style={{ textAlign: 'right' }}
309
+ maxLength={25}
310
+ loading={isCipher(changeField, 'priceIncludeTax')}
311
+ onChange={() => {
312
+ setChangeField('priceIncludeTax');
313
+ onChangePriceIncludeTax(controller, form, record);
314
+ }}
315
+ />,
316
+ )}
317
+ </Form.Item>
318
+ );
319
+ } else {
320
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
321
+ }
322
+ },
323
+ },
324
+ {
325
+ title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
326
+ dataIndex: 'priceExcludeTax',
327
+ key: 'priceExcludeTax',
328
+ align: 'right',
329
+ width: 149,
330
+ render: (value: string, record: IGood) => {
331
+ if (editGood?.$index === record.$index && !disableds.includes('priceExcludeTax') && model !== 'prefab') {
332
+ return (
333
+ <Form.Item>
334
+ {getFieldDecorator('priceExcludeTax', {
335
+ initialValue: nonScientificNotation(editGood.priceExcludeTax),
336
+ getValueFromEvent: onNumberValueChange,
337
+ rules: [
338
+ ...getReplenishRules('priceExcludeTax'),
339
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
340
+ {
341
+ validator: async (_, value, callback) => {
342
+ await controller.wait();
343
+ const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
344
+ const isvalue = !!value || value === 0;
345
+ if (isvalue || isQuantity === isvalue) return;
346
+ callback('请输入单价');
347
+ }
348
+ }
349
+ ],
350
+ })(
351
+ <MyInput
352
+ style={{ textAlign: 'right' }}
353
+ maxLength={25}
354
+ loading={isCipher(changeField, 'priceExcludeTax')}
355
+ onChange={() => {
356
+ setChangeField('priceExcludeTax');
357
+ onChangePriceExcludeTax(controller, form, record);
358
+ }}
359
+ />,
360
+ )}
361
+ </Form.Item>
362
+ );
363
+ } else {
364
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
365
+ }
366
+ },
367
+ },
368
+ {
369
+ title: <TitleText required >金额(含税)</TitleText>,
370
+ dataIndex: 'lineAmountIncludeTax',
371
+ key: 'lineAmountIncludeTax',
372
+ width: 119,
373
+ align: 'right',
374
+ render: (value: string, record: IGood) => {
375
+ if (editGood?.$index === record.$index && !disableds.includes('lineAmountIncludeTax') && model !== 'prefab') {
376
+ return (
377
+ <Form.Item>
378
+ {getFieldDecorator('lineAmountIncludeTax', {
379
+ initialValue: editGood.lineAmountIncludeTax,
380
+ getValueFromEvent: onNumberValueChange,
381
+ rules: [
382
+ ...getReplenishRules('lineAmountIncludeTax'),
383
+ { required: true, message: '金额不能为空' },
384
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
385
+ {
386
+ validator: async (_, value, callback) => {
387
+ if (`${value}`.split('.')[0].length > priceIntegerDigit) {
388
+ callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
389
+ }
390
+ }
391
+ },
392
+ {
393
+ validator: async (_, value, callback) => {
394
+ if (deduction && parseFloat(value) <= deduction) {
395
+ callback('扣除额不能大于等于价税合计');
396
+ }
397
+ }
398
+ },
399
+ ],
400
+ })(
401
+ <MyInput
402
+ style={{ textAlign: 'right' }}
403
+ loading={isCipher(changeField, 'lineAmountIncludeTax')}
404
+ onChange={() => {
405
+ setChangeField('lineAmountIncludeTax');
406
+ onChangeLineAmountIncludeTax(controller, form, record);
407
+ }}
408
+ />,
409
+ )}
410
+ </Form.Item>
411
+ );
412
+ } else {
413
+ return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
414
+ }
415
+ },
416
+ },
417
+ {
418
+ title: <TitleText required >金额(不含税)</TitleText>,
419
+ dataIndex: 'lineAmountExcludeTax',
420
+ key: 'lineAmountExcludeTax',
421
+ align: 'right',
422
+ width: 119,
423
+ render: (value: string, record: IGood) => {
424
+ if (editGood?.$index === record.$index && !disableds.includes('lineAmountExcludeTax') && model !== 'prefab') {
425
+ return (
426
+ <Form.Item>
427
+ {getFieldDecorator('lineAmountExcludeTax', {
428
+ initialValue: editGood.lineAmountExcludeTax,
429
+ getValueFromEvent: onNumberValueChange,
430
+ rules: [
431
+ ...getReplenishRules('lineAmountExcludeTax'),
432
+ { required: true, message: '金额不能为空' },
433
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
434
+ {
435
+ validator: async (_, value: string, callback) => {
436
+ if (`${value}`.split('.')[0].length > priceIntegerDigit) {
437
+ callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
438
+ }
439
+ }
440
+ },
441
+ ],
442
+ })(
443
+ <MyInput
444
+ style={{ textAlign: 'right' }}
445
+ loading={isCipher(changeField, 'lineAmountExcludeTax')}
446
+ onChange={() => {
447
+ setChangeField('lineAmountExcludeTax');
448
+ onChangeLineAmountExcludeTax(controller, form, record);
449
+ }}
450
+ />,
451
+ )}
452
+ </Form.Item>
453
+ );
454
+ } else {
455
+ return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
456
+ }
457
+ },
458
+ },
459
+ {
460
+ title: <TitleText required >税率</TitleText>,
461
+ dataIndex: 'taxRate',
462
+ key: 'taxRate',
463
+ align: 'right',
464
+ width: 70,
465
+ render: (value: string, record: IGood) => {
466
+ if (editGood?.$index === record.$index && !disableds.includes('taxRate') && !(model === 'prefab' && calculateType === '3')) {
467
+ return (
468
+ <Form.Item>
469
+ {getFieldDecorator('taxRate', {
470
+ initialValue: editGood.taxRate,
471
+ rules: [
472
+ ...getReplenishRules('taxRate'),
473
+ { required: true, message: '请选择税率' },
474
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
475
+ ],
476
+ })(
477
+ <Select
478
+ className="kts-invoice-operate-goods-list-table-tax-rate"
479
+ // dropdownMenuStyle={{ textAlign: "right" }}
480
+ showArrow={false}
481
+ style={{ width: '100%' }}
482
+ getPopupContainer={() => rootElement || document.body}
483
+ onChange={() => {
484
+ setChangeField('taxRate');
485
+ onChangeTaxRate(controller, form, record);
486
+ }}
487
+ >
488
+ {(record.goodsTaxRateList || taxRateList).map((e, i) => {
489
+ return (
490
+ <Select.Option key={i} value={e}>
491
+ {e}%
492
+ </Select.Option>
493
+ );
494
+ })}
495
+ </Select>,
496
+ )}
497
+ </Form.Item>
498
+ );
499
+ } else {
500
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : `${value}%`}</span>;
501
+ }
502
+ },
503
+ },
504
+ {
505
+ title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
506
+ dataIndex: 'taxAmount',
507
+ key: 'taxAmount',
508
+ align: 'right',
509
+ width: 119,
510
+ render: (value: string, record: IGood) => {
511
+ if (editGood?.$index === record.$index && !disableds.includes('taxAmount')) {
512
+ return getFieldDecorator('taxAmount', {
513
+ initialValue: editGood.taxAmount,
514
+ rules: [
515
+ ...getReplenishRules('taxAmount'),
516
+ { required: true, message: '税额不能为空' },
517
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '税额必须为数字' },
518
+ ],
519
+ })(
520
+ isEnables('taxAmount')
521
+ ? <MyInput
522
+ style={{ textAlign: 'right' }}
523
+ loading={isCipher(changeField, 'taxAmount')}
524
+ onChange={() => {
525
+ setChangeField('taxAmount');
526
+ onChangeTaxAmount(controller, form, record);
527
+ }}
528
+ />
529
+ : <MyDiv loading={isCipher(changeField, 'taxAmount')} />
530
+ );
531
+ } else {
532
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : parseFloat(value).toFixed(2)}</span>;
533
+ }
534
+ },
535
+ },
536
+ ]
537
+ // 含税不含税
538
+ .filter((e) => {
539
+ if (isTaxIncluded) {
540
+ return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
541
+ } else {
542
+ return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
543
+ }
544
+ })
545
+ // 是否启动拖拽
546
+ .filter(e => e.key !== 'drag' || isStart)
547
+ // 只读
548
+ .filter(e => {
549
+ if (model === 'readOnly') {
550
+ return e.key !== 'operating';
551
+ } else {
552
+ return true;
553
+ }
554
+ })
555
+ .map((e) => {
556
+ return {
557
+ ...e,
558
+ ellipsis: true,
559
+ };
560
+ }) as any[];
561
+ }, [isTaxIncluded, editGood, controller, taxRateList, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, isStart, calculateType]);
562
+
563
+ // React.useEffect(() => {
564
+ // clearTimeout(t)
565
+ // const t = setTimeout(() => { setChangeField('') }, 1000);
566
+ // return () => { clearTimeout(t) }
567
+ // }, [changeField]);
568
+
569
+ return columns;
570
+ };
571
+
572
+ /** 字段 */
573
+ function isCipher(name?: string, field?: string) {
574
+ if (!name || !field) return false;
575
+ return name !== field;
576
+ }
577
+
578
+ class MyInput extends React.Component<InputProps & { loading?: boolean }> {
579
+ render() {
580
+ if (this.props.loading) {
581
+ return (
582
+ <Spin size="small">
583
+ <Input {...this.props} autoComplete="off" />
584
+ </Spin>
585
+ )
586
+ } else {
587
+ return <Input {...this.props} autoComplete="off" />
588
+ }
589
+ }
590
+ }
591
+
592
+ class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
593
+
594
+ render() {
595
+ if (this.props.loading) {
596
+ return (
597
+ <Spin size="small">
598
+ <span style={{ padding: '0 10px' }}>{this.props.value}</span>
599
+ </Spin>
600
+ )
601
+ } else {
602
+ return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
603
+ }
604
+ }
605
+ }
606
+
607
+ class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
608
+ render(): React.ReactNode {
609
+
610
+ const { isMyShow, valueT, valueF } = this.props;
611
+
612
+ if (isMyShow) {
613
+ if (valueT) {
614
+ return (
615
+ <Tooltip title={valueT}>
616
+ <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
617
+ </Tooltip>
618
+ )
619
+ } else {
620
+ return (
621
+ <Tooltip title={valueF}>
622
+ <span style={MyItemNameStyle}>{valueF}</span>
623
+ </Tooltip>
624
+ )
625
+ }
626
+ } else {
627
+ if (valueF) {
628
+ return (
629
+ <Tooltip title={valueF}>
630
+ <span style={MyItemNameStyle}>{valueF}</span>
631
+ </Tooltip>
632
+ )
633
+ } else {
634
+ return (
635
+ <Tooltip title={valueT} style={MyItemNameStyle}>
636
+ <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
637
+ </Tooltip>
638
+ )
639
+ }
640
+ }
641
+ }
642
+ }
643
+
644
+ /** 格式搜索结果 */
645
+ function formatSearch(value?: string, search?: string) {
646
+ if (!value || !search) return value;
647
+
648
+ const __html = ucoding(value).split(new RegExp(ucoding(search), 'g')).map(e => dcoding(e)).join(`<span class="kts-invoice-operate-goods-list-table-search-protrude" >${search}</span>`);
649
+ return <span dangerouslySetInnerHTML={{ __html }} />
650
+ }
651
+
652
+ /** 编码 */
653
+ function ucoding(v: string): string {
654
+ return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
655
+ }
656
+
657
+ /** 解码 */
658
+ function dcoding(v: string): string {
659
+ return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
660
+ }
661
+
662
+ /** 是否免税 */
663
+ function isDutyFree(record: IGood): boolean {
664
+ return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
665
+ }
666
+
667
+ const MyItemNameStyle: any = {
668
+ padding: '0px 10px',
669
+ whiteSpace: 'nowrap',
670
+ overflow: 'hidden',
671
+ width: "100%",
672
+ display: 'block',
673
+ textOverflow: 'ellipsis'
674
674
  }