kts-component-invoice-operate 3.2.143 → 3.2.145

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