kts-component-invoice-operate 3.2.244 → 3.2.246

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 (278) 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/BRANCH.md +5 -0
  8. package/README.md +12 -12
  9. package/branch/3.2.x +1 -0
  10. package/dist/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.d.ts +2 -0
  11. package/dist/Invoice/ui/digtal/StakeFarmerholder/index.d.ts +2 -0
  12. package/dist/index.esm.js +126 -7
  13. package/dist/index.js +126 -7
  14. package/docs/index.md +5 -5
  15. package/docs-dist/404.html +33 -33
  16. package/docs-dist/index.html +33 -33
  17. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  18. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  19. package/docs-dist/static/fork.5431267d.svg +11 -11
  20. package/docs-dist/static/plus.44013ce3.svg +11 -11
  21. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  22. package/docs-dist/umi.css +18 -18
  23. package/index.html +12 -12
  24. package/package.json +62 -62
  25. package/src/Invoice/Invoice-digtal/_test/architecture/index.tsx +21 -21
  26. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +40 -40
  27. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +214 -214
  28. package/src/Invoice/Invoice-digtal/_test/freight/index.tsx +14580 -14580
  29. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  30. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  31. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +18 -18
  32. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -19
  33. package/src/Invoice/Invoice-digtal/_test/pay/index.tsx +14636 -14636
  34. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  35. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +55 -55
  36. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +83 -83
  37. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  38. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  39. package/src/Invoice/Invoice-digtal/index.md +44 -44
  40. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +116 -116
  41. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +26 -26
  42. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  43. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IColumnsReplenish/index.ts +10 -10
  44. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IGood/index.ts +33 -33
  45. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/ImportGoods/index.ts +81 -81
  46. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/index.ts +39 -39
  47. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  48. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  49. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  50. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +91 -90
  51. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +84 -84
  52. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  53. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  54. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +134 -134
  55. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/IColumnsReplenish/index.ts +10 -10
  56. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/IGood/index.ts +35 -35
  57. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/ImportGoods/index.ts +81 -81
  58. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/index.ts +39 -39
  59. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  60. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +76 -76
  61. package/src/Invoice/InvoiceController/fns/addFreight.ts +11 -11
  62. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  63. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  64. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  65. package/src/Invoice/InvoiceController/fns/addPay.ts +11 -11
  66. package/src/Invoice/InvoiceController/fns/delFreight.ts +38 -38
  67. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  68. package/src/Invoice/InvoiceController/fns/delPay.ts +38 -38
  69. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  70. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  71. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  72. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  73. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  74. package/src/Invoice/InvoiceController/fns/saveEditFreight.ts +24 -24
  75. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  76. package/src/Invoice/InvoiceController/fns/saveEditPay.ts +23 -23
  77. package/src/Invoice/InvoiceController/fns/setEditFreight.ts +16 -16
  78. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  79. package/src/Invoice/InvoiceController/fns/setEditPay.ts +16 -16
  80. package/src/Invoice/InvoiceController/fns/setFreight.ts +10 -10
  81. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  82. package/src/Invoice/InvoiceController/fns/setPay.ts +10 -10
  83. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  84. package/src/Invoice/InvoiceController/index.ts +127 -127
  85. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  86. package/src/Invoice/_test/children/index.tsx +214 -214
  87. package/src/Invoice/_test/deduction/index.tsx +956 -957
  88. package/src/Invoice/_test/draft/index.tsx +40 -40
  89. package/src/Invoice/_test/easiest/index.tsx +5 -5
  90. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  91. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  92. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  93. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  94. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  95. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  96. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  97. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  98. package/src/Invoice/_test/seller/index.tsx +28 -28
  99. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  100. package/src/Invoice/_test/unit/index.tsx +19 -19
  101. package/src/Invoice/index.less +31 -31
  102. package/src/Invoice/index.md +56 -56
  103. package/src/Invoice/index.tsx +200 -200
  104. package/src/Invoice/tools/calculate/index.ts +144 -144
  105. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  106. package/src/Invoice/tools/evaluate/index.ts +7 -7
  107. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  108. package/src/Invoice/tools/itemName/index.ts +55 -55
  109. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  110. package/src/Invoice/tools/mounting/index.ts +13 -13
  111. package/src/Invoice/tools/strringFn/index.ts +40 -40
  112. package/src/Invoice/tools/useToGenerateId/index.ts +12 -12
  113. package/src/Invoice/tools/utils/index.ts +1 -1
  114. package/src/Invoice/tools/utils/money/index.ts +20 -20
  115. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  116. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  117. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  118. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  119. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  120. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  121. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +612 -612
  122. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +681 -647
  123. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +769 -719
  124. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  125. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  126. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Expand/index.tsx +57 -57
  127. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  128. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +49 -49
  129. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  130. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +91 -91
  131. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  132. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  133. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  134. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/dist/index.js +32 -32
  135. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  136. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  137. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  138. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +99 -99
  139. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  140. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  141. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  142. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +52 -52
  143. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +120 -120
  144. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  145. package/src/Invoice/ui/default/GoodsList/index.less +185 -185
  146. package/src/Invoice/ui/default/GoodsList/index.tsx +207 -207
  147. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +72 -72
  148. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  149. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  150. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  151. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  152. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  153. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  154. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  155. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  156. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  157. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  158. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  159. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  160. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  161. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  162. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  163. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +40 -40
  164. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +71 -71
  165. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  166. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +130 -130
  167. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  168. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  169. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  170. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  171. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +201 -201
  172. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  173. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  174. package/src/Invoice/ui/default/Seller/index.less +113 -113
  175. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  176. package/src/Invoice/ui/default/Sign/index.less +14 -14
  177. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  178. package/src/Invoice/ui/digtal/Architecture/index.less +18 -18
  179. package/src/Invoice/ui/digtal/Architecture/index.tsx +177 -177
  180. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/dist/index.js +616 -616
  181. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/index.tsx +246 -246
  182. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  183. package/src/Invoice/ui/digtal/FreightList/hook/useOnRow/index.tsx +37 -37
  184. package/src/Invoice/ui/digtal/FreightList/hook/useRowSelection/index.tsx +119 -119
  185. package/src/Invoice/ui/digtal/FreightList/hook/useWindowClick/index.tsx +23 -23
  186. package/src/Invoice/ui/digtal/FreightList/index.less +72 -72
  187. package/src/Invoice/ui/digtal/FreightList/index.tsx +129 -129
  188. package/src/Invoice/ui/digtal/FreightList/ui/AddRowButton/index.tsx +74 -74
  189. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  190. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +36 -36
  191. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.less +28 -28
  192. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.tsx +20 -20
  193. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.less +38 -38
  194. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.tsx +108 -108
  195. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +683 -683
  196. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/dist/index.js +616 -616
  197. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +723 -724
  198. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  199. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  200. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  201. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  202. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +87 -87
  203. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  204. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  205. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  206. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  207. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  208. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  209. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  210. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  211. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  212. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +51 -51
  213. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  214. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  215. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  216. package/src/Invoice/ui/digtal/GoodsList/index.tsx +181 -181
  217. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +87 -87
  218. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -340
  219. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  220. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  221. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  222. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  223. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  224. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  225. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  226. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  227. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +60 -60
  228. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  229. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  230. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  231. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  232. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +52 -52
  233. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  234. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +113 -113
  235. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +34 -34
  236. package/src/Invoice/ui/digtal/InvoiceHeader/index.less +57 -57
  237. package/src/Invoice/ui/digtal/InvoiceHeader/index.tsx +77 -77
  238. package/src/Invoice/ui/digtal/PayList/hook/useColumns/dist/index.js +616 -616
  239. package/src/Invoice/ui/digtal/PayList/hook/useColumns/index.tsx +168 -168
  240. package/src/Invoice/ui/digtal/PayList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  241. package/src/Invoice/ui/digtal/PayList/hook/useOnRow/index.tsx +37 -37
  242. package/src/Invoice/ui/digtal/PayList/hook/useRowSelection/index.tsx +119 -119
  243. package/src/Invoice/ui/digtal/PayList/hook/useWindowClick/index.tsx +19 -19
  244. package/src/Invoice/ui/digtal/PayList/index.less +72 -72
  245. package/src/Invoice/ui/digtal/PayList/index.tsx +132 -132
  246. package/src/Invoice/ui/digtal/PayList/ui/AddRowButton/index.tsx +74 -74
  247. package/src/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  248. package/src/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +36 -36
  249. package/src/Invoice/ui/digtal/PayList/ui/TableRow/index.less +28 -28
  250. package/src/Invoice/ui/digtal/PayList/ui/TableRow/index.tsx +20 -20
  251. package/src/Invoice/ui/digtal/PayList/ui/TableVirtual/index.less +38 -38
  252. package/src/Invoice/ui/digtal/PayList/ui/TableVirtual/index.tsx +108 -108
  253. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +21 -21
  254. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +451 -451
  255. package/src/Invoice/ui/digtal/Sign/index.less +48 -48
  256. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  257. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +99 -99
  258. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +1102 -1096
  259. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowDown.svg +2 -2
  260. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowUp.svg +2 -2
  261. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/plus.svg +11 -11
  262. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  263. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +453 -453
  264. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  265. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  266. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  267. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  268. package/src/InvoiceTypeModal/dist/index.js +92 -92
  269. package/src/InvoiceTypeModal/index.less +7 -7
  270. package/src/InvoiceTypeModal/index.md +5 -5
  271. package/src/InvoiceTypeModal/index.tsx +161 -161
  272. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +184 -184
  273. package/src/TaxClassificationCodeModal/index.less +17 -17
  274. package/src/TaxClassificationCodeModal/index.md +6 -6
  275. package/src/TaxClassificationCodeModal/index.tsx +152 -152
  276. package/src/index.ts +13 -13
  277. package/tsconfig.json +31 -31
  278. package/typings.d.ts +3 -3
