ERPTurbo_Client/packages/app-client/src/pages/delivery/all.tsx
shenyifei 480e372085 feat(audit): 完善审批流程和权限控制
- 集成全局用户角色状态管理,实现基于角色的审批权限控制
- 重构审批组件中的订单对象引用为审核对象,提高数据传递准确性
- 新增老板角色审批功能,包括审核通过和驳回操作
- 添加审核驳回后的重新编辑入口,提升审批流程的灵活性
- 优化预览组件中信息确认模块的显示逻辑,仅在草稿状态下显示
- 修改运费校验规则,允许运费为0,调整相关错误提示文案
- 简化市场报价编辑界面,移除弹窗编辑方式,采用直接编辑模式
- 移除包装信息编辑弹窗,优化表格编辑交互体验
- 删除业务服务依赖,优化组件性能和代码结构
- 扩展图标组件,新增复制和钱包图标选项
2025-12-26 09:13:57 +08:00

245 lines
8.2 KiB
TypeScript

import {
ActionType,
CopyText,
DealerPicker,
Icon,
PageList,
State,
ToolBar,
} from "@/components";
import Taro, { useShareAppMessage } from "@tarojs/taro";
import { useRef, useState } from "react";
import { business } from "@/services";
import hocAuth from "@/hocs/auth";
import { CommonComponent } from "@/types/typings";
import { Label, Text, View } from "@tarojs/components";
import { buildUrl } from "@/utils";
import dayjs from "dayjs";
import orderShip from "@/constant/orderShip";
import { Button } from "@nutui/nutui-react-taro";
export default hocAuth(function Page(props: CommonComponent) {
const { shareOptions } = props;
const [state, setState] = useState<BusinessAPI.OrderShipPageQry["state"]>();
const [dealerVO, setDealerVO] = useState<BusinessAPI.DealerVO>();
const actionRef = useRef<ActionType>();
const toolbar: ToolBar<BusinessAPI.OrderShipVO> = {
search: {
activeKey: "vehicleNo",
defaultActiveKey: "vehicleNo",
items: [
{
key: "vehicleNo",
name: "车次号",
placeholder: "请输入车次号",
},
{
key: "plate",
name: "车牌号",
placeholder: "请输入车牌号",
},
],
},
tabs: {
activeKey: "state",
defaultActiveKey: state || "ALL",
items: orderShip.stateList,
onChange: (item) => {
setState(item as BusinessAPI.OrderShipPageQry["state"]);
actionRef.current?.reload();
},
},
render: () => (
<>
<View className={"flex flex-row gap-2.5"}>
<DealerPicker
onFinish={(dealerVO) => {
setDealerVO(dealerVO);
actionRef.current?.reload();
}}
trigger={
<View
className={`border-primary flex h-6 items-center rounded-md border-2 px-2.5`}
>
<View className={"text-primary text-xs"}>
{dealerVO?.shortName || "经销商"}
</View>
{dealerVO?.shortName ? (
<Icon
name={"circle-xmark"}
size={16}
onClick={(event) => {
setDealerVO(undefined);
actionRef.current?.reload();
event.stopPropagation();
}}
/>
) : (
<Icon name={"chevron-down"} size={16} />
)}
</View>
}
/>
</View>
</>
),
};
useShareAppMessage((res) => {
console.log("useShareAppMessage1", res, shareOptions);
// 如果是按钮触发的转发,使用默认配置
if (res.from === "button") {
return shareOptions;
}
// 页面转发使用设置的配置
return {};
});
return (
<PageList<BusinessAPI.OrderShipVO, BusinessAPI.OrderShipPageQry>
rowId={"orderShipId"}
itemHeight={182}
type={"infinite"}
actionRef={actionRef}
render={(orderShipVO: BusinessAPI.OrderShipVO, index) => (
<View className={"mb-2"} key={index}>
<View
className={
"relative flex flex-col divide-y divide-neutral-100 overflow-hidden rounded-xl bg-white shadow-sm"
}
>
{/* 头部区域:车次号 + 状态 */}
<View
className={
"flex cursor-pointer items-center justify-between gap-2 px-4 py-3"
}
// onClick={async () => {
// await Taro.navigateTo({
// url: buildUrl("/pages/delivery/document", {
// orderShipId: orderShipVO.orderShipId,
// orderId: orderShipVO.orderId,
// }),
// });
// }}
>
<View className={"flex min-w-0 flex-1 flex-col gap-1.5"}>
<View className={"flex min-w-0 flex-1 flex-col gap-1.5"}>
<Text className={"text-neutral-darkest text-lg font-bold"}>
{orderShipVO.orderVO?.orderVehicle?.dealerName}{" "}
{orderShipVO.orderVO?.orderVehicle?.vehicleNo
? `${orderShipVO.orderVO?.orderVehicle?.vehicleNo}`
: "暂未生成车次"}
</Text>
<Text className={"text-neutral-dark text-xs"}>
{`${orderShipVO.orderVO?.orderVehicle?.origin}${orderShipVO.orderVO?.orderVehicle?.destination}`}
</Text>
</View>
</View>
<State
position={"relative"}
state={orderShipVO.state}
stateMap={orderShip.stateMap}
/>
</View>
{/* 详细信息区域 */}
<View
className={"flex cursor-pointer flex-col gap-2 px-4 py-3"}
onClick={async () => {
// await Taro.navigateTo({
// url: buildUrl("/pages/delivery/document", {
// orderShipId: orderShipVO.orderShipId,
// orderId: orderShipVO.orderId,
// }),
// });
}}
>
<View className={"flex flex-row items-center justify-between"}>
<Label className={"text-neutral-dark text-xs"}></Label>
<CopyText copyData={orderShipVO.orderSn}>
<Text className={"text-neutral-darkest text-xs font-medium"}>
{orderShipVO.orderSn}
</Text>
</CopyText>
</View>
<View className={"flex flex-row items-center justify-between"}>
<Label className={"text-neutral-dark text-xs"}></Label>
<Text className={"text-neutral-darkest text-xs font-medium"}>
{orderShip.getTypeLabel(orderShipVO.type)}
</Text>
</View>
<View className={"flex flex-row items-center justify-between"}>
<Label className={"text-neutral-dark text-xs"}></Label>
<Text className={"text-neutral-darkest text-xs font-medium"}>
{orderShipVO.createdByName}
</Text>
</View>
<View className={"flex flex-row items-center justify-between"}>
<Label className={"text-neutral-dark text-xs"}></Label>
<Text className={"text-neutral-darkest text-xs font-medium"}>
{dayjs(orderShipVO.createdAt).format("MM-DD HH:mm")}
</Text>
</View>
</View>
{/* 操作按钮区域 */}
<View
className={
"flex justify-end gap-2 border-t border-neutral-100 bg-gray-50 px-4 py-3"
}
>
{orderShipVO.state !== "DRAFT" &&
orderShipVO.state !== "WAIT_SHIPMENT" && (
<Button
type={"primary"}
size={"small"}
onClick={async (e) => {
// 跳转到发货单据生成页面
await Taro.navigateTo({
url: buildUrl("/pages/delivery/document", {
orderShipId: orderShipVO.orderShipId,
orderId: orderShipVO.orderId,
}),
});
e.stopPropagation();
}}
>
</Button>
)}
</View>
</View>
</View>
)}
toolbar={toolbar}
request={async (params) => {
const {
data: { data, success, notEmpty },
} = await business.orderShip.pageOrderShip({
orderShipPageQry: {
...params,
//@ts-ignore
state: state !== "ALL" ? state : undefined,
...(dealerVO
? {
dealerId: dealerVO.dealerId,
}
: {}),
},
});
return {
data,
success,
hasMore: notEmpty,
};
}}
pagination={{
pageSize: 10,
}}
/>
);
});