using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
namespace BLL
{
/// PDF 书籍视图模型。
public class PdfBook
{
public string BookId { get; set; }
public string Title { get; set; }
public int ChapterCount { get; set; }
public string Tag { get; set; }
}
/// PDF 章节(目录项)视图模型,支持多级目录(含父章节与层级)。
public class PdfChapter
{
public string ChapterId { get; set; }
public string BookId { get; set; }
public string ParentChapterId { get; set; } // 上一级章节,NULL=顶级
public int Level { get; set; } // 层级:1章 2节 3小节
public string Title { get; set; }
public int PageStart { get; set; }
public int PageEnd { get; set; }
public int SortNo { get; set; }
}
/// 章节正文视图模型。
public class PdfChapterDetail
{
public string ChapterId { get; set; }
public string Title { get; set; }
public int PageStart { get; set; }
public int PageEnd { get; set; }
public string Content { get; set; }
}
///
/// PDF 书籍目录/正文读取服务。
/// 优先读取数据库表 Sys_PdfBook / Sys_PdfChapter;当库无数据或未建表时,回退到内置示例数据,便于界面预览。
///
public static class PdfBookService
{
// —— 内置示例数据(仅用于 UI 预览)——
private const string SampleBookId = "SAMPLE_SP_001";
private static readonly List _sampleBooks = new List
{
new PdfBook { BookId = SampleBookId, Title = "《建筑施工安全防护(示例)》", Tag = "示例数据", ChapterCount = 15 }
};
// 多级目录示例(对应真实书籍:第一章 → 1.1 → 1.2.1)
private static readonly List _sampleChapters = new List
{
Ch("CH01", "第一章 安全防护", 1, 1, 1, 1, null),
Ch("CH011", "1.1 \u201c三宝\u201d\u201c四口\u201d\u201c五临边\u201d", 1, 1, 2, 2, "CH01"),
Ch("CH012", "1.2 三宝", 1, 3, 3, 2, "CH01"),
Ch("CH0121", "1.2.1 安全帽", 1, 1, 4, 3, "CH012"),
Ch("CH0122", "1.2.2 安全带", 2, 2, 5, 3, "CH012"),
Ch("CH0123", "1.2.3 安全网", 3, 3, 6, 3, "CH012"),
Ch("CH013", "1.3 \u201c四口\u201d安全防护", 4, 6, 7, 2, "CH01"),
Ch("CH0131", "1.3.1 电梯井竖向洞口防护", 4, 4, 8, 3, "CH013"),
Ch("CH0132", "1.3.2 预留洞口安全防护", 5, 5, 9, 3, "CH013"),
Ch("CH0133", "1.3.3 通道口安全防护", 6, 6, 10, 3, "CH013"),
Ch("CH014", "1.4 \u201c五临边\u201d安全防护", 10, 12, 11, 2, "CH01"),
Ch("CH0141", "1.4.1 临边作业", 10, 10, 12, 3, "CH014"),
Ch("CH0142", "1.4.2 基坑临边防护", 10, 10, 13, 3, "CH014"),
Ch("CH0143", "1.4.3 楼层临边防护", 11, 11, 14, 3, "CH014"),
Ch("CH0144", "1.4.4 楼梯临边防护", 12, 12, 15, 3, "CH014")
};
private static readonly Dictionary _sampleContents = new Dictionary
{
{ "CH01", Detail("CH01", "第一章 安全防护", 1, 1, "本章为施工现场安全防护的总述,涵盖\u201c三宝\u201d\u201c四口\u201d\u201c五临边\u201d等基本防护要求。") },
{ "CH011", Detail("CH011", "1.1 \u201c三宝\u201d\u201c四口\u201d\u201c五临边\u201d", 1, 1, "本节概述安全帽、安全带、安全网\u201c三宝\u201d,简称、预留洞口等\u201c四口\u201d以及临边等\u201c五临边\u201d的防护要点。") },
{ "CH012", Detail("CH012", "1.2 三宝", 1, 3, "三宝指安全帽、安全带、安全网,是施工现场最基本的个人防护用品。") },
{ "CH0121", Detail("CH0121", "1.2.1 安全帽", 1, 1, "进入施工现场必须正确佩戴安全帽,并系紧下颏带;安全帽应符合国家标准,不得使用破损或过期的安全帽。") },
{ "CH0122", Detail("CH0122", "1.2.2 安全带", 2, 2, "高处作业应正确使用安全带,做到高挂低用,系挂在牢固可靠的结构上,严禁低挂高用。") },
{ "CH0123", Detail("CH0123", "1.2.3 安全网", 3, 3, "作业面周围应按要求张挂安全平网或立网,安全网应绑扎牢固、无破损,严禁随意拆除。") },
{ "CH013", Detail("CH013", "1.3 \u201c四口\u201d安全防护", 4, 6, "四口指楼梯口、电梯井口、预留洞口、通道口,均应设置可靠的防护设施。") },
{ "CH0131", Detail("CH0131", "1.3.1 电梯井竖向洞口防护", 4, 4, "电梯井口应设置固定式防护门,井内每隔两层并不超过10m设置一道安全平网。") },
{ "CH0132", Detail("CH0132", "1.3.2 预留洞口安全防护", 5, 5, "楼板、屋面等预留洞口应设置盖板或围挡防护,并设置警示标志。") },
{ "CH0133", Detail("CH0133", "1.3.3 通道口安全防护", 6, 6, "通道口应搭设防护棚,并设置明显的安全警示标志和夜间警示灯。") },
{ "CH014", Detail("CH014", "1.4 \u201c五临边\u201d安全防护", 10, 12, "五临边指基坑边、楼层边、屋面边、阳台边、楼梯边等临边作业场所,均应设置防护栏杆。") },
{ "CH0141", Detail("CH0141", "1.4.1 临边作业", 10, 10, "临边作业应设置防护栏杆并挂设安全网,作业人员应正确佩戴和使用安全带。") },
{ "CH0142", Detail("CH0142", "1.4.2 基坑临边防护", 10, 10, "基坑周边应设置高度不低于1.2m的防护栏杆,并设置警示与夜间警示灯。") },
{ "CH0143", Detail("CH0143", "1.4.3 楼层临边防护", 11, 11, "楼层临边应设置防护栏杆和挡脚板,严防人员坠落和物件坠落伤人。") },
{ "CH0144", Detail("CH0144", "1.4.4 楼梯临边防护", 12, 12, "楼梯临边、休息平台等部位应设置临时防护栏杆,随层随设。") }
};
private static PdfChapter Ch(string id, string title, int start, int end, int sort, int level, string parent)
{
return new PdfChapter
{
ChapterId = id, BookId = SampleBookId, Title = title,
PageStart = start, PageEnd = end, SortNo = sort, Level = level, ParentChapterId = parent
};
}
private static PdfChapterDetail Detail(string id, string title, int pageStart, int pageEnd, string content)
{
return new PdfChapterDetail { ChapterId = id, Title = title, PageStart = pageStart, PageEnd = pageEnd, Content = content };
}
/// 获取书籍列表。
public static List GetBooks()
{
try
{
DataTable dt = SQLHelper.GetDataTableRunText(
"SELECT BookId, Title FROM dbo.Sys_PdfBook ORDER BY CreateTime", new SqlParameter[] { });
if (dt != null && dt.Rows.Count > 0)
{
var list = new List();
foreach (DataRow r in dt.Rows)
list.Add(new PdfBook
{
BookId = r["BookId"] == null ? "" : r["BookId"].ToString(),
Title = r["Title"] == null ? "" : r["Title"].ToString(),
Tag = "数据库"
});
return list;
}
}
catch (Exception)
{
// 未建表或查询失败,回退示例数据
}
return _sampleBooks;
}
/// 获取某本书的章节(目录,含层级与父章节,供页面递归建树)。
public static List GetChapters(string bookId)
{
if (bookId == SampleBookId)
return _sampleChapters;
try
{
DataTable dt = SQLHelper.GetDataTableRunText(
"SELECT ChapterId, BookId, ParentChapterId, [Level], ChapterTitle, PageStart, PageEnd, SortNo " +
"FROM dbo.Sys_PdfChapter WHERE BookId=@BookId ORDER BY SortNo",
new[] { new SqlParameter("@BookId", bookId) });
var list = new List();
if (dt != null)
foreach (DataRow r in dt.Rows)
{
var c = new PdfChapter
{
ChapterId = r["ChapterId"] == null ? "" : r["ChapterId"].ToString(),
BookId = r["BookId"] == null ? "" : r["BookId"].ToString(),
ParentChapterId = r["ParentChapterId"] == DBNull.Value ? null : r["ParentChapterId"].ToString(),
Title = r["ChapterTitle"] == null ? "" : r["ChapterTitle"].ToString(),
SortNo = r["SortNo"] == DBNull.Value ? 0 : Convert.ToInt32(r["SortNo"]),
Level = r["Level"] == DBNull.Value ? 1 : Convert.ToInt32(r["Level"])
};
c.PageStart = r["PageStart"] == DBNull.Value ? 0 : Convert.ToInt32(r["PageStart"]);
c.PageEnd = r["PageEnd"] == DBNull.Value ? 0 : Convert.ToInt32(r["PageEnd"]);
list.Add(c);
}
return list;
}
catch (Exception)
{
return new List();
}
}
/// 获取章节正文。
public static PdfChapterDetail GetChapterContent(string chapterId)
{
if (!string.IsNullOrWhiteSpace(chapterId) && chapterId.StartsWith("CH") && _sampleContents.ContainsKey(chapterId))
return _sampleContents[chapterId];
try
{
DataTable dt = SQLHelper.GetDataTableRunText(
"SELECT ChapterId, ChapterTitle, PageStart, PageEnd, [Text] FROM dbo.Sys_PdfChapter WHERE ChapterId=@ChapterId",
new[] { new SqlParameter("@ChapterId", chapterId) });
if (dt != null && dt.Rows.Count > 0)
{
DataRow r = dt.Rows[0];
return new PdfChapterDetail
{
ChapterId = r["ChapterId"] == null ? "" : r["ChapterId"].ToString(),
Title = r["ChapterTitle"] == null ? "" : r["ChapterTitle"].ToString(),
PageStart = r["PageStart"] == DBNull.Value ? 0 : Convert.ToInt32(r["PageStart"]),
PageEnd = r["PageEnd"] == DBNull.Value ? 0 : Convert.ToInt32(r["PageEnd"]),
Content = r["Text"] == DBNull.Value ? "" : r["Text"].ToString()
};
}
}
catch (Exception)
{
// 未建表或查询失败
}
return null;
}
}
}