редактирование и удаление сопоставлений

список накладных с позициями
This commit is contained in:
2025-12-29 10:46:05 +03:00
parent c2d382cb6a
commit 310a64e3ba
30 changed files with 1250 additions and 8173 deletions

View File

@@ -2,22 +2,18 @@
import React, { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import {
List,
Typography,
Tag,
Spin,
Empty,
DatePicker,
Flex,
message,
} from "antd";
import { List, Typography, Tag, Spin, Empty, DatePicker, Flex } from "antd";
import { useNavigate } from "react-router-dom";
import {
ArrowRightOutlined,
ThunderboltFilled,
HistoryOutlined,
FileTextOutlined,
CheckCircleOutlined,
DeleteOutlined,
PlusOutlined,
ExclamationCircleOutlined,
LoadingOutlined,
CloseCircleOutlined,
StopOutlined,
} from "@ant-design/icons";
import dayjs, { Dayjs } from "dayjs";
import { api } from "../services/api";
@@ -29,9 +25,9 @@ const { RangePicker } = DatePicker;
export const DraftsList: React.FC = () => {
const navigate = useNavigate();
// Состояние фильтра дат: по умолчанию последние 30 дней
// Состояние фильтра дат: по умолчанию последние 7 дней
const [dateRange, setDateRange] = useState<[Dayjs, Dayjs]>([
dayjs().subtract(30, "day"),
dayjs().subtract(7, "day"),
dayjs(),
]);
@@ -51,6 +47,9 @@ export const DraftsList: React.FC = () => {
dateRange[0].format("YYYY-MM-DD"),
dateRange[1].format("YYYY-MM-DD")
),
staleTime: 0,
refetchOnMount: true,
refetchOnWindowFocus: true,
});
const getStatusTag = (item: UnifiedInvoice) => {
@@ -64,26 +63,64 @@ export const DraftsList: React.FC = () => {
switch (item.status) {
case "PROCESSING":
return <Tag color="blue">Обработка</Tag>;
return (
<Tag icon={<LoadingOutlined />} color="blue">
Обработка
</Tag>
);
case "READY_TO_VERIFY":
return <Tag color="orange">Проверка</Tag>;
return (
<Tag icon={<ExclamationCircleOutlined />} color="orange">
Проверка
</Tag>
);
case "COMPLETED":
return <Tag color="green">Готово</Tag>;
return (
<Tag icon={<CheckCircleOutlined />} color="green">
Готово
</Tag>
);
case "ERROR":
return <Tag color="red">Ошибка</Tag>;
return (
<Tag icon={<CloseCircleOutlined />} color="red">
Ошибка
</Tag>
);
case "CANCELED":
return <Tag color="default">Отменен</Tag>;
return (
<Tag icon={<StopOutlined />} color="default">
Отменен
</Tag>
);
case "NEW":
return (
<Tag icon={<PlusOutlined />} color="blue">
Новый
</Tag>
);
case "PROCESSED":
return (
<Tag icon={<CheckCircleOutlined />} color="green">
Обработан
</Tag>
);
case "DELETED":
return (
<Tag icon={<DeleteOutlined />} color="red">
Удален
</Tag>
);
default:
return <Tag>{item.status}</Tag>;
}
};
const handleInvoiceClick = (item: UnifiedInvoice) => {
if (item.type === "SYNCED") {
message.info("История доступна только для просмотра");
return;
if (item.type === "DRAFT") {
navigate("/invoice/draft/" + item.id);
} else if (item.type === "SYNCED") {
navigate("/invoice/view/" + item.id);
}
navigate(`/invoice/${item.id}`);
};
if (isError) {
@@ -143,7 +180,7 @@ export const DraftsList: React.FC = () => {
padding: 12,
marginBottom: 10,
borderRadius: 12,
cursor: isSynced ? "default" : "pointer",
cursor: "pointer",
border: isSynced ? "1px solid #f0f0f0" : "1px solid #e6f7ff",
boxShadow: "0 2px 4px rgba(0,0,0,0.02)",
display: "block",
@@ -158,34 +195,44 @@ export const DraftsList: React.FC = () => {
{item.document_number || "Без номера"}
</Text>
{item.is_app_created && (
<ThunderboltFilled
style={{ color: "#faad14" }}
title="Создано в RMSer"
/>
<span title="Создано в RMSer">📱</span>
)}
</Flex>
<Flex vertical gap={2}>
<Text type="secondary" style={{ fontSize: 13 }}>
{item.items_count} поз.
</Text>
<Text type="secondary" style={{ fontSize: 13 }}>
{dayjs(item.date_incoming).format("DD.MM.YYYY")}
</Text>
</Flex>
{item.incoming_number && (
<Text type="secondary" style={{ fontSize: 12 }}>
Вх. {item.incoming_number}
</Text>
)}
</Flex>
{getStatusTag(item)}
<Flex vertical align="start" gap={4}>
{getStatusTag(item)}
{isSynced && item.items_preview && (
<div>
{item.items_preview
.split(", ")
.map((previewItem, idx) => (
<div
key={idx}
style={{ fontSize: 12, color: "#666" }}
>
{previewItem}
</div>
))}
</div>
)}
</Flex>
</Flex>
<Flex justify="space-between" style={{ marginTop: 4 }}>
<Flex gap={8} align="center">
<FileTextOutlined style={{ color: "#888" }} />
<Text type="secondary" style={{ fontSize: 13 }}>
{item.items_count} поз.
</Text>
<Text type="secondary" style={{ fontSize: 13 }}>
</Text>
<Text type="secondary" style={{ fontSize: 13 }}>
{dayjs(item.date_incoming).format("DD.MM.YYYY")}
</Text>
</Flex>
<Flex justify="space-between" align="center">
<div></div>
{item.store_name && (
<Tag
style={{