kts-component-invoice-operate 3.2.192 → 3.2.194

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/.dumi/theme/builtins/API.tsx +66 -66
  2. package/.editorconfig +16 -16
  3. package/.fatherrc.ts +4 -4
  4. package/.prettierignore +7 -7
  5. package/.prettierrc +11 -11
  6. package/.umirc.ts +8 -8
  7. package/README.md +9 -9
  8. package/dist/Invoice/ui/digtal/StakeFarmerholder/index.d.ts +3 -0
  9. package/dist/index.esm.js +829 -774
  10. package/dist/index.js +829 -774
  11. package/docs/index.md +5 -5
  12. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  13. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  14. package/docs-dist/static/fork.5431267d.svg +11 -11
  15. package/docs-dist/static/plus.44013ce3.svg +11 -11
  16. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  17. package/index.html +12 -12
  18. package/package.json +62 -62
  19. package/src/Invoice/Invoice-digtal/_test/architecture/index.tsx +21 -21
  20. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +40 -40
  21. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +29 -29
  22. package/src/Invoice/Invoice-digtal/_test/freight/index.tsx +14574 -14574
  23. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  24. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  25. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +18 -18
  26. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -19
  27. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  28. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +55 -55
  29. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +21 -21
  30. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  31. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  32. package/src/Invoice/Invoice-digtal/index.md +41 -41
  33. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +105 -105
  34. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +26 -26
  35. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  36. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IColumnsReplenish/index.ts +10 -10
  37. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IGood/index.ts +33 -33
  38. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/ImportGoods/index.ts +81 -81
  39. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/index.ts +39 -39
  40. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  41. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  42. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  43. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +87 -87
  44. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +81 -81
  45. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  46. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  47. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +131 -131
  48. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  49. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +71 -71
  50. package/src/Invoice/InvoiceController/fns/addFreight.ts +11 -11
  51. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  52. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  53. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  54. package/src/Invoice/InvoiceController/fns/delFreight.ts +38 -38
  55. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  56. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  57. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  58. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  59. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  60. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  61. package/src/Invoice/InvoiceController/fns/saveEditFreight.ts +24 -24
  62. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  63. package/src/Invoice/InvoiceController/fns/setEditFreight.ts +16 -16
  64. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  65. package/src/Invoice/InvoiceController/fns/setFreight.ts +10 -10
  66. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  67. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  68. package/src/Invoice/InvoiceController/index.ts +106 -106
  69. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  70. package/src/Invoice/_test/children/index.tsx +214 -214
  71. package/src/Invoice/_test/deduction/index.tsx +935 -935
  72. package/src/Invoice/_test/draft/index.tsx +40 -40
  73. package/src/Invoice/_test/easiest/index.tsx +5 -5
  74. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  75. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  76. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  77. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  78. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  79. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  80. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  81. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  82. package/src/Invoice/_test/seller/index.tsx +28 -28
  83. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  84. package/src/Invoice/_test/unit/index.tsx +19 -19
  85. package/src/Invoice/index.less +31 -31
  86. package/src/Invoice/index.md +56 -56
  87. package/src/Invoice/index.tsx +190 -190
  88. package/src/Invoice/tools/calculate/index.ts +132 -132
  89. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  90. package/src/Invoice/tools/evaluate/index.ts +7 -7
  91. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  92. package/src/Invoice/tools/itemName/index.ts +55 -55
  93. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  94. package/src/Invoice/tools/mounting/index.ts +13 -13
  95. package/src/Invoice/tools/strringFn/index.ts +40 -40
  96. package/src/Invoice/tools/useToGenerateId/index.ts +10 -10
  97. package/src/Invoice/tools/utils/index.ts +1 -1
  98. package/src/Invoice/tools/utils/money/index.ts +20 -20
  99. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  100. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  101. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  102. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  103. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  104. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  105. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +607 -607
  106. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +647 -647
  107. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +711 -711
  108. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  109. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  110. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Expand/index.tsx +57 -57
  111. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  112. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +49 -49
  113. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  114. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +91 -91
  115. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  116. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  117. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  118. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  119. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  120. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  121. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +99 -99
  122. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  123. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  124. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  125. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +52 -52
  126. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +120 -120
  127. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  128. package/src/Invoice/ui/default/GoodsList/index.less +185 -185
  129. package/src/Invoice/ui/default/GoodsList/index.tsx +205 -205
  130. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +65 -65
  131. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  132. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  133. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  134. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  135. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  136. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  137. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  138. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  139. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  140. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  141. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  142. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  143. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  144. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  145. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  146. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +40 -40
  147. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +71 -71
  148. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  149. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +130 -130
  150. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  151. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  152. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  153. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  154. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +198 -198
  155. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  156. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  157. package/src/Invoice/ui/default/Seller/index.less +113 -113
  158. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  159. package/src/Invoice/ui/default/Sign/index.less +14 -14
  160. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  161. package/src/Invoice/ui/digtal/Architecture/index.less +18 -18
  162. package/src/Invoice/ui/digtal/Architecture/index.tsx +177 -177
  163. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/dist/index.js +616 -616
  164. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/index.tsx +246 -246
  165. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  166. package/src/Invoice/ui/digtal/FreightList/hook/useOnRow/index.tsx +37 -37
  167. package/src/Invoice/ui/digtal/FreightList/hook/useRowSelection/index.tsx +119 -119
  168. package/src/Invoice/ui/digtal/FreightList/hook/useWindowClick/index.tsx +23 -23
  169. package/src/Invoice/ui/digtal/FreightList/index.less +72 -72
  170. package/src/Invoice/ui/digtal/FreightList/index.tsx +129 -129
  171. package/src/Invoice/ui/digtal/FreightList/ui/AddRowButton/index.tsx +64 -64
  172. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  173. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +36 -36
  174. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.less +28 -28
  175. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.tsx +20 -20
  176. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.less +38 -38
  177. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.tsx +108 -108
  178. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +673 -673
  179. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +673 -673
  180. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  181. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  182. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  183. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  184. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +87 -87
  185. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  186. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  187. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  188. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  189. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  190. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  191. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  192. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  193. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  194. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +51 -51
  195. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  196. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  197. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  198. package/src/Invoice/ui/digtal/GoodsList/index.tsx +179 -179
  199. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +67 -67
  200. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -340
  201. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  202. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  203. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  204. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  205. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  206. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  207. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  208. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  209. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +50 -50
  210. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  211. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  212. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  213. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  214. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +52 -52
  215. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  216. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +108 -108
  217. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  218. package/src/Invoice/ui/digtal/InvoiceHeader/index.less +57 -57
  219. package/src/Invoice/ui/digtal/InvoiceHeader/index.tsx +77 -77
  220. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +14 -14
  221. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +192 -192
  222. package/src/Invoice/ui/digtal/Sign/index.less +48 -48
  223. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  224. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +99 -99
  225. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +477 -436
  226. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowDown.svg +2 -2
  227. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowUp.svg +2 -2
  228. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/plus.svg +11 -11
  229. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  230. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +433 -433
  231. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  232. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  233. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  234. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  235. package/src/InvoiceTypeModal/index.less +7 -7
  236. package/src/InvoiceTypeModal/index.md +5 -5
  237. package/src/InvoiceTypeModal/index.tsx +161 -161
  238. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +184 -184
  239. package/src/TaxClassificationCodeModal/index.less +17 -17
  240. package/src/TaxClassificationCodeModal/index.md +6 -6
  241. package/src/TaxClassificationCodeModal/index.tsx +152 -152
  242. package/src/index.ts +13 -13
  243. package/tsconfig.json +31 -31
  244. package/typings.d.ts +3 -3
