feat(purchase): 重构采购模块组件结构与交互逻辑
- 将采购相关组件移至 module 目录统一管理 - 优化 OrderCost 组件的人工费用处理逻辑,改为统一管理工头姓名 - 改进 OrderPackage 组件的纸箱类型渲染逻辑,根据供应商属性动态显示 - 更新 Weigh 组件,支持多供应商场景下的纸箱选择展示 - 调整采购模块导出路径,适配新的目录结构 - 优化表单交互文案,提升用户体验一致性
This commit is contained in:
parent
1ac1564ec2
commit
5a814cb358
@ -1,11 +1,12 @@
|
|||||||
export { default as OrderVehicle } from "./OrderVehicle";
|
export { default as OrderVehicle } from "./module/OrderVehicle";
|
||||||
export { default as Weigh } from "./Weigh";
|
export { default as Weigh } from "./module/Weigh";
|
||||||
export { default as MelonFarmer } from "./MelonFarmer";
|
export { default as MelonFarmer } from "./module/MelonFarmer";
|
||||||
export { default as OrderPackage } from "./OrderPackage";
|
export { default as OrderPackage } from "./module/OrderPackage";
|
||||||
export { default as TicketUpload } from "./TicketUpload";
|
export { default as TicketUpload } from "./module/TicketUpload";
|
||||||
export { default as OrderCost } from "./OrderCost";
|
export { default as OrderCost } from "./module/OrderCost";
|
||||||
export { default as SupplierList } from "./SupplierList";
|
export { default as SupplierList } from "./module/SupplierList";
|
||||||
export { default as PurchasePreview } from "./PurchasePreview";
|
export { default as PurchasePreview } from "./module/PurchasePreview";
|
||||||
|
|
||||||
export { default as PurchaseOrderRejectApprove } from "./button/PurchaseOrderRejectApprove";
|
export { default as PurchaseOrderRejectApprove } from "./button/PurchaseOrderRejectApprove";
|
||||||
export { default as PurchaseOrderRejectFinal } from "./button/PurchaseOrderRejectFinal";
|
export { default as PurchaseOrderRejectFinal } from "./button/PurchaseOrderRejectFinal";
|
||||||
export { default as PurchaseOrderSubmitReview } from "./button/PurchaseOrderSubmitReview";
|
export { default as PurchaseOrderSubmitReview } from "./button/PurchaseOrderSubmitReview";
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { View } from "@tarojs/components";
|
|||||||
import { Icon } from "@/components";
|
import { Icon } from "@/components";
|
||||||
import { forwardRef, useEffect, useImperativeHandle, useState } from "react";
|
import { forwardRef, useEffect, useImperativeHandle, useState } from "react";
|
||||||
import { business } from "@/services";
|
import { business } from "@/services";
|
||||||
import { Checkbox, Input, Picker, Toast } from "@nutui/nutui-react-taro";
|
import { Button, Checkbox, Input, Toast } from "@nutui/nutui-react-taro";
|
||||||
import { CostItem } from "@/types/typings";
|
import { CostItem } from "@/types/typings";
|
||||||
import { generateShortId } from "@/utils/generateShortId";
|
import { generateShortId } from "@/utils/generateShortId";
|
||||||
|
|
||||||
@ -16,19 +16,17 @@ export interface IOrderCostProps {
|
|||||||
onChange?: (costItemList: CostItem[]) => void;
|
onChange?: (costItemList: CostItem[]) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const options = [
|
|
||||||
[
|
|
||||||
{ value: "US", label: "我方" },
|
|
||||||
{ value: "OTHER", label: "瓜农" },
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
export default forwardRef<OrderCostRef, IOrderCostProps>(
|
export default forwardRef<OrderCostRef, IOrderCostProps>(
|
||||||
function OrderCost(IOrderCostProps, ref) {
|
function OrderCost(IOrderCostProps, ref) {
|
||||||
const { value, onChange } = IOrderCostProps;
|
const { value, onChange } = IOrderCostProps;
|
||||||
|
|
||||||
const [costItemVOList, setCostItemVOList] = useState<CostItem[]>();
|
const [costItemVOList, setCostItemVOList] = useState<CostItem[]>();
|
||||||
|
|
||||||
|
// 总的工头姓名状态
|
||||||
|
const [principal, setPrincipal] = useState<string>("");
|
||||||
|
// 工头姓名错误状态
|
||||||
|
const [principalError, setPrincipalError] = useState<boolean>(false);
|
||||||
|
|
||||||
const init = async () => {
|
const init = async () => {
|
||||||
const { data } = await business.costItem.listCostItem({
|
const { data } = await business.costItem.listCostItem({
|
||||||
costItemListQry: {
|
costItemListQry: {
|
||||||
@ -58,6 +56,17 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
}) || [];
|
}) || [];
|
||||||
|
|
||||||
setCostItemVOList(initialList as CostItem[]);
|
setCostItemVOList(initialList as CostItem[]);
|
||||||
|
|
||||||
|
// 初始化总的工头姓名(如果有启用且费用承担方为"我方"的项目)
|
||||||
|
const enabledUsItems = initialList.filter(
|
||||||
|
(item) =>
|
||||||
|
item.selected &&
|
||||||
|
item.payerType === "US" &&
|
||||||
|
item.costType === "HUMAN_COST",
|
||||||
|
);
|
||||||
|
if (enabledUsItems.length > 0 && enabledUsItems[0].principal) {
|
||||||
|
setPrincipal(enabledUsItems[0].principal || "");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 当传入的value发生变化时,重新初始化列表
|
// 当传入的value发生变化时,重新初始化列表
|
||||||
@ -68,9 +77,20 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
// 当内部状态发生变化时,通知父组件更新
|
// 当内部状态发生变化时,通知父组件更新
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (costItemVOList && onChange) {
|
if (costItemVOList && onChange) {
|
||||||
onChange(costItemVOList);
|
// 更新所有启用且费用承担方为"我方"的人工费用项的工头姓名
|
||||||
|
const updatedList = costItemVOList.map((item) => {
|
||||||
|
if (
|
||||||
|
item.costType === "HUMAN_COST" &&
|
||||||
|
item.selected &&
|
||||||
|
item.payerType === "US"
|
||||||
|
) {
|
||||||
|
return { ...item, principal };
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
onChange(updatedList);
|
||||||
}
|
}
|
||||||
}, [costItemVOList]);
|
}, [costItemVOList, principal]);
|
||||||
|
|
||||||
// 错误状态
|
// 错误状态
|
||||||
const [countError, setCountError] = useState<{ [key: string]: boolean }>(
|
const [countError, setCountError] = useState<{ [key: string]: boolean }>(
|
||||||
@ -79,14 +99,6 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
const [payerTypeError, setPayerTypeError] = useState<{
|
const [payerTypeError, setPayerTypeError] = useState<{
|
||||||
[key: string]: boolean;
|
[key: string]: boolean;
|
||||||
}>({});
|
}>({});
|
||||||
const [principalError, setPrincipalError] = useState<{
|
|
||||||
[key: string]: boolean;
|
|
||||||
}>({});
|
|
||||||
|
|
||||||
// 为每个项目维护独立的Picker可见状态
|
|
||||||
const [pickerVisibleMap, setPickerVisibleMap] = useState<{
|
|
||||||
[key: string]: boolean;
|
|
||||||
}>({});
|
|
||||||
|
|
||||||
// 设置人工项目选择状态
|
// 设置人工项目选择状态
|
||||||
const setArtificialSelect = (id: string, selected: boolean) => {
|
const setArtificialSelect = (id: string, selected: boolean) => {
|
||||||
@ -132,12 +144,9 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 校验工头姓名
|
// 校验工头姓名
|
||||||
const validatePrincipal = (id: string, value: string) => {
|
const validatePrincipal = (value: string) => {
|
||||||
const isValid = value.trim().length > 0;
|
const isValid = value.trim().length > 0;
|
||||||
setPrincipalError((prev) => ({
|
setPrincipalError(!isValid);
|
||||||
...prev,
|
|
||||||
[id]: !isValid,
|
|
||||||
}));
|
|
||||||
return isValid;
|
return isValid;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -159,17 +168,18 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 处理工头姓名变化
|
// 处理工头姓名变化
|
||||||
const handlePrincipalChange = (id: string, value: string) => {
|
const handlePrincipalChange = (value: string) => {
|
||||||
if (!costItemVOList) return;
|
setPrincipal(value);
|
||||||
const newList = costItemVOList.map((item) =>
|
|
||||||
item.orderCostId === id ? { ...item, principal: value } : item,
|
|
||||||
);
|
|
||||||
setCostItemVOList(newList);
|
|
||||||
|
|
||||||
// 如果是瓜农承担且已启用,则校验工头姓名
|
// 如果有启用且费用承担方为"我方"的项目,则校验工头姓名
|
||||||
const item = costItemVOList.find((item) => item.orderCostId === id);
|
const enabledUsItems = costItemVOList?.filter(
|
||||||
if (item?.selected && item.payerType === "OTHER") {
|
(item) =>
|
||||||
validatePrincipal(id, value);
|
item.costType === "HUMAN_COST" &&
|
||||||
|
item.selected &&
|
||||||
|
item.payerType === "US",
|
||||||
|
);
|
||||||
|
if (enabledUsItems && enabledUsItems.length > 0) {
|
||||||
|
validatePrincipal(value);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -178,14 +188,9 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
validateCount(id, value);
|
validateCount(id, value);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 失去焦点时校验费用承担方
|
|
||||||
const handlePayerTypeBlur = (id: string, value: CostItem["payerType"]) => {
|
|
||||||
validatePayerType(id, value);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 失去焦点时校验工头姓名
|
// 失去焦点时校验工头姓名
|
||||||
const handlePrincipalBlur = (id: string, value: string) => {
|
const handlePrincipalBlur = (value: string) => {
|
||||||
validatePrincipal(id, value);
|
validatePrincipal(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 对外暴露的校验方法
|
// 对外暴露的校验方法
|
||||||
@ -206,18 +211,23 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
if (!validatePayerType(item.orderCostId, item.payerType)) {
|
if (!validatePayerType(item.orderCostId, item.payerType)) {
|
||||||
isValid = false;
|
isValid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果是瓜农承担,校验工头姓名
|
|
||||||
if (
|
|
||||||
item.payerType === "US" &&
|
|
||||||
!validatePrincipal(item.orderCostId, item.principal || "")
|
|
||||||
) {
|
|
||||||
isValid = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 校验总的工头姓名(如果有启用且费用承担方为"我方"的项目)
|
||||||
|
const enabledUsItems = costItemVOList.filter(
|
||||||
|
(item) =>
|
||||||
|
item.costType === "HUMAN_COST" &&
|
||||||
|
item.selected &&
|
||||||
|
item.payerType === "US",
|
||||||
|
);
|
||||||
|
if (enabledUsItems.length > 0) {
|
||||||
|
if (!validatePrincipal(principal)) {
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
Toast.show("toast", {
|
Toast.show("toast", {
|
||||||
icon: "fail",
|
icon: "fail",
|
||||||
@ -255,183 +265,126 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<View className={"text-sm font-normal text-[#000000]"}>
|
<View className={"text-sm font-normal text-[#000000]"}>
|
||||||
启用
|
用了
|
||||||
</View>
|
</View>
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
|
{item.selected && type === "HUMAN_COST" && (
|
||||||
|
<View>
|
||||||
|
{/* 费用承担方改为按钮形式,参考OrderPackage中的样式 */}
|
||||||
|
<View className="flex items-center justify-between">
|
||||||
|
<View className="text-sm flex-shrink-0">谁出钱:</View>
|
||||||
|
<View className="flex gap-2">
|
||||||
|
<Button
|
||||||
|
size="small"
|
||||||
|
type={item.payerType === "US" ? "primary" : "default"}
|
||||||
|
onClick={() => {
|
||||||
|
handlePayerTypeChange(item.orderCostId, "US");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
我们出
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
size="small"
|
||||||
|
type={item.payerType === "OTHER" ? "primary" : "default"}
|
||||||
|
onClick={() => {
|
||||||
|
handlePayerTypeChange(item.orderCostId, "OTHER");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
对方出
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{payerTypeError[item.orderCostId] && item.selected && (
|
||||||
|
<View className="mt-1 text-xs text-red-500">
|
||||||
|
请选择谁出这笔钱
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
|
||||||
{item.selected && (
|
{item.selected && (
|
||||||
<View>
|
<View>
|
||||||
<View className="flex items-center">
|
<View className="flex items-center justify-between gap-2">
|
||||||
<View
|
<View className="text-sm flex-shrink-0">用多少:</View>
|
||||||
className="rounded-l-button flex !size-12 flex-none items-center justify-center bg-gray-200 text-sm"
|
<View className="flex items-center">
|
||||||
onClick={() => {
|
<View
|
||||||
const count = item.count || 1;
|
className="rounded-l-button flex !size-12 flex-none items-center justify-center bg-gray-200 text-sm"
|
||||||
handleCountChange(
|
onClick={() => {
|
||||||
item.orderCostId,
|
const count = item.count || 1;
|
||||||
Math.max(1, count - 1),
|
handleCountChange(
|
||||||
);
|
item.orderCostId,
|
||||||
}}
|
Math.max(1, count - 1),
|
||||||
>
|
);
|
||||||
<Icon name="minus" size={20} />
|
|
||||||
</View>
|
|
||||||
<View
|
|
||||||
className={`flex h-12 w-full shrink items-center border-4 border-gray-200`}
|
|
||||||
>
|
|
||||||
<Input
|
|
||||||
type="number"
|
|
||||||
value={item.count.toString()}
|
|
||||||
align={"center"}
|
|
||||||
placeholder={"请输入数量"}
|
|
||||||
onChange={(value) => {
|
|
||||||
handleCountChange(item.orderCostId, Number(value));
|
|
||||||
}}
|
}}
|
||||||
formatter={(value) =>
|
>
|
||||||
Math.max(1, Number(value)).toString()
|
<Icon name="minus" size={20} />
|
||||||
}
|
</View>
|
||||||
onBlur={() =>
|
<View
|
||||||
handleCountBlur(item.orderCostId, item.count)
|
className={`flex h-12 w-full shrink items-center border-4 border-gray-200`}
|
||||||
}
|
>
|
||||||
/>
|
<Input
|
||||||
</View>
|
type="number"
|
||||||
<View
|
value={item.count.toString()}
|
||||||
className="rounded-r-button flex !size-12 flex-none items-center justify-center bg-gray-200 text-sm"
|
align={"center"}
|
||||||
onClick={() => {
|
placeholder={"用了多少"}
|
||||||
const count = item.count || 1;
|
onChange={(value) => {
|
||||||
handleCountChange(item.orderCostId, count + 1);
|
handleCountChange(item.orderCostId, Number(value));
|
||||||
}}
|
}}
|
||||||
>
|
formatter={(value) =>
|
||||||
<Icon name="plus" size={20} />
|
Math.max(1, Number(value)).toString()
|
||||||
</View>
|
}
|
||||||
|
onBlur={() =>
|
||||||
|
handleCountBlur(item.orderCostId, item.count)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
<View
|
||||||
|
className="rounded-r-button flex !size-12 flex-none items-center justify-center bg-gray-200 text-sm"
|
||||||
|
onClick={() => {
|
||||||
|
const count = item.count || 1;
|
||||||
|
handleCountChange(item.orderCostId, count + 1);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Icon name="plus" size={20} />
|
||||||
|
</View>
|
||||||
|
|
||||||
<View className={"ml-2.5 text-sm text-gray-500"}>
|
<View className={"ml-2.5 text-sm text-gray-500"}>
|
||||||
{item.unit}
|
{item.unit}
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{countError[item.orderCostId] && item.selected && (
|
{countError[item.orderCostId] && item.selected && (
|
||||||
<View className="mt-1 text-xs text-red-500">
|
<View className="mt-1 text-xs text-red-500">
|
||||||
请输入正确的数量
|
请填写正确的数量
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{item.selected && type === "HUMAN_COST" && (
|
|
||||||
<View>
|
|
||||||
<View
|
|
||||||
className={`relative flex h-10 w-full items-center rounded-md ${payerTypeError[item.orderCostId] ? "border-4 border-red-500" : "border-4 border-gray-300"}`}
|
|
||||||
>
|
|
||||||
<Input
|
|
||||||
type="number"
|
|
||||||
value={
|
|
||||||
options[0].find(
|
|
||||||
(option) => option.value === item.payerType,
|
|
||||||
)?.label || ""
|
|
||||||
}
|
|
||||||
placeholder={"请选择费用承担方"}
|
|
||||||
onChange={(value) => {
|
|
||||||
handlePayerTypeChange(
|
|
||||||
item.orderCostId,
|
|
||||||
value as CostItem["payerType"],
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
onBlur={() =>
|
|
||||||
handlePayerTypeBlur(item.orderCostId, item.payerType)
|
|
||||||
}
|
|
||||||
disabled
|
|
||||||
onClick={() => {
|
|
||||||
setPickerVisibleMap((prev) => ({
|
|
||||||
...prev,
|
|
||||||
[item.orderCostId]: true,
|
|
||||||
}));
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<Icon
|
|
||||||
name={"chevron-down"}
|
|
||||||
className={"absolute -right-1 mr-4"}
|
|
||||||
onClick={() => {
|
|
||||||
setPickerVisibleMap((prev) => ({
|
|
||||||
...prev,
|
|
||||||
[item.orderCostId]: true,
|
|
||||||
}));
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
<Picker
|
|
||||||
title="请选择费用承担方"
|
|
||||||
visible={pickerVisibleMap[item.orderCostId] || false}
|
|
||||||
options={options}
|
|
||||||
onConfirm={(_options, values) => {
|
|
||||||
// 设置费用承担方
|
|
||||||
if (values.length > 0) {
|
|
||||||
handlePayerTypeChange(
|
|
||||||
item.orderCostId,
|
|
||||||
values[0] as CostItem["payerType"],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
setPickerVisibleMap((prev) => ({
|
|
||||||
...prev,
|
|
||||||
[item.orderCostId]: false,
|
|
||||||
}));
|
|
||||||
}}
|
|
||||||
onClose={() => {
|
|
||||||
setPickerVisibleMap((prev) => ({
|
|
||||||
...prev,
|
|
||||||
[item.orderCostId]: false,
|
|
||||||
}));
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
{payerTypeError[item.orderCostId] && item.selected && (
|
|
||||||
<View className="mt-1 text-xs text-red-500">
|
|
||||||
请选择费用承担方
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{item.selected &&
|
|
||||||
type === "HUMAN_COST" &&
|
|
||||||
item.payerType === "US" && (
|
|
||||||
<View>
|
|
||||||
<View
|
|
||||||
className={`flex h-10 w-full items-center rounded-md ${principalError[item.orderCostId] ? "border-4 border-red-500" : "border-4 border-gray-300"}`}
|
|
||||||
>
|
|
||||||
<Input
|
|
||||||
type="text"
|
|
||||||
placeholder={"请填写工头姓名"}
|
|
||||||
value={item.principal}
|
|
||||||
onChange={(value) => {
|
|
||||||
handlePrincipalChange(item.orderCostId, value);
|
|
||||||
}}
|
|
||||||
onBlur={() =>
|
|
||||||
handlePrincipalBlur(
|
|
||||||
item.orderCostId,
|
|
||||||
item.principal || "",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
{principalError[item.orderCostId] &&
|
|
||||||
item.selected &&
|
|
||||||
item.payerType === "US" && (
|
|
||||||
<View className="mt-1 text-xs text-red-500">
|
|
||||||
请填写工头姓名
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 检查是否有人工费用项被启用且费用承担方为"我方"
|
||||||
|
const shouldShowPrincipalInput = () => {
|
||||||
|
return (
|
||||||
|
costItemVOList?.some(
|
||||||
|
(item) =>
|
||||||
|
item.costType === "HUMAN_COST" &&
|
||||||
|
item.selected &&
|
||||||
|
item.payerType === "US",
|
||||||
|
) || false
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View className="flex flex-1 flex-col bg-[#D1D5DB] px-2.5 pt-2.5 pb-16">
|
<View className="flex flex-1 flex-col bg-[#D1D5DB] px-2.5 pt-2.5 pb-16">
|
||||||
<View className={"mb-2.5"}>
|
<View className={"mb-2.5"}>
|
||||||
<View className="mb-2.5 text-sm font-bold">人工信息</View>
|
<View className="mb-2.5 text-sm font-bold">人工费用</View>
|
||||||
<View className="mb-2.5 flex items-center rounded-lg border border-blue-200 bg-blue-50 p-2.5">
|
<View className="mb-2.5 flex items-center rounded-lg border border-blue-200 bg-blue-50 p-2.5">
|
||||||
<Icon
|
<Icon
|
||||||
className={"mr-1"}
|
className={"mr-1"}
|
||||||
@ -439,27 +392,60 @@ export default forwardRef<OrderCostRef, IOrderCostProps>(
|
|||||||
color={"var(--color-blue-700)"}
|
color={"var(--color-blue-700)"}
|
||||||
size={18}
|
size={18}
|
||||||
/>
|
/>
|
||||||
<View className={"text-sm text-blue-700"}>
|
<View className={"text-sm text-blue-700"}>对方出钱可以不勾选</View>
|
||||||
瓜农承担费用的人工可以不启用
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
{renderItemList(getItemsByCostType("HUMAN_COST"), "HUMAN_COST")}
|
{renderItemList(getItemsByCostType("HUMAN_COST"), "HUMAN_COST")}
|
||||||
|
|
||||||
|
{/* 总的工头姓名输入框 */}
|
||||||
|
{shouldShowPrincipalInput() && (
|
||||||
|
<View className="mt-2.5">
|
||||||
|
<View className="mb-1 text-sm font-medium">工头叫什么名字</View>
|
||||||
|
<View
|
||||||
|
className={`flex h-12 items-center rounded-md px-3 ${principalError ? "border-2 border-red-500 bg-red-100" : "border-2 border-gray-300 bg-white"}`}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
className="text-base"
|
||||||
|
type="text"
|
||||||
|
placeholder={"工头的名字"}
|
||||||
|
value={principal}
|
||||||
|
onChange={(value) => {
|
||||||
|
handlePrincipalChange(value);
|
||||||
|
}}
|
||||||
|
onBlur={() => handlePrincipalBlur(principal)}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
{principalError && (
|
||||||
|
<View className="mt-1 text-xs text-red-500">
|
||||||
|
工头叫啥子填一下
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
</View>
|
</View>
|
||||||
<View className={"mb-2.5"}>
|
<View className={"mb-2.5"}>
|
||||||
<View className="mb-2.5 text-sm font-bold">辅料信息</View>
|
<View className="mb-2.5 text-sm font-bold">辅料费用</View>
|
||||||
|
<View className="mb-2.5 flex items-center rounded-lg border border-blue-200 bg-blue-50 p-2.5">
|
||||||
|
<Icon
|
||||||
|
className={"mr-1"}
|
||||||
|
name="circle-info"
|
||||||
|
color={"var(--color-blue-700)"}
|
||||||
|
size={18}
|
||||||
|
/>
|
||||||
|
<View className={"text-sm text-blue-700"}>用了几包就填几包</View>
|
||||||
|
</View>
|
||||||
{renderItemList(
|
{renderItemList(
|
||||||
getItemsByCostType("PACKAGING_MATERIALS"),
|
getItemsByCostType("PACKAGING_MATERIALS"),
|
||||||
"PACKAGING_MATERIALS",
|
"PACKAGING_MATERIALS",
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
<View className={"mb-2.5"}>
|
{/*<View className={"mb-2.5"}>*/}
|
||||||
<View className="mb-2.5 text-sm font-bold">空纸箱信息</View>
|
{/* <View className="mb-2.5 text-sm font-bold">空纸箱费用</View>*/}
|
||||||
{renderItemList(getItemsByCostType("OTHER_COST"), "OTHER_COST")}
|
{/* {renderItemList(getItemsByCostType("OTHER_COST"), "OTHER_COST")}*/}
|
||||||
</View>
|
{/*</View>*/}
|
||||||
<View className={"mb-2.5"}>
|
{/*<View className={"mb-2.5"}>*/}
|
||||||
<View className="mb-2.5 text-sm font-bold">空礼盒信息</View>
|
{/* <View className="mb-2.5 text-sm font-bold">空礼盒费用</View>*/}
|
||||||
{renderItemList(getItemsByCostType("OTHER_COST"), "OTHER_COST")}
|
{/* {renderItemList(getItemsByCostType("OTHER_COST"), "OTHER_COST")}*/}
|
||||||
</View>
|
{/*</View>*/}
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -40,27 +40,38 @@ export default forwardRef<OrderPackageRef, IOrderPackageProps>(
|
|||||||
const orderPackageList = value.orderPackageList || [];
|
const orderPackageList = value.orderPackageList || [];
|
||||||
setOrderPackageList(value.orderPackageList || []);
|
setOrderPackageList(value.orderPackageList || []);
|
||||||
|
|
||||||
// 根据orderPackageList 初始化 packageTypeEnabled
|
// 根据orderPackageList和supplierVO属性初始化 packageTypeEnabled
|
||||||
setPackageTypeEnabled({
|
const initialPackageTypeEnabled = {
|
||||||
|
USED: undefined,
|
||||||
|
EXTRA_USED: undefined,
|
||||||
|
EXTRA: undefined,
|
||||||
|
REMAIN: undefined,
|
||||||
|
OWN: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
// 根据orderPackageList设置已有的纸箱类型
|
||||||
|
if (orderPackageList.some((item) => item.boxType === "USED")) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
USED:
|
initialPackageTypeEnabled.USED = true;
|
||||||
orderPackageList.some((item) => item.boxType === "USED") || undefined,
|
}
|
||||||
|
if (orderPackageList.some((item) => item.boxType === "EXTRA_USED")) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
EXTRA_USED:
|
initialPackageTypeEnabled.EXTRA_USED = true;
|
||||||
orderPackageList.some((item) => item.boxType === "EXTRA_USED") ||
|
}
|
||||||
undefined,
|
if (orderPackageList.some((item) => item.boxType === "EXTRA")) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
EXTRA:
|
initialPackageTypeEnabled.EXTRA = true;
|
||||||
orderPackageList.some((item) => item.boxType === "EXTRA") ||
|
}
|
||||||
undefined,
|
if (orderPackageList.some((item) => item.boxType === "REMAIN")) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
REMAIN:
|
initialPackageTypeEnabled.REMAIN = true;
|
||||||
orderPackageList.some((item) => item.boxType === "REMAIN") ||
|
}
|
||||||
undefined,
|
if (orderPackageList.some((item) => item.boxType === "OWN")) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
OWN:
|
initialPackageTypeEnabled.OWN = true;
|
||||||
orderPackageList.some((item) => item.boxType === "OWN") || undefined,
|
}
|
||||||
});
|
|
||||||
|
setPackageTypeEnabled(initialPackageTypeEnabled);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const [orderPackageList, setOrderPackageList] = useState<
|
const [orderPackageList, setOrderPackageList] = useState<
|
||||||
@ -1286,7 +1297,7 @@ export default forwardRef<OrderPackageRef, IOrderPackageProps>(
|
|||||||
{!supplierVO.isPaper && (
|
{!supplierVO.isPaper && (
|
||||||
<>
|
<>
|
||||||
<View className="flex items-center justify-between">
|
<View className="flex items-center justify-between">
|
||||||
<View className="text-sm">有没有用额外拿来的纸箱?</View>
|
<View className="text-sm">有没有用本次拉来的纸箱?</View>
|
||||||
<View className="flex flex-shrink-0 gap-2">
|
<View className="flex flex-shrink-0 gap-2">
|
||||||
<Button
|
<Button
|
||||||
size="small"
|
size="small"
|
||||||
@ -1322,12 +1333,22 @@ export default forwardRef<OrderPackageRef, IOrderPackageProps>(
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
</View>
|
</View>
|
||||||
{/* 根据启用的类型渲染对应的内容 */}
|
{/* 根据启用的类型和supplierVO属性渲染对应的内容 */}
|
||||||
{renderPackageByType("OWN")}
|
{renderPackageByType("OWN")}
|
||||||
{renderPackageByType("USED")}
|
{supplierVO.isPaper && supplierVO.isLast && (
|
||||||
{renderPackageByType("EXTRA_USED")}
|
<>
|
||||||
{renderPackageByType("EXTRA")}
|
{renderPackageByType("USED")}
|
||||||
{renderPackageByType("REMAIN")}
|
{renderPackageByType("EXTRA_USED")}
|
||||||
|
{renderPackageByType("REMAIN")}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{supplierVO.isPaper && !supplierVO.isLast && (
|
||||||
|
<>
|
||||||
|
{renderPackageByType("USED")}
|
||||||
|
{renderPackageByType("EXTRA")}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{!supplierVO.isPaper && renderPackageByType("USED")}
|
||||||
|
|
||||||
{/* 当选择了使用自己的纸箱时才渲染 */}
|
{/* 当选择了使用自己的纸箱时才渲染 */}
|
||||||
{/* 批量添加弹窗 */}
|
{/* 批量添加弹窗 */}
|
||||||
@ -20,10 +20,11 @@ export interface WeighRef {
|
|||||||
interface IWeightProps {
|
interface IWeightProps {
|
||||||
value: SupplierVO;
|
value: SupplierVO;
|
||||||
onChange: (supplierVO: SupplierVO) => void;
|
onChange: (supplierVO: SupplierVO) => void;
|
||||||
|
supplierCount: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default forwardRef<WeighRef, IWeightProps>(function Weigh(props, ref) {
|
export default forwardRef<WeighRef, IWeightProps>(function Weigh(props, ref) {
|
||||||
const { value, onChange } = props;
|
const { value, onChange, supplierCount } = props;
|
||||||
|
|
||||||
const [supplierVO, setSupplierVO] = useState<SupplierVO>();
|
const [supplierVO, setSupplierVO] = useState<SupplierVO>();
|
||||||
|
|
||||||
@ -268,38 +269,44 @@ export default forwardRef<WeighRef, IWeightProps>(function Weigh(props, ref) {
|
|||||||
<View className={"flex items-center justify-between gap-2.5"}>
|
<View className={"flex items-center justify-between gap-2.5"}>
|
||||||
<View className="text-sm">空车来的时候带纸箱了吗?</View>
|
<View className="text-sm">空车来的时候带纸箱了吗?</View>
|
||||||
<View className="text-neutral-darkest text-sm font-medium">
|
<View className="text-neutral-darkest text-sm font-medium">
|
||||||
<Radio.Group
|
{supplierCount == 1 ? (
|
||||||
direction="horizontal"
|
<Radio.Group
|
||||||
value={
|
direction="horizontal"
|
||||||
supplierVO.isPaper === true
|
value={
|
||||||
? "true"
|
supplierVO.isPaper === true
|
||||||
: supplierVO.isPaper === false
|
? "true"
|
||||||
? "false"
|
: supplierVO.isPaper === false
|
||||||
: undefined
|
? "false"
|
||||||
}
|
: undefined
|
||||||
onChange={(value) => {
|
}
|
||||||
// 清除错误状态
|
onChange={(value) => {
|
||||||
setIsPaperError((prev) => ({
|
// 清除错误状态
|
||||||
...prev,
|
setIsPaperError((prev) => ({
|
||||||
[supplierVO.orderSupplierId]: false,
|
...prev,
|
||||||
}));
|
[supplierVO.orderSupplierId]: false,
|
||||||
|
}));
|
||||||
|
|
||||||
// 根据用户选择设置是否包含空纸箱
|
// 根据用户选择设置是否包含空纸箱
|
||||||
const isPaperValue =
|
const isPaperValue =
|
||||||
value === "true"
|
value === "true"
|
||||||
? true
|
? true
|
||||||
: value === "false"
|
: value === "false"
|
||||||
? false
|
? false
|
||||||
: undefined;
|
: undefined;
|
||||||
setSupplierVO({
|
setSupplierVO({
|
||||||
...supplierVO,
|
...supplierVO,
|
||||||
isPaper: isPaperValue,
|
isPaper: isPaperValue,
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Radio value="true">带了</Radio>
|
<Radio value="true">带了</Radio>
|
||||||
<Radio value="false">没带</Radio>
|
<Radio value="false">没带</Radio>
|
||||||
</Radio.Group>
|
</Radio.Group>
|
||||||
|
) : supplierVO.isPaper === true ? (
|
||||||
|
"带了"
|
||||||
|
) : (
|
||||||
|
"没带"
|
||||||
|
)}
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
{isPaperError[supplierVO.orderSupplierId] && (
|
{isPaperError[supplierVO.orderSupplierId] && (
|
||||||
@ -429,6 +429,7 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Weigh
|
<Weigh
|
||||||
|
supplierCount={orderSupplierList.length}
|
||||||
key={item.orderSupplierId}
|
key={item.orderSupplierId}
|
||||||
ref={(ref) => {
|
ref={(ref) => {
|
||||||
if (ref) {
|
if (ref) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user