kts-component-invoice-operate 3.2.215 → 3.2.217-chinaship

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