kts-component-invoice-operate 3.2.243 → 3.2.245

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 (302) 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/Invoice-digtal/_test/pay/index.d.ts +4 -0
  11. package/dist/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.d.ts +1 -0
  12. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/IColumnsReplenish/index.d.ts +6 -0
  13. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/IGood/index.d.ts +12 -0
  14. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/ImportGoods/index.d.ts +21 -0
  15. package/dist/Invoice/InvoiceController/InvoiceControllerState/PayListState/index.d.ts +31 -0
  16. package/dist/Invoice/InvoiceController/InvoiceControllerState/index.d.ts +2 -0
  17. package/dist/Invoice/InvoiceController/fns/addPay.d.ts +6 -0
  18. package/dist/Invoice/InvoiceController/fns/delPay.d.ts +6 -0
  19. package/dist/Invoice/InvoiceController/fns/saveEditPay.d.ts +6 -0
  20. package/dist/Invoice/InvoiceController/fns/setEditPay.d.ts +6 -0
  21. package/dist/Invoice/InvoiceController/fns/setPay.d.ts +6 -0
  22. package/dist/Invoice/InvoiceController/index.d.ts +6 -0
  23. package/dist/Invoice/index.d.ts +2 -0
  24. package/dist/Invoice/ui/digtal/PayList/hook/useColumns/index.d.ts +3 -0
  25. package/dist/Invoice/ui/digtal/PayList/hook/useColumns/ui/TitleText/index.d.ts +8 -0
  26. package/dist/Invoice/ui/digtal/PayList/hook/useOnRow/index.d.ts +8 -0
  27. package/dist/Invoice/ui/digtal/PayList/hook/useRowSelection/index.d.ts +8 -0
  28. package/dist/Invoice/ui/digtal/PayList/hook/useWindowClick/index.d.ts +5 -0
  29. package/dist/Invoice/ui/digtal/PayList/index.d.ts +18 -0
  30. package/dist/Invoice/ui/digtal/PayList/ui/AddRowButton/index.d.ts +3 -0
  31. package/dist/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useDelRowButton/index.d.ts +6 -0
  32. package/dist/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useEmptyRefill/index.d.ts +6 -0
  33. package/dist/Invoice/ui/digtal/PayList/ui/TableRow/index.d.ts +3 -0
  34. package/dist/Invoice/ui/digtal/PayList/ui/TableVirtual/index.d.ts +4 -0
  35. package/dist/Invoice/ui/digtal/StakeFarmerholder/index.d.ts +2 -0
  36. package/dist/index.esm.js +8765 -5735
  37. package/dist/index.js +8764 -5734
  38. package/docs/index.md +5 -5
  39. package/docs-dist/404.html +33 -33
  40. package/docs-dist/index.html +33 -33
  41. package/docs-dist/static/arrowDown.a1cbf0d8.svg +2 -2
  42. package/docs-dist/static/arrowUp.4c482054.svg +2 -2
  43. package/docs-dist/static/fork.5431267d.svg +11 -11
  44. package/docs-dist/static/plus.44013ce3.svg +11 -11
  45. package/docs-dist/static/plus.4fd1af30.svg +11 -11
  46. package/docs-dist/umi.css +18 -18
  47. package/index.html +12 -12
  48. package/package.json +62 -62
  49. package/src/Invoice/Invoice-digtal/_test/architecture/index.tsx +21 -21
  50. package/src/Invoice/Invoice-digtal/_test/disabled/index.tsx +40 -40
  51. package/src/Invoice/Invoice-digtal/_test/easiest/index.tsx +214 -182
  52. package/src/Invoice/Invoice-digtal/_test/freight/index.tsx +14580 -14574
  53. package/src/Invoice/Invoice-digtal/_test/header/index.tsx +84 -84
  54. package/src/Invoice/Invoice-digtal/_test/importGoods/index.tsx +868 -868
  55. package/src/Invoice/Invoice-digtal/_test/importStakeholder/index.tsx +18 -18
  56. package/src/Invoice/Invoice-digtal/_test/lineCredit/index.tsx +19 -19
  57. package/src/Invoice/Invoice-digtal/_test/pay/index.tsx +14637 -0
  58. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -150
  59. package/src/Invoice/Invoice-digtal/_test/readOnly/index.tsx +55 -55
  60. package/src/Invoice/Invoice-digtal/_test/realEstateInfo/index.tsx +83 -36
  61. package/src/Invoice/Invoice-digtal/_test/stakeholder/index.tsx +12 -12
  62. package/src/Invoice/Invoice-digtal/_test/typeSelection/index.tsx +29 -29
  63. package/src/Invoice/Invoice-digtal/index.md +44 -43
  64. package/src/Invoice/InvoiceController/InvoiceControllerForm/index.ts +116 -105
  65. package/src/Invoice/InvoiceController/InvoiceControllerState/AutoComplete/index.ts +26 -26
  66. package/src/Invoice/InvoiceController/InvoiceControllerState/BuyerState/index.tsx +88 -88
  67. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IColumnsReplenish/index.ts +10 -10
  68. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/IGood/index.ts +33 -33
  69. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/ImportGoods/index.ts +81 -81
  70. package/src/Invoice/InvoiceController/InvoiceControllerState/FreightListState/index.ts +39 -39
  71. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/Drag/index.ts +15 -15
  72. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/EndowCode/index.tsx +104 -104
  73. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IColumnsReplenish/index.ts +10 -10
  74. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/IGood/index.ts +91 -89
  75. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ImportGoods/index.ts +84 -84
  76. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType/index.ts +7 -7
  77. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/ProductComparison/index.ts +9 -9
  78. package/src/Invoice/InvoiceController/InvoiceControllerState/GoodsListState/index.ts +134 -134
  79. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/IColumnsReplenish/index.ts +10 -0
  80. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/IGood/index.ts +35 -0
  81. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/ImportGoods/index.ts +81 -0
  82. package/src/Invoice/InvoiceController/InvoiceControllerState/PayListState/index.ts +40 -0
  83. package/src/Invoice/InvoiceController/InvoiceControllerState/Stakeholder/index.ts +13 -13
  84. package/src/Invoice/InvoiceController/InvoiceControllerState/index.ts +76 -73
  85. package/src/Invoice/InvoiceController/fns/addFreight.ts +11 -11
  86. package/src/Invoice/InvoiceController/fns/addGood.ts +11 -11
  87. package/src/Invoice/InvoiceController/fns/addGoodDiscount.ts +126 -126
  88. package/src/Invoice/InvoiceController/fns/addGoodDiscountV2.ts +86 -86
  89. package/src/Invoice/InvoiceController/fns/addPay.ts +11 -0
  90. package/src/Invoice/InvoiceController/fns/delFreight.ts +38 -38
  91. package/src/Invoice/InvoiceController/fns/delGood.ts +41 -41
  92. package/src/Invoice/InvoiceController/fns/delPay.ts +38 -0
  93. package/src/Invoice/InvoiceController/fns/getGoodsSearch.ts +26 -26
  94. package/src/Invoice/InvoiceController/fns/importGoodsDrawer.ts +79 -79
  95. package/src/Invoice/InvoiceController/fns/itemBlur.ts +40 -40
  96. package/src/Invoice/InvoiceController/fns/mergeDetails.ts +201 -201
  97. package/src/Invoice/InvoiceController/fns/mergeDiscount.ts +35 -35
  98. package/src/Invoice/InvoiceController/fns/saveEditFreight.ts +24 -24
  99. package/src/Invoice/InvoiceController/fns/saveEditGood.ts +24 -24
  100. package/src/Invoice/InvoiceController/fns/saveEditPay.ts +23 -0
  101. package/src/Invoice/InvoiceController/fns/setEditFreight.ts +16 -16
  102. package/src/Invoice/InvoiceController/fns/setEditGood.ts +16 -16
  103. package/src/Invoice/InvoiceController/fns/setEditPay.ts +16 -0
  104. package/src/Invoice/InvoiceController/fns/setFreight.ts +10 -10
  105. package/src/Invoice/InvoiceController/fns/setGoods.ts +10 -10
  106. package/src/Invoice/InvoiceController/fns/setPay.ts +11 -0
  107. package/src/Invoice/InvoiceController/fns/updateInvoiceNo.ts +8 -8
  108. package/src/Invoice/InvoiceController/index.ts +127 -106
  109. package/src/Invoice/_test/buyerNameSearch/index.tsx +42 -42
  110. package/src/Invoice/_test/children/index.tsx +214 -214
  111. package/src/Invoice/_test/deduction/index.tsx +957 -957
  112. package/src/Invoice/_test/draft/index.tsx +40 -40
  113. package/src/Invoice/_test/easiest/index.tsx +5 -5
  114. package/src/Invoice/_test/endowCode/index.tsx +1158 -1158
  115. package/src/Invoice/_test/goodsMenuExpand/index.tsx +32 -32
  116. package/src/Invoice/_test/importBuyer/index.tsx +74 -74
  117. package/src/Invoice/_test/importGoods/index.tsx +1197 -1197
  118. package/src/Invoice/_test/invoiceType/index.tsx +59 -59
  119. package/src/Invoice/_test/isInvoiceNo/index.tsx +12 -12
  120. package/src/Invoice/_test/replaceHead/index.tsx +22 -22
  121. package/src/Invoice/_test/retrieveData/index.tsx +22 -22
  122. package/src/Invoice/_test/seller/index.tsx +28 -28
  123. package/src/Invoice/_test/setDataSource/index.tsx +73 -73
  124. package/src/Invoice/_test/unit/index.tsx +19 -19
  125. package/src/Invoice/index.less +31 -31
  126. package/src/Invoice/index.md +56 -56
  127. package/src/Invoice/index.tsx +200 -197
  128. package/src/Invoice/tools/calculate/index.ts +144 -144
  129. package/src/Invoice/tools/coolingFn/index.ts +17 -17
  130. package/src/Invoice/tools/evaluate/index.ts +7 -7
  131. package/src/Invoice/tools/idGenerator/index.ts +2 -2
  132. package/src/Invoice/tools/itemName/index.ts +55 -55
  133. package/src/Invoice/tools/lazyFn/index.ts +19 -19
  134. package/src/Invoice/tools/mounting/index.ts +13 -13
  135. package/src/Invoice/tools/strringFn/index.ts +40 -40
  136. package/src/Invoice/tools/useToGenerateId/index.ts +12 -10
  137. package/src/Invoice/tools/utils/index.ts +1 -1
  138. package/src/Invoice/tools/utils/money/index.ts +20 -20
  139. package/src/Invoice/ui/default/AddComparisonDrawer/index.tsx +149 -149
  140. package/src/Invoice/ui/default/Buyer/index.less +219 -219
  141. package/src/Invoice/ui/default/Buyer/index.tsx +114 -114
  142. package/src/Invoice/ui/default/Buyer/ui/BuyerNameInput/index.tsx +166 -166
  143. package/src/Invoice/ui/default/Buyer/ui/ImportBuyerButton/index.tsx +21 -21
  144. package/src/Invoice/ui/default/EndowCodeDrawer/index.less +8 -8
  145. package/src/Invoice/ui/default/EndowCodeDrawer/index.tsx +612 -612
  146. package/src/Invoice/ui/default/GoodsList/hook/useColumns/autoFillFn/index.ts +647 -647
  147. package/src/Invoice/ui/default/GoodsList/hook/useColumns/index.tsx +719 -719
  148. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  149. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  150. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/Expand/index.tsx +57 -57
  151. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.less +18 -18
  152. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemCodeInput/index.tsx +49 -49
  153. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +17 -17
  154. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +91 -91
  155. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  156. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  157. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +118 -118
  158. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/dist/index.js +32 -32
  159. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  160. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +25 -25
  161. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  162. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +99 -99
  163. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  164. package/src/Invoice/ui/default/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  165. package/src/Invoice/ui/default/GoodsList/hook/useDeduction/index.tsx +24 -24
  166. package/src/Invoice/ui/default/GoodsList/hook/useOnRow/index.tsx +52 -52
  167. package/src/Invoice/ui/default/GoodsList/hook/useRowSelection/index.tsx +120 -120
  168. package/src/Invoice/ui/default/GoodsList/hook/useWindowClick/index.tsx +23 -23
  169. package/src/Invoice/ui/default/GoodsList/index.less +185 -185
  170. package/src/Invoice/ui/default/GoodsList/index.tsx +207 -207
  171. package/src/Invoice/ui/default/GoodsList/ui/AddRowButton/index.tsx +72 -72
  172. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.less +21 -21
  173. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +244 -244
  174. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  175. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +69 -69
  176. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +65 -65
  177. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDetails/index.tsx +91 -91
  178. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useMergeDiscount/index.tsx +36 -36
  179. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesDiscount/index.tsx +109 -109
  180. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/hooks/useSalesGifts/index.tsx +94 -94
  181. package/src/Invoice/ui/default/GoodsList/ui/BulkMenu/index.tsx +37 -37
  182. package/src/Invoice/ui/default/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  183. package/src/Invoice/ui/default/GoodsList/ui/Search/index.less +10 -10
  184. package/src/Invoice/ui/default/GoodsList/ui/Search/index.tsx +52 -52
  185. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.less +18 -18
  186. package/src/Invoice/ui/default/GoodsList/ui/Statistics/index.tsx +114 -114
  187. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.less +40 -40
  188. package/src/Invoice/ui/default/GoodsList/ui/TableRow/index.tsx +71 -71
  189. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.less +38 -38
  190. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual/index.tsx +130 -130
  191. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.less +44 -44
  192. package/src/Invoice/ui/default/GoodsList/ui/TableVirtual.o/index.tsx +96 -96
  193. package/src/Invoice/ui/default/GoodsList/ui/TaxIncludedSwitch/index.tsx +31 -31
  194. package/src/Invoice/ui/default/ImportBuyerDrawer/index.tsx +75 -75
  195. package/src/Invoice/ui/default/ImportGoodsDrawer/index.tsx +201 -201
  196. package/src/Invoice/ui/default/InvoiceHeader/index.less +68 -68
  197. package/src/Invoice/ui/default/InvoiceHeader/index.tsx +246 -246
  198. package/src/Invoice/ui/default/Seller/index.less +113 -113
  199. package/src/Invoice/ui/default/Seller/index.tsx +98 -98
  200. package/src/Invoice/ui/default/Sign/index.less +14 -14
  201. package/src/Invoice/ui/default/Sign/index.tsx +71 -71
  202. package/src/Invoice/ui/digtal/Architecture/index.less +18 -18
  203. package/src/Invoice/ui/digtal/Architecture/index.tsx +177 -177
  204. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/dist/index.js +616 -616
  205. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/index.tsx +246 -246
  206. package/src/Invoice/ui/digtal/FreightList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  207. package/src/Invoice/ui/digtal/FreightList/hook/useOnRow/index.tsx +37 -37
  208. package/src/Invoice/ui/digtal/FreightList/hook/useRowSelection/index.tsx +119 -119
  209. package/src/Invoice/ui/digtal/FreightList/hook/useWindowClick/index.tsx +23 -23
  210. package/src/Invoice/ui/digtal/FreightList/index.less +72 -72
  211. package/src/Invoice/ui/digtal/FreightList/index.tsx +129 -129
  212. package/src/Invoice/ui/digtal/FreightList/ui/AddRowButton/index.tsx +74 -74
  213. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  214. package/src/Invoice/ui/digtal/FreightList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +36 -36
  215. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.less +28 -28
  216. package/src/Invoice/ui/digtal/FreightList/ui/TableRow/index.tsx +20 -20
  217. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.less +38 -38
  218. package/src/Invoice/ui/digtal/FreightList/ui/TableVirtual/index.tsx +108 -108
  219. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/autoFillFn/index.ts +683 -683
  220. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/dist/index.js +616 -616
  221. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/index.tsx +724 -724
  222. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/svg/plus.svg +11 -11
  223. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.less +20 -20
  224. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/Drag/index.tsx +205 -205
  225. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.less +9 -9
  226. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/ItemNameInput/index.tsx +87 -87
  227. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowEditButton/index.tsx +30 -30
  228. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +43 -43
  229. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +76 -76
  230. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +41 -41
  231. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +34 -34
  232. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.less +13 -13
  233. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowMenu/index.tsx +98 -98
  234. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/RowSaveButton/index.tsx +14 -14
  235. package/src/Invoice/ui/digtal/GoodsList/hook/useColumns/ui/TitleText/index.tsx +20 -20
  236. package/src/Invoice/ui/digtal/GoodsList/hook/useOnRow/index.tsx +51 -51
  237. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +121 -121
  238. package/src/Invoice/ui/digtal/GoodsList/hook/useWindowClick/index.tsx +23 -23
  239. package/src/Invoice/ui/digtal/GoodsList/index.less +56 -56
  240. package/src/Invoice/ui/digtal/GoodsList/index.tsx +181 -181
  241. package/src/Invoice/ui/digtal/GoodsList/ui/AddRowButton/index.tsx +87 -87
  242. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +340 -340
  243. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/svg/add.svg +11 -11
  244. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useCommodityComparisonButton/index.tsx +75 -75
  245. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -50
  246. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -37
  247. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEndowCodeButton/index.tsx +82 -82
  248. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +57 -57
  249. package/src/Invoice/ui/digtal/GoodsList/ui/DescribeSwitch/index.tsx +36 -36
  250. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.less +11 -11
  251. package/src/Invoice/ui/digtal/GoodsList/ui/Search/index.tsx +60 -60
  252. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.less +53 -53
  253. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/index.tsx +98 -98
  254. package/src/Invoice/ui/digtal/GoodsList/ui/Statistics/svg/fork.svg +11 -11
  255. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.less +28 -28
  256. package/src/Invoice/ui/digtal/GoodsList/ui/TableRow/index.tsx +52 -52
  257. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.less +38 -38
  258. package/src/Invoice/ui/digtal/GoodsList/ui/TableVirtual/index.tsx +113 -113
  259. package/src/Invoice/ui/digtal/GoodsList/ui/TaxIncludedSwitch/index.tsx +34 -34
  260. package/src/Invoice/ui/digtal/InvoiceHeader/index.less +57 -57
  261. package/src/Invoice/ui/digtal/InvoiceHeader/index.tsx +77 -77
  262. package/src/Invoice/ui/digtal/PayList/hook/useColumns/dist/index.js +616 -0
  263. package/src/Invoice/ui/digtal/PayList/hook/useColumns/index.tsx +168 -0
  264. package/src/Invoice/ui/digtal/PayList/hook/useColumns/ui/TitleText/index.tsx +20 -0
  265. package/src/Invoice/ui/digtal/PayList/hook/useOnRow/index.tsx +37 -0
  266. package/src/Invoice/ui/digtal/PayList/hook/useRowSelection/index.tsx +120 -0
  267. package/src/Invoice/ui/digtal/PayList/hook/useWindowClick/index.tsx +19 -0
  268. package/src/Invoice/ui/digtal/PayList/index.less +73 -0
  269. package/src/Invoice/ui/digtal/PayList/index.tsx +132 -0
  270. package/src/Invoice/ui/digtal/PayList/ui/AddRowButton/index.tsx +75 -0
  271. package/src/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useDelRowButton/index.tsx +50 -0
  272. package/src/Invoice/ui/digtal/PayList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +37 -0
  273. package/src/Invoice/ui/digtal/PayList/ui/TableRow/index.less +29 -0
  274. package/src/Invoice/ui/digtal/PayList/ui/TableRow/index.tsx +21 -0
  275. package/src/Invoice/ui/digtal/PayList/ui/TableVirtual/index.less +39 -0
  276. package/src/Invoice/ui/digtal/PayList/ui/TableVirtual/index.tsx +109 -0
  277. package/src/Invoice/ui/digtal/RealEstateInfo/index.less +21 -21
  278. package/src/Invoice/ui/digtal/RealEstateInfo/index.tsx +451 -242
  279. package/src/Invoice/ui/digtal/Sign/index.less +48 -48
  280. package/src/Invoice/ui/digtal/Sign/index.tsx +99 -99
  281. package/src/Invoice/ui/digtal/StakeFarmerholder/index.less +99 -99
  282. package/src/Invoice/ui/digtal/StakeFarmerholder/index.tsx +1102 -491
  283. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowDown.svg +2 -2
  284. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/arrowUp.svg +2 -2
  285. package/src/Invoice/ui/digtal/StakeFarmerholder/svg/plus.svg +11 -11
  286. package/src/Invoice/ui/digtal/Stakeholder/index.less +99 -99
  287. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +453 -453
  288. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowDown.svg +2 -2
  289. package/src/Invoice/ui/digtal/Stakeholder/svg/arrowUp.svg +2 -2
  290. package/src/Invoice/ui/digtal/Stakeholder/svg/plus.svg +11 -11
  291. package/src/InvoiceTypeModal/_test/easiest/index.tsx +31 -31
  292. package/src/InvoiceTypeModal/dist/index.js +92 -92
  293. package/src/InvoiceTypeModal/index.less +7 -7
  294. package/src/InvoiceTypeModal/index.md +5 -5
  295. package/src/InvoiceTypeModal/index.tsx +161 -161
  296. package/src/TaxClassificationCodeModal/_test/easiest/index.tsx +184 -184
  297. package/src/TaxClassificationCodeModal/index.less +17 -17
  298. package/src/TaxClassificationCodeModal/index.md +6 -6
  299. package/src/TaxClassificationCodeModal/index.tsx +152 -152
  300. package/src/index.ts +13 -13
  301. package/tsconfig.json +31 -31
  302. package/typings.d.ts +3 -3
@@ -1,719 +1,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 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 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
+ }