203 lines
11 KiB
C#
203 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Data.SqlClient;
|
|
using System.Linq;
|
|
|
|
namespace BLL
|
|
{
|
|
/// <summary>PDF 书籍视图模型。</summary>
|
|
public class PdfBook
|
|
{
|
|
public string BookId { get; set; }
|
|
public string Title { get; set; }
|
|
public int ChapterCount { get; set; }
|
|
public string Tag { get; set; }
|
|
}
|
|
|
|
/// <summary>PDF 章节(目录项)视图模型,支持多级目录(含父章节与层级)。</summary>
|
|
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; }
|
|
}
|
|
|
|
/// <summary>章节正文视图模型。</summary>
|
|
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; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// PDF 书籍目录/正文读取服务。
|
|
/// 优先读取数据库表 Sys_PdfBook / Sys_PdfChapter;当库无数据或未建表时,回退到内置示例数据,便于界面预览。
|
|
/// </summary>
|
|
public static class PdfBookService
|
|
{
|
|
// —— 内置示例数据(仅用于 UI 预览)——
|
|
private const string SampleBookId = "SAMPLE_SP_001";
|
|
private static readonly List<PdfBook> _sampleBooks = new List<PdfBook>
|
|
{
|
|
new PdfBook { BookId = SampleBookId, Title = "《建筑施工安全防护(示例)》", Tag = "示例数据", ChapterCount = 15 }
|
|
};
|
|
|
|
// 多级目录示例(对应真实书籍:第一章 → 1.1 → 1.2.1)
|
|
private static readonly List<PdfChapter> _sampleChapters = new List<PdfChapter>
|
|
{
|
|
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<string, PdfChapterDetail> _sampleContents = new Dictionary<string, PdfChapterDetail>
|
|
{
|
|
{ "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 };
|
|
}
|
|
|
|
/// <summary>获取书籍列表。</summary>
|
|
public static List<PdfBook> 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<PdfBook>();
|
|
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;
|
|
}
|
|
|
|
/// <summary>获取某本书的章节(目录,含层级与父章节,供页面递归建树)。</summary>
|
|
public static List<PdfChapter> 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<PdfChapter>();
|
|
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<PdfChapter>();
|
|
}
|
|
}
|
|
|
|
/// <summary>获取章节正文。</summary>
|
|
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;
|
|
}
|
|
}
|
|
}
|