kts-component-invoice-operate 3.2.154 → 3.2.156

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