kts-component-invoice-operate 3.2.166 → 3.2.168

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 (215) 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/index.esm.js +775 -759
  9. package/dist/index.js +775 -759
  10. package/docs/index.md +5 -5
  11. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  12. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  13. package/docs-dist/static/fork.5431267d.svg +11 -11
  14. package/docs-dist/static/plus.44013ce3.svg +11 -11
  15. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  16. package/index.html +12 -12
  17. package/package.json +62 -61
  18. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +40 -40
  19. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +17 -17
  20. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  21. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  22. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +18 -18
  23. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -19
  24. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  25. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +55 -55
  26. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +21 -21
  27. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  28. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  29. package/src/Invoice/Invoice-digtal/index.md +34 -34
  30. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +95 -95
  31. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +26 -26
  32. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  33. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  34. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  35. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  36. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +87 -87
  37. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +81 -81
  38. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  39. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  40. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +131 -131
  41. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  42. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +65 -65
  43. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  44. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  45. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  46. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  47. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  48. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  49. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  50. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  51. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  52. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  53. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  54. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  55. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  56. package/src/Invoice/InvoiceController/index.ts +87 -87
  57. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  58. package/src/Invoice/_test/children/index.tsx +214 -214
  59. package/src/Invoice/_test/deduction/index.tsx +935 -935
  60. package/src/Invoice/_test/draft/index.tsx +40 -40
  61. package/src/Invoice/_test/easiest/index.tsx +5 -5
  62. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  63. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  64. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  65. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  66. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  67. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  68. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  69. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  70. package/src/Invoice/_test/seller/index.tsx +28 -28
  71. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  72. package/src/Invoice/_test/unit/index.tsx +19 -19
  73. package/src/Invoice/index.less +31 -31
  74. package/src/Invoice/index.md +56 -56
  75. package/src/Invoice/index.tsx +183 -183
  76. package/src/Invoice/tools/calculate/index.ts +132 -132
  77. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  78. package/src/Invoice/tools/evaluate/index.ts +7 -7
  79. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  80. package/src/Invoice/tools/itemName/index.ts +55 -55
  81. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  82. package/src/Invoice/tools/mounting/index.ts +13 -13
  83. package/src/Invoice/tools/strringFn/index.ts +40 -40
  84. package/src/Invoice/tools/useToGenerateId/index.ts +8 -8
  85. package/src/Invoice/tools/utils/index.ts +1 -1
  86. package/src/Invoice/tools/utils/money/index.ts +20 -20
  87. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  88. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  89. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  90. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  91. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  92. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  93. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +606 -592
  94. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +647 -647
  95. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +711 -711
  96. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  97. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  98. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Expand/index.tsx +57 -57
  99. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  100. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +49 -49
  101. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  102. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +91 -91
  103. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  104. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  105. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  106. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  107. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  108. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  109. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +99 -99
  110. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  111. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  112. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  113. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +52 -52
  114. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +120 -120
  115. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  116. package/src/Invoice/ui/default/GoodsList/index.less +185 -185
  117. package/src/Invoice/ui/default/GoodsList/index.tsx +205 -205
  118. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +65 -65
  119. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  120. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  121. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  122. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  123. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  124. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  125. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  126. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  127. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  128. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  129. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  130. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  131. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  132. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  133. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  134. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +40 -40
  135. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +71 -71
  136. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  137. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +130 -130
  138. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  139. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  140. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  141. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  142. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +198 -198
  143. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  144. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  145. package/src/Invoice/ui/default/Seller/index.less +113 -113
  146. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  147. package/src/Invoice/ui/default/Sign/index.less +14 -14
  148. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  149. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +639 -639
  150. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +660 -660
  151. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  152. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  153. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  154. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  155. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +87 -87
  156. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  157. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  158. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  159. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  160. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  161. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  162. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  163. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  164. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  165. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +51 -51
  166. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  167. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  168. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  169. package/src/Invoice/ui/digtal/GoodsList/index.tsx +180 -180
  170. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +67 -67
  171. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -340
  172. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  173. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  174. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  175. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  176. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  177. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  178. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  179. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  180. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +50 -50
  181. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  182. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  183. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  184. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  185. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +53 -53
  186. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  187. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +108 -108
  188. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  189. package/src/Invoice/ui/digtal/InvoiceHeader/index.less +57 -57
  190. package/src/Invoice/ui/digtal/InvoiceHeader/index.tsx +77 -77
  191. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +14 -14
  192. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +192 -192
  193. package/src/Invoice/ui/digtal/Sign/index.less +48 -48
  194. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  195. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +99 -99
  196. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +436 -436
  197. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowDown.svg +2 -2
  198. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowUp.svg +2 -2
  199. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/plus.svg +11 -11
  200. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  201. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +396 -396
  202. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  203. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  204. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  205. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  206. package/src/InvoiceTypeModal/index.less +7 -7
  207. package/src/InvoiceTypeModal/index.md +5 -5
  208. package/src/InvoiceTypeModal/index.tsx +161 -161
  209. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +184 -184
  210. package/src/TaxClassificationCodeModal/index.less +9 -4
  211. package/src/TaxClassificationCodeModal/index.md +6 -6
  212. package/src/TaxClassificationCodeModal/index.tsx +144 -141
  213. package/src/index.ts +13 -12
  214. package/tsconfig.json +31 -31
  215. package/typings.d.ts +3 -3
