kts-component-invoice-operate 3.2.214 → 3.2.215

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 (250) 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/ImportGoods/index.d.ts +2 -0
  9. package/dist/index.esm.js +1 -0
  10. package/dist/index.js +1 -0
  11. package/docs/index.md +5 -5
  12. package/docs-dist/404.html +33 -33
  13. package/docs-dist/index.html +33 -33
  14. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  15. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  16. package/docs-dist/static/fork.5431267d.svg +11 -11
  17. package/docs-dist/static/plus.44013ce3.svg +11 -11
  18. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  19. package/docs-dist/umi.css +18 -18
  20. package/index.html +12 -12
  21. package/package.json +62 -62
  22. package/src/Invoice/Invoice-digtal/_test/architecture/index.tsx +21 -21
  23. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +40 -40
  24. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +176 -174
  25. package/src/Invoice/Invoice-digtal/_test/freight/index.tsx +14574 -14574
  26. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  27. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  28. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +18 -18
  29. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -19
  30. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  31. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +55 -55
  32. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +21 -21
  33. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  34. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  35. package/src/Invoice/Invoice-digtal/index.md +41 -41
  36. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +105 -105
  37. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +26 -26
  38. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  39. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IColumnsReplenish/index.ts +10 -10
  40. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IGood/index.ts +33 -33
  41. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/ImportGoods/index.ts +81 -81
  42. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/index.ts +39 -39
  43. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  44. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  45. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  46. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +87 -87
  47. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +84 -81
  48. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  49. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  50. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +131 -131
  51. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  52. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +71 -71
  53. package/src/Invoice/InvoiceController/fns/addFreight.ts +11 -11
  54. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  55. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  56. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  57. package/src/Invoice/InvoiceController/fns/delFreight.ts +38 -38
  58. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  59. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  60. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  61. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  62. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  63. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  64. package/src/Invoice/InvoiceController/fns/saveEditFreight.ts +24 -24
  65. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  66. package/src/Invoice/InvoiceController/fns/setEditFreight.ts +16 -16
  67. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  68. package/src/Invoice/InvoiceController/fns/setFreight.ts +10 -10
  69. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  70. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  71. package/src/Invoice/InvoiceController/index.ts +106 -106
  72. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  73. package/src/Invoice/_test/children/index.tsx +214 -214
  74. package/src/Invoice/_test/deduction/index.tsx +935 -935
  75. package/src/Invoice/_test/draft/index.tsx +40 -40
  76. package/src/Invoice/_test/easiest/index.tsx +5 -5
  77. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  78. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  79. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  80. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  81. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  82. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  83. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  84. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  85. package/src/Invoice/_test/seller/index.tsx +28 -28
  86. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  87. package/src/Invoice/_test/unit/index.tsx +19 -19
  88. package/src/Invoice/index.less +31 -31
  89. package/src/Invoice/index.md +56 -56
  90. package/src/Invoice/index.tsx +197 -197
  91. package/src/Invoice/tools/calculate/index.ts +144 -144
  92. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  93. package/src/Invoice/tools/evaluate/index.ts +7 -7
  94. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  95. package/src/Invoice/tools/itemName/index.ts +55 -55
  96. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  97. package/src/Invoice/tools/mounting/index.ts +13 -13
  98. package/src/Invoice/tools/strringFn/index.ts +40 -40
  99. package/src/Invoice/tools/useToGenerateId/index.ts +10 -10
  100. package/src/Invoice/tools/utils/index.ts +1 -1
  101. package/src/Invoice/tools/utils/money/index.ts +20 -20
  102. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  103. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  104. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  105. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  106. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  107. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  108. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +612 -612
  109. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +647 -647
  110. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +712 -712
  111. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  112. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  113. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Expand/index.tsx +57 -57
  114. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  115. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +49 -49
  116. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  117. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +91 -91
  118. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  119. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  120. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  121. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/dist/index.js +32 -32
  122. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  123. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  124. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  125. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +99 -99
  126. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  127. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  128. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  129. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +52 -52
  130. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +120 -120
  131. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  132. package/src/Invoice/ui/default/GoodsList/index.less +185 -185
  133. package/src/Invoice/ui/default/GoodsList/index.tsx +205 -205
  134. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +65 -65
  135. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  136. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  137. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  138. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  139. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  140. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  141. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  142. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  143. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  144. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  145. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  146. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  147. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  148. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  149. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  150. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +40 -40
  151. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +71 -71
  152. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  153. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +130 -130
  154. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  155. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  156. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  157. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  158. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +198 -198
  159. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  160. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  161. package/src/Invoice/ui/default/Seller/index.less +113 -113
  162. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  163. package/src/Invoice/ui/default/Sign/index.less +14 -14
  164. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  165. package/src/Invoice/ui/digtal/Architecture/index.less +18 -18
  166. package/src/Invoice/ui/digtal/Architecture/index.tsx +177 -177
  167. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/dist/index.js +616 -616
  168. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/index.tsx +246 -246
  169. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  170. package/src/Invoice/ui/digtal/FreightList/hook/useOnRow/index.tsx +37 -37
  171. package/src/Invoice/ui/digtal/FreightList/hook/useRowSelection/index.tsx +119 -119
  172. package/src/Invoice/ui/digtal/FreightList/hook/useWindowClick/index.tsx +23 -23
  173. package/src/Invoice/ui/digtal/FreightList/index.less +72 -72
  174. package/src/Invoice/ui/digtal/FreightList/index.tsx +129 -129
  175. package/src/Invoice/ui/digtal/FreightList/ui/AddRowButton/index.tsx +74 -74
  176. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  177. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +36 -36
  178. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.less +28 -28
  179. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.tsx +20 -20
  180. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.less +38 -38
  181. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.tsx +108 -108
  182. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +683 -683
  183. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/dist/index.js +616 -616
  184. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +703 -703
  185. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  186. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  187. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  188. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  189. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +87 -87
  190. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  191. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  192. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  193. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  194. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  195. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  196. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  197. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  198. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  199. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +51 -51
  200. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  201. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  202. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  203. package/src/Invoice/ui/digtal/GoodsList/index.tsx +179 -179
  204. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +77 -77
  205. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -340
  206. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  207. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  208. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  209. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  210. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  211. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  212. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  213. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  214. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +60 -60
  215. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  216. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  217. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  218. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  219. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +52 -52
  220. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  221. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +108 -108
  222. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  223. package/src/Invoice/ui/digtal/InvoiceHeader/index.less +57 -57
  224. package/src/Invoice/ui/digtal/InvoiceHeader/index.tsx +77 -77
  225. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +14 -14
  226. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +192 -192
  227. package/src/Invoice/ui/digtal/Sign/index.less +48 -48
  228. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  229. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +99 -99
  230. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +477 -477
  231. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowDown.svg +2 -2
  232. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowUp.svg +2 -2
  233. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/plus.svg +11 -11
  234. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  235. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +435 -435
  236. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  237. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  238. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  239. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  240. package/src/InvoiceTypeModal/dist/index.js +92 -92
  241. package/src/InvoiceTypeModal/index.less +7 -7
  242. package/src/InvoiceTypeModal/index.md +5 -5
  243. package/src/InvoiceTypeModal/index.tsx +161 -161
  244. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +184 -184
  245. package/src/TaxClassificationCodeModal/index.less +17 -17
  246. package/src/TaxClassificationCodeModal/index.md +6 -6
  247. package/src/TaxClassificationCodeModal/index.tsx +152 -152
  248. package/src/index.ts +13 -13
  249. package/tsconfig.json +31 -31
  250. package/typings.d.ts +3 -3