@@ -1,607 +1,607 @@
1
- import React from 'react';
2
- import Invoice from '../../..';
3
- import { Button, Drawer, Select, Modal, Input as InputAntd, Form, Tree, message } from 'kts-components-antd-x3';
4
- import { chain, bignumber } from 'mathjs';
5
- import { Input, NumberPicker } from '@formily/antd-components';
6
- import { format15 } from '../GoodsList/hook/useColumns/autoFillFn';
7
- import { LineAttributeType } from '../../../InvoiceController';
8
- import IGood from '../../../InvoiceController/InvoiceControllerState/GoodsListState/IGood';
9
- import { countTaxAmount, countAmountExcludeTax, countPrice } from '../../../tools/calculate';
10
- import { bytesLnegth, cutStr } from '../../../tools/strringFn';
11
- import {
12
- SchemaForm,
13
- FormButtonGroup,
14
- createAsyncFormActions,
15
- SchemaMarkupField as Field,
16
- FormEffectHooks,
17
- } from '@formily/antd';
18
- import './index.less';
19
- import { TaxClassificationModal } from "../../../..";
20
-
21
- const { TreeNode } = Tree;
22
- const { confirm } = Modal;
23
-
24
- export default () => {
25
- const controller = Invoice.useInvoiceController();
26
-
27
- const visible = controller.useMemo(s => s.goodsListState.endowCode.endowcodeGoodIndex.length > 0, []);
28
-
29
- const [defaultValue, setDefaultValue] = React.useState<IGood>();
30
-
31
- const onClose = React.useCallback(() => {
32
- controller.pipeline(async (s) => {
33
- s.goodsListState.endowCode.endowcodeGoodIndex = [];
34
- })();
35
- }, [controller]);
36
-
37
- // 计算赋码默认值
38
- React.useEffect(() => {
39
- if (visible) {
40
- controller.pipeline(async s => {
41
- const endowcodeGoodIndex = s.goodsListState.endowCode.endowcodeGoodIndex.filter(i => {
42
- const good = s.goodsListState.goodsMap.get(i);
43
- if (!good) return false;
44
-
45
- return good.lineAttribute !== LineAttributeType.折扣行;
46
- })
47
-
48
- const good = s.goodsListState.goodsMap.get(s.goodsListState.endowCode.endowcodeGoodIndex[0]);
49
- if (!good) return;
50
-
51
- const getDefaultValue = s.goodsListState.endowCode.getDefaultValue;
52
- if (getDefaultValue) {
53
- setDefaultValue(await getDefaultValue({ ...good }, endowcodeGoodIndex.length));
54
- } else {
55
- if (endowcodeGoodIndex.length === 1) {
56
- if (controller.state.goodsListState.isUpdateGoodsTaxRateList && controller.getGoodsTaxRateList && good.taxClassificationCode) {
57
- const goodsTaxRateList = await controller.getGoodsTaxRateList(good.taxClassificationCode);
58
- good.goodsTaxRateList = goodsTaxRateList;
59
- // if (good.taxRate !== undefined && good.taxRate !== null && !goodsTaxRateList.includes(good.taxRate)) {
60
- // good.taxRate = undefined;
61
- // }
62
- }
63
- setDefaultValue(good);
64
- } else {
65
- setDefaultValue({ taxRate: good.taxRate } as any);
66
- }
67
- }
68
- })()
69
- } else {
70
- setDefaultValue(undefined);
71
- }
72
- }, [visible])
73
-
74
- return (
75
- <Drawer
76
- title="赋码"
77
- placement="right"
78
- destroyOnClose={true}
79
- closable={false}
80
- width={383}
81
- onClose={onClose}
82
- visible={visible}
83
- >
84
- {defaultValue && <DrawerBody defaultValue={defaultValue} />}
85
- </Drawer>
86
- );
87
- };
88
-
89
- const DrawerBody = (props: { defaultValue: IGood }) => {
90
-
91
- const controller = Invoice.useInvoiceController();
92
-
93
- const { defaultValue } = props;
94
-
95
- const actions = React.useMemo(() => createAsyncFormActions(), []);
96
-
97
- const taxClassificationProps = controller.useMemo(s => s.taxClassificationProps, []);
98
-
99
- /** 免税类型 是否需要 */
100
- const isTaxFreeTypeNeeded = controller.useMemo(s => s.goodsListState.endowCode.isTaxFreeTypeNeeded, []);
101
-
102
- /** 税率 是否禁用 */
103
- const readOnlyTaxRate = controller.useMemo(s => {
104
- if (s.goodsListState.endowCode.getReadOnlyTaxRate) {
105
- return s.goodsListState.endowCode.getReadOnlyTaxRate(s.goodsListState);
106
- } else {
107
- return false;
108
- }
109
- }, [])
110
-
111
- /** 优惠政策 是否禁用 */
112
- const readOnlyFavouredPolicy = controller.useMemo(s => {
113
- if (s.goodsListState.endowCode.getReadOnlyFavouredPolicy) {
114
- return s.goodsListState.endowCode.getReadOnlyFavouredPolicy(s.goodsListState);
115
- } else {
116
- return false;
117
- }
118
- }, [])
119
-
120
- /** 税率列表 */
121
- const taxRateList = controller.useMemo(s => s.goodsListState.taxRateList, []);
122
-
123
- /** 免税类型 列表 */
124
- const taxFreeTypeList = controller.useMemo(s => s.goodsListState.endowCode.taxFreeTypeList, []);
125
-
126
- /** 优惠政策类型列表 */
127
- const favouredPolicyNameList = controller.useMemo(s => s.goodsListState.endowCode.favouredPolicyNameList, []);
128
-
129
- /** 优惠政策类型列表 */
130
- // const getTaxCategoryCodeTree = controller.useMemo(s => s.goodsListState.endowCode.getTaxCategoryCodeTree, []);
131
-
132
- /** 税率 */
133
- const [taxRate, setTaxRate] = React.useState<number>(0);
134
-
135
- /** 商品可用税率 */
136
- const [goodsTaxRateList, setGoodsTaxRateList] = React.useState<number[] | null | undefined>(defaultValue.goodsTaxRateList);
137
-
138
- const formattedTaxRateList = React.useMemo(() => {
139
- return (goodsTaxRateList || taxRateList).map((e) => ({ label: `${e}%`, value: e }))
140
- }, [goodsTaxRateList, taxRateList])
141
-
142
- /** 税收分类编码 选择组件 */
143
- const ShowSearch = React.useCallback(props => {
144
-
145
- const [dataSource, setDataSource] = React.useState<any[]>([]);
146
-
147
- const onSearch = React.useCallback(async e => {
148
- const arr = await controller.state.goodsListState.endowCode.getTaxCategoryCodeList(e);
149
- setDataSource(arr);
150
- }, [])
151
-
152
- const onChange = React.useCallback((value: string) => {
153
- if (props.onChange) {
154
- props.onChange(value);
155
- }
156
-
157
- const info = dataSource.filter(i => i.value === value)[0];
158
- if (!info) return;
159
-
160
- // !readOnlyTaxRate && actions.setFieldState('taxRate', async s => {
161
- // if (info.taxRate || info.taxRate === 0) {
162
- // s.value = info.taxRate
163
- // }
164
- // });
165
-
166
- actions.setFieldState('shorthand', async (s) => {
167
- if (info.shorthand) {
168
- s.value = info.shorthand
169
- }
170
- });
171
- }, [actions, dataSource, readOnlyTaxRate])
172
-
173
- return (
174
- <Select
175
- {...props}
176
- showSearch
177
- showArrow={false}
178
- notFoundContent={null}
179
- filterOption={false}
180
- onSearch={onSearch}
181
- onChange={onChange}
182
- >
183
- {dataSource.map(e => <Select.Option key={e.value} value={e.value}>{e.label}</Select.Option>)}
184
- </Select>
185
- )
186
- }, [controller, actions])
187
-
188
- /** 税收分类编码 选择组件2 */
189
- const ShowSearch2 = React.useCallback(props => {
190
-
191
- // 是否显示
192
- const [visible, setVisible] = React.useState(false);
193
-
194
- // 税收分类编码树
195
- const [list, setList] = React.useState<any[]>();
196
-
197
- // 搜索条件
198
- const [filter, setFilter] = React.useState<{
199
- /** 税收分类编码 */
200
- taxCategoryCode?: string,
201
-
202
- /** 货物和劳务名称/简称 */
203
- val?: string
204
- }>();
205
-
206
- /** 创建 树节点 */
207
- const createTreeNode = React.useCallback(() => {
208
- if (!list) return <></>;
209
-
210
- return ctn(list);
211
-
212
- function title(label: string) {
213
- if (!filter) return label;
214
- label = (filter.taxCategoryCode ? label.split(new RegExp(filter.taxCategoryCode, 'g')) : [label]).join(`<span style="color: #1890ff;">${filter.taxCategoryCode}</span>`);
215
- label = (filter.val ? label.split(new RegExp(filter.val, 'g')) : [label]).join(`<span style="color: #1890ff;">${filter.val}</span>`);
216
- return <span dangerouslySetInnerHTML={{ __html: label }} />
217
- }
218
-
219
- function ctn(l: any[], p = '0') {
220
- if (!l || !l.length) return [<></>];
221
- return l.filter(e => e.pid === p).map(e => {
222
- return (
223
- <TreeNode title={title(e.label)} key={e.id}>
224
- {ctn(l, e.id)}
225
- </TreeNode>
226
- )
227
- })
228
- }
229
- }, [list, filter])
230
-
231
- /** 点击了节点 */
232
- const onSelect = React.useCallback((e: string[]) => {
233
- const id = e[0];
234
-
235
- // 是否叶子节点
236
- if (list?.filter(e => e.pid === id).length !== 0) { return; }
237
-
238
- const info = list?.filter(e => e.id === id)[0];
239
-
240
- // !readOnlyTaxRate && actions.setFieldState('taxRate', async s => {
241
- // if (info.taxRate || info.taxRate === 0) {
242
- // s.value = info.taxRate
243
- // }
244
- // });
245
-
246
- actions.setFieldState('taxClassificationCode', async s => {
247
- if (info.id) {
248
- s.value = info.id
249
- }
250
- });
251
-
252
- actions.setFieldState('shorthand', async (s) => {
253
- if (info.shorthand) {
254
- s.value = info.shorthand
255
- }
256
- });
257
-
258
- setVisible(false);
259
- }, [list, actions, readOnlyTaxRate])
260
-
261
- React.useEffect(() => {
262
- (async () => {
263
- const fn = controller.state.goodsListState.endowCode.getTaxCategoryCodeTree || (async () => []);
264
- const list = await fn(filter?.taxCategoryCode, filter?.val);
265
- setList(list || []);
266
- })()
267
- }, [filter])
268
-
269
- React.useEffect(() => {
270
- if (visible) {
271
- setList([])
272
- }
273
- }, [visible])
274
-
275
- return (
276
- <>
277
- <InputAntd readOnly value={props.value} addonAfter={<Button size="small" type="link" onClick={() => { setVisible(true) }} >点击选择</Button>} />
278
- <Drawer
279
- title="税收分类编码"
280
- visible={visible}
281
- width={500}
282
- onClose={() => { setVisible(false) }}
283
- >
284
- <Form key={`${visible}`} >
285
- <Form.Item label="产品或服务简称" >
286
- <InputAntd onChange={e => { setFilter({ ...filter, val: e.target.value }) }} />
287
- </Form.Item>
288
- <Form.Item label="税收分类编码">
289
- <InputAntd onChange={e => { setFilter({ ...filter, taxCategoryCode: e.target.value }) }} />
290
- </Form.Item>
291
- </Form>
292
- {
293
- (list && list.length > 0)
294
- ? <Tree
295
- defaultExpandAll
296
- selectedKeys={[]}
297
- onSelect={onSelect}
298
- >
299
- {createTreeNode()}
300
- </Tree>
301
- : <span style={{ color: '#00000073' }} >请输入“产品或服务简称”或“税收分类编码”查找数据。</span>
302
- }
303
- </Drawer>
304
- </>
305
- )
306
- }, [controller, actions])
307
-
308
- /** 税收分类编码 选择组件3 */
309
- const ShowSearch3 = React.useCallback(props => {
310
- const [open, setOpen] = React.useState(false);
311
-
312
- const [list, setList] = React.useState<any>([]);
313
-
314
- const onSearch = React.useCallback(async (value: any = null) => {
315
- if(value?.target?.value){
316
- const arr = await controller.state.goodsListState.endowCode.onSearchTaxClassificationCode(value?.target?.value);
317
- const list: any[] = arr.map((item: any)=> {
318
- return {
319
- ...item,
320
- title: `${item.productName} ${item.taxCategoryCode}`,
321
- key: item.taxCategoryCode,
322
- isLeaf: true
323
- }
324
- });
325
- setList(list);
326
- } else {
327
- await onLoad();
328
- }
329
- }, []);
330
-
331
- const onLoad = React.useCallback(async (value?: any) => {
332
- const arr = await controller.state.goodsListState.endowCode.onLoadTaxClassificationCode(value?.taxCategoryCode);
333
- const data: any[] = arr.map((item: any)=> {
334
- return {
335
- ...item,
336
- title: `${item.productName} ${item.taxCategoryCode}`,
337
- key: item.taxCategoryCode
338
- }
339
- });
340
-
341
- const treeData = optimizeTreeData(data);
342
-
343
- if(value?.key) {
344
- setList((origin: any)=> {
345
- updateTreeData(origin, value.key, treeData)
346
- });
347
- } else {
348
- setList(treeData);
349
- }
350
- return [];
351
- }, []);
352
-
353
- const onClick = React.useCallback(async () => {
354
- setOpen(true);
355
- await onLoad();
356
- }, []);
357
- const onSubmit1 = React.useCallback((key: any, info: any) => {
358
- // console.log('1231231231', key, info);
359
- // 根据税编改变税率列表
360
- // 如果只有一个,默认选中,有多个时,置空,用户手选
361
- // if (controller.state.goodsListState.isUpdateGoodsTaxRateList) {
362
- // if (info.node.taxRateList?.length) {
363
- // setGoodsTaxRateList(info.node.taxRateList);
364
- // }
365
- // if (!readOnlyTaxRate) {
366
- // actions.setFieldState('taxRate', async s => {
367
- // if (info.node.taxRateList && info.node.taxRateList?.length === 1) {
368
- // s.value = info.node.taxRateList[0]
369
- // } else {
370
- // s.value = undefined
371
- // }
372
- // });
373
-
374
- // }
375
- // }
376
-
377
- // !readOnlyTaxRate && actions.setFieldState('taxRate', async s => {
378
- // if (info.node.taxRate || info.taxRate === 0) {
379
- // s.value = info.node.taxRate
380
- // }
381
- // });
382
- let node = info.node || info;
383
- actions.setFieldState('taxClassificationCode', async s => {
384
- if(node.taxCategoryCode) {
385
- s.value = node.taxCategoryCode
386
- }
387
- });
388
-
389
- actions.setFieldState('shorthand', async (s) => {
390
- if (node.shorthand){
391
- s.value = node.shorthand
392
- }
393
- });
394
- setOpen(false);
395
- }, [controller, actions]);
396
-
397
- const onSelect = React.useCallback((key: any, info: any) => {
398
- let node = info.node || info;
399
- if (controller.state.goodsListState.isUpdateGoodsTaxRateList) {
400
- if (node.taxRateList?.length) {
401
- setGoodsTaxRateList(node.taxRateList);
402
- }
403
- if (!readOnlyTaxRate) {
404
- actions.setFieldState('taxRate', async s => {
405
- if (node.taxRateList && node.taxRateList?.length === 1) {
406
- s.value = node.taxRateList[0]
407
- } else {
408
- s.value = undefined
409
- }
410
- });
411
-
412
- }
413
- }
414
- setInfo(info.node);
415
- // setOpen(false);
416
- }, [controller, actions]);
417
-
418
- const optimizeTreeData = (data: any): any => {
419
- return data.map((item: any)=> {
420
- return {
421
- ...item,
422
- selectable: item?.hzx === 'N',
423
- isLeaf: item?.hzx === 'N'
424
- }
425
- });
426
- }
427
-
428
- const updateTreeData = (list: any, key: React.Key, children: any): any => {
429
- const data = list.map((node: any) => {
430
- if (node.key === key) {
431
- return {
432
- ...node,
433
- children
434
- };
435
- }
436
- if (node.children) {
437
- return {
438
- ...node,
439
- children: updateTreeData(node.children, key, children)
440
- };
441
- }
442
- return node;
443
- });
444
- setList(data);
445
- return data;
446
- }
447
- const [info, setInfo] = React.useState({});
448
- return (
449
- <>
450
- <InputAntd readOnly onClick={onClick} value={props.value} />
451
- <TaxClassificationModal
452
- list={list}
453
- open={open}
454
- info={info}
455
- onSelect={onSelect}
456
- onSubmit={onSubmit1}
457
- onCancel={()=> {setOpen(false); setInfo({})}}
458
- onSearch={onSearch}
459
- onLoad={onLoad}
460
- />
461
- </>
462
- )
463
- }, [controller, actions])
464
-
465
- // 是否享受优惠政策
466
- const [favouredPolicyMark, setFavouredPolicyMark] = React.useState<number>(0);
467
-
468
- // 确定
469
- const onSubmit = React.useCallback(values => {
470
- controller.pipeline(async s => {
471
-
472
- const endowCodeGood = s.goodsListState.endowCode.endowcodeGoodIndex.map(e => s.goodsListState.goodsMap.get(e));
473
-
474
- // 赋码
475
- endowCodeGood.forEach(good => {
476
- if (!good) return;
477
-
478
- good.shorthand = values.shorthand;
479
- good.taxClassificationCode = values.taxClassificationCode;
480
- good.taxRate = values.taxRate;
481
- good.taxFreeType = values.taxFreeType;
482
- good.favouredPolicyMark = values.favouredPolicyMark;
483
- good.favouredPolicyName = values.favouredPolicyName;
484
-
485
- // 无论是否含税,都保持价税合计不变
486
- good.taxAmount = countTaxAmount(good.lineAmountIncludeTax || 0, s.goodsListState.deduction, values.taxRate);
487
- if (good.taxAmount || good.taxAmount === 0 ) {
488
- good.lineAmountExcludeTax = countAmountExcludeTax(good.lineAmountIncludeTax || 0, good.taxAmount);
489
- }
490
- if (good.lineAmountExcludeTax && good.quantity) {
491
- good.priceExcludeTax = countPrice(good.lineAmountExcludeTax, good.quantity, controller.state.calculatingDigits) as any;
492
- }
493
-
494
- //赋值商品的可用税率
495
- good.goodsTaxRateList = goodsTaxRateList;
496
-
497
- });
498
-
499
- s.goodsListState.goodsList = s.goodsListState.goodsList.slice();
500
- s.goodsListState.endowCode.endowcodeGoodIndex = [];
501
- })();
502
- }, [controller, goodsTaxRateList]);
503
-
504
- const effects = React.useCallback(() => {
505
- // 税率变化
506
- FormEffectHooks.onFieldValueChange$('taxRate').subscribe((e) => {
507
- setTaxRate(e.value);
508
- actions.setFieldState('taxFreeType', async (s) => {
509
- if (e.value !== 0)
510
- s.value = undefined;
511
- });
512
- });
513
-
514
- // 是否享受优惠政策
515
- FormEffectHooks.onFieldValueChange$('favouredPolicyMark').subscribe((e) => {
516
- setFavouredPolicyMark(e.value);
517
- actions.setFieldState('favouredPolicyName', async (s) => {
518
- if (e.value === 0)
519
- s.value = undefined;
520
- });
521
- });
522
- }, [actions]);
523
-
524
- // 更新 税收分类编码列表
525
- React.useEffect(() => {
526
- if (controller.getTaxCategoryCodeList) controller.getTaxCategoryCodeList();
527
- }, [controller]);
528
-
529
- return (
530
- <SchemaForm actions={actions} previewPlaceholder=" " components={{ ...components, showSearch: !!controller.state.goodsListState.endowCode.onLoadTaxClassificationCode ? ShowSearch3 : ShowSearch }} effects={effects}>
531
- <FormButtonGroup>
532
- <Field
533
- name="taxClassificationCode"
534
- type="showSearch"
535
- title="税收分类编码"
536
- // enum={taxCategoryCodeList}
537
- default={defaultValue?.taxClassificationCode}
538
- x-rules={[{ message: '请选择税收分类编码', required: true }]}
539
- />
540
- <Field
541
- name="shorthand"
542
- type="string"
543
- readOnly
544
- default={defaultValue?.shorthand}
545
- title="商品和服务分类简称"
546
- />
547
- <Field
548
- name="taxRate"
549
- type="string"
550
- title="税率"
551
- x-component-props={{ disabled: readOnlyTaxRate }}
552
- default={defaultValue?.taxRate ?? 0}
553
- enum={formattedTaxRateList}
554
- x-rules={[{ message: '请选择税率', required: true }]}
555
- />
556
- {taxRate === 0 && isTaxFreeTypeNeeded &&
557
- <Field
558
- name="taxFreeType"
559
- type="string"
560
- title="免税类型"
561
- x-component-props={{ disabled: readOnlyTaxRate }}
562
- default={defaultValue?.taxFreeType}
563
- enum={taxFreeTypeList}
564
- x-rules={[{ message: '请选择免税类型', required: true }]}
565
- />
566
- }
567
- <Field
568
- name="favouredPolicyMark"
569
- type="number"
570
- title="是否享受优惠政策"
571
- x-component-props={{ disabled: readOnlyFavouredPolicy }}
572
- enum={[
573
- { label: '是', value: 1 },
574
- { label: '否', value: 0 },
575
- ]}
576
- default={defaultValue?.favouredPolicyMark ?? 0}
577
- x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
578
- />
579
- {favouredPolicyMark === 1 &&
580
- <Field
581
- name="favouredPolicyName"
582
- type="string"
583
- title="优惠政策类型"
584
- x-component-props={{ disabled: readOnlyFavouredPolicy }}
585
- enum={favouredPolicyNameList}
586
- default={defaultValue?.favouredPolicyName}
587
- x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
588
- />
589
- }
590
- </FormButtonGroup>
591
-
592
- <span className="kts-invoice-operate-goods-endow-code-button-list">
593
- <Button onClick={() => { actions.submit(onSubmit) }} type="primary">
594
- 确定
595
- </Button>
596
- <Button onClick={() => { controller.pipeline(async s => (s.goodsListState.endowCode.endowcodeGoodIndex = []))() }}>
597
- 取消
598
- </Button>
599
- </span>
600
- </SchemaForm>
601
- );
602
- };
603
-
604
- const components = {
605
- string: Input,
606
- number: NumberPicker,
607
- };
1
+ import React from 'react';
2
+ import Invoice from '../../..';
3
+ import { Button, Drawer, Select, Modal, Input as InputAntd, Form, Tree, message } from 'kts-components-antd-x3';
4
+ import { chain, bignumber } from 'mathjs';
5
+ import { Input, NumberPicker } from '@formily/antd-components';
6
+ import { format15 } from '../GoodsList/hook/useColumns/autoFillFn';
7
+ import { LineAttributeType } from '../../../InvoiceController';
8
+ import IGood from '../../../InvoiceController/InvoiceControllerState/GoodsListState/IGood';
9
+ import { countTaxAmount, countAmountExcludeTax, countPrice } from '../../../tools/calculate';
10
+ import { bytesLnegth, cutStr } from '../../../tools/strringFn';
11
+ import {
12
+ SchemaForm,
13
+ FormButtonGroup,
14
+ createAsyncFormActions,
15
+ SchemaMarkupField as Field,
16
+ FormEffectHooks,
17
+ } from '@formily/antd';
18
+ import './index.less';
19
+ import { TaxClassificationModal } from "../../../..";
20
+
21
+ const { TreeNode } = Tree;
22
+ const { confirm } = Modal;
23
+
24
+ export default () => {
25
+ const controller = Invoice.useInvoiceController();
26
+
27
+ const visible = controller.useMemo(s => s.goodsListState.endowCode.endowcodeGoodIndex.length > 0, []);
28
+
29
+ const [defaultValue, setDefaultValue] = React.useState<IGood>();
30
+
31
+ const onClose = React.useCallback(() => {
32
+ controller.pipeline(async (s) => {
33
+ s.goodsListState.endowCode.endowcodeGoodIndex = [];
34
+ })();
35
+ }, [controller]);
36
+
37
+ // 计算赋码默认值
38
+ React.useEffect(() => {
39
+ if (visible) {
40
+ controller.pipeline(async s => {
41
+ const endowcodeGoodIndex = s.goodsListState.endowCode.endowcodeGoodIndex.filter(i => {
42
+ const good = s.goodsListState.goodsMap.get(i);
43
+ if (!good) return false;
44
+
45
+ return good.lineAttribute !== LineAttributeType.折扣行;
46
+ })
47
+
48
+ const good = s.goodsListState.goodsMap.get(s.goodsListState.endowCode.endowcodeGoodIndex[0]);
49
+ if (!good) return;
50
+
51
+ const getDefaultValue = s.goodsListState.endowCode.getDefaultValue;
52
+ if (getDefaultValue) {
53
+ setDefaultValue(await getDefaultValue({ ...good }, endowcodeGoodIndex.length));
54
+ } else {
55
+ if (endowcodeGoodIndex.length === 1) {
56
+ if (controller.state.goodsListState.isUpdateGoodsTaxRateList && controller.getGoodsTaxRateList && good.taxClassificationCode) {
57
+ const goodsTaxRateList = await controller.getGoodsTaxRateList(good.taxClassificationCode);
58
+ good.goodsTaxRateList = goodsTaxRateList;
59
+ // if (good.taxRate !== undefined && good.taxRate !== null && !goodsTaxRateList.includes(good.taxRate)) {
60
+ // good.taxRate = undefined;
61
+ // }
62
+ }
63
+ setDefaultValue(good);
64
+ } else {
65
+ setDefaultValue({ taxRate: good.taxRate } as any);
66
+ }
67
+ }
68
+ })()
69
+ } else {
70
+ setDefaultValue(undefined);
71
+ }
72
+ }, [visible])
73
+
74
+ return (
75
+ <Drawer
76
+ title="赋码"
77
+ placement="right"
78
+ destroyOnClose={true}
79
+ closable={false}
80
+ width={383}
81
+ onClose={onClose}
82
+ visible={visible}
83
+ >
84
+ {defaultValue && <DrawerBody defaultValue={defaultValue} />}
85
+ </Drawer>
86
+ );
87
+ };
88
+
89
+ const DrawerBody = (props: { defaultValue: IGood }) => {
90
+
91
+ const controller = Invoice.useInvoiceController();
92
+
93
+ const { defaultValue } = props;
94
+
95
+ const actions = React.useMemo(() => createAsyncFormActions(), []);
96
+
97
+ const taxClassificationProps = controller.useMemo(s => s.taxClassificationProps, []);
98
+
99
+ /** 免税类型 是否需要 */
100
+ const isTaxFreeTypeNeeded = controller.useMemo(s => s.goodsListState.endowCode.isTaxFreeTypeNeeded, []);
101
+
102
+ /** 税率 是否禁用 */
103
+ const readOnlyTaxRate = controller.useMemo(s => {
104
+ if (s.goodsListState.endowCode.getReadOnlyTaxRate) {
105
+ return s.goodsListState.endowCode.getReadOnlyTaxRate(s.goodsListState);
106
+ } else {
107
+ return false;
108
+ }
109
+ }, [])
110
+
111
+ /** 优惠政策 是否禁用 */
112
+ const readOnlyFavouredPolicy = controller.useMemo(s => {
113
+ if (s.goodsListState.endowCode.getReadOnlyFavouredPolicy) {
114
+ return s.goodsListState.endowCode.getReadOnlyFavouredPolicy(s.goodsListState);
115
+ } else {
116
+ return false;
117
+ }
118
+ }, [])
119
+
120
+ /** 税率列表 */
121
+ const taxRateList = controller.useMemo(s => s.goodsListState.taxRateList, []);
122
+
123
+ /** 免税类型 列表 */
124
+ const taxFreeTypeList = controller.useMemo(s => s.goodsListState.endowCode.taxFreeTypeList, []);
125
+
126
+ /** 优惠政策类型列表 */
127
+ const favouredPolicyNameList = controller.useMemo(s => s.goodsListState.endowCode.favouredPolicyNameList, []);
128
+
129
+ /** 优惠政策类型列表 */
130
+ // const getTaxCategoryCodeTree = controller.useMemo(s => s.goodsListState.endowCode.getTaxCategoryCodeTree, []);
131
+
132
+ /** 税率 */
133
+ const [taxRate, setTaxRate] = React.useState<number>(0);
134
+
135
+ /** 商品可用税率 */
136
+ const [goodsTaxRateList, setGoodsTaxRateList] = React.useState<number[] | null | undefined>(defaultValue.goodsTaxRateList);
137
+
138
+ const formattedTaxRateList = React.useMemo(() => {
139
+ return (goodsTaxRateList || taxRateList).map((e) => ({ label: `${e}%`, value: e }))
140
+ }, [goodsTaxRateList, taxRateList])
141
+
142
+ /** 税收分类编码 选择组件 */
143
+ const ShowSearch = React.useCallback(props => {
144
+
145
+ const [dataSource, setDataSource] = React.useState<any[]>([]);
146
+
147
+ const onSearch = React.useCallback(async e => {
148
+ const arr = await controller.state.goodsListState.endowCode.getTaxCategoryCodeList(e);
149
+ setDataSource(arr);
150
+ }, [])
151
+
152
+ const onChange = React.useCallback((value: string) => {
153
+ if (props.onChange) {
154
+ props.onChange(value);
155
+ }
156
+
157
+ const info = dataSource.filter(i => i.value === value)[0];
158
+ if (!info) return;
159
+
160
+ // !readOnlyTaxRate && actions.setFieldState('taxRate', async s => {
161
+ // if (info.taxRate || info.taxRate === 0) {
162
+ // s.value = info.taxRate
163
+ // }
164
+ // });
165
+
166
+ actions.setFieldState('shorthand', async (s) => {
167
+ if (info.shorthand) {
168
+ s.value = info.shorthand
169
+ }
170
+ });
171
+ }, [actions, dataSource, readOnlyTaxRate])
172
+
173
+ return (
174
+ <Select
175
+ {...props}
176
+ showSearch
177
+ showArrow={false}
178
+ notFoundContent={null}
179
+ filterOption={false}
180
+ onSearch={onSearch}
181
+ onChange={onChange}
182
+ >
183
+ {dataSource.map(e => <Select.Option key={e.value} value={e.value}>{e.label}</Select.Option>)}
184
+ </Select>
185
+ )
186
+ }, [controller, actions])
187
+
188
+ /** 税收分类编码 选择组件2 */
189
+ const ShowSearch2 = React.useCallback(props => {
190
+
191
+ // 是否显示
192
+ const [visible, setVisible] = React.useState(false);
193
+
194
+ // 税收分类编码树
195
+ const [list, setList] = React.useState<any[]>();
196
+
197
+ // 搜索条件
198
+ const [filter, setFilter] = React.useState<{
199
+ /** 税收分类编码 */
200
+ taxCategoryCode?: string,
201
+
202
+ /** 货物和劳务名称/简称 */
203
+ val?: string
204
+ }>();
205
+
206
+ /** 创建 树节点 */
207
+ const createTreeNode = React.useCallback(() => {
208
+ if (!list) return <></>;
209
+
210
+ return ctn(list);
211
+
212
+ function title(label: string) {
213
+ if (!filter) return label;
214
+ label = (filter.taxCategoryCode ? label.split(new RegExp(filter.taxCategoryCode, 'g')) : [label]).join(`<span style="color: #1890ff;">${filter.taxCategoryCode}</span>`);
215
+ label = (filter.val ? label.split(new RegExp(filter.val, 'g')) : [label]).join(`<span style="color: #1890ff;">${filter.val}</span>`);
216
+ return <span dangerouslySetInnerHTML={{ __html: label }} />
217
+ }
218
+
219
+ function ctn(l: any[], p = '0') {
220
+ if (!l || !l.length) return [<></>];
221
+ return l.filter(e => e.pid === p).map(e => {
222
+ return (
223
+ <TreeNode title={title(e.label)} key={e.id}>
224
+ {ctn(l, e.id)}
225
+ </TreeNode>
226
+ )
227
+ })
228
+ }
229
+ }, [list, filter])
230
+
231
+ /** 点击了节点 */
232
+ const onSelect = React.useCallback((e: string[]) => {
233
+ const id = e[0];
234
+
235
+ // 是否叶子节点
236
+ if (list?.filter(e => e.pid === id).length !== 0) { return; }
237
+
238
+ const info = list?.filter(e => e.id === id)[0];
239
+
240
+ // !readOnlyTaxRate && actions.setFieldState('taxRate', async s => {
241
+ // if (info.taxRate || info.taxRate === 0) {
242
+ // s.value = info.taxRate
243
+ // }
244
+ // });
245
+
246
+ actions.setFieldState('taxClassificationCode', async s => {
247
+ if (info.id) {
248
+ s.value = info.id
249
+ }
250
+ });
251
+
252
+ actions.setFieldState('shorthand', async (s) => {
253
+ if (info.shorthand) {
254
+ s.value = info.shorthand
255
+ }
256
+ });
257
+
258
+ setVisible(false);
259
+ }, [list, actions, readOnlyTaxRate])
260
+
261
+ React.useEffect(() => {
262
+ (async () => {
263
+ const fn = controller.state.goodsListState.endowCode.getTaxCategoryCodeTree || (async () => []);
264
+ const list = await fn(filter?.taxCategoryCode, filter?.val);
265
+ setList(list || []);
266
+ })()
267
+ }, [filter])
268
+
269
+ React.useEffect(() => {
270
+ if (visible) {
271
+ setList([])
272
+ }
273
+ }, [visible])
274
+
275
+ return (
276
+ <>
277
+ <InputAntd readOnly value={props.value} addonAfter={<Button size="small" type="link" onClick={() => { setVisible(true) }} >点击选择</Button>} />
278
+ <Drawer
279
+ title="税收分类编码"
280
+ visible={visible}
281
+ width={500}
282
+ onClose={() => { setVisible(false) }}
283
+ >
284
+ <Form key={`${visible}`} >
285
+ <Form.Item label="产品或服务简称" >
286
+ <InputAntd onChange={e => { setFilter({ ...filter, val: e.target.value }) }} />
287
+ </Form.Item>
288
+ <Form.Item label="税收分类编码">
289
+ <InputAntd onChange={e => { setFilter({ ...filter, taxCategoryCode: e.target.value }) }} />
290
+ </Form.Item>
291
+ </Form>
292
+ {
293
+ (list && list.length > 0)
294
+ ? <Tree
295
+ defaultExpandAll
296
+ selectedKeys={[]}
297
+ onSelect={onSelect}
298
+ >
299
+ {createTreeNode()}
300
+ </Tree>
301
+ : <span style={{ color: '#00000073' }} >请输入“产品或服务简称”或“税收分类编码”查找数据。</span>
302
+ }
303
+ </Drawer>
304
+ </>
305
+ )
306
+ }, [controller, actions])
307
+
308
+ /** 税收分类编码 选择组件3 */
309
+ const ShowSearch3 = React.useCallback(props => {
310
+ const [open, setOpen] = React.useState(false);
311
+
312
+ const [list, setList] = React.useState<any>([]);
313
+
314
+ const onSearch = React.useCallback(async (value: any = null) => {
315
+ if(value?.target?.value){
316
+ const arr = await controller.state.goodsListState.endowCode.onSearchTaxClassificationCode(value?.target?.value);
317
+ const list: any[] = arr.map((item: any)=> {
318
+ return {
319
+ ...item,
320
+ title: `${item.productName} ${item.taxCategoryCode}`,
321
+ key: item.taxCategoryCode,
322
+ isLeaf: true
323
+ }
324
+ });
325
+ setList(list);
326
+ } else {
327
+ await onLoad();
328
+ }
329
+ }, []);
330
+
331
+ const onLoad = React.useCallback(async (value?: any) => {
332
+ const arr = await controller.state.goodsListState.endowCode.onLoadTaxClassificationCode(value?.taxCategoryCode);
333
+ const data: any[] = arr.map((item: any)=> {
334
+ return {
335
+ ...item,
336
+ title: `${item.productName} ${item.taxCategoryCode}`,
337
+ key: item.taxCategoryCode
338
+ }
339
+ });
340
+
341
+ const treeData = optimizeTreeData(data);
342
+
343
+ if(value?.key) {
344
+ setList((origin: any)=> {
345
+ updateTreeData(origin, value.key, treeData)
346
+ });
347
+ } else {
348
+ setList(treeData);
349
+ }
350
+ return [];
351
+ }, []);
352
+
353
+ const onClick = React.useCallback(async () => {
354
+ setOpen(true);
355
+ await onLoad();
356
+ }, []);
357
+ const onSubmit1 = React.useCallback((key: any, info: any) => {
358
+ // console.log('1231231231', key, info);
359
+ // 根据税编改变税率列表
360
+ // 如果只有一个,默认选中,有多个时,置空,用户手选
361
+ // if (controller.state.goodsListState.isUpdateGoodsTaxRateList) {
362
+ // if (info.node.taxRateList?.length) {
363
+ // setGoodsTaxRateList(info.node.taxRateList);
364
+ // }
365
+ // if (!readOnlyTaxRate) {
366
+ // actions.setFieldState('taxRate', async s => {
367
+ // if (info.node.taxRateList && info.node.taxRateList?.length === 1) {
368
+ // s.value = info.node.taxRateList[0]
369
+ // } else {
370
+ // s.value = undefined
371
+ // }
372
+ // });
373
+
374
+ // }
375
+ // }
376
+
377
+ // !readOnlyTaxRate && actions.setFieldState('taxRate', async s => {
378
+ // if (info.node.taxRate || info.taxRate === 0) {
379
+ // s.value = info.node.taxRate
380
+ // }
381
+ // });
382
+ let node = info.node || info;
383
+ actions.setFieldState('taxClassificationCode', async s => {
384
+ if(node.taxCategoryCode) {
385
+ s.value = node.taxCategoryCode
386
+ }
387
+ });
388
+
389
+ actions.setFieldState('shorthand', async (s) => {
390
+ if (node.shorthand){
391
+ s.value = node.shorthand
392
+ }
393
+ });
394
+ setOpen(false);
395
+ }, [controller, actions]);
396
+
397
+ const onSelect = React.useCallback((key: any, info: any) => {
398
+ let node = info.node || info;
399
+ if (controller.state.goodsListState.isUpdateGoodsTaxRateList) {
400
+ if (node.taxRateList?.length) {
401
+ setGoodsTaxRateList(node.taxRateList);
402
+ }
403
+ if (!readOnlyTaxRate) {
404
+ actions.setFieldState('taxRate', async s => {
405
+ if (node.taxRateList && node.taxRateList?.length === 1) {
406
+ s.value = node.taxRateList[0]
407
+ } else {
408
+ s.value = undefined
409
+ }
410
+ });
411
+
412
+ }
413
+ }
414
+ setInfo(info.node);
415
+ // setOpen(false);
416
+ }, [controller, actions]);
417
+
418
+ const optimizeTreeData = (data: any): any => {
419
+ return data.map((item: any)=> {
420
+ return {
421
+ ...item,
422
+ selectable: item?.hzx === 'N',
423
+ isLeaf: item?.hzx === 'N'
424
+ }
425
+ });
426
+ }
427
+
428
+ const updateTreeData = (list: any, key: React.Key, children: any): any => {
429
+ const data = list.map((node: any) => {
430
+ if (node.key === key) {
431
+ return {
432
+ ...node,
433
+ children
434
+ };
435
+ }
436
+ if (node.children) {
437
+ return {
438
+ ...node,
439
+ children: updateTreeData(node.children, key, children)
440
+ };
441
+ }
442
+ return node;
443
+ });
444
+ setList(data);
445
+ return data;
446
+ }
447
+ const [info, setInfo] = React.useState({});
448
+ return (
449
+ <>
450
+ <InputAntd readOnly onClick={onClick} value={props.value} />
451
+ <TaxClassificationModal
452
+ list={list}
453
+ open={open}
454
+ info={info}
455
+ onSelect={onSelect}
456
+ onSubmit={onSubmit1}
457
+ onCancel={()=> {setOpen(false); setInfo({})}}
458
+ onSearch={onSearch}
459
+ onLoad={onLoad}
460
+ />
461
+ </>
462
+ )
463
+ }, [controller, actions])
464
+
465
+ // 是否享受优惠政策
466
+ const [favouredPolicyMark, setFavouredPolicyMark] = React.useState<number>(0);
467
+
468
+ // 确定
469
+ const onSubmit = React.useCallback(values => {
470
+ controller.pipeline(async s => {
471
+
472
+ const endowCodeGood = s.goodsListState.endowCode.endowcodeGoodIndex.map(e => s.goodsListState.goodsMap.get(e));
473
+
474
+ // 赋码
475
+ endowCodeGood.forEach(good => {
476
+ if (!good) return;
477
+
478
+ good.shorthand = values.shorthand;
479
+ good.taxClassificationCode = values.taxClassificationCode;
480
+ good.taxRate = values.taxRate;
481
+ good.taxFreeType = values.taxFreeType;
482
+ good.favouredPolicyMark = values.favouredPolicyMark;
483
+ good.favouredPolicyName = values.favouredPolicyName;
484
+
485
+ // 无论是否含税,都保持价税合计不变
486
+ good.taxAmount = countTaxAmount(good.lineAmountIncludeTax || 0, s.goodsListState.deduction, values.taxRate);
487
+ if (good.taxAmount || good.taxAmount === 0 ) {
488
+ good.lineAmountExcludeTax = countAmountExcludeTax(good.lineAmountIncludeTax || 0, good.taxAmount);
489
+ }
490
+ if (good.lineAmountExcludeTax && good.quantity) {
491
+ good.priceExcludeTax = countPrice(good.lineAmountExcludeTax, good.quantity, controller.state.calculatingDigits) as any;
492
+ }
493
+
494
+ //赋值商品的可用税率
495
+ good.goodsTaxRateList = goodsTaxRateList;
496
+
497
+ });
498
+
499
+ s.goodsListState.goodsList = s.goodsListState.goodsList.slice();
500
+ s.goodsListState.endowCode.endowcodeGoodIndex = [];
501
+ })();
502
+ }, [controller, goodsTaxRateList]);
503
+
504
+ const effects = React.useCallback(() => {
505
+ // 税率变化
506
+ FormEffectHooks.onFieldValueChange$('taxRate').subscribe((e) => {
507
+ setTaxRate(e.value);
508
+ actions.setFieldState('taxFreeType', async (s) => {
509
+ if (e.value !== 0)
510
+ s.value = undefined;
511
+ });
512
+ });
513
+
514
+ // 是否享受优惠政策
515
+ FormEffectHooks.onFieldValueChange$('favouredPolicyMark').subscribe((e) => {
516
+ setFavouredPolicyMark(e.value);
517
+ actions.setFieldState('favouredPolicyName', async (s) => {
518
+ if (e.value === 0)
519
+ s.value = undefined;
520
+ });
521
+ });
522
+ }, [actions]);
523
+
524
+ // 更新 税收分类编码列表
525
+ React.useEffect(() => {
526
+ if (controller.getTaxCategoryCodeList) controller.getTaxCategoryCodeList();
527
+ }, [controller]);
528
+
529
+ return (
530
+ <SchemaForm actions={actions} previewPlaceholder=" " components={{ ...components, showSearch: !!controller.state.goodsListState.endowCode.onLoadTaxClassificationCode ? ShowSearch3 : ShowSearch }} effects={effects}>
531
+ <FormButtonGroup>
532
+ <Field
533
+ name="taxClassificationCode"
534
+ type="showSearch"
535
+ title="税收分类编码"
536
+ // enum={taxCategoryCodeList}
537
+ default={defaultValue?.taxClassificationCode}
538
+ x-rules={[{ message: '请选择税收分类编码', required: true }]}
539
+ />
540
+ <Field
541
+ name="shorthand"
542
+ type="string"
543
+ readOnly
544
+ default={defaultValue?.shorthand}
545
+ title="商品和服务分类简称"
546
+ />
547
+ <Field
548
+ name="taxRate"
549
+ type="string"
550
+ title="税率"
551
+ x-component-props={{ disabled: readOnlyTaxRate }}
552
+ default={defaultValue?.taxRate ?? 0}
553
+ enum={formattedTaxRateList}
554
+ x-rules={[{ message: '请选择税率', required: true }]}
555
+ />
556
+ {taxRate === 0 && isTaxFreeTypeNeeded &&
557
+ <Field
558
+ name="taxFreeType"
559
+ type="string"
560
+ title="免税类型"
561
+ x-component-props={{ disabled: readOnlyTaxRate }}
562
+ default={defaultValue?.taxFreeType}
563
+ enum={taxFreeTypeList}
564
+ x-rules={[{ message: '请选择免税类型', required: true }]}
565
+ />
566
+ }
567
+ <Field
568
+ name="favouredPolicyMark"
569
+ type="number"
570
+ title="是否享受优惠政策"
571
+ x-component-props={{ disabled: readOnlyFavouredPolicy }}
572
+ enum={[
573
+ { label: '是', value: 1 },
574
+ { label: '否', value: 0 },
575
+ ]}
576
+ default={defaultValue?.favouredPolicyMark ?? 0}
577
+ x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
578
+ />
579
+ {favouredPolicyMark === 1 &&
580
+ <Field
581
+ name="favouredPolicyName"
582
+ type="string"
583
+ title="优惠政策类型"
584
+ x-component-props={{ disabled: readOnlyFavouredPolicy }}
585
+ enum={favouredPolicyNameList}
586
+ default={defaultValue?.favouredPolicyName}
587
+ x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
588
+ />
589
+ }
590
+ </FormButtonGroup>
591
+
592
+ <span className="kts-invoice-operate-goods-endow-code-button-list">
593
+ <Button onClick={() => { actions.submit(onSubmit) }} type="primary">
594
+ 确定
595
+ </Button>
596
+ <Button onClick={() => { controller.pipeline(async s => (s.goodsListState.endowCode.endowcodeGoodIndex = []))() }}>
597
+ 取消
598
+ </Button>
599
+ </span>
600
+ </SchemaForm>
601
+ );
602
+ };
603
+
604
+ const components = {
605
+ string: Input,
606
+ number: NumberPicker,
607
+ };