@@ -1,592 +1,606 @@
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 onSubmit = React.useCallback((key: any, info: any) => {
358
-
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
-
383
- actions.setFieldState('taxClassificationCode', async s => {
384
- if(info.node.taxCategoryCode) {
385
- s.value = info.node.taxCategoryCode
386
- }
387
- });
388
-
389
- actions.setFieldState('shorthand', async (s) => {
390
- if (info.node.shorthand){
391
- s.value = info.node.shorthand
392
- }
393
- });
394
- // setOpen(false);
395
- }, [controller, actions]);
396
-
397
- const onSelect = React.useCallback((key: any, info: any) => {
398
-
399
- setInfo(info.node);
400
- // setOpen(false);
401
- }, [controller, actions]);
402
-
403
- const optimizeTreeData = (data: any): any => {
404
- return data.map((item: any)=> {
405
- return {
406
- ...item,
407
- selectable: item?.hzx === 'N',
408
- isLeaf: item?.hzx === 'N'
409
- }
410
- });
411
- }
412
-
413
- const updateTreeData = (list: any, key: React.Key, children: any): any => {
414
- const data = list.map((node: any) => {
415
- if (node.key === key) {
416
- return {
417
- ...node,
418
- children
419
- };
420
- }
421
- if (node.children) {
422
- return {
423
- ...node,
424
- children: updateTreeData(node.children, key, children)
425
- };
426
- }
427
- return node;
428
- });
429
- setList(data);
430
- return data;
431
- }
432
- const [info, setInfo] = React.useState({});
433
- return (
434
- <>
435
- <InputAntd readOnly onClick={onClick} value={props.value} />
436
- <TaxClassificationModal
437
- list={list}
438
- open={open}
439
- info={info}
440
- onSelect={onSelect}
441
- onSubmit={onSubmit}
442
- onCancel={()=> {setOpen(false)}}
443
- onSearch={onSearch}
444
- onLoad={onLoad}
445
- />
446
- </>
447
- )
448
- }, [controller, actions])
449
-
450
- // 是否享受优惠政策
451
- const [favouredPolicyMark, setFavouredPolicyMark] = React.useState<number>(0);
452
-
453
- // 确定
454
- const onSubmit = React.useCallback(values => {
455
- controller.pipeline(async s => {
456
-
457
- const endowCodeGood = s.goodsListState.endowCode.endowcodeGoodIndex.map(e => s.goodsListState.goodsMap.get(e));
458
-
459
- // 赋码
460
- endowCodeGood.forEach(good => {
461
- if (!good) return;
462
-
463
- good.shorthand = values.shorthand;
464
- good.taxClassificationCode = values.taxClassificationCode;
465
- good.taxRate = values.taxRate;
466
- good.taxFreeType = values.taxFreeType;
467
- good.favouredPolicyMark = values.favouredPolicyMark;
468
- good.favouredPolicyName = values.favouredPolicyName;
469
-
470
- // 无论是否含税,都保持价税合计不变
471
- good.taxAmount = countTaxAmount(good.lineAmountIncludeTax || 0, s.goodsListState.deduction, values.taxRate);
472
- if (good.taxAmount || good.taxAmount === 0 ) {
473
- good.lineAmountExcludeTax = countAmountExcludeTax(good.lineAmountIncludeTax || 0, good.taxAmount);
474
- }
475
- if (good.lineAmountExcludeTax && good.quantity) {
476
- good.priceExcludeTax = countPrice(good.lineAmountExcludeTax, good.quantity, controller.state.calculatingDigits) as any;
477
- }
478
-
479
- //赋值商品的可用税率
480
- good.goodsTaxRateList = goodsTaxRateList;
481
-
482
- });
483
-
484
- s.goodsListState.goodsList = s.goodsListState.goodsList.slice();
485
- s.goodsListState.endowCode.endowcodeGoodIndex = [];
486
- })();
487
- }, [controller, goodsTaxRateList]);
488
-
489
- const effects = React.useCallback(() => {
490
- // 税率变化
491
- FormEffectHooks.onFieldValueChange$('taxRate').subscribe((e) => {
492
- setTaxRate(e.value);
493
- actions.setFieldState('taxFreeType', async (s) => {
494
- if (e.value !== 0)
495
- s.value = undefined;
496
- });
497
- });
498
-
499
- // 是否享受优惠政策
500
- FormEffectHooks.onFieldValueChange$('favouredPolicyMark').subscribe((e) => {
501
- setFavouredPolicyMark(e.value);
502
- actions.setFieldState('favouredPolicyName', async (s) => {
503
- if (e.value === 0)
504
- s.value = undefined;
505
- });
506
- });
507
- }, [actions]);
508
-
509
- // 更新 税收分类编码列表
510
- React.useEffect(() => {
511
- if (controller.getTaxCategoryCodeList) controller.getTaxCategoryCodeList();
512
- }, [controller]);
513
-
514
- return (
515
- <SchemaForm actions={actions} previewPlaceholder=" " components={{ ...components, showSearch: !!controller.state.goodsListState.endowCode.onLoadTaxClassificationCode ? ShowSearch3 : ShowSearch }} effects={effects}>
516
- <FormButtonGroup>
517
- <Field
518
- name="taxClassificationCode"
519
- type="showSearch"
520
- title="税收分类编码"
521
- // enum={taxCategoryCodeList}
522
- default={defaultValue?.taxClassificationCode}
523
- x-rules={[{ message: '请选择税收分类编码', required: true }]}
524
- />
525
- <Field
526
- name="shorthand"
527
- type="string"
528
- readOnly
529
- default={defaultValue?.shorthand}
530
- title="商品和服务分类简称"
531
- />
532
- <Field
533
- name="taxRate"
534
- type="string"
535
- title="税率"
536
- x-component-props={{ disabled: readOnlyTaxRate }}
537
- default={defaultValue?.taxRate ?? 0}
538
- enum={formattedTaxRateList}
539
- x-rules={[{ message: '请选择税率', required: true }]}
540
- />
541
- {taxRate === 0 && isTaxFreeTypeNeeded &&
542
- <Field
543
- name="taxFreeType"
544
- type="string"
545
- title="免税类型"
546
- x-component-props={{ disabled: readOnlyTaxRate }}
547
- default={defaultValue?.taxFreeType}
548
- enum={taxFreeTypeList}
549
- x-rules={[{ message: '请选择免税类型', required: true }]}
550
- />
551
- }
552
- <Field
553
- name="favouredPolicyMark"
554
- type="number"
555
- title="是否享受优惠政策"
556
- x-component-props={{ disabled: readOnlyFavouredPolicy }}
557
- enum={[
558
- { label: '是', value: 1 },
559
- { label: '否', value: 0 },
560
- ]}
561
- default={defaultValue?.favouredPolicyMark ?? 0}
562
- x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
563
- />
564
- {favouredPolicyMark === 1 &&
565
- <Field
566
- name="favouredPolicyName"
567
- type="string"
568
- title="优惠政策类型"
569
- x-component-props={{ disabled: readOnlyFavouredPolicy }}
570
- enum={favouredPolicyNameList}
571
- default={defaultValue?.favouredPolicyName}
572
- x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
573
- />
574
- }
575
- </FormButtonGroup>
576
-
577
- <span className="kts-invoice-operate-goods-endow-code-button-list">
578
- <Button onClick={() => { actions.submit(onSubmit) }} type="primary">
579
- 确定
580
- </Button>
581
- <Button onClick={() => { controller.pipeline(async s => (s.goodsListState.endowCode.endowcodeGoodIndex = []))() }}>
582
- 取消
583
- </Button>
584
- </span>
585
- </SchemaForm>
586
- );
587
- };
588
-
589
- const components = {
590
- string: Input,
591
- number: NumberPicker,
592
- };
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
+
383
+ actions.setFieldState('taxClassificationCode', async s => {
384
+ if(info.node.taxCategoryCode) {
385
+ s.value = info.node.taxCategoryCode
386
+ }
387
+ });
388
+
389
+ actions.setFieldState('shorthand', async (s) => {
390
+ if (info.node.shorthand){
391
+ s.value = info.node.shorthand
392
+ }
393
+ });
394
+ setOpen(false);
395
+ }, [controller, actions]);
396
+
397
+ const onSelect = React.useCallback((key: any, info: any) => {
398
+ if (controller.state.goodsListState.isUpdateGoodsTaxRateList) {
399
+ if (info.node.taxRateList?.length) {
400
+ setGoodsTaxRateList(info.node.taxRateList);
401
+ }
402
+ if (!readOnlyTaxRate) {
403
+ actions.setFieldState('taxRate', async s => {
404
+ if (info.node.taxRateList && info.node.taxRateList?.length === 1) {
405
+ s.value = info.node.taxRateList[0]
406
+ } else {
407
+ s.value = undefined
408
+ }
409
+ });
410
+
411
+ }
412
+ }
413
+ setInfo(info.node);
414
+ // setOpen(false);
415
+ }, [controller, actions]);
416
+
417
+ const optimizeTreeData = (data: any): any => {
418
+ return data.map((item: any)=> {
419
+ return {
420
+ ...item,
421
+ selectable: item?.hzx === 'N',
422
+ isLeaf: item?.hzx === 'N'
423
+ }
424
+ });
425
+ }
426
+
427
+ const updateTreeData = (list: any, key: React.Key, children: any): any => {
428
+ const data = list.map((node: any) => {
429
+ if (node.key === key) {
430
+ return {
431
+ ...node,
432
+ children
433
+ };
434
+ }
435
+ if (node.children) {
436
+ return {
437
+ ...node,
438
+ children: updateTreeData(node.children, key, children)
439
+ };
440
+ }
441
+ return node;
442
+ });
443
+ setList(data);
444
+ return data;
445
+ }
446
+ const [info, setInfo] = React.useState({});
447
+ return (
448
+ <>
449
+ <InputAntd readOnly onClick={onClick} value={props.value} />
450
+ <TaxClassificationModal
451
+ list={list}
452
+ open={open}
453
+ info={info}
454
+ onSelect={onSelect}
455
+ onSubmit={onSubmit1}
456
+ onCancel={()=> {setOpen(false)}}
457
+ onSearch={onSearch}
458
+ onLoad={onLoad}
459
+ />
460
+ </>
461
+ )
462
+ }, [controller, actions])
463
+
464
+ // 是否享受优惠政策
465
+ const [favouredPolicyMark, setFavouredPolicyMark] = React.useState<number>(0);
466
+
467
+ // 确定
468
+ const onSubmit = React.useCallback(values => {
469
+ controller.pipeline(async s => {
470
+
471
+ const endowCodeGood = s.goodsListState.endowCode.endowcodeGoodIndex.map(e => s.goodsListState.goodsMap.get(e));
472
+
473
+ // 赋码
474
+ endowCodeGood.forEach(good => {
475
+ if (!good) return;
476
+
477
+ good.shorthand = values.shorthand;
478
+ good.taxClassificationCode = values.taxClassificationCode;
479
+ good.taxRate = values.taxRate;
480
+ good.taxFreeType = values.taxFreeType;
481
+ good.favouredPolicyMark = values.favouredPolicyMark;
482
+ good.favouredPolicyName = values.favouredPolicyName;
483
+
484
+ // 无论是否含税,都保持价税合计不变
485
+ good.taxAmount = countTaxAmount(good.lineAmountIncludeTax || 0, s.goodsListState.deduction, values.taxRate);
486
+ if (good.taxAmount || good.taxAmount === 0 ) {
487
+ good.lineAmountExcludeTax = countAmountExcludeTax(good.lineAmountIncludeTax || 0, good.taxAmount);
488
+ }
489
+ if (good.lineAmountExcludeTax && good.quantity) {
490
+ good.priceExcludeTax = countPrice(good.lineAmountExcludeTax, good.quantity, controller.state.calculatingDigits) as any;
491
+ }
492
+
493
+ //赋值商品的可用税率
494
+ good.goodsTaxRateList = goodsTaxRateList;
495
+
496
+ });
497
+
498
+ s.goodsListState.goodsList = s.goodsListState.goodsList.slice();
499
+ s.goodsListState.endowCode.endowcodeGoodIndex = [];
500
+ })();
501
+ }, [controller, goodsTaxRateList]);
502
+
503
+ const effects = React.useCallback(() => {
504
+ // 税率变化
505
+ FormEffectHooks.onFieldValueChange$('taxRate').subscribe((e) => {
506
+ setTaxRate(e.value);
507
+ actions.setFieldState('taxFreeType', async (s) => {
508
+ if (e.value !== 0)
509
+ s.value = undefined;
510
+ });
511
+ });
512
+
513
+ // 是否享受优惠政策
514
+ FormEffectHooks.onFieldValueChange$('favouredPolicyMark').subscribe((e) => {
515
+ setFavouredPolicyMark(e.value);
516
+ actions.setFieldState('favouredPolicyName', async (s) => {
517
+ if (e.value === 0)
518
+ s.value = undefined;
519
+ });
520
+ });
521
+ }, [actions]);
522
+
523
+ // 更新 税收分类编码列表
524
+ React.useEffect(() => {
525
+ if (controller.getTaxCategoryCodeList) controller.getTaxCategoryCodeList();
526
+ }, [controller]);
527
+
528
+ return (
529
+ <SchemaForm actions={actions} previewPlaceholder=" " components={{ ...components, showSearch: !!controller.state.goodsListState.endowCode.onLoadTaxClassificationCode ? ShowSearch3 : ShowSearch }} effects={effects}>
530
+ <FormButtonGroup>
531
+ <Field
532
+ name="taxClassificationCode"
533
+ type="showSearch"
534
+ title="税收分类编码"
535
+ // enum={taxCategoryCodeList}
536
+ default={defaultValue?.taxClassificationCode}
537
+ x-rules={[{ message: '请选择税收分类编码', required: true }]}
538
+ />
539
+ <Field
540
+ name="shorthand"
541
+ type="string"
542
+ readOnly
543
+ default={defaultValue?.shorthand}
544
+ title="商品和服务分类简称"
545
+ />
546
+ <Field
547
+ name="taxRate"
548
+ type="string"
549
+ title="税率"
550
+ x-component-props={{ disabled: readOnlyTaxRate }}
551
+ default={defaultValue?.taxRate ?? 0}
552
+ enum={formattedTaxRateList}
553
+ x-rules={[{ message: '请选择税率', required: true }]}
554
+ />
555
+ {taxRate === 0 && isTaxFreeTypeNeeded &&
556
+ <Field
557
+ name="taxFreeType"
558
+ type="string"
559
+ title="免税类型"
560
+ x-component-props={{ disabled: readOnlyTaxRate }}
561
+ default={defaultValue?.taxFreeType}
562
+ enum={taxFreeTypeList}
563
+ x-rules={[{ message: '请选择免税类型', required: true }]}
564
+ />
565
+ }
566
+ <Field
567
+ name="favouredPolicyMark"
568
+ type="number"
569
+ title="是否享受优惠政策"
570
+ x-component-props={{ disabled: readOnlyFavouredPolicy }}
571
+ enum={[
572
+ { label: '', value: 1 },
573
+ { label: '否', value: 0 },
574
+ ]}
575
+ default={defaultValue?.favouredPolicyMark ?? 0}
576
+ x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
577
+ />
578
+ {favouredPolicyMark === 1 &&
579
+ <Field
580
+ name="favouredPolicyName"
581
+ type="string"
582
+ title="优惠政策类型"
583
+ x-component-props={{ disabled: readOnlyFavouredPolicy }}
584
+ enum={favouredPolicyNameList}
585
+ default={defaultValue?.favouredPolicyName}
586
+ x-rules={[{ message: '请选择是否享受优惠政策', required: true }]}
587
+ />
588
+ }
589
+ </FormButtonGroup>
590
+
591
+ <span className="kts-invoice-operate-goods-endow-code-button-list">
592
+ <Button onClick={() => { actions.submit(onSubmit) }} type="primary">
593
+ 确定
594
+ </Button>
595
+ <Button onClick={() => { controller.pipeline(async s => (s.goodsListState.endowCode.endowcodeGoodIndex = []))() }}>
596
+ 取消
597
+ </Button>
598
+ </span>
599
+ </SchemaForm>
600
+ );
601
+ };
602
+
603
+ const components = {
604
+ string: Input,
605
+ number: NumberPicker,
606
+ };