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