@@ -1,712 +1,712 @@
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
-
488
- return <span style={{ padding: '0 10px' }}>{value === '' ? '' : formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
489
- }
490
- },
491
- },
492
- {
493
- title: <TitleText required >税率</TitleText>,
494
- dataIndex: 'taxRate',
495
- key: 'taxRate',
496
- align: 'right',
497
- width: 75,
498
- render: (value: string, record: IGood) => {
499
- if (editGood?.$index === record.$index && !(model === 'prefab' && calculateType === '3')) {
500
- return (
501
- <Form.Item>
502
- {getFieldDecorator('taxRate', {
503
- initialValue: editGood.taxRate,
504
- rules: [
505
- ...getReplenishRules('taxRate'),
506
- { required: true, message: '请选择税率' },
507
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
508
- ],
509
- })(
510
- <Select
511
- className="kts-invoice-operate-goods-list-table-tax-rate"
512
- dropdownMenuStyle={{ textAlign: "right" }}
513
- showArrow={false}
514
- style={{ width: '100%' }}
515
- getPopupContainer={() => rootElement || document.body}
516
- onChange={() => {
517
- setChangeField('taxRate');
518
- onChangeTaxRate(controller, form, record);
519
- }}
520
- >
521
- {(record.goodsTaxRateList || taxRateList).map((e, i) => {
522
- return (
523
- <Select.Option key={i} value={e}>
524
- {e}%
525
- </Select.Option>
526
- );
527
- })}
528
- </Select>,
529
- )}
530
- </Form.Item>
531
- );
532
- } else {
533
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : value === '' ? '' : `${value}%`}</span>;
534
- }
535
- },
536
- },
537
- {
538
- title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
539
- dataIndex: 'taxAmount',
540
- key: 'taxAmount',
541
- align: 'right',
542
- width: 119,
543
- render: (value: string, record: IGood) => {
544
- if (editGood?.$index === record.$index) {
545
- return getFieldDecorator('taxAmount', {
546
- initialValue: editGood.taxAmount,
547
- rules: getReplenishRules('taxAmount'),
548
- })(<MyDiv loading={isCipher(changeField, 'taxAmount')} />);
549
- } else {
550
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : value === '' ? '' : parseFloat(value).toFixed(2)}</span>;
551
- }
552
- },
553
- },
554
- {
555
- title: '行性质',
556
- dataIndex: 'lineAttribute',
557
- key: 'lineAttribute',
558
- width: 70,
559
- render: (e: any) => {
560
- switch (e) {
561
- case LineAttributeType.折扣行:
562
- return <span style={{ padding: '0 10px' }}>折扣行</span>
563
- case LineAttributeType.被折扣行:
564
- return <span style={{ padding: '0 10px' }}>被折扣行</span>
565
- case LineAttributeType.赠品行:
566
- return <span style={{ padding: '0 10px' }}>赠品行</span>
567
- case LineAttributeType.折让行:
568
- return <span style={{ padding: '0 10px' }}>折让行</span>
569
- case LineAttributeType.正常:
570
- return <span style={{ padding: '0 10px' }}>正常行</span>
571
- default:
572
- return <span style={{ padding: '0 10px' }}>{e}</span>
573
- }
574
- }
575
- },
576
- {
577
- title: '操作',
578
- key: 'operating',
579
- align: 'right',
580
- width: 130,
581
- fixed: 'right',
582
- render: (_value: string, record: IGood) => <RowMenu key={record.lineAttribute} goods={record} />,
583
- },
584
- ]
585
- // 筛选隐藏
586
- .filter(e => {
587
- return e.key ? columnshide.indexOf(e.key) < 0 : false;
588
- })
589
- // 含税不含税
590
- .filter((e) => {
591
- if (isTaxIncluded) {
592
- return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
593
- } else {
594
- return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
595
- }
596
- })
597
- // 是否启动拖拽
598
- .filter(e => e.key !== 'drag' || isStart)
599
- // 是否启动展开
600
- .filter(e => e.key === 'expand' ? goodsList.some(e => !!e.children) : true)
601
- // 只读
602
- .filter(e => {
603
- if (model === 'readOnly') {
604
- return e.key !== 'operating';
605
- } else {
606
- return true;
607
- }
608
- })
609
- .map((e) => {
610
- return {
611
- ...e,
612
- ellipsis: true,
613
- };
614
- }) as any[];
615
- }, [isTaxIncluded, editGood, goodsList, controller, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, columnshide, isStart]);
616
-
617
- return controller.setColumnsConfig ? controller.setColumnsConfig(columns) : columns;
618
- };
619
-
620
- /** 字段 */
621
- function isCipher(name?: string, field?: string) {
622
- if (!name || !field) return false;
623
- return name !== field;
624
- }
625
-
626
- class MyInput extends React.Component<InputProps & { loading?: boolean }> {
627
- render() {
628
- if (this.props.loading) {
629
- return (
630
- <Spin size="small">
631
- <Input {...this.props} autoComplete="off" />
632
- </Spin>
633
- )
634
- } else {
635
- return <Input {...this.props} autoComplete="off" />
636
- }
637
- }
638
- }
639
-
640
- class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
641
- render() {
642
- if (this.props.loading) {
643
- return (
644
- <Spin size="small">
645
- <span style={{ padding: '0 10px' }}>{this.props.value}</span>
646
- </Spin>
647
- )
648
- } else {
649
- return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
650
- }
651
- }
652
- }
653
-
654
- class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
655
- render(): React.ReactNode {
656
-
657
- const { isMyShow, valueT, valueF } = this.props;
658
-
659
- if (isMyShow) {
660
- if (valueT) {
661
- return (
662
- <Tooltip title={valueT}>
663
- <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
664
- </Tooltip>
665
- )
666
- } else {
667
- return (
668
- <Tooltip title={valueF}>
669
- <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
670
- </Tooltip>
671
- )
672
- }
673
- } else {
674
- if (valueF) {
675
- return (
676
- <Tooltip title={valueF}>
677
- <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
678
- </Tooltip>
679
- )
680
- } else {
681
- return (
682
- <Tooltip title={valueT}>
683
- <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
684
- </Tooltip>
685
- )
686
- }
687
- }
688
- }
689
- }
690
-
691
- /** 格式搜索结果 */
692
- function formatSearch(value?: string, search?: string) {
693
- if (!value || !search) return value;
694
-
695
- 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>`);
696
- return <span dangerouslySetInnerHTML={{ __html }} />
697
- }
698
-
699
- /** 编码 */
700
- function ucoding(v: string): string {
701
- return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
702
- }
703
-
704
- /** 解码 */
705
- function dcoding(v: string): string {
706
- return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
707
- }
708
-
709
- /** 是否免税 */
710
- function isDutyFree(record: IGood): boolean {
711
- return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
712
- }
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
+
488
+ return <span style={{ padding: '0 10px' }}>{value === '' ? '' : formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
489
+ }
490
+ },
491
+ },
492
+ {
493
+ title: <TitleText required >税率</TitleText>,
494
+ dataIndex: 'taxRate',
495
+ key: 'taxRate',
496
+ align: 'right',
497
+ width: 75,
498
+ render: (value: string, record: IGood) => {
499
+ if (editGood?.$index === record.$index && !(model === 'prefab' && calculateType === '3')) {
500
+ return (
501
+ <Form.Item>
502
+ {getFieldDecorator('taxRate', {
503
+ initialValue: editGood.taxRate,
504
+ rules: [
505
+ ...getReplenishRules('taxRate'),
506
+ { required: true, message: '请选择税率' },
507
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
508
+ ],
509
+ })(
510
+ <Select
511
+ className="kts-invoice-operate-goods-list-table-tax-rate"
512
+ dropdownMenuStyle={{ textAlign: "right" }}
513
+ showArrow={false}
514
+ style={{ width: '100%' }}
515
+ getPopupContainer={() => rootElement || document.body}
516
+ onChange={() => {
517
+ setChangeField('taxRate');
518
+ onChangeTaxRate(controller, form, record);
519
+ }}
520
+ >
521
+ {(record.goodsTaxRateList || taxRateList).map((e, i) => {
522
+ return (
523
+ <Select.Option key={i} value={e}>
524
+ {e}%
525
+ </Select.Option>
526
+ );
527
+ })}
528
+ </Select>,
529
+ )}
530
+ </Form.Item>
531
+ );
532
+ } else {
533
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : value === '' ? '' : `${value}%`}</span>;
534
+ }
535
+ },
536
+ },
537
+ {
538
+ title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
539
+ dataIndex: 'taxAmount',
540
+ key: 'taxAmount',
541
+ align: 'right',
542
+ width: 119,
543
+ render: (value: string, record: IGood) => {
544
+ if (editGood?.$index === record.$index) {
545
+ return getFieldDecorator('taxAmount', {
546
+ initialValue: editGood.taxAmount,
547
+ rules: getReplenishRules('taxAmount'),
548
+ })(<MyDiv loading={isCipher(changeField, 'taxAmount')} />);
549
+ } else {
550
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : value === '' ? '' : parseFloat(value).toFixed(2)}</span>;
551
+ }
552
+ },
553
+ },
554
+ {
555
+ title: '行性质',
556
+ dataIndex: 'lineAttribute',
557
+ key: 'lineAttribute',
558
+ width: 70,
559
+ render: (e: any) => {
560
+ switch (e) {
561
+ case LineAttributeType.折扣行:
562
+ return <span style={{ padding: '0 10px' }}>折扣行</span>
563
+ case LineAttributeType.被折扣行:
564
+ return <span style={{ padding: '0 10px' }}>被折扣行</span>
565
+ case LineAttributeType.赠品行:
566
+ return <span style={{ padding: '0 10px' }}>赠品行</span>
567
+ case LineAttributeType.折让行:
568
+ return <span style={{ padding: '0 10px' }}>折让行</span>
569
+ case LineAttributeType.正常:
570
+ return <span style={{ padding: '0 10px' }}>正常行</span>
571
+ default:
572
+ return <span style={{ padding: '0 10px' }}>{e}</span>
573
+ }
574
+ }
575
+ },
576
+ {
577
+ title: '操作',
578
+ key: 'operating',
579
+ align: 'right',
580
+ width: 130,
581
+ fixed: 'right',
582
+ render: (_value: string, record: IGood) => <RowMenu key={record.lineAttribute} goods={record} />,
583
+ },
584
+ ]
585
+ // 筛选隐藏
586
+ .filter(e => {
587
+ return e.key ? columnshide.indexOf(e.key) < 0 : false;
588
+ })
589
+ // 含税不含税
590
+ .filter((e) => {
591
+ if (isTaxIncluded) {
592
+ return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
593
+ } else {
594
+ return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
595
+ }
596
+ })
597
+ // 是否启动拖拽
598
+ .filter(e => e.key !== 'drag' || isStart)
599
+ // 是否启动展开
600
+ .filter(e => e.key === 'expand' ? goodsList.some(e => !!e.children) : true)
601
+ // 只读
602
+ .filter(e => {
603
+ if (model === 'readOnly') {
604
+ return e.key !== 'operating';
605
+ } else {
606
+ return true;
607
+ }
608
+ })
609
+ .map((e) => {
610
+ return {
611
+ ...e,
612
+ ellipsis: true,
613
+ };
614
+ }) as any[];
615
+ }, [isTaxIncluded, editGood, goodsList, controller, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, columnshide, isStart]);
616
+
617
+ return controller.setColumnsConfig ? controller.setColumnsConfig(columns) : columns;
618
+ };
619
+
620
+ /** 字段 */
621
+ function isCipher(name?: string, field?: string) {
622
+ if (!name || !field) return false;
623
+ return name !== field;
624
+ }
625
+
626
+ class MyInput extends React.Component<InputProps & { loading?: boolean }> {
627
+ render() {
628
+ if (this.props.loading) {
629
+ return (
630
+ <Spin size="small">
631
+ <Input {...this.props} autoComplete="off" />
632
+ </Spin>
633
+ )
634
+ } else {
635
+ return <Input {...this.props} autoComplete="off" />
636
+ }
637
+ }
638
+ }
639
+
640
+ class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
641
+ render() {
642
+ if (this.props.loading) {
643
+ return (
644
+ <Spin size="small">
645
+ <span style={{ padding: '0 10px' }}>{this.props.value}</span>
646
+ </Spin>
647
+ )
648
+ } else {
649
+ return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
650
+ }
651
+ }
652
+ }
653
+
654
+ class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
655
+ render(): React.ReactNode {
656
+
657
+ const { isMyShow, valueT, valueF } = this.props;
658
+
659
+ if (isMyShow) {
660
+ if (valueT) {
661
+ return (
662
+ <Tooltip title={valueT}>
663
+ <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
664
+ </Tooltip>
665
+ )
666
+ } else {
667
+ return (
668
+ <Tooltip title={valueF}>
669
+ <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
670
+ </Tooltip>
671
+ )
672
+ }
673
+ } else {
674
+ if (valueF) {
675
+ return (
676
+ <Tooltip title={valueF}>
677
+ <span style={{ padding: '0 10px', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueF}</span>
678
+ </Tooltip>
679
+ )
680
+ } else {
681
+ return (
682
+ <Tooltip title={valueT}>
683
+ <span style={{ padding: '0 10px', color: '#0074ff', display: 'block', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{valueT}</span>
684
+ </Tooltip>
685
+ )
686
+ }
687
+ }
688
+ }
689
+ }
690
+
691
+ /** 格式搜索结果 */
692
+ function formatSearch(value?: string, search?: string) {
693
+ if (!value || !search) return value;
694
+
695
+ 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>`);
696
+ return <span dangerouslySetInnerHTML={{ __html }} />
697
+ }
698
+
699
+ /** 编码 */
700
+ function ucoding(v: string): string {
701
+ return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
702
+ }
703
+
704
+ /** 解码 */
705
+ function dcoding(v: string): string {
706
+ return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
707
+ }
708
+
709
+ /** 是否免税 */
710
+ function isDutyFree(record: IGood): boolean {
711
+ return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
712
+ }