@@ -1,725 +1,724 @@
1
-
2
- import React from 'react';
3
- import Icon from '@ant-design/icons';
4
- import { Form } from 'kts-components-antd-x3';
5
- import { ReactComponent as PlusSvg } from './svg/plus.svg'
6
- import { AutoComplete, Select, Button, Input, Spin, Tooltip, InputProps } from 'kts-xui';
7
- import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
8
- import { getItemNameWithShorthand } from '../../../../../tools/itemName';
9
- import { IGood, LineAttributeType } from '../../../../../InvoiceController';
10
- import { chain, bignumber } from 'mathjs';
11
- import Invoice from '../../../../..';
12
- import TitleText from './ui/TitleText';
13
- import ItemNameInput from './ui/ItemNameInput';
14
- import {
15
- onChangeQuantity,
16
- onChangePriceIncludeTax,
17
- onChangePriceExcludeTax,
18
- onChangeLineAmountIncludeTax,
19
- onChangeLineAmountExcludeTax,
20
- onChangeTaxRate,
21
- onChangeItemName,
22
- onChangeTaxAmount,
23
- } from './autoFillFn';
24
- import Drag from './ui/Drag';
25
- import { nonScientificNotation } from '../../../../../tools/calculate';
26
-
27
- export default (form: WrappedFormUtils) => {
28
- const { getFieldDecorator, getFieldValue } = form;
29
-
30
- const controller = Invoice.useInvoiceController();
31
-
32
- const rootElement = controller.useMemo(s => s.rootElement, []);
33
-
34
- /** 是否含税 */
35
- const isTaxIncluded = controller.useMemo(e => e.goodsListState.isTaxIncluded, []);
36
-
37
- /** 组件模式 */
38
- const model = controller.useMemo(e => e.model, []);
39
-
40
- /** 计算类型 */
41
- const calculateType = controller.useMemo(e => e.goodsListState.calculateType, []);
42
-
43
- /** 是否显示我方 */
44
- const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
45
-
46
- /** 正在编辑的货物 */
47
- const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
48
-
49
- /** 是否启用拖拽 */
50
- const isStart = controller.useMemo((e) => e.goodsListState.drag.isStart, []);
51
-
52
- /** 禁用字段 */
53
- const disableds = controller.useMemo((e) => e.stakeholder.disableds || [], []);
54
-
55
- /** 启用字段 */
56
- const enables = controller.useMemo(s => s.stakeholder.enables || [], []);
57
-
58
- /** 搜索条件 */
59
- const searchValue = controller.useMemo((e) => e.goodsListState.searchValue, []);
60
-
61
- /** 税率列表 */
62
- const taxRateList = controller.useMemo((e) => e.goodsListState.taxRateList, []);
63
-
64
- /** 单位列表 */
65
- const unitList = controller.useMemo((e) => e.goodsListState.unitList, []);
66
-
67
- /** 商品表格补充配置 */
68
- const columnsReplenish = controller.useMemo((e) => e.goodsListState.columnsReplenish, []);
69
-
70
- /** 扣除额 */
71
- const deduction = controller.useMemo((e) => e.goodsListState.deduction, []);
72
-
73
- /** 计算中启动字段 */
74
- const changeField = controller.useMemo((e) => e.calculatingField, []);
75
-
76
- const isValidateGood = controller.useMemo(s => s.goodsListState.isValidateGood, [])
77
- /** 计算中启动字段 */
78
- const setChangeField = React.useCallback((value: string) => controller.run(async s => { s.calculatingField = value }), []);
79
-
80
- const isEnables = React.useCallback(field => enables.indexOf(field) >= 0, [enables])
81
-
82
- const onNumberValueChange = React.useCallback((e) => {
83
- const value = e?.target?.value;
84
- if (value) {
85
- return value.replace(/[^0-9-\.]/g, '');
86
- }
87
- }, [])
88
-
89
- /** 获取补充校验规则 */
90
- const getReplenishRules = React.useCallback((id: string) => {
91
- return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
92
- }, [columnsReplenish])
93
-
94
- /** 金额整数位限制,不传默认9位 */
95
- const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
96
-
97
- /** 表头 */
98
- const columns = React.useMemo(() => {
99
- return [
100
- {
101
- title: ' ',
102
- key: 'drag',
103
- width: 40,
104
- align: 'center',
105
- render: (_: any, record: IGood) => <Drag record={record} />
106
- },
107
- {
108
- title: '序号',
109
- key: 'serialNo',
110
- dataIndex: 'serialNo',
111
- width: 50,
112
- render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
113
- },
114
- {
115
- title: <TitleText required >项目名称</TitleText>,
116
- key: 'itemName',
117
- render: (_: string, record: IGood) => {
118
- if (editGood?.$index === record.$index && !disableds.includes('itemName') && model !== 'prefab') {
119
- return (
120
- <Form.Item>
121
- <div style={{ display: 'flex' }} >
122
- {getFieldDecorator('itemName', {
123
- initialValue: isMyShow ? record.itemNameSelf : record.itemName,
124
- rules: [
125
- ...getReplenishRules('itemName'),
126
- {
127
- validator: async (_, __, callback) => {
128
- if (isValidateGood) {
129
- await controller.wait();
130
- const value = controller.state.goodsListState.editGood;
131
- if (!value?.itemName && !value?.itemNameSelf) {
132
- callback('项目名称不能为空');
133
- } else {
134
- return;
135
- }
136
- } else {
137
- callback();
138
- }
139
- }
140
- }
141
- ]
142
- })(
143
- <ItemNameInput
144
- editGood={editGood}
145
- shorthand={editGood.shorthand}
146
- suffix={
147
- <Tooltip title="点击从商品管理中添加商品信息">
148
- <Button
149
- type="link"
150
- style={{ padding: 0, width: 20, fontSize: 20, fill: '#0074ff' }}
151
- icon={<PlusSvg />}
152
- onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
153
- />
154
- </Tooltip>
155
- }
156
- onChange={() => {
157
- onChangeItemName(controller, form, record);
158
- }}
159
- />
160
- )}
161
- </div>
162
- </Form.Item>
163
- );
164
- } else {
165
- return (
166
- <span>
167
- {record.lineAttribute === LineAttributeType.折扣行 ? <span className='goods-list-digtal-discount-tag'>折扣</span> : <></>}
168
- <MyItemNameDiv
169
- valueT={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemNameSelf || '' }), searchValue)}
170
- valueF={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemName || '' }), searchValue)}
171
- isMyShow={isMyShow}
172
- />
173
- </span>
174
- )
175
- }
176
- },
177
- },
178
- {
179
- title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
180
- key: 'itemModelName',
181
- width: 119,
182
- render: (_: string, record: IGood) => {
183
- if (editGood?.$index === record.$index && !disableds.includes('itemModelName') && model !== 'prefab') {
184
- return (
185
- <Form.Item>
186
- {getFieldDecorator('itemModelName', {
187
- initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
188
- rules: getReplenishRules('itemModelName'),
189
- })(
190
- <MyInput
191
- onChange={async () => {
192
- await controller.wait()
193
- const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
194
- const value = {} as any;
195
- value[key] = form.getFieldsValue().itemModelName;
196
- controller.setEditGood(value);
197
- }}
198
- />,
199
- )}
200
- </Form.Item>
201
- );
202
- } else {
203
- return (
204
- <MyItemNameDiv
205
- valueT={formatSearch(record.itemModelNameSelf, searchValue)}
206
- valueF={formatSearch(record.itemModelName, searchValue)}
207
- isMyShow={isMyShow}
208
- />
209
- )
210
- }
211
- },
212
- },
213
- {
214
- title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
215
- key: 'unit',
216
- width: 70,
217
- render: (_: string, record: IGood) => {
218
- if (editGood?.$index === record.$index && !disableds.includes('unit') && model !== 'prefab') {
219
- return (
220
- <Form.Item>
221
- {getFieldDecorator('unit', {
222
- initialValue: editGood.unit,
223
- rules: getReplenishRules('unit'),
224
- })(
225
- <AutoComplete
226
- style={{ width: '100%' }}
227
- dataSource={unitList}
228
- getPopupContainer={() => rootElement || document.body}
229
- onChange={async () => {
230
- await controller.wait()
231
- controller.setEditGood({ unit: form.getFieldsValue().unit });
232
- }}
233
- />,
234
- )}
235
- </Form.Item>
236
- );
237
- } else {
238
- return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
239
- }
240
- },
241
- },
242
- {
243
- title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
244
- dataIndex: 'quantity',
245
- key: 'quantity',
246
- align: 'right',
247
- width: 149,
248
- render: (value: string, record: IGood) => {
249
- if (editGood?.$index === record.$index && !disableds.includes('quantity') && model !== 'prefab') {
250
- return (
251
- <Form.Item>
252
- {getFieldDecorator('quantity', {
253
- initialValue: nonScientificNotation(editGood.quantity),
254
- getValueFromEvent: onNumberValueChange,
255
- rules: [
256
- ...getReplenishRules('quantity'),
257
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
258
- {
259
- validator: async (_, value, callback) => {
260
-
261
- if (isValidateGood) {
262
- await controller.wait();
263
- const isvalue = !!value || value === 0;
264
- const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
265
- if (isvalue || isPrice === isvalue) return;
266
- callback('请输入数量');
267
- } else {
268
- callback();
269
- }
270
- }
271
- }
272
- ],
273
- })(
274
- <MyInput
275
- style={{ textAlign: 'right' }}
276
- maxLength={25}
277
- loading={isCipher(changeField, "quantity")}
278
- onChange={async () => {
279
- setChangeField('quantity');
280
- await onChangeQuantity(controller, form, record);
281
- }}
282
- />,
283
- )}
284
- </Form.Item>
285
- );
286
- } else {
287
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
288
- }
289
- },
290
- },
291
- {
292
- title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
293
- dataIndex: 'priceIncludeTax',
294
- key: 'priceIncludeTax',
295
- align: 'right',
296
- width: 149,
297
- render: (value: string, record: IGood) => {
298
- if (editGood?.$index === record.$index && !disableds.includes('priceIncludeTax') && model !== 'prefab') {
299
- return (
300
- <Form.Item>
301
- {getFieldDecorator('priceIncludeTax', {
302
- initialValue: nonScientificNotation(editGood.priceIncludeTax),
303
- getValueFromEvent: onNumberValueChange,
304
- rules: [
305
- ...getReplenishRules('priceIncludeTax'),
306
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
307
- {
308
- validator: async (_, value, callback) => {
309
- await controller.wait();
310
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
311
- const isvalue = !!value || value === 0;
312
- if (isvalue || isQuantity === isvalue) return;
313
- callback('请输入单价');
314
- }
315
- }
316
- ],
317
- })(
318
- <MyInput
319
- style={{ textAlign: 'right' }}
320
- maxLength={25}
321
- loading={isCipher(changeField, 'priceIncludeTax')}
322
- onChange={() => {
323
- setChangeField('priceIncludeTax');
324
- onChangePriceIncludeTax(controller, form, record);
325
- }}
326
- />,
327
- )}
328
- </Form.Item>
329
- );
330
- } else {
331
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
332
- }
333
- },
334
- },
335
- {
336
- title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
337
- dataIndex: 'priceExcludeTax',
338
- key: 'priceExcludeTax',
339
- align: 'right',
340
- width: 149,
341
- render: (value: string, record: IGood) => {
342
- if (editGood?.$index === record.$index && !disableds.includes('priceExcludeTax') && model !== 'prefab') {
343
- return (
344
- <Form.Item>
345
- {getFieldDecorator('priceExcludeTax', {
346
- initialValue: nonScientificNotation(editGood.priceExcludeTax),
347
- getValueFromEvent: onNumberValueChange,
348
- rules: [
349
- ...getReplenishRules('priceExcludeTax'),
350
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
351
- {
352
- validator: async (_, value, callback) => {
353
- await controller.wait();
354
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
355
- const isvalue = !!value || value === 0;
356
- if (isvalue || isQuantity === isvalue) return;
357
- callback('请输入单价');
358
- }
359
- }
360
- ],
361
- })(
362
- <MyInput
363
- style={{ textAlign: 'right' }}
364
- maxLength={25}
365
- loading={isCipher(changeField, 'priceExcludeTax')}
366
- onChange={() => {
367
- setChangeField('priceExcludeTax');
368
- onChangePriceExcludeTax(controller, form, record);
369
- }}
370
- />,
371
- )}
372
- </Form.Item>
373
- );
374
- } else {
375
- return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
376
- }
377
- },
378
- },
379
- {
380
- title: <TitleText required >金额(含税)</TitleText>,
381
- dataIndex: 'lineAmountIncludeTax',
382
- key: 'lineAmountIncludeTax',
383
- width: 119,
384
- align: 'right',
385
- render: (value: string, record: IGood) => {
386
- if (editGood?.$index === record.$index && !disableds.includes('lineAmountIncludeTax') && model !== 'prefab') {
387
- return (
388
- <Form.Item>
389
- {getFieldDecorator('lineAmountIncludeTax', {
390
- initialValue: editGood.lineAmountIncludeTax,
391
- getValueFromEvent: onNumberValueChange,
392
- rules: [
393
- ...getReplenishRules('lineAmountIncludeTax'),
394
- { required: isValidateGood, message: '金额不能为空' },
395
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额错误,请重新输入' },
396
- {
397
- validator: async (_, value, callback) => {
398
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
399
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
400
- }
401
- }
402
- },
403
- {
404
- validator: async (_, value, callback) => {
405
- if (deduction && parseFloat(value) <= deduction) {
406
- callback('扣除额不能大于等于价税合计');
407
- }
408
- }
409
- },
410
- ],
411
- })(
412
- <MyInput
413
- style={{ textAlign: 'right' }}
414
- loading={isCipher(changeField, 'lineAmountIncludeTax')}
415
- onChange={() => {
416
- setChangeField('lineAmountIncludeTax');
417
- onChangeLineAmountIncludeTax(controller, form, record);
418
- }}
419
- />,
420
- )}
421
- </Form.Item>
422
- );
423
- } else {
424
- return <span style={{ padding: '0 10px' }}>{value && formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
425
- }
426
- },
427
- },
428
- {
429
- title: <TitleText required >金额(不含税)</TitleText>,
430
- dataIndex: 'lineAmountExcludeTax',
431
- key: 'lineAmountExcludeTax',
432
- align: 'right',
433
- width: 119,
434
- render: (value: string, record: IGood) => {
435
- if (editGood?.$index === record.$index && !disableds.includes('lineAmountExcludeTax') && model !== 'prefab') {
436
- return (
437
- <Form.Item>
438
- {getFieldDecorator('lineAmountExcludeTax', {
439
- initialValue: editGood.lineAmountExcludeTax,
440
- getValueFromEvent: onNumberValueChange,
441
- rules: [
442
- ...getReplenishRules('lineAmountExcludeTax'),
443
- { required: isValidateGood, message: '金额不能为空' },
444
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额错误,请重新输入' },
445
- {
446
- validator: async (_, value: string, callback) => {
447
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
448
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
449
- }
450
- }
451
- },
452
- ],
453
- })(
454
- <MyInput
455
- style={{ textAlign: 'right' }}
456
- loading={isCipher(changeField, 'lineAmountExcludeTax')}
457
- onChange={() => {
458
- setChangeField('lineAmountExcludeTax');
459
- onChangeLineAmountExcludeTax(controller, form, record);
460
- }}
461
- />,
462
- )}
463
- </Form.Item>
464
- );
465
- } else {
466
- return <span style={{ padding: '0 10px' }}>{value && formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
467
- }
468
- },
469
- },
470
- {
471
- title: <TitleText required >税率</TitleText>,
472
- dataIndex: 'taxRate',
473
- key: 'taxRate',
474
- align: 'right',
475
- width: 70,
476
- render: (value: string|number, record: IGood) => {
477
- if (editGood?.$index === record.$index && !disableds.includes('taxRate') && !(model === 'prefab' && calculateType === '3')) {
478
- return (
479
- <Form.Item>
480
- {getFieldDecorator('taxRate', {
481
- initialValue: editGood.taxRate,
482
- rules: [
483
- ...getReplenishRules('taxRate'),
484
- { required: isValidateGood, message: '请选择税率' },
485
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
486
- ],
487
- })(
488
- <Select
489
- className="kts-invoice-operate-goods-list-table-tax-rate"
490
- // dropdownMenuStyle={{ textAlign: "right" }}
491
- showArrow={false}
492
- style={{ width: '100%' }}
493
- getPopupContainer={() => rootElement || document.body}
494
- onChange={() => {
495
- setChangeField('taxRate');
496
- onChangeTaxRate(controller, form, record);
497
- }}
498
- >
499
- {(record.goodsTaxRateList || taxRateList).map((e, i) => {
500
- return (
501
- <Select.Option key={i} value={e}>
502
- {e}%
503
- </Select.Option>
504
- );
505
- })}
506
- </Select>,
507
- )}
508
- </Form.Item>
509
- );
510
- } else {
511
- if (value || value === '0' || value === 0) {
512
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : `${value}%`}</span>;
513
- } else {
514
- return ''
515
- }
516
- }
517
- },
518
- },
519
- {
520
- title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
521
- dataIndex: 'taxAmount',
522
- key: 'taxAmount',
523
- align: 'right',
524
- width: 119,
525
- render: (value: string, record: IGood) => {
526
- if (editGood?.$index === record.$index && !disableds.includes('taxAmount') && model !== 'prefab') {
527
- return (
528
- <Form.Item>
529
- {getFieldDecorator('taxAmount', {
530
- initialValue: editGood.taxAmount,
531
- rules: [
532
- ...getReplenishRules('taxAmount'),
533
- { required: isValidateGood, message: '税额不能为空' },
534
- {
535
- validator: (rule, value, callback) => {
536
- //含税金额
537
- const lineAmountIncludeTax = editGood?.lineAmountIncludeTax || 0;
538
- //不含税金额
539
- // const lineAmountExcludeTax = lineAmountIncludeTax-value;
540
- const lineAmountExcludeTax = chain(bignumber(lineAmountIncludeTax || 0)).subtract(bignumber(value || 0));
541
- const taxRate = editGood?.taxRate;
542
- if (lineAmountExcludeTax && taxRate && lineAmountIncludeTax) {
543
- // const total = bignumber(lineAmountExcludeTax * taxRate / 100);
544
- const total = lineAmountExcludeTax.multiply(bignumber(taxRate || 0)).divide(bignumber(100));
545
- // if (Number(Math.abs(Number(total) - Number(value)).toFixed(4)) <= 0.01) {
546
- if (Math.abs(total.subtract(bignumber(value || 0)).done().toNumber()) <= 0.01) {
547
- callback();
548
- } else {
549
- callback('税额填写错误,请重新输入')
550
- }
551
-
552
- } else {
553
- callback();
554
- }
555
-
556
- }
557
- },
558
-
559
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '税额必须为数字' },
560
- ],
561
- })(
562
- isEnables('taxAmount')
563
- ? <MyInput
564
- style={{ textAlign: 'right' }}
565
- loading={isCipher(changeField, 'taxAmount')}
566
- onChange={() => {
567
- setChangeField('taxAmount');
568
- onChangeTaxAmount(controller, form, record);
569
- }}
570
- />
571
- : <MyDiv loading={isCipher(changeField, 'taxAmount')} />
572
- )}
573
- </Form.Item>
574
- )
575
- } else {
576
- return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : value && parseFloat(value).toFixed(2)}</span>;
577
- }
578
- },
579
- },
580
- {
581
- title: '行备注',
582
- dataIndex: 'remarks',
583
- key: 'remarks',
584
- width: 150,
585
-
586
- },
587
- ]
588
- // 含税不含税
589
- .filter((e) => {
590
- if (isTaxIncluded) {
591
- return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
592
- } else {
593
- return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
594
- }
595
- })
596
- // 是否启动拖拽
597
- .filter(e => e.key !== 'drag' || isStart)
598
- // 只读
599
- .filter(e => {
600
- if (model === 'readOnly') {
601
- return e.key !== 'operating';
602
- } else {
603
- return true;
604
- }
605
- })
606
- .map((e) => {
607
- return {
608
- ...e,
609
- ellipsis: true,
610
- };
611
- }) as any[];
612
- }, [isTaxIncluded, editGood, controller, taxRateList, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, isStart, calculateType]);
613
-
614
- // React.useEffect(() => {
615
- // clearTimeout(t)
616
- // const t = setTimeout(() => { setChangeField('') }, 1000);
617
- // return () => { clearTimeout(t) }
618
- // }, [changeField]);
619
-
620
- return columns;
621
- };
622
-
623
- /** 字段 */
624
- function isCipher(name?: string, field?: string) {
625
- if (!name || !field) return false;
626
- return name !== field;
627
- }
628
-
629
- class MyInput extends React.Component<InputProps & { loading?: boolean }> {
630
- render() {
631
- if (this.props.loading) {
632
- return (
633
- <Spin size="small">
634
- <Input {...this.props} autoComplete="off" />
635
- </Spin>
636
- )
637
- } else {
638
- return <Input {...this.props} autoComplete="off" />
639
- }
640
- }
641
- }
642
-
643
- class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
644
-
645
- render() {
646
- if (this.props.loading) {
647
- return (
648
- <Spin size="small">
649
- <span style={{ padding: '0 10px' }}>{this.props.value}</span>
650
- </Spin>
651
- )
652
- } else {
653
- return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
654
- }
655
- }
656
- }
657
-
658
- class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
659
- render(): React.ReactNode {
660
-
661
- const { isMyShow, valueT, valueF } = this.props;
662
-
663
- if (isMyShow) {
664
- if (valueT) {
665
- return (
666
- <Tooltip title={valueT}>
667
- <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
668
- </Tooltip>
669
- )
670
- } else {
671
- return (
672
- <Tooltip title={valueF}>
673
- <span style={MyItemNameStyle}>{valueF}</span>
674
- </Tooltip>
675
- )
676
- }
677
- } else {
678
- if (valueF) {
679
- return (
680
- <Tooltip title={valueF}>
681
- <span style={MyItemNameStyle}>{valueF}</span>
682
- </Tooltip>
683
- )
684
- } else {
685
- return (
686
- <Tooltip title={valueT} style={MyItemNameStyle}>
687
- <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
688
- </Tooltip>
689
- )
690
- }
691
- }
692
- }
693
- }
694
-
695
- /** 格式搜索结果 */
696
- function formatSearch(value?: string, search?: string) {
697
- if (!value || !search) return value;
698
-
699
- const __html = ucoding(value).split(new RegExp(ucoding(search), 'g')).map(e => dcoding(e)).join(`<span class="kts-invoice-operate-goods-list-table-search-protrude" >${search}</span>`);
700
- return <span dangerouslySetInnerHTML={{ __html }} />
701
- }
702
-
703
- /** 编码 */
704
- function ucoding(v: string): string {
705
- return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
706
- }
707
-
708
- /** 解码 */
709
- function dcoding(v: string): string {
710
- return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
711
- }
712
-
713
- /** 是否免税 */
714
- function isDutyFree(record: IGood): boolean {
715
- return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
716
- }
717
-
718
- const MyItemNameStyle: any = {
719
- padding: '0px 10px',
720
- whiteSpace: 'nowrap',
721
- overflow: 'hidden',
722
- width: "100%",
723
- display: 'block',
724
- textOverflow: 'ellipsis'
1
+
2
+ import React from 'react';
3
+ import Icon from '@ant-design/icons';
4
+ import { Form } from 'kts-components-antd-x3';
5
+ import { ReactComponent as PlusSvg } from './svg/plus.svg'
6
+ import { AutoComplete, Select, Button, Input, Spin, Tooltip, InputProps } from 'kts-xui';
7
+ import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
8
+ import { getItemNameWithShorthand } from '../../../../../tools/itemName';
9
+ import { IGood, LineAttributeType } from '../../../../../InvoiceController';
10
+ import { chain, bignumber } from 'mathjs';
11
+ import Invoice from '../../../../..';
12
+ import TitleText from './ui/TitleText';
13
+ import ItemNameInput from './ui/ItemNameInput';
14
+ import {
15
+ onChangeQuantity,
16
+ onChangePriceIncludeTax,
17
+ onChangePriceExcludeTax,
18
+ onChangeLineAmountIncludeTax,
19
+ onChangeLineAmountExcludeTax,
20
+ onChangeTaxRate,
21
+ onChangeItemName,
22
+ onChangeTaxAmount,
23
+ } from './autoFillFn';
24
+ import Drag from './ui/Drag';
25
+ import { nonScientificNotation } from '../../../../../tools/calculate';
26
+
27
+ export default (form: WrappedFormUtils) => {
28
+ const { getFieldDecorator, getFieldValue } = form;
29
+
30
+ const controller = Invoice.useInvoiceController();
31
+
32
+ const rootElement = controller.useMemo(s => s.rootElement, []);
33
+
34
+ /** 是否含税 */
35
+ const isTaxIncluded = controller.useMemo(e => e.goodsListState.isTaxIncluded, []);
36
+
37
+ /** 组件模式 */
38
+ const model = controller.useMemo(e => e.model, []);
39
+
40
+ /** 计算类型 */
41
+ const calculateType = controller.useMemo(e => e.goodsListState.calculateType, []);
42
+
43
+ /** 是否显示我方 */
44
+ const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
45
+
46
+ /** 正在编辑的货物 */
47
+ const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
48
+
49
+ /** 是否启用拖拽 */
50
+ const isStart = controller.useMemo((e) => e.goodsListState.drag.isStart, []);
51
+
52
+ /** 禁用字段 */
53
+ const disableds = controller.useMemo((e) => e.stakeholder.disableds || [], []);
54
+
55
+ /** 启用字段 */
56
+ const enables = controller.useMemo(s => s.stakeholder.enables || [], []);
57
+
58
+ /** 搜索条件 */
59
+ const searchValue = controller.useMemo((e) => e.goodsListState.searchValue, []);
60
+
61
+ /** 税率列表 */
62
+ const taxRateList = controller.useMemo((e) => e.goodsListState.taxRateList, []);
63
+
64
+ /** 单位列表 */
65
+ const unitList = controller.useMemo((e) => e.goodsListState.unitList, []);
66
+
67
+ /** 商品表格补充配置 */
68
+ const columnsReplenish = controller.useMemo((e) => e.goodsListState.columnsReplenish, []);
69
+
70
+ /** 扣除额 */
71
+ const deduction = controller.useMemo((e) => e.goodsListState.deduction, []);
72
+
73
+ /** 计算中启动字段 */
74
+ const changeField = controller.useMemo((e) => e.calculatingField, []);
75
+
76
+ const isValidateGood = controller.useMemo(s => s.goodsListState.isValidateGood, [])
77
+ /** 计算中启动字段 */
78
+ const setChangeField = React.useCallback((value: string) => controller.run(async s => { s.calculatingField = value }), []);
79
+
80
+ const isEnables = React.useCallback(field => enables.indexOf(field) >= 0, [enables])
81
+
82
+ const onNumberValueChange = React.useCallback((e) => {
83
+ const value = e?.target?.value;
84
+ if (value) {
85
+ return value.replace(/[^0-9-\.]/g, '');
86
+ }
87
+ }, [])
88
+
89
+ /** 获取补充校验规则 */
90
+ const getReplenishRules = React.useCallback((id: string) => {
91
+ return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
92
+ }, [columnsReplenish])
93
+
94
+ /** 金额整数位限制,不传默认9位 */
95
+ const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
96
+
97
+ /** 表头 */
98
+ const columns = React.useMemo(() => {
99
+ return [
100
+ {
101
+ title: ' ',
102
+ key: 'drag',
103
+ width: 40,
104
+ align: 'center',
105
+ render: (_: any, record: IGood) => <Drag record={record} />
106
+ },
107
+ {
108
+ title: '序号',
109
+ key: 'serialNo',
110
+ dataIndex: 'serialNo',
111
+ width: 50,
112
+ render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
113
+ },
114
+ {
115
+ title: <TitleText required >项目名称</TitleText>,
116
+ key: 'itemName',
117
+ render: (_: string, record: IGood) => {
118
+ if (editGood?.$index === record.$index && !disableds.includes('itemName') && model !== 'prefab') {
119
+ return (
120
+ <Form.Item>
121
+ <div style={{ display: 'flex' }} >
122
+ {getFieldDecorator('itemName', {
123
+ initialValue: isMyShow ? record.itemNameSelf : record.itemName,
124
+ rules: [
125
+ ...getReplenishRules('itemName'),
126
+ {
127
+ validator: async (_, __, callback) => {
128
+ if (isValidateGood) {
129
+ await controller.wait();
130
+ const value = controller.state.goodsListState.editGood;
131
+ if (!value?.itemName && !value?.itemNameSelf) {
132
+ callback('项目名称不能为空');
133
+ } else {
134
+ return;
135
+ }
136
+ } else {
137
+ callback();
138
+ }
139
+ }
140
+ }
141
+ ]
142
+ })(
143
+ <ItemNameInput
144
+ editGood={editGood}
145
+ shorthand={editGood.shorthand}
146
+ suffix={
147
+ <Tooltip title="点击从商品管理中添加商品信息">
148
+ <Button
149
+ type="link"
150
+ style={{ padding: 0, width: 20, fontSize: 20, fill: '#0074ff' }}
151
+ icon={<PlusSvg />}
152
+ onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
153
+ />
154
+ </Tooltip>
155
+ }
156
+ onChange={() => {
157
+ onChangeItemName(controller, form, record);
158
+ }}
159
+ />
160
+ )}
161
+ </div>
162
+ </Form.Item>
163
+ );
164
+ } else {
165
+ return (
166
+ <span>
167
+ {record.lineAttribute === LineAttributeType.折扣行 ? <span className='goods-list-digtal-discount-tag'>折扣</span> : <></>}
168
+ <MyItemNameDiv
169
+ valueT={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemNameSelf || '' }), searchValue)}
170
+ valueF={formatSearch(getItemNameWithShorthand({ shorthand: record.shorthand, full: record.itemName || '' }), searchValue)}
171
+ isMyShow={isMyShow}
172
+ />
173
+ </span>
174
+ )
175
+ }
176
+ },
177
+ },
178
+ {
179
+ title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
180
+ key: 'itemModelName',
181
+ width: 119,
182
+ render: (_: string, record: IGood) => {
183
+ if (editGood?.$index === record.$index && !disableds.includes('itemModelName') && model !== 'prefab') {
184
+ return (
185
+ <Form.Item>
186
+ {getFieldDecorator('itemModelName', {
187
+ initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
188
+ rules: getReplenishRules('itemModelName'),
189
+ })(
190
+ <MyInput
191
+ onChange={async () => {
192
+ await controller.wait()
193
+ const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
194
+ const value = {} as any;
195
+ value[key] = form.getFieldsValue().itemModelName;
196
+ controller.setEditGood(value);
197
+ }}
198
+ />,
199
+ )}
200
+ </Form.Item>
201
+ );
202
+ } else {
203
+ return (
204
+ <MyItemNameDiv
205
+ valueT={formatSearch(record.itemModelNameSelf, searchValue)}
206
+ valueF={formatSearch(record.itemModelName, searchValue)}
207
+ isMyShow={isMyShow}
208
+ />
209
+ )
210
+ }
211
+ },
212
+ },
213
+ {
214
+ title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
215
+ key: 'unit',
216
+ width: 70,
217
+ render: (_: string, record: IGood) => {
218
+ if (editGood?.$index === record.$index && !disableds.includes('unit') && model !== 'prefab') {
219
+ return (
220
+ <Form.Item>
221
+ {getFieldDecorator('unit', {
222
+ initialValue: editGood.unit,
223
+ rules: getReplenishRules('unit'),
224
+ })(
225
+ <AutoComplete
226
+ style={{ width: '100%' }}
227
+ dataSource={unitList}
228
+ getPopupContainer={() => rootElement || document.body}
229
+ onChange={async () => {
230
+ await controller.wait()
231
+ controller.setEditGood({ unit: form.getFieldsValue().unit });
232
+ }}
233
+ />,
234
+ )}
235
+ </Form.Item>
236
+ );
237
+ } else {
238
+ return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
239
+ }
240
+ },
241
+ },
242
+ {
243
+ title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
244
+ dataIndex: 'quantity',
245
+ key: 'quantity',
246
+ align: 'right',
247
+ width: 149,
248
+ render: (value: string, record: IGood) => {
249
+ if (editGood?.$index === record.$index && !disableds.includes('quantity') && model !== 'prefab') {
250
+ return (
251
+ <Form.Item>
252
+ {getFieldDecorator('quantity', {
253
+ initialValue: nonScientificNotation(editGood.quantity),
254
+ getValueFromEvent: onNumberValueChange,
255
+ rules: [
256
+ ...getReplenishRules('quantity'),
257
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
258
+ {
259
+ validator: async (_, value, callback) => {
260
+
261
+ if (isValidateGood) {
262
+ await controller.wait();
263
+ const isvalue = !!value || value === 0;
264
+ const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
265
+ if (isvalue || isPrice === isvalue) return;
266
+ callback('请输入数量');
267
+ } else {
268
+ callback();
269
+ }
270
+ }
271
+ }
272
+ ],
273
+ })(
274
+ <MyInput
275
+ style={{ textAlign: 'right' }}
276
+ maxLength={25}
277
+ loading={isCipher(changeField, "quantity")}
278
+ onChange={async () => {
279
+ setChangeField('quantity');
280
+ await onChangeQuantity(controller, form, record);
281
+ }}
282
+ />,
283
+ )}
284
+ </Form.Item>
285
+ );
286
+ } else {
287
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
288
+ }
289
+ },
290
+ },
291
+ {
292
+ title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
293
+ dataIndex: 'priceIncludeTax',
294
+ key: 'priceIncludeTax',
295
+ align: 'right',
296
+ width: 149,
297
+ render: (value: string, record: IGood) => {
298
+ if (editGood?.$index === record.$index && !disableds.includes('priceIncludeTax') && model !== 'prefab') {
299
+ return (
300
+ <Form.Item>
301
+ {getFieldDecorator('priceIncludeTax', {
302
+ initialValue: nonScientificNotation(editGood.priceIncludeTax),
303
+ getValueFromEvent: onNumberValueChange,
304
+ rules: [
305
+ ...getReplenishRules('priceIncludeTax'),
306
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
307
+ {
308
+ validator: async (_, value, callback) => {
309
+ await controller.wait();
310
+ const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
311
+ const isvalue = !!value || value === 0;
312
+ if (isvalue || isQuantity === isvalue) return;
313
+ callback('请输入单价');
314
+ }
315
+ }
316
+ ],
317
+ })(
318
+ <MyInput
319
+ style={{ textAlign: 'right' }}
320
+ maxLength={25}
321
+ loading={isCipher(changeField, 'priceIncludeTax')}
322
+ onChange={() => {
323
+ setChangeField('priceIncludeTax');
324
+ onChangePriceIncludeTax(controller, form, record);
325
+ }}
326
+ />,
327
+ )}
328
+ </Form.Item>
329
+ );
330
+ } else {
331
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
332
+ }
333
+ },
334
+ },
335
+ {
336
+ title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
337
+ dataIndex: 'priceExcludeTax',
338
+ key: 'priceExcludeTax',
339
+ align: 'right',
340
+ width: 149,
341
+ render: (value: string, record: IGood) => {
342
+ if (editGood?.$index === record.$index && !disableds.includes('priceExcludeTax') && model !== 'prefab') {
343
+ return (
344
+ <Form.Item>
345
+ {getFieldDecorator('priceExcludeTax', {
346
+ initialValue: nonScientificNotation(editGood.priceExcludeTax),
347
+ getValueFromEvent: onNumberValueChange,
348
+ rules: [
349
+ ...getReplenishRules('priceExcludeTax'),
350
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
351
+ {
352
+ validator: async (_, value, callback) => {
353
+ await controller.wait();
354
+ const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
355
+ const isvalue = !!value || value === 0;
356
+ if (isvalue || isQuantity === isvalue) return;
357
+ callback('请输入单价');
358
+ }
359
+ }
360
+ ],
361
+ })(
362
+ <MyInput
363
+ style={{ textAlign: 'right' }}
364
+ maxLength={25}
365
+ loading={isCipher(changeField, 'priceExcludeTax')}
366
+ onChange={() => {
367
+ setChangeField('priceExcludeTax');
368
+ onChangePriceExcludeTax(controller, form, record);
369
+ }}
370
+ />,
371
+ )}
372
+ </Form.Item>
373
+ );
374
+ } else {
375
+ return <span style={{ padding: '0 10px' }}>{nonScientificNotation(value)}</span>;
376
+ }
377
+ },
378
+ },
379
+ {
380
+ title: <TitleText required >金额(含税)</TitleText>,
381
+ dataIndex: 'lineAmountIncludeTax',
382
+ key: 'lineAmountIncludeTax',
383
+ width: 119,
384
+ align: 'right',
385
+ render: (value: string, record: IGood) => {
386
+ if (editGood?.$index === record.$index && !disableds.includes('lineAmountIncludeTax') && model !== 'prefab') {
387
+ return (
388
+ <Form.Item>
389
+ {getFieldDecorator('lineAmountIncludeTax', {
390
+ initialValue: editGood.lineAmountIncludeTax,
391
+ getValueFromEvent: onNumberValueChange,
392
+ rules: [
393
+ ...getReplenishRules('lineAmountIncludeTax'),
394
+ { required: isValidateGood, message: '金额不能为空' },
395
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额错误,请重新输入' },
396
+ {
397
+ validator: async (_, value, callback) => {
398
+ if (`${value}`.split('.')[0].length > priceIntegerDigit) {
399
+ callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
400
+ }
401
+ }
402
+ },
403
+ {
404
+ validator: async (_, value, callback) => {
405
+ if (deduction && parseFloat(value) <= deduction) {
406
+ callback('扣除额不能大于等于价税合计');
407
+ }
408
+ }
409
+ },
410
+ ],
411
+ })(
412
+ <MyInput
413
+ style={{ textAlign: 'right' }}
414
+ loading={isCipher(changeField, 'lineAmountIncludeTax')}
415
+ onChange={() => {
416
+ setChangeField('lineAmountIncludeTax');
417
+ onChangeLineAmountIncludeTax(controller, form, record);
418
+ }}
419
+ />,
420
+ )}
421
+ </Form.Item>
422
+ );
423
+ } else {
424
+ return <span style={{ padding: '0 10px' }}>{value && formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
425
+ }
426
+ },
427
+ },
428
+ {
429
+ title: <TitleText required >金额(不含税)</TitleText>,
430
+ dataIndex: 'lineAmountExcludeTax',
431
+ key: 'lineAmountExcludeTax',
432
+ align: 'right',
433
+ width: 119,
434
+ render: (value: string, record: IGood) => {
435
+ if (editGood?.$index === record.$index && !disableds.includes('lineAmountExcludeTax') && model !== 'prefab') {
436
+ return (
437
+ <Form.Item>
438
+ {getFieldDecorator('lineAmountExcludeTax', {
439
+ initialValue: editGood.lineAmountExcludeTax,
440
+ getValueFromEvent: onNumberValueChange,
441
+ rules: [
442
+ ...getReplenishRules('lineAmountExcludeTax'),
443
+ { required: isValidateGood, message: '金额不能为空' },
444
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额错误,请重新输入' },
445
+ {
446
+ validator: async (_, value: string, callback) => {
447
+ if (`${value}`.split('.')[0].length > priceIntegerDigit) {
448
+ callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
449
+ }
450
+ }
451
+ },
452
+ ],
453
+ })(
454
+ <MyInput
455
+ style={{ textAlign: 'right' }}
456
+ loading={isCipher(changeField, 'lineAmountExcludeTax')}
457
+ onChange={() => {
458
+ setChangeField('lineAmountExcludeTax');
459
+ onChangeLineAmountExcludeTax(controller, form, record);
460
+ }}
461
+ />,
462
+ )}
463
+ </Form.Item>
464
+ );
465
+ } else {
466
+ return <span style={{ padding: '0 10px' }}>{value && formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
467
+ }
468
+ },
469
+ },
470
+ {
471
+ title: <TitleText required >税率</TitleText>,
472
+ dataIndex: 'taxRate',
473
+ key: 'taxRate',
474
+ align: 'right',
475
+ width: 70,
476
+ render: (value: string|number, record: IGood) => {
477
+ if (editGood?.$index === record.$index && !disableds.includes('taxRate') && !(model === 'prefab' && calculateType === '3')) {
478
+ return (
479
+ <Form.Item>
480
+ {getFieldDecorator('taxRate', {
481
+ initialValue: editGood.taxRate,
482
+ rules: [
483
+ ...getReplenishRules('taxRate'),
484
+ { required: isValidateGood, message: '请选择税率' },
485
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '请选择正确税率' },
486
+ ],
487
+ })(
488
+ <Select
489
+ className="kts-invoice-operate-goods-list-table-tax-rate"
490
+ // dropdownMenuStyle={{ textAlign: "right" }}
491
+ showArrow={false}
492
+ style={{ width: '100%' }}
493
+ getPopupContainer={() => rootElement || document.body}
494
+ onChange={() => {
495
+ setChangeField('taxRate');
496
+ onChangeTaxRate(controller, form, record);
497
+ }}
498
+ >
499
+ {(record.goodsTaxRateList || taxRateList).map((e, i) => {
500
+ return (
501
+ <Select.Option key={i} value={e}>
502
+ {e}%
503
+ </Select.Option>
504
+ );
505
+ })}
506
+ </Select>,
507
+ )}
508
+ </Form.Item>
509
+ );
510
+ } else {
511
+ if (value || value === '0' || value === 0) {
512
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '免税' : `${value}%`}</span>;
513
+ } else {
514
+ return ''
515
+ }
516
+ }
517
+ },
518
+ },
519
+ {
520
+ title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
521
+ dataIndex: 'taxAmount',
522
+ key: 'taxAmount',
523
+ align: 'right',
524
+ width: 119,
525
+ render: (value: string, record: IGood) => {
526
+ if (editGood?.$index === record.$index && !disableds.includes('taxAmount') && model !== 'prefab') {
527
+ return (
528
+ <Form.Item>
529
+ {getFieldDecorator('taxAmount', {
530
+ initialValue: editGood.taxAmount,
531
+ rules: [
532
+ ...getReplenishRules('taxAmount'),
533
+ { required: isValidateGood, message: '税额不能为空' },
534
+ {
535
+ validator: (rule, value, callback) => {
536
+ //含税金额
537
+ const lineAmountIncludeTax = editGood?.lineAmountIncludeTax || 0;
538
+ //不含税金额
539
+ // const lineAmountExcludeTax = lineAmountIncludeTax-value;
540
+ const lineAmountExcludeTax = chain(bignumber(lineAmountIncludeTax || 0)).subtract(bignumber(value || 0));
541
+ const taxRate = editGood?.taxRate;
542
+ if (lineAmountExcludeTax && taxRate && lineAmountIncludeTax) {
543
+ // const total = bignumber(lineAmountExcludeTax * taxRate / 100);
544
+ const total = lineAmountExcludeTax.multiply(bignumber(taxRate || 0)).divide(bignumber(100));
545
+ // if (Number(Math.abs(Number(total) - Number(value)).toFixed(4)) <= 0.01) {
546
+ if (Math.abs(total.subtract(bignumber(value || 0)).done().toNumber()) <= 0.01) {
547
+ callback();
548
+ } else {
549
+ callback('税额填写错误,请重新输入')
550
+ }
551
+ } else {
552
+ callback();
553
+ }
554
+
555
+ }
556
+ },
557
+
558
+ { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '税额必须为数字' },
559
+ ],
560
+ })(
561
+ isEnables('taxAmount')
562
+ ? <MyInput
563
+ style={{ textAlign: 'right' }}
564
+ loading={isCipher(changeField, 'taxAmount')}
565
+ onChange={() => {
566
+ setChangeField('taxAmount');
567
+ onChangeTaxAmount(controller, form, record);
568
+ }}
569
+ />
570
+ : <MyDiv loading={isCipher(changeField, 'taxAmount')} />
571
+ )}
572
+ </Form.Item>
573
+ )
574
+ } else {
575
+ return <span style={{ padding: '0 10px' }}>{isDutyFree(record) ? '***' : value && parseFloat(value).toFixed(2)}</span>;
576
+ }
577
+ },
578
+ },
579
+ {
580
+ title: '行备注',
581
+ dataIndex: 'remarks',
582
+ key: 'remarks',
583
+ width: 150,
584
+
585
+ },
586
+ ]
587
+ // 含税不含税
588
+ .filter((e) => {
589
+ if (isTaxIncluded) {
590
+ return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
591
+ } else {
592
+ return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
593
+ }
594
+ })
595
+ // 是否启动拖拽
596
+ .filter(e => e.key !== 'drag' || isStart)
597
+ // 只读
598
+ .filter(e => {
599
+ if (model === 'readOnly') {
600
+ return e.key !== 'operating';
601
+ } else {
602
+ return true;
603
+ }
604
+ })
605
+ .map((e) => {
606
+ return {
607
+ ...e,
608
+ ellipsis: true,
609
+ };
610
+ }) as any[];
611
+ }, [isTaxIncluded, editGood, controller, taxRateList, changeField, deduction, isMyShow, searchValue, model, columnsReplenish, isStart, calculateType]);
612
+
613
+ // React.useEffect(() => {
614
+ // clearTimeout(t)
615
+ // const t = setTimeout(() => { setChangeField('') }, 1000);
616
+ // return () => { clearTimeout(t) }
617
+ // }, [changeField]);
618
+
619
+ return columns;
620
+ };
621
+
622
+ /** 字段 */
623
+ function isCipher(name?: string, field?: string) {
624
+ if (!name || !field) return false;
625
+ return name !== field;
626
+ }
627
+
628
+ class MyInput extends React.Component<InputProps & { loading?: boolean }> {
629
+ render() {
630
+ if (this.props.loading) {
631
+ return (
632
+ <Spin size="small">
633
+ <Input {...this.props} autoComplete="off" />
634
+ </Spin>
635
+ )
636
+ } else {
637
+ return <Input {...this.props} autoComplete="off" />
638
+ }
639
+ }
640
+ }
641
+
642
+ class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
643
+
644
+ render() {
645
+ if (this.props.loading) {
646
+ return (
647
+ <Spin size="small">
648
+ <span style={{ padding: '0 10px' }}>{this.props.value}</span>
649
+ </Spin>
650
+ )
651
+ } else {
652
+ return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
653
+ }
654
+ }
655
+ }
656
+
657
+ class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
658
+ render(): React.ReactNode {
659
+
660
+ const { isMyShow, valueT, valueF } = this.props;
661
+
662
+ if (isMyShow) {
663
+ if (valueT) {
664
+ return (
665
+ <Tooltip title={valueT}>
666
+ <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
667
+ </Tooltip>
668
+ )
669
+ } else {
670
+ return (
671
+ <Tooltip title={valueF}>
672
+ <span style={MyItemNameStyle}>{valueF}</span>
673
+ </Tooltip>
674
+ )
675
+ }
676
+ } else {
677
+ if (valueF) {
678
+ return (
679
+ <Tooltip title={valueF}>
680
+ <span style={MyItemNameStyle}>{valueF}</span>
681
+ </Tooltip>
682
+ )
683
+ } else {
684
+ return (
685
+ <Tooltip title={valueT} style={MyItemNameStyle}>
686
+ <span style={{ ...MyItemNameStyle, color: '#0074ff' }}>{valueT}</span>
687
+ </Tooltip>
688
+ )
689
+ }
690
+ }
691
+ }
692
+ }
693
+
694
+ /** 格式搜索结果 */
695
+ function formatSearch(value?: string, search?: string) {
696
+ if (!value || !search) return value;
697
+
698
+ const __html = ucoding(value).split(new RegExp(ucoding(search), 'g')).map(e => dcoding(e)).join(`<span class="kts-invoice-operate-goods-list-table-search-protrude" >${search}</span>`);
699
+ return <span dangerouslySetInnerHTML={{ __html }} />
700
+ }
701
+
702
+ /** 编码 */
703
+ function ucoding(v: string): string {
704
+ return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
705
+ }
706
+
707
+ /** 解码 */
708
+ function dcoding(v: string): string {
709
+ return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
710
+ }
711
+
712
+ /** 是否免税 */
713
+ function isDutyFree(record: IGood): boolean {
714
+ return (record.taxFreeType as any) === 1 && record.favouredPolicyName === '免税';
715
+ }
716
+
717
+ const MyItemNameStyle: any = {
718
+ padding: '0px 10px',
719
+ whiteSpace: 'nowrap',
720
+ overflow: 'hidden',
721
+ width: "100%",
722
+ display: 'block',
723
+ textOverflow: 'ellipsis'
725
724
  }