ERPTurbo_Client/packages/app-client/src/components/purchase/section/TaxSubsidySection.tsx
shenyifei a62ca1fb95 refactor(purchase): 重构采购订单计算逻辑
- 引入 PurchaseOrderCalculator 类统一管理采购订单相关计算
- 替换原有分散的计算函数调用为计算器实例方法
- 更新成本差异、税费补贴、计提税金等计算逻辑
- 优化市场报价和平均单价的计算方式
- 调整成本汇总表格列定义及数据处理
- 修改页面中价格和金额的格式化显示逻辑
- 更新代理配置路径重写规则以适配新接口路径
- 调整标题文案从"寻鸿门店管理系统"到"西瓜运输管理系统"
2025-11-13 16:24:25 +08:00

186 lines
6.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useEffect, useState } from "react";
import { Text, View } from "@tarojs/components";
import { Button, Input, Popup, SafeArea } from "@nutui/nutui-react-taro";
import { validatePrice } from "@/utils/format";
import { PurchaseOrderCalculator } from "@/utils/PurchaseOrderCalculator";
export default function TaxSubsidySection(props: {
dealerVO: BusinessAPI.DealerVO;
purchaseOrderVO: BusinessAPI.PurchaseOrderVO;
onChange?: (purchaseOrderVO: BusinessAPI.PurchaseOrderVO) => void;
readOnly?: boolean;
}) {
const { purchaseOrderVO, onChange, readOnly, dealerVO } = props;
const calculator = new PurchaseOrderCalculator(purchaseOrderVO);
const [visible, setVisible] = useState(false);
const [taxSubsidy, setTaxSubsidy] = useState<number>(
purchaseOrderVO.orderDealer.taxSubsidy || 0,
);
// 当dealerVO变化时自动计算税费补贴
useEffect(() => {
if (!purchaseOrderVO.orderDealer.taxSubsidy) {
const defaultValue = calculator.getDefaultTaxSubsidy();
setTaxSubsidy(defaultValue);
// 更新父组件的状态
onChange?.({
...purchaseOrderVO,
orderDealer: {
...purchaseOrderVO.orderDealer,
taxSubsidy: defaultValue,
},
});
}
}, []);
// 设置税费补贴默认值
const setDefaultTaxSubsidy = () => {
const defaultValue = calculator.getDefaultTaxSubsidy();
setTaxSubsidy(defaultValue);
};
// 保存税费补贴
const saveTaxSubsidy = () => {
onChange?.({
...purchaseOrderVO,
orderDealer: {
...purchaseOrderVO.orderDealer,
taxSubsidy,
},
});
setVisible(false);
};
return (
<View className={"flex flex-col gap-2.5"}>
{/* 卡片形式展示返点信息 */}
<View className="bg-primary/3 rounded-lg border-b border-gray-100 p-2.5">
<View className="mb-2">
<Text className="text-sm font-medium"></Text>
</View>
<View className="flex">
<View className="flex-1">
{!readOnly ? (
<View onClick={() => setVisible(true)}>
<View className="mb-2 flex items-center justify-between">
<Text className="text-sm text-gray-500"></Text>
<Text className="text-sm text-gray-500"></Text>
</View>
<View className="relative flex">
<Text className="w-full border-b-2 border-red-500 pb-2 text-3xl font-bold text-red-500 focus:outline-none">
{taxSubsidy || "0.00"}
</Text>
</View>
</View>
) : (
<View>
<View className="mb-2 flex items-center justify-between">
<Text className="text-sm text-gray-500"></Text>
<Text className="text-sm text-gray-500"></Text>
</View>
<View className="relative">
<Text className="w-full py-2 text-3xl font-bold text-red-500">
{taxSubsidy || "0.00"}
</Text>
</View>
</View>
)}
</View>
<View className="flex flex-1 flex-col gap-2 pl-4">
<View className="flex items-center justify-between">
<Text className="text-sm text-gray-500"></Text>
<Text className="text-sm font-medium">
{dealerVO.companyRebateRatio
? dealerVO.companyRebateRatio + "%"
: "未设置"}
</Text>
</View>
</View>
</View>
</View>
{/* 税费补贴弹窗 */}
<Popup
duration={150}
style={{
minHeight: "auto",
}}
visible={visible}
className={"flex flex-col"}
position="bottom"
title={"编辑税费补贴"}
onClose={() => setVisible(false)}
onOverlayClick={() => {
setVisible(false);
}}
lockScroll
>
<View className={"flex flex-col gap-3 p-2.5"}>
<View className={"text-neutral-darkest text-sm font-medium"}>
</View>
<View
className={
"border-neutral-base flex flex-row items-center rounded-md border border-solid"
}
>
<Input
className={"placeholder:text-neutral-dark"}
placeholder={"请输入税费补贴金额"}
type={"digit"}
value={taxSubsidy?.toString()}
onChange={(value) => {
const numValue = validatePrice(value);
if (numValue !== undefined) {
setTaxSubsidy(numValue as any);
}
}}
/>
<View className={"mr-2"}></View>
</View>
<View className={"flex flex-row gap-2 pt-2"}>
<Button size="small" onClick={setDefaultTaxSubsidy}>
</Button>
<View className="ml-2 self-center text-xs text-gray-500">
默认值: 市场报价 × {dealerVO.companyRebateRatio || "未设置"}%
</View>
</View>
</View>
<View className={"flex w-full flex-col bg-white"}>
<View className={"flex flex-row gap-2 p-3"}>
<View className={"flex-1"}>
<Button
size={"large"}
block
type="default"
onClick={() => {
setVisible(false);
}}
>
</Button>
</View>
<View className={"flex-1"}>
<Button
size={"large"}
block
type="primary"
onClick={saveTaxSubsidy}
>
</Button>
</View>
</View>
<SafeArea position={"bottom"} />
</View>
</Popup>
</View>
);
}