kts-component-invoice-operate 3.2.134 → 3.2.136

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 (207) hide show
  1. package/.dumi/theme/builtins/API.tsx +66 -66
  2. package/.editorconfig +16 -16
  3. package/.fatherrc.ts +4 -4
  4. package/.prettierignore +7 -7
  5. package/.prettierrc +11 -11
  6. package/.umirc.ts +8 -8
  7. package/README.md +9 -9
  8. package/dist/index.esm.js +572 -574
  9. package/dist/index.js +572 -574
  10. package/docs/index.md +5 -5
  11. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  12. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  13. package/docs-dist/static/fork.5431267d.svg +11 -11
  14. package/docs-dist/static/plus.44013ce3.svg +11 -11
  15. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  16. package/index.html +12 -12
  17. package/package.json +61 -61
  18. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +38 -38
  19. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +16 -16
  20. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  21. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  22. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +17 -17
  23. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -20
  24. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  25. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +42 -42
  26. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  27. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  28. package/src/Invoice/Invoice-digtal/index.md +30 -30
  29. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +95 -95
  30. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +20 -20
  31. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  32. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  33. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  34. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  35. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +78 -78
  36. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +81 -81
  37. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  38. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  39. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +117 -117
  40. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  41. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +65 -65
  42. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  43. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  44. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  45. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  46. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  47. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  48. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  49. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  50. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  51. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  52. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  53. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  54. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  55. package/src/Invoice/InvoiceController/index.ts +81 -81
  56. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  57. package/src/Invoice/_test/deduction/index.tsx +935 -935
  58. package/src/Invoice/_test/draft/index.tsx +40 -40
  59. package/src/Invoice/_test/easiest/index.tsx +5 -5
  60. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  61. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  62. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  63. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  64. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  65. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  66. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  67. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  68. package/src/Invoice/_test/seller/index.tsx +28 -28
  69. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  70. package/src/Invoice/_test/unit/index.tsx +19 -19
  71. package/src/Invoice/index.less +29 -29
  72. package/src/Invoice/index.md +53 -53
  73. package/src/Invoice/index.tsx +171 -171
  74. package/src/Invoice/tools/calculate/index.ts +132 -132
  75. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  76. package/src/Invoice/tools/evaluate/index.ts +7 -7
  77. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  78. package/src/Invoice/tools/itemName/index.ts +55 -55
  79. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  80. package/src/Invoice/tools/mounting/index.ts +13 -13
  81. package/src/Invoice/tools/strringFn/index.ts +40 -40
  82. package/src/Invoice/tools/useToGenerateId/index.ts +8 -8
  83. package/src/Invoice/tools/utils/index.ts +1 -1
  84. package/src/Invoice/tools/utils/money/index.ts +20 -20
  85. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  86. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  87. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  88. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  89. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  90. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  91. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +550 -550
  92. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +632 -632
  93. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +694 -694
  94. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  95. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  96. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  97. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +47 -47
  98. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  99. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +88 -88
  100. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  101. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  102. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  103. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  104. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  105. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  106. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  107. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  108. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  109. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  110. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +39 -39
  111. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +114 -114
  112. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  113. package/src/Invoice/ui/default/GoodsList/index.less +179 -179
  114. package/src/Invoice/ui/default/GoodsList/index.tsx +205 -205
  115. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +65 -65
  116. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  117. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  118. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  119. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  120. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  121. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  122. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  123. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  124. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  125. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  126. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  127. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  128. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  129. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  130. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  131. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +28 -28
  132. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +57 -57
  133. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  134. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +108 -108
  135. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  136. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  137. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  138. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  139. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +198 -198
  140. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  141. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  142. package/src/Invoice/ui/default/Seller/index.less +113 -113
  143. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  144. package/src/Invoice/ui/default/Sign/index.less +14 -14
  145. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  146. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +624 -624
  147. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +654 -654
  148. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  149. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  150. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  151. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  152. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +84 -84
  153. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  154. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  155. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  156. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  157. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  158. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  159. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  160. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  161. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  162. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +39 -39
  163. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  164. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  165. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  166. package/src/Invoice/ui/digtal/GoodsList/index.tsx +180 -180
  167. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +65 -65
  168. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -339
  169. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  170. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  171. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  172. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  173. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  174. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  175. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  176. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  177. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +50 -50
  178. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  179. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  180. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  181. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  182. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +53 -53
  183. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  184. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +108 -108
  185. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual.o/index.less +44 -44
  186. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  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/Sign/index.less +48 -48
  191. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  192. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  193. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +395 -395
  194. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  195. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  196. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  197. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  198. package/src/InvoiceTypeModal/index.less +7 -7
  199. package/src/InvoiceTypeModal/index.md +5 -5
  200. package/src/InvoiceTypeModal/index.tsx +153 -153
  201. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +177 -177
  202. package/src/TaxClassificationCodeModal/index.md +6 -6
  203. package/src/TaxClassificationCodeModal/index.tsx +74 -74
  204. package/src/index.ts +12 -12
  205. package/tsconfig.json +31 -31
  206. package/typings.d.ts +3 -3
  207. package/yarn.e.lock +14331 -14331
