v1.0.8 dualside work, have bugs/need work

This commit is contained in:
2026-09-19 23:10:41 +03:00
parent 6475ffa7e0
commit 27b3f4cab4
5 changed files with 78 additions and 37 deletions

View File

@ -10,6 +10,7 @@ pub async fn create_print(
mut multipart: Multipart,
) -> Result<Json<JobView>, (StatusCode, String)> {
info!("📥 Получен запрос на печать");
let mut settings_list: Vec<Option<PrintSettings>> = Vec::new();
let mut files_data: Vec<(String, bytes::Bytes)> = Vec::new();
@ -23,35 +24,55 @@ pub async fn create_print(
settings_list.push(parsed);
} else if field_name == "files" {
let file_name = field.file_name().unwrap_or("unknown").to_string();
if let Ok(data) = field.bytes().await { files_data.push((file_name, data)); }
if let Ok(data) = field.bytes().await {
files_data.push((file_name, data));
}
}
}
if files_data.is_empty() { return Err((StatusCode::BAD_REQUEST, "Нет файлов".into())); }
if files_data.is_empty() {
return Err((StatusCode::BAD_REQUEST, "Нет файлов".into()));
}
let mut job_files: Vec<JobFile> = Vec::new();
for (i, (file_name, data)) in files_data.into_iter().enumerate() {
let ext = Path::new(&file_name).extension().and_then(|e| e.to_str()).unwrap_or("").to_lowercase();
let temp = if ext.is_empty() { NamedTempFile::new() } else { NamedTempFile::with_suffix(&format!(".{}", ext)) };
if let Ok(temp) = temp {
let path = temp.into_temp_path();
if fs::write(&*path, &data).await.is_ok() {
let settings = settings_list.get(i).cloned().flatten();
job_files.push(JobFile {
name: file_name, path, settings,
status: FileStatus::Queued, error: None,
name: file_name,
path,
settings,
status: FileStatus::Queued,
error: None,
});
}
}
}
if job_files.is_empty() { return Err((StatusCode::BAD_REQUEST, "Не удалось сохранить файлы".into())); }
if job_files.is_empty() {
return Err((StatusCode::BAD_REQUEST, "Не удалось сохранить файлы".into()));
}
// ВСЕГДА начинаем с WaitingStart.
// 1. Если первый файл односторонний - он просто поедет печататься.
// 2. Если первый файл двусторонний - лоток и так пуст, очистка не нужна.
// Очистка (AwaitingClearOutput) будет запрошена ТОЛЬКО при переходе
// от предыдущего файла к следующему двустороннему в advance.rs
let initial_phase = JobPhase::WaitingStart;
let job_id = format!("job-{}", JOB_COUNTER.fetch_add(1, Ordering::SeqCst));
let job = Job {
id: job_id.clone(), files: job_files, current: None,
phase: JobPhase::WaitingStart, cups_id: None, duplex_first_pass_done: false,
id: job_id.clone(),
files: job_files,
current: Some(0),
phase: initial_phase,
cups_id: None,
duplex_first_pass_done: false,
};
let view = job.view();