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,711 +1,711 @@
1
- import React from 'react';
2
- import { Form, AutoComplete, Select, Button, Input, Spin, Tooltip } from 'kts-components-antd-x3';
3
- import { InputProps } from 'kts-components-antd-x3/lib/input';
4
- import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
5
- import { IGood, LineAttributeType } from '../../../../../InvoiceController';
6
- import Invoice from '../../../../..';
7
- import RowMenu from './ui/RowMenu';
8
- import TitleText from './ui/TitleText';
9
- import ItemNameInput from './ui/ItemNameInput';
10
- import ItemCodeInput from './ui/ItemCodeInput';
11
- import {
12
- onChangeQuantity,
13
- onChangePriceIncludeTax,
14
- onChangePriceExcludeTax,
15
- onChangeLineAmountIncludeTax,
16
- onChangeLineAmountExcludeTax,
17
- onChangeTaxRate,
18
- onChangeItemName,
19
- onChangeItemCode,
20
- } from './autoFillFn';
21
- import { getItemNameWithShorthand } from '../../../../../tools/itemName';
22
- import Drag from './ui/Drag';
23
- import { nonScientificNotation } from '../../../../../tools/calculate';
24
- import Expand from './ui/Expand';
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 isStart = controller.useMemo((e) => e.goodsListState.drag.isStart, []);
44
-
45
- /** 是否显示我方 */
46
- const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
47
-
48
- /** 正在编辑的货物 */
49
- const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
50
-
51
- /** 正在编辑的货物 */
52
- const goodsList = controller.useMemo((e) => e.goodsListState.goodsList, []);
53
-
54
- /** 商品表格隐藏列 */
55
- const columnshide = controller.useMemo((e) => e.goodsListState.columnshide, []);
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 onNumberValueChange = React.useCallback((e) => {
79
- const value = e?.target?.value;
80
- if (value) {
81
- return value.replace(/[^0-9-\.]/g, '');
82
- }
83
- }, [])
84
-
85
- /** 获取补充校验规则 */
86
- const getReplenishRules = React.useCallback((id: string) => {
87
- return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
88
- }, [columnsReplenish])
89
-
90
- /** 金额整数位限制,不传默认9位 */
91
- const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
92
-
93
- /** 表头 */
94
- const columns = React.useMemo(() => {
95
- return [
96
- {
97
- title: ' ',
98
- key: 'drag',
99
- width: 40,
100
- align: 'center',
101
- render: (_: any, record: IGood) => <Drag record={record} />
102
- },
103
- {
104
- title: ' ',
105
- key: 'expand',
106
- width: 50,
107
- align: 'center',
108
- render: (_: any, record: IGood) => <Expand record={record} />
109
- },
110
- {
111
- title: '序号',
112
- key: 'serialNo',
113
- dataIndex: 'serialNo',
114
- width: 50,
115
- render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
116
- },
117
- {
118
- title: '商品编码',
119
- key: 'itemCode',
120
- width: 119,
121
- render: (_: string, record: IGood) => {
122
- if (editGood?.$index === record.$index && model !== 'prefab') {
123
- return (
124
- <Form.Item>
125
- {getFieldDecorator('itemCode', {
126
- initialValue: editGood.itemCode,
127
- rules: [
128
- ...getReplenishRules('itemCode'),
129
- { pattern: /^.{1,19}$/, message: '商品编码长度不能超过19位' },
130
- ]
131
- })(
132
- <ItemCodeInput
133
- onChange={async () => {
134
- await onChangeItemCode(controller, form, record);
135
- // await onChangeLineAmountIncludeTax(controller, form, record);
136
- }}
137
- />
138
- )}
139
- </Form.Item>
140
- )
141
- } else {
142
- return <span style={{ padding: '0 10px' }}>{record.itemCode}</span>
143
- }
144
- }
145
- },
146
- {
147
- title: <TitleText required >项目名称</TitleText>,
148
- key: 'itemName',
149
- render: (_: string, record: IGood) => {
150
- if (editGood?.$index === record.$index && model !== 'prefab') {
151
- return (
152
- <Form.Item>
153
- <div style={{ display: 'flex' }} >
154
- {getFieldDecorator('itemName', {
155
- initialValue: record.itemName,
156
- rules: [
157
- ...getReplenishRules('itemName'),
158
- {
159
- validator: async (_, __, callback) => {
160
- await controller.wait();
161
- const value = controller.state.goodsListState.editGood;
162
- if (!value?.itemName && !value?.itemNameSelf) {
163
- callback('项目名称不能为空');
164
- } else {
165
- return;
166
- }
167
- }
168
- }
169
- ]
170
- })(
171
- <ItemNameInput
172
- editGood={editGood}
173
- shorthand={editGood.shorthand}
174
- onChange={() => {
175
- onChangeItemName(controller, form, record);
176
- }}
177
- />
178
- )}
179
- <div className="kts-invoice-operate-goods-list-able-list-itemName-import">
180
- {controller.getGoodsList && model !== 'readOnly' && (
181
- <Tooltip title="点击从商品管理中添加商品信息">
182
- <Button
183
- onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
184
- type="link"
185
- icon="plus-circle"
186
- />
187
- </Tooltip>
188
- )}
189
- </div>
190
- </div>
191
- </Form.Item>
192
- );
193
- } else {
194
- return (
195
- <MyItemNameDiv
196
- valueT={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemNameSelf || '' }), searchValue)}
197
- valueF={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemName || '' }), searchValue)}
198
- isMyShow={isMyShow}
199
- />
200
- )
201
- }
202
- },
203
- },
204
- {
205
- title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
206
- key: 'itemModelName',
207
- width: 119,
208
- render: (_: string, record: IGood) => {
209
- if (editGood?.$index === record.$index && model !== 'prefab') {
210
- return (
211
- <Form.Item>
212
- {getFieldDecorator('itemModelName', {
213
- initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
214
- rules: getReplenishRules('itemModelName'),
215
- })(
216
- <MyInput
217
- onChange={async () => {
218
- await controller.wait()
219
- const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
220
- const value = {} as any;
221
- value[key] = form.getFieldsValue().itemModelName;
222
- controller.setEditGood(value);
223
- }}
224
- />,
225
- )}
226
- </Form.Item>
227
- );
228
- } else {
229
- return (
230
- <MyItemNameDiv
231
- valueT={formatSearch(record.itemModelNameSelf, searchValue)}
232
- valueF={formatSearch(record.itemModelName, searchValue)}
233
- isMyShow={isMyShow}
234
- />
235
- )
236
- }
237
- },
238
- },
239
- {
240
- title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
241
- key: 'unit',
242
- width: 70,
243
- render: (_: string, record: IGood) => {
244
- if (editGood?.$index === record.$index && model !== 'prefab') {
245
- return (
246
- <Form.Item>
247
- {getFieldDecorator('unit', {
248
- initialValue: editGood.unit,
249
- rules: getReplenishRules('unit'),
250
- })(
251
- <AutoComplete
252
- style={{ width: '100%' }}
253
- dataSource={unitList}
254
- getPopupContainer={() => rootElement || document.body}
255
- onChange={async () => {
256
- await controller.wait()
257
- controller.setEditGood({ unit: form.getFieldsValue().unit });
258
- }}
259
- />,
260
- )}
261
- </Form.Item>
262
- );
263
- } else {
264
- return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
265
- }
266
- },
267
- },
268
- {
269
- title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
270
- dataIndex: 'quantity',
271
- key: 'quantity',
272
- align: 'right',
273
- width: 149,
274
- render: (value: string, record: IGood) => {
275
- if (editGood?.$index === record.$index && model !== 'prefab') {
276
- return (
277
- <Form.Item>
278
- {getFieldDecorator('quantity', {
279
- initialValue: nonScientificNotation(editGood.quantity),
280
- getValueFromEvent: onNumberValueChange,
281
- rules: [
282
- ...getReplenishRules('quantity'),
283
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
284
- {
285
- validator: async (_, value, callback) => {
286
- await controller.wait();
287
- const isvalue = !!value || value === 0;
288
- const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
289
- if (isvalue || isPrice === isvalue) return;
290
- callback('请输入数量');
291
- }
292
- }
293
- ],
294
- })(
295
- <MyInput
296
- style={{ textAlign: 'right' }}
297
- maxLength={25}
298
- loading={isCipher(changeField, "quantity")}
299
- onChange={async () => {
300
- setChangeField('quantity');
301
- await onChangeQuantity(controller, form, record);
302
- }}
303
- />,
304
- )}
305
- </Form.Item>
306
- );
307
- } else {
308
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
309
- }
310
- },
311
- },
312
- {
313
- title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
314
- dataIndex: 'priceIncludeTax',
315
- key: 'priceIncludeTax',
316
- align: 'right',
317
- width: 149,
318
- render: (value: string, record: IGood) => {
319
- if (editGood?.$index === record.$index && model !== 'prefab') {
320
- return (
321
- <Form.Item>
322
- {getFieldDecorator('priceIncludeTax', {
323
- initialValue: nonScientificNotation(editGood.priceIncludeTax),
324
- getValueFromEvent: onNumberValueChange,
325
- rules: [
326
- ...getReplenishRules('priceIncludeTax'),
327
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
328
- {
329
- validator: async (_, value, callback) => {
330
- await controller.wait();
331
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
332
- const isvalue = !!value || value === 0;
333
- if (isvalue || isQuantity === isvalue) return;
334
- callback('请输入单价');
335
- }
336
- }
337
- ],
338
- })(
339
- <MyInput
340
- style={{ textAlign: 'right' }}
341
- maxLength={25}
342
- loading={isCipher(changeField, 'priceIncludeTax')}
343
- onChange={() => {
344
- setChangeField('priceIncludeTax');
345
- onChangePriceIncludeTax(controller, form, record);
346
- }}
347
- />,
348
- )}
349
- </Form.Item>
350
- );
351
- } else {
352
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
353
- }
354
- },
355
- },
356
- {
357
- title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
358
- dataIndex: 'priceExcludeTax',
359
- key: 'priceExcludeTax',
360
- align: 'right',
361
- width: 149,
362
- render: (value: string, record: IGood) => {
363
- if (editGood?.$index === record.$index && model !== 'prefab') {
364
- return (
365
- <Form.Item>
366
- {getFieldDecorator('priceExcludeTax', {
367
- initialValue: nonScientificNotation(editGood.priceExcludeTax),
368
- getValueFromEvent: onNumberValueChange,
369
- rules: [
370
- ...getReplenishRules('priceExcludeTax'),
371
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
372
- {
373
- validator: async (_, value, callback) => {
374
- await controller.wait();
375
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
376
- const isvalue = !!value || value === 0;
377
- if (isvalue || isQuantity === isvalue) return;
378
- callback('请输入单价');
379
- }
380
- }
381
- ],
382
- })(
383
- <MyInput
384
- style={{ textAlign: 'right' }}
385
- maxLength={25}
386
- loading={isCipher(changeField, 'priceExcludeTax')}
387
- onChange={() => {
388
- setChangeField('priceExcludeTax');
389
- onChangePriceExcludeTax(controller, form, record);
390
- }}
391
- />,
392
- )}
393
- </Form.Item>
394
- );
395
- } else {
396
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
397
- }
398
- },
399
- },
400
- {
401
- title: <TitleText required >金额(含税)</TitleText>,
402
- dataIndex: 'lineAmountIncludeTax',
403
- key: 'lineAmountIncludeTax',
404
- width: 119,
405
- align: 'right',
406
- render: (value: string, record: IGood) => {
407
- if (editGood?.$index === record.$index && model !== 'prefab') {
408
- return (
409
- <Form.Item>
410
- {getFieldDecorator('lineAmountIncludeTax', {
411
- initialValue: editGood.lineAmountIncludeTax,
412
- getValueFromEvent: onNumberValueChange,
413
- rules: [
414
- ...getReplenishRules('lineAmountIncludeTax'),
415
- { required: true, message: '金额不能为空' },
416
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
417
- {
418
- validator: async (_, value, callback) => {
419
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
420
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
421
- }
422
- }
423
- },
424
- {
425
- validator: async (_, value, callback) => {
426
- if (deduction && parseFloat(value) <= deduction) {
427
- callback('扣除额不能大于等于价税合计');
428
- }
429
- }
430
- },
431
- ],
432
- })(
433
- <MyInput
434
- style={{ textAlign: 'right' }}
435
- loading={isCipher(changeField, 'lineAmountIncludeTax')}
436
- onChange={() => {
437
- setChangeField('lineAmountIncludeTax');
438
- onChangeLineAmountIncludeTax(controller, form, record);
439
- }}
440
- />,
441
- )}
442
- </Form.Item>
443
- );
444
- } else {
445
- return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
446
- }
447
- },
448
- },
449
- {
450
- title: <TitleText required >金额(不含税)</TitleText>,
451
- dataIndex: 'lineAmountExcludeTax',
452
- key: 'lineAmountExcludeTax',
453
- align: 'right',
454
- width: 119,
455
- render: (value: string, record: IGood) => {
456
- if (editGood?.$index === record.$index && model !== 'prefab') {
457
- return (
458
- <Form.Item>
459
- {getFieldDecorator('lineAmountExcludeTax', {
460
- initialValue: editGood.lineAmountExcludeTax,
461
- getValueFromEvent: onNumberValueChange,
462
- rules: [
463
- ...getReplenishRules('lineAmountExcludeTax'),
464
- { required: true, message: '金额不能为空' },
465
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
466
- {
467
- validator: async (_, value: string, callback) => {
468
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
469
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
470
- }
471
- }
472
- },
473
- ],
474
- })(
475
- <MyInput
476
- style={{ textAlign: 'right' }}
477
- loading={isCipher(changeField, 'lineAmountExcludeTax')}
478
- onChange={() => {
479
- setChangeField('lineAmountExcludeTax');
480
- onChangeLineAmountExcludeTax(controller, form, record);
481
- }}
482
- />,
483
- )}
484
- </Form.Item>
485
- );
486
- } else {
487
- return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
488
- }
489
- },
490
- },
491
- {
492
- title: <TitleText required >税率</TitleText>,
493
- dataIndex: 'taxRate',
494
- key: 'taxRate',
495
- align: 'right',
496
- width: 75,
497
- render: (value: string, record: IGood) => {
498
- if (editGood?.$index === record.$index && !(model === 'prefab' && calculateType === '3')) {
499
- return (
500
- <Form.Item>
501
- {getFieldDecorator('taxRate', {
502
- initialValue: editGood.taxRate,
503
- rules: [
504
- ...getReplenishRules('taxRate'),
505
- { required: true, message: '请选择税率' },
506
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
507
- ],
508
- })(
509
- <Select
510
- className="kts-invoice-operate-goods-list-table-tax-rate"
511
- dropdownMenuStyle={{ textAlign: "right" }}
512
- showArrow={false}
513
- style={{ width: '100%' }}
514
- getPopupContainer={() => rootElement || document.body}
515
- onChange={() => {
516
- setChangeField('taxRate');
517
- onChangeTaxRate(controller, form, record);
518
- }}
519
- >
520
- {(record.goodsTaxRateList || taxRateList).map((e, i) => {
521
- return (
522
- <Select.Option key={i} value={e}>
523
- {e}%
524
- </Select.Option>
525
- );
526
- })}
527
- </Select>,
528
- )}
529
- </Form.Item>
530
- );
531
- } else {
532
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : `${value}%`}</span>;
533
- }
534
- },
535
- },
536
- {
537
- title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
538
- dataIndex: 'taxAmount',
539
- key: 'taxAmount',
540
- align: 'right',
541
- width: 119,
542
- render: (value: string, record: IGood) => {
543
- if (editGood?.$index === record.$index) {
544
- return getFieldDecorator('taxAmount', {
545
- initialValue: editGood.taxAmount,
546
- rules: getReplenishRules('taxAmount'),
547
- })(<MyDiv loading={isCipher(changeField, 'taxAmount')} />);
548
- } else {
549
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : parseFloat(value).toFixed(2)}</span>;
550
- }
551
- },
552
- },
553
- {
554
- title: '行性质',
555
- dataIndex: 'lineAttribute',
556
- key: 'lineAttribute',
557
- width: 70,
558
- render: (e: any) => {
559
- switch (e) {
560
- case LineAttributeType.折扣行:
561
- return <span style={{ padding: '0 10px' }}>折扣行</span>
562
- case LineAttributeType.被折扣行:
563
- return <span style={{ padding: '0 10px' }}>被折扣行</span>
564
- case LineAttributeType.赠品行:
565
- return <span style={{ padding: '0 10px' }}>赠品行</span>
566
- case LineAttributeType.折让行:
567
- return <span style={{ padding: '0 10px' }}>折让行</span>
568
- case LineAttributeType.正常:
569
- return <span style={{ padding: '0 10px' }}>正常行</span>
570
- default:
571
- return <span style={{ padding: '0 10px' }}>{e}</span>
572
- }
573
- }
574
- },
575
- {
576
- title: '操作',
577
- key: 'operating',
578
- align: 'right',
579
- width: 130,
580
- fixed: 'right',
581
- render: (_value: string, record: IGood) => <RowMenu key={record.lineAttribute} goods={record} />,
582
- },
583
- ]
584
- // 筛选隐藏
585
- .filter(e => {
586
- return e.key ? columnshide.indexOf(e.key) < 0 : false;
587
- })
588
- // 含税不含税
589
- .filter((e) => {
590
- if (isTaxIncluded) {
591
- return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
592
- } else {
593
- return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
594
- }
595
- })
596
- // 是否启动拖拽
597
- .filter(e => e.key !== 'drag' || isStart)
598
- // 是否启动展开
599
- .filter(e => e.key === 'expand' ? goodsList.some(e => !!e.children) : true)
600
- // 只读
601
- .filter(e => {
602
- if (model === 'readOnly') {
603
- return e.key !== 'operating';
604
- } else {
605
- return true;
606
- }
607
- })
608
- .map((e) => {
609
- return {
610
- ...e,
611
- ellipsis: true,
612
- };
613
- }) as any[];
614
- }, [isTaxIncluded, editGood, goodsList, controller, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, columnshide, isStart]);
615
-
616
- return controller.setColumnsConfig ? controller.setColumnsConfig(columns) : columns;
617
- };
618
-
619
- /** 字段 */
620
- function isCipher(name?: string, field?: string) {
621
- if (!name || !field) return false;
622
- return name !== field;
623
- }
624
-
625
- class MyInput extends React.Component<InputProps & { loading?: boolean }> {
626
- render() {
627
- if (this.props.loading) {
628
- return (
629
- <Spin size="small">
630
- <Input {...this.props} autoComplete="off" />
631
- </Spin>
632
- )
633
- } else {
634
- return <Input {...this.props} autoComplete="off" />
635
- }
636
- }
637
- }
638
-
639
- class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
640
- render() {
641
- if (this.props.loading) {
642
- return (
643
- <Spin size="small">
644
- <span style={{ padding: '0 10px' }}>{this.props.value}</span>
645
- </Spin>
646
- )
647
- } else {
648
- return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
649
- }
650
- }
651
- }
652
-
653
- class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
654
- render(): React.ReactNode {
655
-
656
- const { isMyShow, valueT, valueF } = this.props;
657
-
658
- if (isMyShow) {
659
- if (valueT) {
660
- return (
661
- <Tooltip title={valueT}>
662
- <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
663
- </Tooltip>
664
- )
665
- } else {
666
- return (
667
- <Tooltip title={valueF}>
668
- <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
669
- </Tooltip>
670
- )
671
- }
672
- } else {
673
- if (valueF) {
674
- return (
675
- <Tooltip title={valueF}>
676
- <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
677
- </Tooltip>
678
- )
679
- } else {
680
- return (
681
- <Tooltip title={valueT}>
682
- <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
683
- </Tooltip>
684
- )
685
- }
686
- }
687
- }
688
- }
689
-
690
- /** 格式搜索结果 */
691
- function formatSearch(value?: string, search?: string) {
692
- if (!value || !search) return value;
693
-
694
- 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>`);
695
- return <span dangerouslySetInnerHTML={{ __html }} />
696
- }
697
-
698
- /** 编码 */
699
- function ucoding(v: string): string {
700
- return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
701
- }
702
-
703
- /** 解码 */
704
- function dcoding(v: string): string {
705
- return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
706
- }
707
-
708
- /** 是否免税 */
709
- function isDutyFree(record: IGood): boolean {
710
- return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
711
- }
1
+ import React from 'react';
2
+ import { Form, AutoComplete, Select, Button, Input, Spin, Tooltip } from 'kts-components-antd-x3';
3
+ import { InputProps } from 'kts-components-antd-x3/lib/input';
4
+ import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
5
+ import { IGood, LineAttributeType } from '../../../../../InvoiceController';
6
+ import Invoice from '../../../../..';
7
+ import RowMenu from './ui/RowMenu';
8
+ import TitleText from './ui/TitleText';
9
+ import ItemNameInput from './ui/ItemNameInput';
10
+ import ItemCodeInput from './ui/ItemCodeInput';
11
+ import {
12
+ onChangeQuantity,
13
+ onChangePriceIncludeTax,
14
+ onChangePriceExcludeTax,
15
+ onChangeLineAmountIncludeTax,
16
+ onChangeLineAmountExcludeTax,
17
+ onChangeTaxRate,
18
+ onChangeItemName,
19
+ onChangeItemCode,
20
+ } from './autoFillFn';
21
+ import { getItemNameWithShorthand } from '../../../../../tools/itemName';
22
+ import Drag from './ui/Drag';
23
+ import { nonScientificNotation } from '../../../../../tools/calculate';
24
+ import Expand from './ui/Expand';
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 isStart = controller.useMemo((e) => e.goodsListState.drag.isStart, []);
44
+
45
+ /** 是否显示我方 */
46
+ const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
47
+
48
+ /** 正在编辑的货物 */
49
+ const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
50
+
51
+ /** 正在编辑的货物 */
52
+ const goodsList = controller.useMemo((e) => e.goodsListState.goodsList, []);
53
+
54
+ /** 商品表格隐藏列 */
55
+ const columnshide = controller.useMemo((e) => e.goodsListState.columnshide, []);
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 onNumberValueChange = React.useCallback((e) => {
79
+ const value = e?.target?.value;
80
+ if (value) {
81
+ return value.replace(/[^0-9-\.]/g, '');
82
+ }
83
+ }, [])
84
+
85
+ /** 获取补充校验规则 */
86
+ const getReplenishRules = React.useCallback((id: string) => {
87
+ return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
88
+ }, [columnsReplenish])
89
+
90
+ /** 金额整数位限制,不传默认9位 */
91
+ const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
92
+
93
+ /** 表头 */
94
+ const columns = React.useMemo(() => {
95
+ return [
96
+ {
97
+ title: ' ',
98
+ key: 'drag',
99
+ width: 40,
100
+ align: 'center',
101
+ render: (_: any, record: IGood) => <Drag record={record} />
102
+ },
103
+ {
104
+ title: ' ',
105
+ key: 'expand',
106
+ width: 50,
107
+ align: 'center',
108
+ render: (_: any, record: IGood) => <Expand record={record} />
109
+ },
110
+ {
111
+ title: '序号',
112
+ key: 'serialNo',
113
+ dataIndex: 'serialNo',
114
+ width: 50,
115
+ render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
116
+ },
117
+ {
118
+ title: '商品编码',
119
+ key: 'itemCode',
120
+ width: 119,
121
+ render: (_: string, record: IGood) => {
122
+ if (editGood?.$index === record.$index && model !== 'prefab') {
123
+ return (
124
+ <Form.Item>
125
+ {getFieldDecorator('itemCode', {
126
+ initialValue: editGood.itemCode,
127
+ rules: [
128
+ ...getReplenishRules('itemCode'),
129
+ { pattern: /^.{1,19}$/, message: '商品编码长度不能超过19位' },
130
+ ]
131
+ })(
132
+ <ItemCodeInput
133
+ onChange={async () => {
134
+ await onChangeItemCode(controller, form, record);
135
+ // await onChangeLineAmountIncludeTax(controller, form, record);
136
+ }}
137
+ />
138
+ )}
139
+ </Form.Item>
140
+ )
141
+ } else {
142
+ return <span style={{ padding: '0 10px' }}>{record.itemCode}</span>
143
+ }
144
+ }
145
+ },
146
+ {
147
+ title: <TitleText required >项目名称</TitleText>,
148
+ key: 'itemName',
149
+ render: (_: string, record: IGood) => {
150
+ if (editGood?.$index === record.$index && model !== 'prefab') {
151
+ return (
152
+ <Form.Item>
153
+ <div style={{ display: 'flex' }} >
154
+ {getFieldDecorator('itemName', {
155
+ initialValue: record.itemName,
156
+ rules: [
157
+ ...getReplenishRules('itemName'),
158
+ {
159
+ validator: async (_, __, callback) => {
160
+ await controller.wait();
161
+ const value = controller.state.goodsListState.editGood;
162
+ if (!value?.itemName && !value?.itemNameSelf) {
163
+ callback('项目名称不能为空');
164
+ } else {
165
+ return;
166
+ }
167
+ }
168
+ }
169
+ ]
170
+ })(
171
+ <ItemNameInput
172
+ editGood={editGood}
173
+ shorthand={editGood.shorthand}
174
+ onChange={() => {
175
+ onChangeItemName(controller, form, record);
176
+ }}
177
+ />
178
+ )}
179
+ <div className="kts-invoice-operate-goods-list-able-list-itemName-import">
180
+ {controller.getGoodsList && model !== 'readOnly' && (
181
+ <Tooltip title="点击从商品管理中添加商品信息">
182
+ <Button
183
+ onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
184
+ type="link"
185
+ icon="plus-circle"
186
+ />
187
+ </Tooltip>
188
+ )}
189
+ </div>
190
+ </div>
191
+ </Form.Item>
192
+ );
193
+ } else {
194
+ return (
195
+ <MyItemNameDiv
196
+ valueT={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemNameSelf || '' }), searchValue)}
197
+ valueF={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemName || '' }), searchValue)}
198
+ isMyShow={isMyShow}
199
+ />
200
+ )
201
+ }
202
+ },
203
+ },
204
+ {
205
+ title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
206
+ key: 'itemModelName',
207
+ width: 119,
208
+ render: (_: string, record: IGood) => {
209
+ if (editGood?.$index === record.$index && model !== 'prefab') {
210
+ return (
211
+ <Form.Item>
212
+ {getFieldDecorator('itemModelName', {
213
+ initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
214
+ rules: getReplenishRules('itemModelName'),
215
+ })(
216
+ <MyInput
217
+ onChange={async () => {
218
+ await controller.wait()
219
+ const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
220
+ const value = {} as any;
221
+ value[key] = form.getFieldsValue().itemModelName;
222
+ controller.setEditGood(value);
223
+ }}
224
+ />,
225
+ )}
226
+ </Form.Item>
227
+ );
228
+ } else {
229
+ return (
230
+ <MyItemNameDiv
231
+ valueT={formatSearch(record.itemModelNameSelf, searchValue)}
232
+ valueF={formatSearch(record.itemModelName, searchValue)}
233
+ isMyShow={isMyShow}
234
+ />
235
+ )
236
+ }
237
+ },
238
+ },
239
+ {
240
+ title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
241
+ key: 'unit',
242
+ width: 70,
243
+ render: (_: string, record: IGood) => {
244
+ if (editGood?.$index === record.$index && model !== 'prefab') {
245
+ return (
246
+ <Form.Item>
247
+ {getFieldDecorator('unit', {
248
+ initialValue: editGood.unit,
249
+ rules: getReplenishRules('unit'),
250
+ })(
251
+ <AutoComplete
252
+ style={{ width: '100%' }}
253
+ dataSource={unitList}
254
+ getPopupContainer={() => rootElement || document.body}
255
+ onChange={async () => {
256
+ await controller.wait()
257
+ controller.setEditGood({ unit: form.getFieldsValue().unit });
258
+ }}
259
+ />,
260
+ )}
261
+ </Form.Item>
262
+ );
263
+ } else {
264
+ return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
265
+ }
266
+ },
267
+ },
268
+ {
269
+ title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
270
+ dataIndex: 'quantity',
271
+ key: 'quantity',
272
+ align: 'right',
273
+ width: 149,
274
+ render: (value: string, record: IGood) => {
275
+ if (editGood?.$index === record.$index && model !== 'prefab') {
276
+ return (
277
+ <Form.Item>
278
+ {getFieldDecorator('quantity', {
279
+ initialValue: nonScientificNotation(editGood.quantity),
280
+ getValueFromEvent: onNumberValueChange,
281
+ rules: [
282
+ ...getReplenishRules('quantity'),
283
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
284
+ {
285
+ validator: async (_, value, callback) => {
286
+ await controller.wait();
287
+ const isvalue = !!value || value === 0;
288
+ const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
289
+ if (isvalue || isPrice === isvalue) return;
290
+ callback('请输入数量');
291
+ }
292
+ }
293
+ ],
294
+ })(
295
+ <MyInput
296
+ style={{ textAlign: 'right' }}
297
+ maxLength={25}
298
+ loading={isCipher(changeField, "quantity")}
299
+ onChange={async () => {
300
+ setChangeField('quantity');
301
+ await onChangeQuantity(controller, form, record);
302
+ }}
303
+ />,
304
+ )}
305
+ </Form.Item>
306
+ );
307
+ } else {
308
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
309
+ }
310
+ },
311
+ },
312
+ {
313
+ title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
314
+ dataIndex: 'priceIncludeTax',
315
+ key: 'priceIncludeTax',
316
+ align: 'right',
317
+ width: 149,
318
+ render: (value: string, record: IGood) => {
319
+ if (editGood?.$index === record.$index && model !== 'prefab') {
320
+ return (
321
+ <Form.Item>
322
+ {getFieldDecorator('priceIncludeTax', {
323
+ initialValue: nonScientificNotation(editGood.priceIncludeTax),
324
+ getValueFromEvent: onNumberValueChange,
325
+ rules: [
326
+ ...getReplenishRules('priceIncludeTax'),
327
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
328
+ {
329
+ validator: async (_, value, callback) => {
330
+ await controller.wait();
331
+ const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
332
+ const isvalue = !!value || value === 0;
333
+ if (isvalue || isQuantity === isvalue) return;
334
+ callback('请输入单价');
335
+ }
336
+ }
337
+ ],
338
+ })(
339
+ <MyInput
340
+ style={{ textAlign: 'right' }}
341
+ maxLength={25}
342
+ loading={isCipher(changeField, 'priceIncludeTax')}
343
+ onChange={() => {
344
+ setChangeField('priceIncludeTax');
345
+ onChangePriceIncludeTax(controller, form, record);
346
+ }}
347
+ />,
348
+ )}
349
+ </Form.Item>
350
+ );
351
+ } else {
352
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
353
+ }
354
+ },
355
+ },
356
+ {
357
+ title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
358
+ dataIndex: 'priceExcludeTax',
359
+ key: 'priceExcludeTax',
360
+ align: 'right',
361
+ width: 149,
362
+ render: (value: string, record: IGood) => {
363
+ if (editGood?.$index === record.$index && model !== 'prefab') {
364
+ return (
365
+ <Form.Item>
366
+ {getFieldDecorator('priceExcludeTax', {
367
+ initialValue: nonScientificNotation(editGood.priceExcludeTax),
368
+ getValueFromEvent: onNumberValueChange,
369
+ rules: [
370
+ ...getReplenishRules('priceExcludeTax'),
371
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
372
+ {
373
+ validator: async (_, value, callback) => {
374
+ await controller.wait();
375
+ const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
376
+ const isvalue = !!value || value === 0;
377
+ if (isvalue || isQuantity === isvalue) return;
378
+ callback('请输入单价');
379
+ }
380
+ }
381
+ ],
382
+ })(
383
+ <MyInput
384
+ style={{ textAlign: 'right' }}
385
+ maxLength={25}
386
+ loading={isCipher(changeField, 'priceExcludeTax')}
387
+ onChange={() => {
388
+ setChangeField('priceExcludeTax');
389
+ onChangePriceExcludeTax(controller, form, record);
390
+ }}
391
+ />,
392
+ )}
393
+ </Form.Item>
394
+ );
395
+ } else {
396
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
397
+ }
398
+ },
399
+ },
400
+ {
401
+ title: <TitleText required >金额(含税)</TitleText>,
402
+ dataIndex: 'lineAmountIncludeTax',
403
+ key: 'lineAmountIncludeTax',
404
+ width: 119,
405
+ align: 'right',
406
+ render: (value: string, record: IGood) => {
407
+ if (editGood?.$index === record.$index && model !== 'prefab') {
408
+ return (
409
+ <Form.Item>
410
+ {getFieldDecorator('lineAmountIncludeTax', {
411
+ initialValue: editGood.lineAmountIncludeTax,
412
+ getValueFromEvent: onNumberValueChange,
413
+ rules: [
414
+ ...getReplenishRules('lineAmountIncludeTax'),
415
+ { required: true, message: '金额不能为空' },
416
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
417
+ {
418
+ validator: async (_, value, callback) => {
419
+ if (`${value}`.split('.')[0].length > priceIntegerDigit) {
420
+ callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
421
+ }
422
+ }
423
+ },
424
+ {
425
+ validator: async (_, value, callback) => {
426
+ if (deduction && parseFloat(value) <= deduction) {
427
+ callback('扣除额不能大于等于价税合计');
428
+ }
429
+ }
430
+ },
431
+ ],
432
+ })(
433
+ <MyInput
434
+ style={{ textAlign: 'right' }}
435
+ loading={isCipher(changeField, 'lineAmountIncludeTax')}
436
+ onChange={() => {
437
+ setChangeField('lineAmountIncludeTax');
438
+ onChangeLineAmountIncludeTax(controller, form, record);
439
+ }}
440
+ />,
441
+ )}
442
+ </Form.Item>
443
+ );
444
+ } else {
445
+ return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
446
+ }
447
+ },
448
+ },
449
+ {
450
+ title: <TitleText required >金额(不含税)</TitleText>,
451
+ dataIndex: 'lineAmountExcludeTax',
452
+ key: 'lineAmountExcludeTax',
453
+ align: 'right',
454
+ width: 119,
455
+ render: (value: string, record: IGood) => {
456
+ if (editGood?.$index === record.$index && model !== 'prefab') {
457
+ return (
458
+ <Form.Item>
459
+ {getFieldDecorator('lineAmountExcludeTax', {
460
+ initialValue: editGood.lineAmountExcludeTax,
461
+ getValueFromEvent: onNumberValueChange,
462
+ rules: [
463
+ ...getReplenishRules('lineAmountExcludeTax'),
464
+ { required: true, message: '金额不能为空' },
465
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
466
+ {
467
+ validator: async (_, value: string, callback) => {
468
+ if (`${value}`.split('.')[0].length > priceIntegerDigit) {
469
+ callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
470
+ }
471
+ }
472
+ },
473
+ ],
474
+ })(
475
+ <MyInput
476
+ style={{ textAlign: 'right' }}
477
+ loading={isCipher(changeField, 'lineAmountExcludeTax')}
478
+ onChange={() => {
479
+ setChangeField('lineAmountExcludeTax');
480
+ onChangeLineAmountExcludeTax(controller, form, record);
481
+ }}
482
+ />,
483
+ )}
484
+ </Form.Item>
485
+ );
486
+ } else {
487
+ return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
488
+ }
489
+ },
490
+ },
491
+ {
492
+ title: <TitleText required >税率</TitleText>,
493
+ dataIndex: 'taxRate',
494
+ key: 'taxRate',
495
+ align: 'right',
496
+ width: 75,
497
+ render: (value: string, record: IGood) => {
498
+ if (editGood?.$index === record.$index && !(model === 'prefab' && calculateType === '3')) {
499
+ return (
500
+ <Form.Item>
501
+ {getFieldDecorator('taxRate', {
502
+ initialValue: editGood.taxRate,
503
+ rules: [
504
+ ...getReplenishRules('taxRate'),
505
+ { required: true, message: '请选择税率' },
506
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
507
+ ],
508
+ })(
509
+ <Select
510
+ className="kts-invoice-operate-goods-list-table-tax-rate"
511
+ dropdownMenuStyle={{ textAlign: "right" }}
512
+ showArrow={false}
513
+ style={{ width: '100%' }}
514
+ getPopupContainer={() => rootElement || document.body}
515
+ onChange={() => {
516
+ setChangeField('taxRate');
517
+ onChangeTaxRate(controller, form, record);
518
+ }}
519
+ >
520
+ {(record.goodsTaxRateList || taxRateList).map((e, i) => {
521
+ return (
522
+ <Select.Option key={i} value={e}>
523
+ {e}%
524
+ </Select.Option>
525
+ );
526
+ })}
527
+ </Select>,
528
+ )}
529
+ </Form.Item>
530
+ );
531
+ } else {
532
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : `${value}%`}</span>;
533
+ }
534
+ },
535
+ },
536
+ {
537
+ title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
538
+ dataIndex: 'taxAmount',
539
+ key: 'taxAmount',
540
+ align: 'right',
541
+ width: 119,
542
+ render: (value: string, record: IGood) => {
543
+ if (editGood?.$index === record.$index) {
544
+ return getFieldDecorator('taxAmount', {
545
+ initialValue: editGood.taxAmount,
546
+ rules: getReplenishRules('taxAmount'),
547
+ })(<MyDiv loading={isCipher(changeField, 'taxAmount')} />);
548
+ } else {
549
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : parseFloat(value).toFixed(2)}</span>;
550
+ }
551
+ },
552
+ },
553
+ {
554
+ title: '行性质',
555
+ dataIndex: 'lineAttribute',
556
+ key: 'lineAttribute',
557
+ width: 70,
558
+ render: (e: any) => {
559
+ switch (e) {
560
+ case LineAttributeType.折扣行:
561
+ return <span style={{ padding: '0 10px' }}>折扣行</span>
562
+ case LineAttributeType.被折扣行:
563
+ return <span style={{ padding: '0 10px' }}>被折扣行</span>
564
+ case LineAttributeType.赠品行:
565
+ return <span style={{ padding: '0 10px' }}>赠品行</span>
566
+ case LineAttributeType.折让行:
567
+ return <span style={{ padding: '0 10px' }}>折让行</span>
568
+ case LineAttributeType.正常:
569
+ return <span style={{ padding: '0 10px' }}>正常行</span>
570
+ default:
571
+ return <span style={{ padding: '0 10px' }}>{e}</span>
572
+ }
573
+ }
574
+ },
575
+ {
576
+ title: '操作',
577
+ key: 'operating',
578
+ align: 'right',
579
+ width: 130,
580
+ fixed: 'right',
581
+ render: (_value: string, record: IGood) => <RowMenu key={record.lineAttribute} goods={record} />,
582
+ },
583
+ ]
584
+ // 筛选隐藏
585
+ .filter(e => {
586
+ return e.key ? columnshide.indexOf(e.key) < 0 : false;
587
+ })
588
+ // 含税不含税
589
+ .filter((e) => {
590
+ if (isTaxIncluded) {
591
+ return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
592
+ } else {
593
+ return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
594
+ }
595
+ })
596
+ // 是否启动拖拽
597
+ .filter(e => e.key !== 'drag' || isStart)
598
+ // 是否启动展开
599
+ .filter(e => e.key === 'expand' ? goodsList.some(e => !!e.children) : true)
600
+ // 只读
601
+ .filter(e => {
602
+ if (model === 'readOnly') {
603
+ return e.key !== 'operating';
604
+ } else {
605
+ return true;
606
+ }
607
+ })
608
+ .map((e) => {
609
+ return {
610
+ ...e,
611
+ ellipsis: true,
612
+ };
613
+ }) as any[];
614
+ }, [isTaxIncluded, editGood, goodsList, controller, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, columnshide, isStart]);
615
+
616
+ return controller.setColumnsConfig ? controller.setColumnsConfig(columns) : columns;
617
+ };
618
+
619
+ /** 字段 */
620
+ function isCipher(name?: string, field?: string) {
621
+ if (!name || !field) return false;
622
+ return name !== field;
623
+ }
624
+
625
+ class MyInput extends React.Component<InputProps & { loading?: boolean }> {
626
+ render() {
627
+ if (this.props.loading) {
628
+ return (
629
+ <Spin size="small">
630
+ <Input {...this.props} autoComplete="off" />
631
+ </Spin>
632
+ )
633
+ } else {
634
+ return <Input {...this.props} autoComplete="off" />
635
+ }
636
+ }
637
+ }
638
+
639
+ class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
640
+ render() {
641
+ if (this.props.loading) {
642
+ return (
643
+ <Spin size="small">
644
+ <span style={{ padding: '0 10px' }}>{this.props.value}</span>
645
+ </Spin>
646
+ )
647
+ } else {
648
+ return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
649
+ }
650
+ }
651
+ }
652
+
653
+ class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
654
+ render(): React.ReactNode {
655
+
656
+ const { isMyShow, valueT, valueF } = this.props;
657
+
658
+ if (isMyShow) {
659
+ if (valueT) {
660
+ return (
661
+ <Tooltip title={valueT}>
662
+ <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
663
+ </Tooltip>
664
+ )
665
+ } else {
666
+ return (
667
+ <Tooltip title={valueF}>
668
+ <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
669
+ </Tooltip>
670
+ )
671
+ }
672
+ } else {
673
+ if (valueF) {
674
+ return (
675
+ <Tooltip title={valueF}>
676
+ <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
677
+ </Tooltip>
678
+ )
679
+ } else {
680
+ return (
681
+ <Tooltip title={valueT}>
682
+ <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
683
+ </Tooltip>
684
+ )
685
+ }
686
+ }
687
+ }
688
+ }
689
+
690
+ /** 格式搜索结果 */
691
+ function formatSearch(value?: string, search?: string) {
692
+ if (!value || !search) return value;
693
+
694
+ 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>`);
695
+ return <span dangerouslySetInnerHTML={{ __html }} />
696
+ }
697
+
698
+ /** 编码 */
699
+ function ucoding(v: string): string {
700
+ return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
701
+ }
702
+
703
+ /** 解码 */
704
+ function dcoding(v: string): string {
705
+ return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
706
+ }
707
+
708
+ /** 是否免税 */
709
+ function isDutyFree(record: IGood): boolean {
710
+ return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
711
+ }