@@ -1,395 +1,395 @@
1
-
2
- import React from 'react';
3
- import Icon from '@ant-design/icons';
4
- import { decorator } from "grey-react-box";
5
- import { Form } from "kts-components-antd-x3";
6
- import { AutoComplete, Button, Checkbox, Col, Input, InputProps, Row, Tooltip } from 'kts-xui'
7
- import { CheckboxChangeEvent } from 'kts-components-antd-x4/lib/checkbox';
8
- import { FormComponentProps } from "kts-components-antd-x3/lib/form";
9
- import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
10
- import { ReactComponent as ArrowUpSvg } from './svg/arrowUp.svg';
11
- import { ReactComponent as ArrowDownSvg } from './svg/arrowDown.svg';
12
- import { ReactComponent as PlusSvg } from './svg/plus.svg'
13
- import InvoiceController from "../../../InvoiceController";
14
- import Invoice from "../../../../Invoice";
15
- import './index.less';
16
- import classNames from 'classnames';
17
-
18
- const RULES = {
19
- companyName: (label: string) => [
20
- { required: true, message: `${label}必填` },
21
- { max: 100, message: `${label}内容超长` }
22
- ],
23
- taxId: (label: string) => [
24
- { max: 20, message: `${label}内容超长` },
25
- { pattern: /^([a-zA-Z0-9])*$/g, message: `${label}仅能数字、英文` }
26
- ],
27
- buyerTelPhone: (label: string) => [
28
- { max: 100, message: `${label}内容超长` },
29
- { pattern: /^[0-9\s\-\+]+$/g, message: `${label}仅能数字、空格、-、+` }
30
- ],
31
- sellerTelPhone: (label: string) => [
32
- { required: true, message: `${label}必填` },
33
- { max: 100, message: `${label}内容超长` },
34
- { pattern: /^[0-9\s\-\+]+$/g, message: `${label}仅能数字、空格、-、+` }
35
- ],
36
- bankName: (label: string) => [
37
- { max: 100, message: `${label}内容超长` }
38
- ],
39
- bankAccount: (label: string) => [
40
- { max: 100, message: `${label}内容超长` },
41
- { pattern: /^([0-9a-zA-Z-\s])*$/g, message: `${label}仅能数字、字母、-、空格` }
42
- ]
43
- }
44
-
45
- const formatCompanyName = (e: any) => {
46
- const value = e?.target?.value;
47
- if (value) {
48
- return value.replace('(', '(').replace(')', ')').replace(' ', '');
49
- }
50
- }
51
-
52
- export interface IStakeholder {
53
-
54
- /** 是否显示导入按钮 */
55
- isShowImportButton?: boolean;
56
-
57
- /** 点击了 */
58
- onClickImportButton?: (e: InvoiceController) => void
59
-
60
- /** 查看当前可用授信额度 */
61
- lineCredit?: React.ReactNode;
62
-
63
- /** 票种类型 */
64
- isVatNormal?: boolean;
65
-
66
- /** 是否可以选择自然人 */
67
- isNaturalPerson?: boolean;
68
- }
69
-
70
- /** 干系人 */
71
- export default decorator<IStakeholder, IStakeholder & FormComponentProps>(Form.create())(props => {
72
-
73
- const { form, isShowImportButton, onClickImportButton, isVatNormal = false } = props;
74
-
75
- const [isExpand, setExpand] = React.useState(true);
76
-
77
- const { getFieldDecorator } = form;
78
-
79
- const controller = Invoice.useInvoiceController();
80
-
81
- const model = controller.useMemo(s => s.model, []);
82
-
83
- const disableds = controller.useMemo(s => s.stakeholder.disableds || [], []);
84
-
85
- const rulesMap = controller.useMemo(s => s.stakeholder.rulesMap || {}, []);
86
-
87
- const readOnly = React.useMemo(() => {
88
- if (model === 'readOnly') return true;
89
- if (model === 'prefab') return true;
90
- return false;
91
- }, [model]);
92
-
93
- const onExpand = React.useCallback(() => { setExpand(e => !e) }, []);
94
-
95
- const isReadOnly = React.useCallback(field => readOnly || disableds.indexOf(field) >= 0, [disableds, readOnly]);
96
-
97
- const getRules = React.useCallback((field, defaultRules) => {
98
- if (isReadOnly(field)) return [];
99
- return rulesMap[field] || defaultRules;
100
- }, [rulesMap, isReadOnly, isReadOnly]);
101
-
102
- controller.useForm('stakeholder', form);
103
-
104
- return (
105
- <div className={classNames("kts-invoice-operate-invoice-digtal-stakeholder", { readOnly: readOnly })} >
106
- <div>
107
- {'购买方信息'.split('').map(e => <span>{e}</span>)}
108
- {
109
- !readOnly &&
110
- <Icon
111
- className="digtal-stakeholder-expand-button"
112
- component={isExpand ? ArrowUpSvg : ArrowDownSvg}
113
- onClick={onExpand}
114
- />
115
- }
116
- </div>
117
- <div>
118
- <div style={{ marginTop: 20 }} className='natural-person-flag' >
119
- {
120
- props.isNaturalPerson === true &&
121
- <Form.Item colon={false}>
122
- {getFieldDecorator('naturalPersonFlag', {
123
- })(
124
- <NaturalPersonFlag readOnly={isReadOnly('naturalPersonFlag')} />
125
- )}
126
- </Form.Item>
127
- }
128
- </div>
129
- <Form className="digtal-stakeholder-form" >
130
- <Row gutter={[16, 0]}>
131
- <Col span={24} >
132
- <Form.Item label='名称' colon={false}>
133
- {getFieldDecorator('buyerName', {
134
- rules: getRules('buyerName', RULES.companyName('购买方名称')),
135
- })(
136
- <BuyerNameInput
137
- myform={form}
138
- fieldName='buyerName'
139
- readOnly={isReadOnly('buyerName')}
140
- placeholder="请输入名称"
141
- autoComplete="off"
142
- suffix={
143
- isShowImportButton === true &&
144
- <Button
145
- type='link'
146
- style={{ padding: 0, width: 20, height: '100%' }}
147
- icon={<Icon component={PlusSvg} />}
148
- onClick={() => { onClickImportButton && onClickImportButton(controller) }}
149
- />
150
- }
151
- />
152
- )}
153
- </Form.Item>
154
- </Col>
155
-
156
- <Col span={24} >
157
- <Form.Item label='统一社会信用代码/纳税人识别号' colon={false}>
158
- {getFieldDecorator('buyerTaxId', {
159
- rules: getRules('buyerTaxId', [{ required: !isVatNormal, message: '购买方纳税人识别号必填' }, ...RULES.taxId('购买方纳税人识别号')])
160
- })(
161
- <BuyerNameInput
162
- myform={form}
163
- fieldName='buyerTaxId'
164
- readOnly={isReadOnly('buyerTaxId')}
165
- placeholder="请输入统一社会信用代码/纳税人识别号"
166
- autoComplete="off"
167
- />
168
- )}
169
- </Form.Item>
170
- </Col>
171
- {
172
- isExpand && (
173
- <>
174
- <Col span={14} >
175
- <Form.Item label='购买方地址' colon={false}>
176
- {getFieldDecorator('buyerAddress', {
177
- rules: getRules('buyerAddress', [{ max: 100, message: '购买方地址内容超长' }])
178
- })(<MyInput readOnly={isReadOnly('buyerAddress')} placeholder="请输入购买方地址" autoComplete="off" />)}
179
- </Form.Item>
180
- </Col>
181
-
182
- <Col span={10} >
183
- <Form.Item label='电话' colon={false} className='telephone'>
184
- {getFieldDecorator('buyerPhone', {
185
- rules: getRules('buyerPhone', RULES.buyerTelPhone('购买方电话'))
186
- })(<MyInput readOnly={isReadOnly('buyerPhone')} placeholder="请输入电话" autoComplete="off" />)}
187
- </Form.Item>
188
- </Col>
189
-
190
- <Col span={14} >
191
- <Form.Item label='购买方开户银行' colon={false}>
192
- {getFieldDecorator('buyerBank', {
193
- rules: getRules('buyerBank', RULES.bankName('购买方开户银行'))
194
- })(<MyInput readOnly={isReadOnly('buyerBank')} placeholder="请输入购买方开户银行" autoComplete="off" />)}
195
- </Form.Item>
196
- </Col>
197
-
198
- <Col span={10} >
199
- <Form.Item label='银行账号' colon={false}>
200
- {getFieldDecorator('buyerAccount', {
201
- rules: getRules('buyerAccount', RULES.bankAccount('购买方银行账号'))
202
- })(<MyInput readOnly={isReadOnly('buyerAccount')} placeholder="请输入银行账号" autoComplete="off" />)}
203
- </Form.Item>
204
- </Col>
205
- </>
206
- )
207
- }
208
- </Row>
209
- </Form>
210
- </div>
211
- <div>
212
- {'销售方信息'.split('').map(e => <span>{e}</span>)}
213
- {
214
- !readOnly &&
215
- <Icon
216
- className="digtal-stakeholder-expand-button"
217
- component={isExpand ? ArrowUpSvg : ArrowDownSvg}
218
- onClick={onExpand}
219
- />
220
- }
221
- </div>
222
- <div>
223
- {
224
- !readOnly && props.lineCredit &&
225
- <div style={{ marginTop: 20 }} >
226
- <Tooltip trigger="click" title={props.lineCredit} >
227
- <Button type="link" style={{ padding: `0px 8px` }} >查看当前可用授信额度</Button>
228
- </Tooltip>
229
- </div>
230
- }
231
- <Form className="digtal-stakeholder-form" >
232
- <Row gutter={[16, 0]}>
233
- <Col span={24} >
234
- <Form.Item label='名称' colon={false}>
235
- {getFieldDecorator('supplierName', {
236
- rules: getRules('supplierName', RULES.companyName('销售方名称')),
237
- getValueFromEvent: formatCompanyName
238
- })(<MyInput readOnly={isReadOnly('supplierName')} placeholder="请输入名称" autoComplete="off" />)}
239
- </Form.Item>
240
- </Col>
241
-
242
- <Col span={24} >
243
- <Form.Item label='统一社会信用代码/纳税人识别号' colon={false}>
244
- {getFieldDecorator('supplierTaxId', {
245
- rules: getRules('supplierTaxId', [{ required: true, message: '销售方纳税人识别号必填' }, ...RULES.taxId('销售方纳税人识别号')])
246
- })(<MyInput readOnly={isReadOnly('supplierTaxId')} placeholder="请输入统一社会信用代码/纳税人识别号" autoComplete="off" />)}
247
- </Form.Item>
248
- </Col>
249
- {
250
- isExpand && (
251
- <>
252
- <Col span={12} >
253
- <Form.Item label='销售方地址' colon={false}>
254
- {getFieldDecorator('sellerAddress', {
255
- rules: getRules('sellerAddress', [{ max: 300, message: '销售方地址内容超长' }])
256
- })(<MyInput readOnly={isReadOnly('sellerAddress')} placeholder="请输入销售方地址" autoComplete="off" />)}
257
- </Form.Item>
258
- </Col>
259
-
260
- <Col span={12} >
261
- <Form.Item label='电话' colon={false} className='telephone' >
262
- {getFieldDecorator('sellerPhone', {
263
- rules: getRules('sellerPhone', RULES.sellerTelPhone('销售方电话'))
264
- })(<MyInput readOnly={isReadOnly('sellerPhone')} placeholder="请输入电话" autoComplete="off" />)}
265
- </Form.Item>
266
- </Col>
267
-
268
- <Col span={12} >
269
- <Form.Item label='销售方开户银行' colon={false}>
270
- {getFieldDecorator('sellerBank', {
271
- rules: getRules('sellerBank', RULES.bankName('销售方开户银行'))
272
- })(<MyInput readOnly={isReadOnly('sellerBank')} placeholder="请输入销售方开户银行" autoComplete="off" />)}
273
- </Form.Item>
274
- </Col>
275
-
276
- <Col span={12} >
277
- <Form.Item label='银行账号' colon={false}>
278
- {getFieldDecorator('sellerAccount', {
279
- rules: getRules('sellerAccount', RULES.bankAccount('销售方银行账号'))
280
- })(<MyInput readOnly={isReadOnly('sellerAccount')} placeholder="请输入银行账号" autoComplete="off" />)}
281
- </Form.Item>
282
- </Col>
283
- </>
284
- )
285
- }
286
- </Row>
287
- </Form>
288
- </div>
289
- </div>
290
- )
291
- })
292
-
293
- function NaturalPersonFlag(props: {
294
- // NATURAL("自然人"), COMPANY("非自然人");
295
- value?: 'COMPANY' | 'NATURAL',
296
- onChange?: (e: 'COMPANY' | 'NATURAL') => void
297
- readOnly?: boolean;
298
- }) {
299
-
300
- const [value, setValue] = React.useState(props.value || 'COMPANY');
301
-
302
- const onChange = React.useCallback((e: CheckboxChangeEvent) => {
303
- if (props.readOnly) return;
304
- setValue(e.target.checked ? 'NATURAL' : 'COMPANY');
305
- props.onChange && props.onChange(e.target.checked ? 'NATURAL' : 'COMPANY');
306
- }, [props.onChange, props.readOnly])
307
-
308
- React.useEffect(() => {
309
- setValue(props.value || 'COMPANY')
310
- }, [props.value])
311
-
312
- return (
313
- <Checkbox
314
- disabled={props.readOnly}
315
- checked={value === 'NATURAL'}
316
- onChange={onChange}
317
- >
318
- 是否开票给自然人
319
- </Checkbox>
320
- )
321
- }
322
-
323
- function BuyerNameInput(props: InputProps & { fieldName: string; myform: WrappedFormUtils<any> }) {
324
-
325
- const { fieldName, myform: form } = props;
326
-
327
- const controller = Invoice.useInvoiceController();
328
-
329
- const autoComplete = controller.useMemo(s => s.autoComplete, [])
330
-
331
- const [options, setOptions] = React.useState<any[]>([])
332
-
333
- const onChangeAutoComplete = React.useCallback(value => {
334
- const record = options.filter(e => e[fieldName] === value)[0] as any;
335
- if (!record || !form) return;
336
-
337
- form.setFieldsValue(record);
338
- setOptions([])
339
- }, [options, fieldName, form])
340
-
341
- const onSearch = React.useCallback(async (searchText: string) => {
342
- await Discontinue.start();
343
- try {
344
- if (fieldName === 'buyerName') {
345
- if (autoComplete.onBuyerNameSearch) {
346
- setOptions(await autoComplete.onBuyerNameSearch(searchText));
347
- }
348
- } else if (fieldName === 'buyerTaxId') {
349
- if (autoComplete.onBuyerTaxIdSearch) {
350
- setOptions(await autoComplete.onBuyerTaxIdSearch(searchText));
351
- }
352
- }
353
-
354
- } catch (error) {
355
- setOptions([]);
356
- throw error;
357
- }
358
- }, [autoComplete.onBuyerNameSearch, fieldName])
359
-
360
- if (props.readOnly) return <span className='digtal-stakeholder-form-text'>{props.value}</span>;
361
-
362
- return (
363
- <AutoComplete
364
- onSearch={onSearch}
365
- options={options.map(e => ({ value: e[fieldName] }))}
366
- onChange={onChangeAutoComplete}
367
- value={props.value}
368
- style={{ width: '100%' }}
369
- >
370
- <Input {...props} style={{ width: '100%', ...props.style }} />
371
- </AutoComplete>
372
- )
373
- }
374
-
375
- class MyInput extends React.Component<InputProps>{
376
- render() {
377
- const props = this.props;
378
- if (props.readOnly) {
379
- return <span className='digtal-stakeholder-form-text'>{props.value}</span>
380
- } else {
381
- return <Input {...props} />
382
- }
383
- }
384
- }
385
-
386
- class Discontinue {
387
-
388
- private static timer: any;
389
-
390
- static start = (interval = 200) => new Promise<void>(resolve => {
391
- clearTimeout(Discontinue.timer);
392
- Discontinue.timer = setTimeout(resolve, interval);
393
- })
394
- }
395
-
1
+
2
+ import React from 'react';
3
+ import Icon from '@ant-design/icons';
4
+ import { decorator } from "grey-react-box";
5
+ import { Form } from "kts-components-antd-x3";
6
+ import { AutoComplete, Button, Checkbox, Col, Input, InputProps, Row, Tooltip } from 'kts-xui'
7
+ import { CheckboxChangeEvent } from 'kts-components-antd-x4/lib/checkbox';
8
+ import { FormComponentProps } from "kts-components-antd-x3/lib/form";
9
+ import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
10
+ import { ReactComponent as ArrowUpSvg } from './svg/arrowUp.svg';
11
+ import { ReactComponent as ArrowDownSvg } from './svg/arrowDown.svg';
12
+ import { ReactComponent as PlusSvg } from './svg/plus.svg'
13
+ import InvoiceController from "../../../InvoiceController";
14
+ import Invoice from "../../../../Invoice";
15
+ import './index.less';
16
+ import classNames from 'classnames';
17
+
18
+ const RULES = {
19
+ companyName: (label: string) => [
20
+ { required: true, message: `${label}必填` },
21
+ { max: 100, message: `${label}内容超长` }
22
+ ],
23
+ taxId: (label: string) => [
24
+ { max: 20, message: `${label}内容超长` },
25
+ { pattern: /^([a-zA-Z0-9])*$/g, message: `${label}仅能数字、英文` }
26
+ ],
27
+ buyerTelPhone: (label: string) => [
28
+ { max: 100, message: `${label}内容超长` },
29
+ { pattern: /^[0-9\s\-\+]+$/g, message: `${label}仅能数字、空格、-、+` }
30
+ ],
31
+ sellerTelPhone: (label: string) => [
32
+ { required: true, message: `${label}必填` },
33
+ { max: 100, message: `${label}内容超长` },
34
+ { pattern: /^[0-9\s\-\+]+$/g, message: `${label}仅能数字、空格、-、+` }
35
+ ],
36
+ bankName: (label: string) => [
37
+ { max: 100, message: `${label}内容超长` }
38
+ ],
39
+ bankAccount: (label: string) => [
40
+ { max: 100, message: `${label}内容超长` },
41
+ { pattern: /^([0-9a-zA-Z-\s])*$/g, message: `${label}仅能数字、字母、-、空格` }
42
+ ]
43
+ }
44
+
45
+ const formatCompanyName = (e: any) => {
46
+ const value = e?.target?.value;
47
+ if (value) {
48
+ return value.replace('(', '(').replace(')', ')').replace(' ', '');
49
+ }
50
+ }
51
+
52
+ export interface IStakeholder {
53
+
54
+ /** 是否显示导入按钮 */
55
+ isShowImportButton?: boolean;
56
+
57
+ /** 点击了 */
58
+ onClickImportButton?: (e: InvoiceController) => void
59
+
60
+ /** 查看当前可用授信额度 */
61
+ lineCredit?: React.ReactNode;
62
+
63
+ /** 票种类型 */
64
+ isVatNormal?: boolean;
65
+
66
+ /** 是否可以选择自然人 */
67
+ isNaturalPerson?: boolean;
68
+ }
69
+
70
+ /** 干系人 */
71
+ export default decorator<IStakeholder, IStakeholder & FormComponentProps>(Form.create())(props => {
72
+
73
+ const { form, isShowImportButton, onClickImportButton, isVatNormal = false } = props;
74
+
75
+ const [isExpand, setExpand] = React.useState(true);
76
+
77
+ const { getFieldDecorator } = form;
78
+
79
+ const controller = Invoice.useInvoiceController();
80
+
81
+ const model = controller.useMemo(s => s.model, []);
82
+
83
+ const disableds = controller.useMemo(s => s.stakeholder.disableds || [], []);
84
+
85
+ const rulesMap = controller.useMemo(s => s.stakeholder.rulesMap || {}, []);
86
+
87
+ const readOnly = React.useMemo(() => {
88
+ if (model === 'readOnly') return true;
89
+ if (model === 'prefab') return true;
90
+ return false;
91
+ }, [model]);
92
+
93
+ const onExpand = React.useCallback(() => { setExpand(e => !e) }, []);
94
+
95
+ const isReadOnly = React.useCallback(field => readOnly || disableds.indexOf(field) >= 0, [disableds, readOnly]);
96
+
97
+ const getRules = React.useCallback((field, defaultRules) => {
98
+ if (isReadOnly(field)) return [];
99
+ return rulesMap[field] || defaultRules;
100
+ }, [rulesMap, isReadOnly, isReadOnly]);
101
+
102
+ controller.useForm('stakeholder', form);
103
+
104
+ return (
105
+ <div className={classNames("kts-invoice-operate-invoice-digtal-stakeholder", { readOnly: readOnly })} >
106
+ <div>
107
+ {'购买方信息'.split('').map(e => <span>{e}</span>)}
108
+ {
109
+ !readOnly &&
110
+ <Icon
111
+ className="digtal-stakeholder-expand-button"
112
+ component={isExpand ? ArrowUpSvg : ArrowDownSvg}
113
+ onClick={onExpand}
114
+ />
115
+ }
116
+ </div>
117
+ <div>
118
+ <div style={{ marginTop: 20 }} className='natural-person-flag' >
119
+ {
120
+ props.isNaturalPerson === true &&
121
+ <Form.Item colon={false}>
122
+ {getFieldDecorator('naturalPersonFlag', {
123
+ })(
124
+ <NaturalPersonFlag readOnly={isReadOnly('naturalPersonFlag')} />
125
+ )}
126
+ </Form.Item>
127
+ }
128
+ </div>
129
+ <Form className="digtal-stakeholder-form" >
130
+ <Row gutter={[16, 0]}>
131
+ <Col span={24} >
132
+ <Form.Item label='名称' colon={false}>
133
+ {getFieldDecorator('buyerName', {
134
+ rules: getRules('buyerName', RULES.companyName('购买方名称')),
135
+ })(
136
+ <BuyerNameInput
137
+ myform={form}
138
+ fieldName='buyerName'
139
+ readOnly={isReadOnly('buyerName')}
140
+ placeholder="请输入名称"
141
+ autoComplete="off"
142
+ suffix={
143
+ isShowImportButton === true &&
144
+ <Button
145
+ type='link'
146
+ style={{ padding: 0, width: 20, height: '100%' }}
147
+ icon={<Icon component={PlusSvg} />}
148
+ onClick={() => { onClickImportButton && onClickImportButton(controller) }}
149
+ />
150
+ }
151
+ />
152
+ )}
153
+ </Form.Item>
154
+ </Col>
155
+
156
+ <Col span={24} >
157
+ <Form.Item label='统一社会信用代码/纳税人识别号' colon={false}>
158
+ {getFieldDecorator('buyerTaxId', {
159
+ rules: getRules('buyerTaxId', [{ required: !isVatNormal, message: '购买方纳税人识别号必填' }, ...RULES.taxId('购买方纳税人识别号')])
160
+ })(
161
+ <BuyerNameInput
162
+ myform={form}
163
+ fieldName='buyerTaxId'
164
+ readOnly={isReadOnly('buyerTaxId')}
165
+ placeholder="请输入统一社会信用代码/纳税人识别号"
166
+ autoComplete="off"
167
+ />
168
+ )}
169
+ </Form.Item>
170
+ </Col>
171
+ {
172
+ isExpand && (
173
+ <>
174
+ <Col span={14} >
175
+ <Form.Item label='购买方地址' colon={false}>
176
+ {getFieldDecorator('buyerAddress', {
177
+ rules: getRules('buyerAddress', [{ max: 100, message: '购买方地址内容超长' }])
178
+ })(<MyInput readOnly={isReadOnly('buyerAddress')} placeholder="请输入购买方地址" autoComplete="off" />)}
179
+ </Form.Item>
180
+ </Col>
181
+
182
+ <Col span={10} >
183
+ <Form.Item label='电话' colon={false} className='telephone'>
184
+ {getFieldDecorator('buyerPhone', {
185
+ rules: getRules('buyerPhone', RULES.buyerTelPhone('购买方电话'))
186
+ })(<MyInput readOnly={isReadOnly('buyerPhone')} placeholder="请输入电话" autoComplete="off" />)}
187
+ </Form.Item>
188
+ </Col>
189
+
190
+ <Col span={14} >
191
+ <Form.Item label='购买方开户银行' colon={false}>
192
+ {getFieldDecorator('buyerBank', {
193
+ rules: getRules('buyerBank', RULES.bankName('购买方开户银行'))
194
+ })(<MyInput readOnly={isReadOnly('buyerBank')} placeholder="请输入购买方开户银行" autoComplete="off" />)}
195
+ </Form.Item>
196
+ </Col>
197
+
198
+ <Col span={10} >
199
+ <Form.Item label='银行账号' colon={false}>
200
+ {getFieldDecorator('buyerAccount', {
201
+ rules: getRules('buyerAccount', RULES.bankAccount('购买方银行账号'))
202
+ })(<MyInput readOnly={isReadOnly('buyerAccount')} placeholder="请输入银行账号" autoComplete="off" />)}
203
+ </Form.Item>
204
+ </Col>
205
+ </>
206
+ )
207
+ }
208
+ </Row>
209
+ </Form>
210
+ </div>
211
+ <div>
212
+ {'销售方信息'.split('').map(e => <span>{e}</span>)}
213
+ {
214
+ !readOnly &&
215
+ <Icon
216
+ className="digtal-stakeholder-expand-button"
217
+ component={isExpand ? ArrowUpSvg : ArrowDownSvg}
218
+ onClick={onExpand}
219
+ />
220
+ }
221
+ </div>
222
+ <div>
223
+ {
224
+ !readOnly && props.lineCredit &&
225
+ <div style={{ marginTop: 20 }} >
226
+ <Tooltip trigger="click" title={props.lineCredit} >
227
+ <Button type="link" style={{ padding: `0px 8px` }} >查看当前可用授信额度</Button>
228
+ </Tooltip>
229
+ </div>
230
+ }
231
+ <Form className="digtal-stakeholder-form" >
232
+ <Row gutter={[16, 0]}>
233
+ <Col span={24} >
234
+ <Form.Item label='名称' colon={false}>
235
+ {getFieldDecorator('supplierName', {
236
+ rules: getRules('supplierName', RULES.companyName('销售方名称')),
237
+ getValueFromEvent: formatCompanyName
238
+ })(<MyInput readOnly={isReadOnly('supplierName')} placeholder="请输入名称" autoComplete="off" />)}
239
+ </Form.Item>
240
+ </Col>
241
+
242
+ <Col span={24} >
243
+ <Form.Item label='统一社会信用代码/纳税人识别号' colon={false}>
244
+ {getFieldDecorator('supplierTaxId', {
245
+ rules: getRules('supplierTaxId', [{ required: true, message: '销售方纳税人识别号必填' }, ...RULES.taxId('销售方纳税人识别号')])
246
+ })(<MyInput readOnly={isReadOnly('supplierTaxId')} placeholder="请输入统一社会信用代码/纳税人识别号" autoComplete="off" />)}
247
+ </Form.Item>
248
+ </Col>
249
+ {
250
+ isExpand && (
251
+ <>
252
+ <Col span={12} >
253
+ <Form.Item label='销售方地址' colon={false}>
254
+ {getFieldDecorator('sellerAddress', {
255
+ rules: getRules('sellerAddress', [{ max: 300, message: '销售方地址内容超长' }])
256
+ })(<MyInput readOnly={isReadOnly('sellerAddress')} placeholder="请输入销售方地址" autoComplete="off" />)}
257
+ </Form.Item>
258
+ </Col>
259
+
260
+ <Col span={12} >
261
+ <Form.Item label='电话' colon={false} className='telephone' >
262
+ {getFieldDecorator('sellerPhone', {
263
+ rules: getRules('sellerPhone', RULES.sellerTelPhone('销售方电话'))
264
+ })(<MyInput readOnly={isReadOnly('sellerPhone')} placeholder="请输入电话" autoComplete="off" />)}
265
+ </Form.Item>
266
+ </Col>
267
+
268
+ <Col span={12} >
269
+ <Form.Item label='销售方开户银行' colon={false}>
270
+ {getFieldDecorator('sellerBank', {
271
+ rules: getRules('sellerBank', RULES.bankName('销售方开户银行'))
272
+ })(<MyInput readOnly={isReadOnly('sellerBank')} placeholder="请输入销售方开户银行" autoComplete="off" />)}
273
+ </Form.Item>
274
+ </Col>
275
+
276
+ <Col span={12} >
277
+ <Form.Item label='银行账号' colon={false}>
278
+ {getFieldDecorator('sellerAccount', {
279
+ rules: getRules('sellerAccount', RULES.bankAccount('销售方银行账号'))
280
+ })(<MyInput readOnly={isReadOnly('sellerAccount')} placeholder="请输入银行账号" autoComplete="off" />)}
281
+ </Form.Item>
282
+ </Col>
283
+ </>
284
+ )
285
+ }
286
+ </Row>
287
+ </Form>
288
+ </div>
289
+ </div>
290
+ )
291
+ })
292
+
293
+ function NaturalPersonFlag(props: {
294
+ // NATURAL("自然人"), COMPANY("非自然人");
295
+ value?: 'COMPANY' | 'NATURAL',
296
+ onChange?: (e: 'COMPANY' | 'NATURAL') => void
297
+ readOnly?: boolean;
298
+ }) {
299
+
300
+ const [value, setValue] = React.useState(props.value || 'COMPANY');
301
+
302
+ const onChange = React.useCallback((e: CheckboxChangeEvent) => {
303
+ if (props.readOnly) return;
304
+ setValue(e.target.checked ? 'NATURAL' : 'COMPANY');
305
+ props.onChange && props.onChange(e.target.checked ? 'NATURAL' : 'COMPANY');
306
+ }, [props.onChange, props.readOnly])
307
+
308
+ React.useEffect(() => {
309
+ setValue(props.value || 'COMPANY')
310
+ }, [props.value])
311
+
312
+ return (
313
+ <Checkbox
314
+ disabled={props.readOnly}
315
+ checked={value === 'NATURAL'}
316
+ onChange={onChange}
317
+ >
318
+ 是否开票给自然人
319
+ </Checkbox>
320
+ )
321
+ }
322
+
323
+ function BuyerNameInput(props: InputProps & { fieldName: string; myform: WrappedFormUtils<any> }) {
324
+
325
+ const { fieldName, myform: form } = props;
326
+
327
+ const controller = Invoice.useInvoiceController();
328
+
329
+ const autoComplete = controller.useMemo(s => s.autoComplete, [])
330
+
331
+ const [options, setOptions] = React.useState<any[]>([])
332
+
333
+ const onChangeAutoComplete = React.useCallback(value => {
334
+ const record = options.filter(e => e[fieldName] === value)[0] as any;
335
+ if (!record || !form) return;
336
+
337
+ form.setFieldsValue(record);
338
+ setOptions([])
339
+ }, [options, fieldName, form])
340
+
341
+ const onSearch = React.useCallback(async (searchText: string) => {
342
+ await Discontinue.start();
343
+ try {
344
+ if (fieldName === 'buyerName') {
345
+ if (autoComplete.onBuyerNameSearch) {
346
+ setOptions(await autoComplete.onBuyerNameSearch(searchText));
347
+ }
348
+ } else if (fieldName === 'buyerTaxId') {
349
+ if (autoComplete.onBuyerTaxIdSearch) {
350
+ setOptions(await autoComplete.onBuyerTaxIdSearch(searchText));
351
+ }
352
+ }
353
+
354
+ } catch (error) {
355
+ setOptions([]);
356
+ throw error;
357
+ }
358
+ }, [autoComplete.onBuyerNameSearch, fieldName])
359
+
360
+ if (props.readOnly) return <span className='digtal-stakeholder-form-text'>{props.value}</span>;
361
+
362
+ return (
363
+ <AutoComplete
364
+ onSearch={onSearch}
365
+ options={options.map(e => ({ value: e[fieldName] }))}
366
+ onChange={onChangeAutoComplete}
367
+ value={props.value}
368
+ style={{ width: '100%' }}
369
+ >
370
+ <Input {...props} style={{ width: '100%', ...props.style }} />
371
+ </AutoComplete>
372
+ )
373
+ }
374
+
375
+ class MyInput extends React.Component<InputProps>{
376
+ render() {
377
+ const props = this.props;
378
+ if (props.readOnly) {
379
+ return <span className='digtal-stakeholder-form-text'>{props.value}</span>
380
+ } else {
381
+ return <Input {...props} />
382
+ }
383
+ }
384
+ }
385
+
386
+ class Discontinue {
387
+
388
+ private static timer: any;
389
+
390
+ static start = (interval = 200) => new Promise<void>(resolve => {
391
+ clearTimeout(Discontinue.timer);
392
+ Discontinue.timer = setTimeout(resolve, interval);
393
+ })
394
+ }
395
+