using System;
using System.IO;
using System.Data;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Diagnostics;
using BP.Sys;
using BP.DA;
using BP.En;
using BP.Web;
using BP.Port;
using BP.WF.Rpt;
using BP.WF.Template;
using ICSharpCode.SharpZipLib.Zip;
using System.Net;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace BP.WF
{
public class MakeForm2Html
{
private static StringBuilder GenerHtmlOfFool(MapData mapData, string frmID, Int64 workid, Entity en, string path, string flowNo = null, string FK_Node = null, NodeFormType formType = NodeFormType.FoolForm)
{
StringBuilder sb = new StringBuilder();
//审核意见
string sql = "SELECT NDFromT,Msg,RDT,EmpFromT,EmpFrom,NDFrom FROM ND" + int.Parse(flowNo) + "Track WHERE WorkID=" + workid + " AND ActionType=" + (int)ActionType.WorkCheck + " ORDER BY RDT ";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
//字段集合.
MapAttrs mapAttrs = new MapAttrs(frmID);
//获取当前表单的联动项
FrmRBs frmRBs = new FrmRBs(frmID);
Attrs attrs = null;
GroupFields gfs = null;
if (formType == NodeFormType.FoolTruck && DataType.IsNullOrEmpty(FK_Node) == false)
{
Node nd = new Node(FK_Node);
Work wk = nd.HisWork;
wk.OID = workid;
wk.RetrieveFromDBSources();
/* 求出来走过的表单集合 */
sql = "SELECT NDFrom FROM ND" + int.Parse(flowNo) + "Track A, WF_Node B ";
sql += " WHERE A.NDFrom=B.NodeID ";
sql += " AND (ActionType=" + (int)ActionType.Forward + " OR ActionType=" + (int)ActionType.Start + " OR ActionType=" + (int)ActionType.Skip + ") ";
sql += " AND B.FormType=" + (int)NodeFormType.FoolTruck + " "; // 仅仅找累加表单.
sql += " AND NDFrom!=" + Int32.Parse(FK_Node.Replace("ND", "")) + " "; //排除当前的表单.
sql += " AND (A.WorkID=" + workid + ") ";
sql += " ORDER BY A.RDT ";
// 获得已经走过的节点IDs.
DataTable dtNodeIDs = DBAccess.RunSQLReturnTable(sql);
string frmIDs = "";
if (dtNodeIDs.Rows.Count > 0)
{
//把所有的节点字段.
foreach (DataRow dr in dtNodeIDs.Rows)
{
if (frmIDs.Contains("ND" + dr[0].ToString()) == true)
continue;
frmIDs += "'ND" + dr[0].ToString() + "',";
}
}
if (frmIDs == "")
frmIDs = "'" + mapData.No + "'";
else
frmIDs = frmIDs.Substring(0, frmIDs.Length - 1);
GenerWorkFlow gwf = new GenerWorkFlow(workid);
if (gwf.WFState == WFState.Complete)
frmIDs = frmIDs + ",'" + FK_Node + "'";
gfs = new GroupFields();
gfs.RetrieveIn(GroupFieldAttr.FrmID, "(" + frmIDs + ")");
mapAttrs = new MapAttrs();
mapAttrs.RetrieveIn(MapAttrAttr.FK_MapData, "(" + frmIDs + ")", "GroupID, Idx");
frmRBs = new FrmRBs();
frmRBs.RetrieveIn(FrmRBAttr.FK_MapData, "(" + frmIDs + ")");
}
else
{
gfs = new GroupFields(frmID);
attrs = en.EnMap.Attrs;
}
string hideField = ",";
string showField = ",";
if (frmRBs.Count > 0)
{
foreach (MapAttr mapAttr in mapAttrs)
{
if (mapAttr.GetParaBoolen("IsEnableJS") == true)
{
string val = en.GetValStrByKey(mapAttr.KeyOfEn);
FrmRB rb = frmRBs.GetEntityByKey(mapAttr.MyPK + "_" + val) as FrmRB;
if (rb == null)
continue;
string cfgs = rb.FieldsCfg;
if (DataType.IsNullOrEmpty(cfgs) == true)
continue;
AtPara atPara = new AtPara(cfgs);
//获取显示的字段
foreach (string key in atPara.HisHT.Keys)
{
int keyVal = atPara.GetValIntByKey(key);
if (keyVal == 0)
continue;
if (keyVal == 3)
hideField += key + ",";
if (keyVal == 2 || keyVal == 4)
showField += key + ",";
}
}
}
}
//生成表头.
String frmName = mapData.Name;
if (BP.Difference.SystemConfig.AppSettings["CustomerNo"] == "TianYe")
frmName = "";
sb.Append("
");
//#region 生成头部信息.
sb.Append("");
sb.Append("");
sb.Append("");
sb.Append("");
//二维码显示
bool IsHaveQrcode = true;
if (BP.Difference.SystemConfig.GetValByKeyBoolen("IsShowQrCode", false) == false)
IsHaveQrcode = false;
//判断当前文件是否存在图片
bool IsHaveImg = false;
String IconPath = path + "/icon.png";
if (System.IO.File.Exists(IconPath) == true)
IsHaveImg = true;
if (IsHaveImg == true)
{
sb.Append("");
sb.Append("");
sb.Append(" | ");
}
if (IsHaveImg == false && IsHaveQrcode == false)
sb.Append("");
else if ((IsHaveImg == true && IsHaveQrcode == false) || (IsHaveImg == false && IsHaveQrcode == true))
sb.Append(" | ");
else
sb.Append(" | ");
sb.Append("
" + frmName + "");
sb.Append(" | ");
if (IsHaveQrcode == true)
{
sb.Append("");
sb.Append(" ");
sb.Append(" | ");
}
sb.Append(" ");
sb.Append(" ");
sb.Append(" | ");
//#endregion 生成头部信息.
if (DataType.IsNullOrEmpty(FK_Node) == false && DataType.IsNullOrEmpty(flowNo) == false)
{
Node nd = new Node(Int32.Parse(FK_Node.Replace("ND", "")));
if (frmID.StartsWith("ND") == true && nd.FrmWorkCheckSta != FrmWorkCheckSta.Disable)
{
GroupField gf = gfs.GetEntityByKey(GroupFieldAttr.CtrlType, "FWC") as GroupField;
if (gf == null)
{
gf = new GroupField();
gf.OID = 100;
gf.FrmID = nd.NodeFrmID;
gf.CtrlType = "FWC";
gf.CtrlID = "FWCND" + nd.NodeID;
gf.Idx = 100;
gf.Lab = "审核信息";
gfs.AddEntity(gf);
}
}
}
foreach (GroupField gf in gfs)
{
//输出标题.
if (gf.CtrlType != "Ath")
{
sb.Append("
");
sb.Append(" " + gf.Lab + " | ");
sb.Append("
");
}
//#region 输出字段.
if (gf.CtrlID == "" && gf.CtrlType == "")
{
Boolean isDropTR = true;
String html = "";
foreach (MapAttr attr in mapAttrs)
{
//处理隐藏字段,如果是不可见并且是启用的就隐藏.
if (attr.UIVisible == false && showField.Contains("," + attr.KeyOfEn + ",") == false)
continue;
if (hideField.Contains("," + attr.KeyOfEn + ",") == true)
continue;
if (attr.GroupID != attr.GroupID)
continue;
//处理分组数据,非当前分组的数据不输出
if (attr.GroupID != gf.OID)
continue;
string text = "";
switch (attr.LGType)
{
case FieldTypeS.Normal: // 输出普通类型字段.
if (attr.MyDataType == 1 && (int)attr.UIContralType == DataType.AppString)
{
if (attrs.Contains(attr.KeyOfEn + "Text") == true)
text = en.GetValRefTextByKey(attr.KeyOfEn);
if (DataType.IsNullOrEmpty(text))
if (attrs.Contains(attr.KeyOfEn + "T") == true)
text = en.GetValStrByKey(attr.KeyOfEn + "T");
}
else
{
//判断是不是图片签名
if (attr.IsSigan == true)
{
String SigantureNO = en.GetValStrByKey(attr.KeyOfEn);
String src = BP.Difference.SystemConfig.HostURL + "/DataUser/Siganture/";
text = " ";
}
else if (attr.UIContralType == UIContralType.SignCheck)//是不是签批字段
{
//获取当前节点的审核意见
DataTable mydt = GetWorkcheckInfoByNodeIDs(dt, en.GetValStrByKey(attr.KeyOfEn));
text = "";
text += "
";
foreach (DataRow dr in mydt.Rows)
{
text += "";
text += " " + dr[1].ToString() + " ";
text += "" + dr[3].ToString() + "(" + dr[2].ToString() + ") ";
text += " |
";
}
text += "
";
}
else
{
text = en.GetValStrByKey(attr.KeyOfEn);
}
if (attr.TextModel == 3)
{
text = text.Replace("white-space: nowrap;", "");
}
if (attr.UIContralType == UIContralType.AthShow)
{
FrmAttachmentDBs athDBsFrom = new FrmAttachmentDBs();
int i = athDBsFrom.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, attr.MyPK, FrmAttachmentDBAttr.RefPKVal, workid);
text = "附件(" + i + "个)";
}
}
break;
case FieldTypeS.Enum:
if (attr.UIContralType == UIContralType.CheckBok)
{
string s = en.GetValStrByKey(attr.KeyOfEn) + ",";
SysEnums enums = new SysEnums(attr.UIBindKey);
foreach (SysEnum se in enums)
{
if (s.IndexOf(se.IntKey + ",") != -1)
text += se.Lab + " ";
}
}
else
text = en.GetValRefTextByKey(attr.KeyOfEn);
break;
case FieldTypeS.FK:
text = en.GetValRefTextByKey(attr.KeyOfEn);
break;
default:
break;
}
if (attr.IsBigDoc)
{
//这几种字体生成 pdf都乱码
text = text.Replace("仿宋,", "宋体,");
text = text.Replace("仿宋;", "宋体;");
text = text.Replace("仿宋\"", "宋体\"");
text = text.Replace("黑体,", "宋体,");
text = text.Replace("黑体;", "宋体;");
text = text.Replace("黑体\"", "宋体\"");
text = text.Replace("楷体,", "宋体,");
text = text.Replace("楷体;", "宋体;");
text = text.Replace("楷体\"", "宋体\"");
text = text.Replace("隶书,", "宋体,");
text = text.Replace("隶书;", "宋体;");
text = text.Replace("隶书\"", "宋体\"");
}
if (attr.MyDataType == DataType.AppBoolean)
{
if (DataType.IsNullOrEmpty(text) || text == "0")
text = "[✕]" + attr.Name;
else
text = "[✔]" + attr.Name;
}
//线性展示并且colspan=3
if (attr.ColSpan == 3 || (attr.ColSpan == 4 && attr.UIHeightInt < 30))
{
isDropTR = true;
html += " ";
html += " " + attr.Name + " | ";
html += " ";
html += text;
html += " | ";
html += "
";
continue;
}
//线性展示并且colspan=4
if (attr.ColSpan == 4)
{
isDropTR = true;
html += " ";
html += " " + attr.Name + " | ";
html += "
";
html += " ";
html += " ";
html += text;
html += " | ";
html += "
";
continue;
}
if (isDropTR == true)
{
html += " ";
html += " " + attr.Name + " | ";
html += " ";
html += text;
html += " | ";
isDropTR = !isDropTR;
continue;
}
if (isDropTR == false)
{
html += " " + attr.Name + " | ";
html += " ";
html += text;
html += " | ";
html += "
";
isDropTR = !isDropTR;
continue;
}
}
sb.Append(html); //增加到里面.
continue;
}
//#endregion 输出字段.
//#region 如果是从表.
if (gf.CtrlType == "Dtl")
{
if (DataType.IsNullOrEmpty(gf.CtrlID) == true)
continue;
/* 如果是从表 */
MapAttrs attrsOfDtls = null;
try
{
attrsOfDtls = new MapAttrs(gf.CtrlID);
}
catch (Exception ex) { }
//#region 输出标题.
sb.Append("");
sb.Append("");
sb.Append("");
foreach (MapAttr item in attrsOfDtls)
{
if (item.KeyOfEn == "OID")
continue;
if (item.UIVisible == false)
continue;
sb.Append("" + item.Name + " | ");
}
sb.Append(" ");
//#endregion 输出标题.
//#region 输出数据.
GEDtls dtls = new GEDtls(gf.CtrlID);
dtls.Retrieve(GEDtlAttr.RefPK, workid, "OID");
foreach (GEDtl dtl in dtls)
{
sb.Append("");
foreach (MapAttr item in attrsOfDtls)
{
if (item.KeyOfEn == "OID" || item.UIVisible == false)
continue;
string text = "";
switch (item.LGType)
{
case FieldTypeS.Normal: // 输出普通类型字段.
if (item.MyDataType == 1 && (int)item.UIContralType == DataType.AppString)
{
if (attrs.Contains(item.KeyOfEn + "Text") == true)
text = dtl.GetValRefTextByKey(item.KeyOfEn);
if (DataType.IsNullOrEmpty(text))
if (attrs.Contains(item.KeyOfEn + "T") == true)
text = dtl.GetValStrByKey(item.KeyOfEn + "T");
}
else
{
text = dtl.GetValStrByKey(item.KeyOfEn);
if (item.TextModel == 3)
{
text = text.Replace("white-space: nowrap;", "");
}
}
break;
case FieldTypeS.Enum:
if (item.UIContralType == UIContralType.CheckBok)
{
string s = en.GetValStrByKey(item.KeyOfEn) + ",";
SysEnums enums = new SysEnums(item.UIBindKey);
foreach (SysEnum se in enums)
{
if (s.IndexOf(se.IntKey + ",") != -1)
text += se.Lab + " ";
}
}
else
text = dtl.GetValRefTextByKey(item.KeyOfEn);
break;
case FieldTypeS.FK:
text = dtl.GetValRefTextByKey(item.KeyOfEn);
break;
default:
break;
}
if (item.UIContralType == UIContralType.DDL)
{
sb.Append("" + text + " | ");
continue;
}
//Hongyan
if (item.MyDataType == DataType.AppBoolean)
{
if (DataType.IsNullOrEmpty(text) || text == "0")
sb.Append("[✕] | ");
else
sb.Append("[✔] | ");
continue;
}
if (item.IsNum)
{
sb.Append("" + text + " | ");
continue;
}
sb.Append("" + text + " | ");
}
sb.Append(" ");
}
//#endregion 输出数据.
sb.Append(" ");
sb.Append(" | ");
sb.Append("
");
}
//#endregion 如果是从表.
//#region 如果是附件.
if (gf.CtrlType == "Ath")
{
if (DataType.IsNullOrEmpty(gf.CtrlID) == true)
continue;
FrmAttachment ath = new FrmAttachment();
ath.setMyPK(gf.CtrlID);
if (ath.RetrieveFromDBSources() == 0)
continue;
if (ath.IsVisable == false)
continue;
sb.Append(" ");
sb.Append(" " + gf.Lab + " | ");
sb.Append("
");
FrmAttachmentDBs athDBs = BP.WF.Glo.GenerFrmAttachmentDBs(ath, workid.ToString(), ath.MyPK, workid);
if (ath.UploadType == AttachmentUploadType.Single)
{
/* 单个文件 */
sb.Append("单附件没有转化:" + ath.MyPK + " | ");
continue;
}
if (ath.UploadType == AttachmentUploadType.Multi)
{
sb.Append("
");
sb.Append("");
//判断是否有这个目录.
if (System.IO.Directory.Exists(path + "/pdf/") == false)
System.IO.Directory.CreateDirectory(path + "/pdf/");
foreach (FrmAttachmentDB item in athDBs)
{
String fileTo = path + "/pdf/" + item.FileName;
//加密信息
bool fileEncrypt = BP.Difference.SystemConfig.IsEnableAthEncrypt;
bool isEncrypt = item.GetParaBoolen("IsEncrypt");
//#region 从ftp服务器上下载.
if (ath.AthSaveWay == AthSaveWay.FTPServer)
{
try
{
if (System.IO.File.Exists(fileTo) == true)
System.IO.File.Delete(fileTo);//rn "err@删除已经存在的文件错误,请检查iis的权限:" + ex.getMessage();
//把文件copy到,
String file = item.GenerTempFile(ath.AthSaveWay);
String fileTempDecryPath = file;
if (fileEncrypt == true && isEncrypt == true)
{
fileTempDecryPath = file + ".tmp";
BP.Tools.EncHelper.DecryptDES(file, fileTempDecryPath);
}
System.IO.File.Copy(fileTempDecryPath, fileTo, true);
sb.Append("- " + item.FileName + "
");
}
catch (Exception ex)
{
sb.Append("- " + item.FileName + "(文件未从ftp下载成功{" + ex.Message + "})
");
}
}
//#endregion 从ftp服务器上下载.
//#region 从iis服务器上下载.
if (ath.AthSaveWay == AthSaveWay.IISServer)
{
try
{
String fileTempDecryPath = item.FileFullName;
if (fileEncrypt == true && isEncrypt == true)
{
fileTempDecryPath = item.FileFullName + ".tmp";
BP.Tools.EncHelper.DecryptDES(item.FileFullName, fileTempDecryPath);
}
//把文件copy到,
System.IO.File.Copy(fileTempDecryPath, fileTo, true);
sb.Append("- " + item.FileName + "
");
}
catch (Exception ex)
{
sb.Append("- " + item.FileName + "(文件未从web下载成功{" + ex.Message + "})
");
}
}
}
sb.Append(" ");
sb.Append(" |
");
}
}
//#endregion 如果是附件.
//如果是IFrame页面
if (gf.CtrlType == "Frame" && flowNo != null)
{
if (DataType.IsNullOrEmpty(gf.CtrlID) == true)
continue;
sb.Append("");
sb.Append(" ");
//根据GroupID获取对应的
MapFrame frame = new MapFrame(gf.CtrlID);
//获取URL
String url = frame.URL;
//替换URL的
url = url.Replace("@basePath", BP.Difference.SystemConfig.HostURLOfBS);
//替换系统参数
url = url.Replace("@WebUser.No", WebUser.No);
url = url.Replace("@WebUser.Name;", WebUser.Name);
url = url.Replace("@WebUser.FK_DeptName;", WebUser.FK_DeptName);
url = url.Replace("@WebUser.FK_Dept;", WebUser.FK_Dept);
//替换参数
if (url.IndexOf("?") > 0)
{
//获取url中的参数
url = url.Substring(url.IndexOf('?'));
String[] paramss = url.Split('&');
foreach (String param in paramss)
{
if (DataType.IsNullOrEmpty(param) || param.IndexOf("@") == -1)
continue;
String[] paramArr = param.Split('=');
if (paramArr.Length == 2 && paramArr[1].IndexOf('@') == 0)
{
if (paramArr[1].IndexOf("@WebUser.") == 0)
continue;
url = url.Replace(paramArr[1], en.GetValStrByKey(paramArr[1].Substring(1)));
}
}
}
sb.Append("");
sb.Append(" | ");
sb.Append("
");
}
//#region 审核组件
if (gf.CtrlType == "FWC" && flowNo != null)
{
NodeWorkCheck fwc = new NodeWorkCheck(frmID);
DataTable dtTrack = null;
Boolean bl = false;
try
{
bl = DBAccess.IsExitsTableCol("Port_Emp", "SignType");
}
catch (Exception ex)
{
}
if (bl)
{
String tTable = "ND" + int.Parse(flowNo) + "Track";
sql = "SELECT a." + BP.Sys.Base.Glo.UserNo + ", a.SignType FROM Port_Emp a, " + tTable + " b WHERE a." + Glo.UserNo + "=b.EmpFrom AND B.WorkID=" + workid;
dtTrack = DBAccess.RunSQLReturnTable(sql);
dtTrack.TableName = "SignType";
if (dtTrack.Columns.Contains("No") == false)
dtTrack.Columns.Add("No");
if (dtTrack.Columns.Contains("SignType") == false)
dtTrack.Columns.Add("SignType");
}
String html = ""; // "";
//#region 生成审核信息.
//获得当前待办的人员,把当前审批的人员排除在外,不然就有默认同意的意见可以打印出来.
sql = "SELECT FK_Emp, FK_Node FROM WF_GenerWorkerList WHERE IsPass!=1 AND WorkID=" + workid;
DataTable dtOfTodo = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow dr in dt.Rows)
{
//#region 排除正在审批的人员.
string nodeID = dr["NDFrom"].ToString();
string empFrom = dr["EmpFrom"].ToString();
if (dtOfTodo.Rows.Count != 0)
{
Boolean isHave = false;
foreach (DataRow mydr in dtOfTodo.Rows)
{
if (mydr["FK_Node"].ToString() != nodeID)
continue;
if (mydr["FK_Emp"].ToString() != empFrom)
continue;
isHave = true;
}
if (isHave == true)
continue;
}
//#endregion 排除正在审批的人员.
html += "";
html += " " + dr["NDFromT"] + " | ";
String msg = dr["Msg"].ToString();
msg += "
";
msg += "
";
String empStrs = "";
if (dtTrack == null)
{
empStrs = dr["EmpFromT"].ToString();
}
else
{
String singType = "0";
foreach (DataRow drTrack in dtTrack.Rows)
{
if (drTrack["No"].ToString() == dr["EmpFrom"].ToString())
{
singType = drTrack["SignType"].ToString();
break;
}
}
if (singType == "0" || singType == "2")
{
empStrs = dr["EmpFromT"].ToString();
}
if (singType == "1")
{
String src = BP.Difference.SystemConfig.HostURL + "/DataUser/Siganture/";
empStrs = " ";
}
}
msg += "审核人:" + empStrs + " 日期:" + dr["RDT"].ToString();
html += " " + msg + " | ";
html += "
";
}
//#endregion 生成审核信息.
sb.Append(" " + html);
}
}
sb.Append("
");
return sb;
}
///
/// 这里做了一些不为空的判断,获得document的元素的时候.
/// 注意同步.
///
///
///
///
///
///
///
///
///
private static void GenerHtmlOfDevelop(MapData mapData, string frmID, Int64 workid, Entity en, string path, string indexFile, string flowNo = null, string FK_Node = null)
{
string htmlString = DataType.ReadTextFile(indexFile);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
//用于创建新节点
HtmlAgilityPack.HtmlNode createnode = doc.DocumentNode.SelectSingleNode("/p");
//将字符串转换成 HtmlDocument
doc.LoadHtml(htmlString);
//字段集合.
MapAttrs mapAttrs = new MapAttrs(frmID);
//获取审核组件的信息
string sql = "SELECT NDFromT,Msg,RDT,EmpFromT,EmpFrom,NDFrom FROM ND" + int.Parse(flowNo) + "Track WHERE WorkID=" + workid + " AND ActionType=" + (int)ActionType.WorkCheck + " ORDER BY RDT ";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
HtmlAgilityPack.HtmlNode node = null;
foreach (MapAttr attr in mapAttrs)
{
//处理隐藏字段,如果是不可见并且是启用的就隐藏.
if (attr.UIVisible == false)
continue;
string text = en.GetValStrByKey(attr.KeyOfEn);
//外键或者外部数据源
if ((attr.LGType == FieldTypeS.Normal && attr.MyDataType == DataType.AppString && attr.UIContralType == UIContralType.DDL)
|| (attr.LGType == FieldTypeS.FK && attr.MyDataType == DataType.AppString))
{
if (mapAttrs.Contains(attr.KeyOfEn + "Text") == true)
text = en.GetValRefTextByKey(attr.KeyOfEn);
if (DataType.IsNullOrEmpty(text))
if (mapAttrs.Contains(attr.KeyOfEn + "T") == true)
text = en.GetValStrByKey(attr.KeyOfEn + "T");
node = doc.GetElementbyId("DDL_" + attr.KeyOfEn);
if (node == null)
continue;
HtmlAgilityPack.HtmlNode parentNode = node.ParentNode;
HtmlAgilityPack.HtmlNode newNode = HtmlAgilityPack.HtmlNode.CreateNode("" + text + "");
parentNode.AppendChild(newNode);
node.Remove();
continue;
}
//枚举、枚举下拉框
if (attr.MyDataType == DataType.AppInt && attr.LGType == FieldTypeS.Enum)
{
text = en.GetValStrByKey(attr.KeyOfEn);
//如果是下拉框
if (attr.UIContralType == UIContralType.DDL)
{
text = en.GetValStringByKey(attr.KeyOfEn + "Text");
node = doc.GetElementbyId("DDL_" + attr.KeyOfEn);
if (node == null)
continue;
HtmlAgilityPack.HtmlNode parentNode = node.ParentNode;
HtmlAgilityPack.HtmlNode newNode = HtmlAgilityPack.HtmlNode.CreateNode("" + text + "");
parentNode.AppendChild(newNode);
node.Remove();
continue;
}
var rb = doc.GetElementbyId("RB_" + attr.KeyOfEn + "_" + text);
if (rb != null)
rb.SetAttributeValue("checked", "checked");
continue;
}
//枚举复选框
if (attr.MyDataType == DataType.AppString && attr.LGType == FieldTypeS.Enum)
{
text = en.GetValStrByKey(attr.KeyOfEn);
string s = en.GetValStrByKey(attr.KeyOfEn) + ",";
SysEnums enums = new SysEnums(attr.UIBindKey);
foreach (SysEnum se in enums)
{
var mycb = doc.GetElementbyId("CB_" + attr.KeyOfEn + "_" + se.IntKey);
if (mycb == null)
continue;
if (s.IndexOf(se.IntKey + ",") != -1)
mycb.SetAttributeValue("checked", "checked");
mycb.SetAttributeValue("disabled", "disabled");
}
continue;
}
if (attr.MyDataType == DataType.AppBoolean)
{
var cb = doc.GetElementbyId("CB_" + attr.KeyOfEn);
if (cb != null)
{
if (DataType.IsNullOrEmpty(text) || text == "0")
doc.GetElementbyId("CB_" + attr.KeyOfEn).SetAttributeValue("checked", "");
else
doc.GetElementbyId("CB_" + attr.KeyOfEn).SetAttributeValue("checked", "checked");
doc.GetElementbyId("CB_" + attr.KeyOfEn).SetAttributeValue("disabled", "disabled");
}
continue;
}
if (attr.MyDataType == DataType.AppString)
{
//签批字段
if (attr.UIContralType == UIContralType.SignCheck)
{
node = doc.GetElementbyId("TB_" + attr.KeyOfEn);
if (node == null)
continue;
DataTable mydt = GetWorkcheckInfoByNodeIDs(dt, text);
if (mydt.Rows.Count == 0)
{
node.Remove();
continue;
}
string _html = "";
_html += "
";
foreach (DataRow dr in mydt.Rows)
{
string sql2 = "SELECT SigantureEnabel FROM WF_Node WHERE NodeID ='" + dr[5].ToString() + "'";
string singType = DBAccess.RunSQLReturnString(sql2);
_html += "";
_html += " " + dr[1].ToString() + " ";
string empstr = "";
if (singType == "0" || singType == "2")
{
empstr = dr[3].ToString();
}
if (singType == "1")
{
string src = BP.Difference.SystemConfig.HostURL + "/DataUser/Siganture/";
empstr = "";
}
_html += "" + empstr + "(" + dr[2].ToString() + ") ";
_html += " |
";
}
_html += "
";
HtmlAgilityPack.HtmlNode parentNode = node.ParentNode;
HtmlAgilityPack.HtmlNode newNode = HtmlAgilityPack.HtmlNode.CreateNode(_html);
parentNode.AppendChild(newNode);
node.Remove();
continue;
}
//字段附件
if (attr.UIContralType == UIContralType.AthShow)
{
continue;
}
//签名
if (attr.IsSigan == true)
{
continue;
}
}
if (attr.IsBigDoc)
{
//这几种字体生成 pdf都乱码
text = text.Replace("仿宋,", "宋体,");
text = text.Replace("仿宋;", "宋体;");
text = text.Replace("仿宋\"", "宋体\"");
text = text.Replace("黑体,", "宋体,");
text = text.Replace("黑体;", "宋体;");
text = text.Replace("黑体\"", "宋体\"");
text = text.Replace("楷体,", "宋体,");
text = text.Replace("楷体;", "宋体;");
text = text.Replace("楷体\"", "宋体\"");
text = text.Replace("隶书,", "宋体,");
text = text.Replace("隶书;", "宋体;");
text = text.Replace("隶书\"", "宋体\"");
var tb1 = doc.GetElementbyId("TB_" + attr.KeyOfEn);
if (tb1 != null)
{
doc.GetElementbyId("TB_" + attr.KeyOfEn).InnerHtml = text;
doc.GetElementbyId("TB_" + attr.KeyOfEn).SetAttributeValue("disabled", "disabled");
}
continue;
}
//如果是字符串
var tb = doc.GetElementbyId("TB_" + attr.KeyOfEn);
if (tb != null)
{
tb.SetAttributeValue("value", text);
tb.SetAttributeValue("disabled", "disabled");
}
}
//获取从表
MapDtls dtls = new MapDtls(frmID);
foreach (MapDtl dtl in dtls)
{
if (dtl.IsView == false)
continue;
string html = GetDtlHtmlByID(dtl, workid, mapData.FrmW);
node = doc.DocumentNode.SelectSingleNode("//img[@data-key='" + dtl.No + "']");
if (node == null)
continue;
HtmlAgilityPack.HtmlNode parentNode = node.ParentNode;
HtmlAgilityPack.HtmlNode newNode = HtmlAgilityPack.HtmlNode.CreateNode(html);
parentNode.AppendChild(newNode);
node.Remove();
}
//获取附件
FrmAttachments aths = new FrmAttachments(frmID);
foreach (FrmAttachment ath in aths)
{
if (ath.IsVisable == false)
continue;
node = doc.DocumentNode.SelectSingleNode("//img[@data-key='" + ath.MyPK + "']");
if (node == null)
continue;
string html = GetAthHtmlByID(ath, workid, path);
HtmlAgilityPack.HtmlNode parentNode = node.ParentNode;
HtmlAgilityPack.HtmlNode newNode = HtmlAgilityPack.HtmlNode.CreateNode(html);
parentNode.AppendChild(newNode);
node.Remove();
}
doc.Save(indexFile, Encoding.UTF8);
return;
}
private static DataTable GetWorkcheckInfoByNodeIDs(DataTable dt, string nodeId)
{
DataTable mydt = dt.Clone();
if (DataType.IsNullOrEmpty(nodeId) == true)
return mydt;
string[] nodeIds = nodeId.Split(',');
for (int i = 0; i < nodeIds.Length; i++)
{
if (DataType.IsNullOrEmpty(nodeIds[i]) == true)
continue;
//获取到值
DataRow[] rows = dt.Select("NDFrom=" + nodeIds[i]);
foreach (DataRow dr in rows)
{
DataRow myrow = mydt.NewRow();
myrow.ItemArray = dr.ItemArray;
mydt.Rows.Add(myrow);
}
}
return mydt;
}
private static string GetDtlHtmlByID(MapDtl dtl, Int64 workid, float width)
{
StringBuilder sb = new System.Text.StringBuilder();
MapAttrs attrsOfDtls = new MapAttrs(dtl.No);
int columNum = 0;
foreach (MapAttr item in attrsOfDtls)
{
if (item.KeyOfEn == "OID")
continue;
if (item.UIVisible == false)
continue;
columNum++;
}
if (columNum == 0)
return "";
int columWidth = (int)100 / columNum;
sb.Append("");
sb.Append("");
foreach (MapAttr item in attrsOfDtls)
{
if (item.KeyOfEn == "OID")
continue;
if (item.UIVisible == false)
continue;
sb.Append("" + item.Name + " | ");
}
sb.Append("
");
//#endregion 输出标题.
//#region 输出数据.
GEDtls gedtls = new GEDtls(dtl.No);
gedtls.Retrieve(GEDtlAttr.RefPK, workid, "OID");
foreach (GEDtl gedtl in gedtls)
{
sb.Append("");
foreach (MapAttr attr in attrsOfDtls)
{
//处理隐藏字段,如果是不可见并且是启用的就隐藏.
if (attr.KeyOfEn.Equals("OID") || attr.UIVisible == false)
continue;
string text = "";
switch (attr.LGType)
{
case FieldTypeS.Normal: // 输出普通类型字段.
if (attr.MyDataType == 1 && (int)attr.UIContralType == DataType.AppString)
{
if (attrsOfDtls.Contains(attr.KeyOfEn + "Text") == true)
text = gedtl.GetValRefTextByKey(attr.KeyOfEn);
if (DataType.IsNullOrEmpty(text))
if (attrsOfDtls.Contains(attr.KeyOfEn + "T") == true)
text = gedtl.GetValStrByKey(attr.KeyOfEn + "T");
}
else
{
//判断是不是图片签名
if (attr.IsSigan == true)
{
String SigantureNO = gedtl.GetValStrByKey(attr.KeyOfEn);
String src = BP.Difference.SystemConfig.HostURL + "/DataUser/Siganture/";
text = " ";
}
else
{
text = gedtl.GetValStrByKey(attr.KeyOfEn);
}
if (attr.TextModel == 3)
{
text = text.Replace("white-space: nowrap;", "");
}
}
break;
case FieldTypeS.Enum:
if (attr.UIContralType == UIContralType.CheckBok)
{
string s = gedtl.GetValStrByKey(attr.KeyOfEn) + ",";
SysEnums enums = new SysEnums(attr.UIBindKey);
foreach (SysEnum se in enums)
{
if (s.IndexOf(se.IntKey + ",") != -1)
text += se.Lab + " ";
}
}
else
text = gedtl.GetValRefTextByKey(attr.KeyOfEn);
break;
case FieldTypeS.FK:
text = gedtl.GetValRefTextByKey(attr.KeyOfEn);
break;
default:
break;
}
if (attr.IsBigDoc)
{
//这几种字体生成 pdf都乱码
text = text.Replace("仿宋,", "宋体,");
text = text.Replace("仿宋;", "宋体;");
text = text.Replace("仿宋\"", "宋体\"");
text = text.Replace("黑体,", "宋体,");
text = text.Replace("黑体;", "宋体;");
text = text.Replace("黑体\"", "宋体\"");
text = text.Replace("楷体,", "宋体,");
text = text.Replace("楷体;", "宋体;");
text = text.Replace("楷体\"", "宋体\"");
text = text.Replace("隶书,", "宋体,");
text = text.Replace("隶书;", "宋体;");
text = text.Replace("隶书\"", "宋体\"");
}
if (attr.MyDataType == DataType.AppBoolean)
{
if (DataType.IsNullOrEmpty(text) || text == "0")
text = "否";
else
text = "是";
}
if (attr.IsNum)
sb.Append("" + text + " | ");
else
sb.Append("" + text + " | ");
}
sb.Append("
");
}
//#endregion 输出数据.
sb.Append("
");
sb.Append("");
return sb.ToString();
}
private static string GetAthHtmlByID(FrmAttachment ath, Int64 workid, string path)
{
StringBuilder sb = new System.Text.StringBuilder();
if (ath.UploadType == AttachmentUploadType.Multi)
{
//判断是否有这个目录.
if (System.IO.Directory.Exists(path + "/pdf/") == false)
System.IO.Directory.CreateDirectory(path + "/pdf/");
//文件加密
bool fileEncrypt = BP.Difference.SystemConfig.IsEnableAthEncrypt;
FrmAttachmentDBs athDBs = BP.WF.Glo.GenerFrmAttachmentDBs(ath, workid.ToString(), ath.MyPK, workid);
sb.Append("");
sb.Append("");
sb.Append("序 | ");
sb.Append("文件名 | ");
sb.Append("大小KB | ");
sb.Append("上传时间 | ");
sb.Append("上传人 | ");
sb.Append("
");
sb.Append("");
int idx = 0;
foreach (FrmAttachmentDB item in athDBs)
{
idx++;
sb.Append("");
sb.Append("" + idx + " | ");
//获取文件是否加密
bool isEncrypt = item.GetParaBoolen("IsEncrypt");
if (ath.AthSaveWay == AthSaveWay.FTPServer)
{
try
{
string toFile = path + "/pdf/" + item.FileName;
if (System.IO.File.Exists(toFile) == false)
{
//获取文件是否加密
string file = item.GenerTempFile(ath.AthSaveWay);
string fileTempDecryPath = file;
if (fileEncrypt == true && isEncrypt == true)
{
fileTempDecryPath = file + ".tmp";
BP.Tools.EncHelper.DecryptDES(file, fileTempDecryPath);
}
System.IO.File.Copy(fileTempDecryPath, toFile, true);
}
sb.Append("" + item.FileName + " | ");
}
catch (Exception ex)
{
sb.Append("" + item.FileName + "(文件未从ftp下载成功{" + ex.Message + "}) | ");
}
}
if (ath.AthSaveWay == AthSaveWay.IISServer)
{
try
{
string toFile = path + "/pdf/" + item.FileName;
if (System.IO.File.Exists(toFile) == false)
{
//把文件copy到,
string fileTempDecryPath = item.FileFullName;
if (fileEncrypt == true && isEncrypt == true)
{
fileTempDecryPath = item.FileFullName + ".tmp";
BP.Tools.EncHelper.DecryptDES(item.FileFullName, fileTempDecryPath);
}
//把文件copy到,
System.IO.File.Copy(fileTempDecryPath, path + "/pdf/" + item.FileName, true);
}
sb.Append("" + item.FileName + " | ");
}
catch (Exception ex)
{
sb.Append("" + item.FileName + "(文件未从ftp下载成功{" + ex.Message + "}) | ");
}
}
sb.Append("" + item.FileSize + "KB | ");
sb.Append("" + item.RDT + " | ");
sb.Append("" + item.RecName + " | ");
sb.Append("
");
}
sb.Append("");
sb.Append("
");
}
return sb.ToString();
}
///
/// 单表单,多表单打印PDF
///
/// 节点属性
/// 流程实例WorkID
/// 流程编号
/// 生成PDF的名称
/// 生成PDF的路径
///
///
public static string MakeCCFormToPDF(Node node, Int64 workid, string flowNo, string pdfName, string filePath)
{
//根据节点信息获取表单方案
MapData md = new MapData("ND" + node.NodeID);
string resultMsg = "";
GenerWorkFlow gwf = null;
//获取主干流程信息
if (flowNo != null)
gwf = new GenerWorkFlow(workid);
//存放信息地址
string hostURL = BP.Difference.SystemConfig.GetValByKey("HostURL", "");
string path = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid;
string frmID = node.NodeFrmID;
//处理正确的文件名.
if (DataType.IsNullOrEmpty(pdfName) == true)
{
if (DataType.IsNullOrEmpty(flowNo) == false)
pdfName = DBAccess.RunSQLReturnStringIsNull("SELECT Title FROM WF_GenerWorkFlow WHERE WorkID=" + workid, workid.ToString());
else
pdfName = workid.ToString();
}
pdfName = DataType.PraseStringToFileName(pdfName);
Hashtable ht = new Hashtable();
#region 单表单打印
if (node.HisFormType == NodeFormType.RefOneFrmTree || node.IsNodeFrm == true)
{
resultMsg = setPDFPath("ND" + node.NodeID, workid, flowNo, gwf);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
string billUrl = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/index.htm";
resultMsg = MakeHtmlDocument(frmID, workid, flowNo, path, billUrl, "ND" + node.NodeID);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
ht.Add("htm", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser") + "/InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/index.htm");
//生成pdf文件
string pdfPath = filePath;
if (DataType.IsNullOrEmpty(pdfPath) == true)
pdfPath = path + "/pdf";
if (System.IO.Directory.Exists(pdfPath) == false)
System.IO.Directory.CreateDirectory(pdfPath);
string pdfFile = pdfPath + "/" + pdfName + ".pdf";
string pdfFileExe = BP.Difference.SystemConfig.PathOfDataUser + "ThirdpartySoftware/wkhtmltox/wkhtmltopdf.exe";
try
{
Html2Pdf(pdfFileExe, billUrl, pdfFile);
if (DataType.IsNullOrEmpty(filePath) == true)
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/pdf/" + pdfName + ".pdf");
else
ht.Add("pdf", pdfPath + "/" + DataType.PraseStringToUrlFileName(pdfName) + ".pdf");
}
catch (Exception ex)
{
throw new Exception("err@html转PDF错误:PDF的路径" + pdfPath + "可能抛的异常" + ex.Message);
}
//生成压缩文件
string zipFile = path + "/../" + pdfName + ".zip";
System.IO.FileInfo finfo = new FileInfo(zipFile);
ZipFilePath = finfo.FullName; //文件路径.
try
{
(new FastZip()).CreateZip(finfo.FullName, pdfPath, true, "");
ht.Add("zip", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser/InstancePacketOfData/" + "ND" + node.NodeID + "/" + pdfName + ".zip");
}
catch (Exception ex)
{
ht.Add("zip", "err@生成zip文件遇到权限问题:" + ex.Message + " @Path:" + pdfFile);
}
//把所有的文件做成一个zip文件.
return BP.Tools.Json.ToJsonEntitiesNoNameMode(ht);
}
#endregion 单表单打印
#region 多表单合并PDF打印
if ((int)node.HisFormType == (int)NodeFormType.SheetTree)
{
string pdfPath = filePath;
//生成pdf文件
//生成pdf文件
if (DataType.IsNullOrEmpty(pdfPath) == true)
pdfPath = path + "/pdf";
string pdfTempPath = path + "/pdfTemp";
DataRow dr = null;
resultMsg = setPDFPath("ND" + node.NodeID, workid, flowNo, gwf);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
//获取绑定的表单
FrmNodes nds = new FrmNodes(node.FK_Flow, node.NodeID);
foreach (FrmNode item in nds)
{
//判断当前绑定的表单是否启用
if (item.FrmEnableRoleInt == (int)FrmEnableRole.Disable)
continue;
//判断 who is pk
if (flowNo != null && item.WhoIsPK == WhoIsPK.PWorkID) //如果是父子流程
workid = gwf.PWorkID;
//获取表单的信息执行打印
string billUrl = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/" + item.FK_Frm + "index.htm";
resultMsg = MakeHtmlDocument(item.FK_Frm, workid, flowNo, path, billUrl, "ND" + node.NodeID);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
ht.Add("htm_" + item.FK_Frm, BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "/InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/" + item.FK_Frm + "index.htm");
//#region 把所有的文件做成一个zip文件.
if (System.IO.Directory.Exists(pdfTempPath) == false)
System.IO.Directory.CreateDirectory(pdfTempPath);
string pdfFormFile = pdfTempPath + "/" + item.FK_Frm + ".pdf";
string pdfFileExe = BP.Difference.SystemConfig.PathOfDataUser + "ThirdpartySoftware/wkhtmltox/wkhtmltopdf.exe";
try
{
Html2Pdf(pdfFileExe, resultMsg, pdfFormFile);
}
catch (Exception ex)
{
/*有可能是因为文件路径的错误, 用补偿的方法在执行一次, 如果仍然失败,按照异常处理. */
Html2Pdf(pdfFileExe, resultMsg, pdfFormFile);
}
}
//pdf合并
string pdfFile = pdfPath + "/" + pdfName + ".pdf";
//开始合并处理
if (System.IO.Directory.Exists(pdfPath) == false)
System.IO.Directory.CreateDirectory(pdfPath);
MergePDF(pdfTempPath, pdfFile);//合并pdf
//合并完删除文件夹
System.IO.Directory.Delete(pdfTempPath, true);
if (DataType.IsNullOrEmpty(filePath) == true)
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "InstancePacketOfData/" + frmID + "/" + workid + "/pdf/" + pdfName + ".pdf");
else
ht.Add("pdf", pdfPath + "/" + pdfName + ".pdf");
//生成压缩文件
string zipFile = path + "/../" + pdfName + ".zip";
System.IO.FileInfo finfo = new FileInfo(zipFile);
ZipFilePath = finfo.FullName; //文件路径.
try
{
(new FastZip()).CreateZip(finfo.FullName, pdfPath, true, "");
ht.Add("zip", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser/InstancePacketOfData/" + frmID + "/" + workid + "/" + pdfName + ".zip");
}
catch (Exception ex)
{
ht.Add("zip", "err@生成zip文件遇到权限问题:" + ex.Message + " @Path:" + pdfFile);
}
return BP.Tools.Json.ToJsonEntitiesNoNameMode(ht);
}
#endregion 多表单合并PDF打印
return "warning@不存在需要打印的表单";
}
///
/// 单据打印
///
/// 表单ID
/// 数据ID
/// PDF路径
/// PDF名称
///
public static string MakeBillToPDF(string frmId, Int64 workid, string filePath, string pdfName)
{
string resultMsg = "";
// 获取单据的属性信息
BP.CCBill.FrmBill bill = new BP.CCBill.FrmBill(frmId);
//存放信息地址
string path = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + bill.No + "/" + workid;
if (DataType.IsNullOrEmpty(pdfName) == true)
pdfName = workid.ToString();
pdfName = DataType.PraseStringToFileName(pdfName);
Hashtable ht = new Hashtable();
string pdfPath = filePath;
//生成pdf文件
if (DataType.IsNullOrEmpty(pdfPath) == true)
pdfPath = path + "/pdf";
DataRow dr = null;
resultMsg = setPDFPath(frmId, workid, null, null);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
//获取表单的信息执行打印
string billUrl = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + bill.No + "/" + workid + "/" + "index.htm";
resultMsg = MakeHtmlDocument(bill.No, workid, null, path, billUrl, frmId);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
ht.Add("htm", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "InstancePacketOfData/" + frmId + "/" + workid + "/" + "index.htm");
//#region 把所有的文件做成一个zip文件.
if (System.IO.Directory.Exists(pdfPath) == false)
System.IO.Directory.CreateDirectory(pdfPath);
string pdfFormFile = pdfPath + "/" + pdfName + ".pdf"; //生成的路径.
string pdfFileExe = BP.Difference.SystemConfig.PathOfDataUser + "ThirdpartySoftware/wkhtmltox/wkhtmltopdf.exe";
try
{
Html2Pdf(pdfFileExe, resultMsg, pdfFormFile);
if (DataType.IsNullOrEmpty(filePath) == true)
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "InstancePacketOfData/" + frmId + "/" + workid + "/pdf/" + pdfName + ".pdf");
else
ht.Add("pdf", pdfPath + "/" + pdfName + ".pdf");
}
catch (Exception ex)
{
pdfFormFile = pdfPath + "/" + pdfName + ".pdf";
Html2Pdf(pdfFileExe, resultMsg, pdfFormFile);
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "") + "/InstancePacketOfData/" + frmId + "/" + workid + "/pdf/" + bill.Name + ".pdf");
}
//生成压缩文件
string zipFile = path + "/../" + pdfName + ".zip";
System.IO.FileInfo finfo = new FileInfo(zipFile);
ZipFilePath = finfo.FullName; //文件路径.
try
{
(new FastZip()).CreateZip(finfo.FullName, pdfPath, true, "");
ht.Add("zip", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser/InstancePacketOfData/" + frmId + "/" + pdfName + ".zip");
}
catch (Exception ex)
{
ht.Add("zip", "err@生成zip文件遇到权限问题:" + ex.Message + " @Path:" + pdfPath);
}
return BP.Tools.Json.ToJsonEntitiesNoNameMode(ht);
}
public static string MakeFormToPDF(string frmId, string frmName, Node node,
Int64 workid, string flowNo, string fileNameFormat, bool urlIsHostUrl, string basePath)
{
string resultMsg = "";
GenerWorkFlow gwf = null;
//获取主干流程信息
if (flowNo != null)
gwf = new GenerWorkFlow(workid);
//存放信息地址
string hostURL = BP.Difference.SystemConfig.GetValByKey("HostURL", "");
string path = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid;
//处理正确的文件名.
if (fileNameFormat == null)
{
if (flowNo != null)
fileNameFormat = DBAccess.RunSQLReturnStringIsNull("SELECT Title FROM WF_GenerWorkFlow WHERE WorkID=" + workid, "" + workid.ToString());
else
fileNameFormat = workid.ToString();
}
if (DataType.IsNullOrEmpty(fileNameFormat) == true)
fileNameFormat = workid.ToString();
fileNameFormat = DataType.PraseStringToFileName(fileNameFormat);
Hashtable ht = new Hashtable();
//生成pdf文件
string pdfPath = path + "/pdf";
DataRow dr = null;
resultMsg = setPDFPath("ND" + node.NodeID, workid, flowNo, gwf);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
//获取绑定的表单
FrmNode frmNode = new FrmNode();
frmNode.Retrieve(FrmNodeAttr.FK_Frm, frmId);
//判断当前绑定的表单是否启用
if (frmNode.FrmEnableRoleInt == (int)FrmEnableRole.Disable)
return "warning@" + frmName + "没有被启用";
//判断 who is pk
if (flowNo != null && frmNode.WhoIsPK == WhoIsPK.PWorkID) //如果是父子流程
workid = gwf.PWorkID;
//获取表单的信息执行打印
string billUrl = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/" + frmNode.FK_Frm + "index.htm";
resultMsg = MakeHtmlDocument(frmNode.FK_Frm, workid, flowNo, path, billUrl, "ND" + node.NodeID);
if (resultMsg.IndexOf("err@") != -1)
return resultMsg;
// ht.Add("htm", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "/InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/" + frmNode.FK_Frm + "index.htm");
//#region 把所有的文件做成一个zip文件.
if (System.IO.Directory.Exists(pdfPath) == false)
System.IO.Directory.CreateDirectory(pdfPath);
fileNameFormat = fileNameFormat.Substring(0, fileNameFormat.Length - 1);
string pdfFormFile = pdfPath + "/" + frmNode.FK_Frm + ".pdf";
string pdfFileExe = BP.Difference.SystemConfig.PathOfDataUser + "ThirdpartySoftware/wkhtmltox/wkhtmltopdf.exe";
try
{
Html2Pdf(pdfFileExe, resultMsg, pdfFormFile);
if (urlIsHostUrl == false)
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "../../DataUser/") + "InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/pdf/" + frmNode.FK_Frm + ".pdf");
else
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURL", "") + "/DataUser/InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/pdf/" + frmNode.FK_Frm + ".pdf");
}
catch (Exception ex)
{
/*有可能是因为文件路径的错误, 用补偿的方法在执行一次, 如果仍然失败,按照异常处理. */
fileNameFormat = DBAccess.GenerGUID();
pdfFormFile = pdfPath + "/" + fileNameFormat + ".pdf";
Html2Pdf(pdfFileExe, resultMsg, pdfFormFile);
ht.Add("pdf", BP.Difference.SystemConfig.GetValByKey("HostURLOfBS", "") + "/InstancePacketOfData/" + "ND" + node.NodeID + "/" + workid + "/pdf/" + frmNode.FK_Frm + ".pdf");
}
return BP.Tools.Json.ToJsonEntitiesNoNameMode(ht);
}
///
/// 读取合并的pdf文件名称
///
/// 目录
/// 导出的路径
public static void MergePDF(string Directorypath, string outpath)
{
List filelist2 = new List();
System.IO.DirectoryInfo di2 = new System.IO.DirectoryInfo(Directorypath);
FileInfo[] ff2 = di2.GetFiles("*.pdf");
BubbleSort(ff2);
foreach (FileInfo temp in ff2)
{
filelist2.Add(Directorypath + "/" + temp.Name);
}
PdfReader reader;
//iTextSharp.text.Rectangle rec = new iTextSharp.text.Rectangle(1403, 991);
Document document = new Document();
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outpath, FileMode.Create));
document.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage newPage;
for (int i = 0; i < filelist2.Count; i++)
{
reader = new PdfReader(filelist2[i]);
int iPageNum = reader.NumberOfPages;
for (int j = 1; j <= iPageNum; j++)
{
document.NewPage();
newPage = writer.GetImportedPage(reader, j);
cb.AddTemplate(newPage, 0, 0);
}
}
document.Close();
}
///
/// 冒泡排序
///
/// 文件名数组
public static void BubbleSort(FileInfo[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
for (int j = i; j < arr.Length; j++)
{
if (arr[i].LastWriteTime > arr[j].LastWriteTime)//按创建时间(升序)
{
FileInfo temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
//前期文件的准备
private static string setPDFPath(string frmID, long workid, string flowNo, GenerWorkFlow gwf)
{
//准备目录文件.
string path = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + frmID + "/";
try
{
path = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + frmID + "/";
if (System.IO.Directory.Exists(path) == false)
System.IO.Directory.CreateDirectory(path);
path = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/" + frmID + "/" + workid;
if (System.IO.Directory.Exists(path) == false)
System.IO.Directory.CreateDirectory(path);
//把模版文件copy过去.
string templateFilePath = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(templateFilePath);
System.IO.FileInfo[] finfos = dir.GetFiles();
if (finfos.Length == 0)
return "err@不存在模板文件";
foreach (System.IO.FileInfo fl in finfos)
{
if (fl.Name.Contains("ShuiYin"))
continue;
if (fl.Name.Contains("htm"))
continue;
if (System.IO.File.Exists(path + "/" + fl.FullName) == true)
System.IO.File.Delete(path + "/" + fl.FullName);
System.IO.File.Copy(fl.FullName, path + "/" + fl.Name, true);
}
}
catch (Exception ex)
{
return "err@读写文件出现权限问题,请联系管理员解决。" + ex.Message;
}
string hostURL = BP.Difference.SystemConfig.GetValByKey("HostURL", "");
string billUrl = hostURL + "/DataUser/InstancePacketOfData/" + frmID + "/" + workid + "/index.htm";
// begin生成二维码.
string pathQR = path + "/QR.png"; // key.Replace("OID.Img@AppPath", BP.Difference.SystemConfig.PathOfWebApp);
if (BP.Difference.SystemConfig.GetValByKeyBoolen("IsShowQrCode", false) == true)
{
/*说明是图片文件.*/
string qrUrl = hostURL + "/WF/WorkOpt/PrintDocQRGuide.htm?FrmID=" + frmID + "&WorkID=" + workid + "&FlowNo=" + flowNo;
if (flowNo != null)
{
gwf = new GenerWorkFlow(workid);
qrUrl = hostURL + "/WF/WorkOpt/PrintDocQRGuide.htm?AP=" + frmID + "$" + workid + "_" + flowNo + "_" + gwf.FK_Node + "_" + gwf.Starter + "_" + gwf.FK_Dept;
}
//二维码的生成
ThoughtWorks.QRCode.Codec.QRCodeEncoder qrc = new ThoughtWorks.QRCode.Codec.QRCodeEncoder();
qrc.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.BYTE;
qrc.QRCodeScale = 4;
qrc.QRCodeVersion = 7;
qrc.QRCodeErrorCorrect = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ERROR_CORRECTION.M;
System.Drawing.Bitmap btm = qrc.Encode(qrUrl, System.Text.Encoding.UTF8);
btm.Save(pathQR);
//QrCodeUtil.createQrCode(qrUrl,path,"QR.png");
}
//end生成二维码.
return "";
}
private static string DownLoadFielToMemoryStream(string url)
{
var wreq = System.Net.HttpWebRequest.Create(url) as System.Net.HttpWebRequest;
System.Net.HttpWebResponse response = wreq.GetResponse() as System.Net.HttpWebResponse;
MemoryStream ms = null;
using (var stream = response.GetResponseStream())
{
Byte[] buffer = new Byte[response.ContentLength];
int offset = 0, actuallyRead = 0;
do
{
actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
offset += actuallyRead;
}
while (actuallyRead > 0);
ms = new MemoryStream(buffer);
}
response.Close();
return Convert.ToBase64String(ms.ToArray());
}
///
/// zip文件路径.
///
public static string ZipFilePath = "";
public static string CCFlowAppPath = "/";
public static string GetHtml(string url)
{
string html = String.Empty;
HttpWebRequest rt = null;
HttpWebResponse rs = null;
Stream stream = null;
StreamReader sr = null;
try
{
rt = (HttpWebRequest)WebRequest.Create(url);
rs = (HttpWebResponse)rt.GetResponse();
stream = rs.GetResponseStream();
sr = new StreamReader(stream, System.Text.Encoding.Default);
html = sr.ReadToEnd();
}
catch (Exception ee)
{
new Exception("发生异常:" + ee.Message);
}
finally
{
sr.Close();
stream.Close();
rs.Close();
}
return html;
}
public static string MakeHtmlDocument(string frmID, Int64 workid, string flowNo, string path, string indexFile, string nodeID)
{
try
{
GenerWorkFlow gwf = null;
if (flowNo != null)
gwf = new GenerWorkFlow(workid);
//#region 定义变量做准备.
//生成表单信息.
MapData mapData = new MapData(frmID);
if (mapData.HisFrmType == FrmType.Url)
{
string url = mapData.UrlExt;
//替换系统参数
url = url.Replace("@WebUser.No", WebUser.No);
url = url.Replace("@WebUser.Name;", WebUser.Name);
url = url.Replace("@WebUser.FK_DeptName;", WebUser.FK_DeptName);
url = url.Replace("@WebUser.FK_Dept;", WebUser.FK_Dept);
//替换参数
if (url.IndexOf("?") > 0)
{
//获取url中的参数
var urlParam = url.Substring(url.IndexOf('?'));
string[] paramss = url.Split('&');
foreach (string param in paramss)
{
if (DataType.IsNullOrEmpty(param) || param.IndexOf("@") == -1)
continue;
string[] paramArr = param.Split('=');
if (paramArr.Length == 2 && paramArr[1].IndexOf('@') == 0)
{
if (paramArr[1].IndexOf("@WebUser.") == 0)
continue;
url = url.Replace(paramArr[1], gwf.GetValStrByKey(paramArr[1].Substring(1)));
}
}
}
url = url.Replace("@basePath", BP.Difference.SystemConfig.HostURLOfBS);
if (url.Contains("http") == false)
url = BP.Difference.SystemConfig.HostURLOfBS + url;
string str = "";
string docs1 = DataType.ReadTextFile(BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/indexUrl.htm");
StringBuilder sb1 = new StringBuilder();
WebClient MyWebClient = new WebClient();
MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句
docs1 = docs1.Replace("@Width", mapData.FrmW.ToString() + "px");
if (gwf != null)
docs1 = docs1.Replace("@Title", gwf.Title);
DataType.WriteFile(indexFile, pageHtml);
return indexFile;
}
if (mapData.HisFrmType == FrmType.Develop)
{
GEEntity enn = new GEEntity(frmID, workid);
string ddocs = DataType.ReadTextFile(BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/indexDevelop.htm");
string htmlString = DBAccess.GetBigTextFromDB("Sys_MapData", "No", mapData.No, "HtmlTemplateFile");
htmlString = htmlString.Replace("../../DataUser", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser");
htmlString = htmlString.Replace("../DataUser", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser");
ddocs = ddocs.Replace("@Docs", htmlString);
ddocs = ddocs.Replace("@Title", mapData.Name);
DataType.WriteFile(indexFile, ddocs);
GenerHtmlOfDevelop(mapData, mapData.No, workid, enn, path, indexFile, flowNo, nodeID);
return indexFile;
}
if (mapData.HisFrmType == FrmType.ChapterFrm)
{
GEEntity enn = new GEEntity(frmID, workid);
string ddocs = DataType.ReadTextFile(BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/indexChapterFrm.htm");
string htmlString = DBAccess.GetBigTextFromDB("Sys_MapData", "No", mapData.No, "HtmlTemplateFile");
htmlString = htmlString.Replace("../../DataUser", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser");
htmlString = htmlString.Replace("../DataUser", BP.Difference.SystemConfig.HostURLOfBS + "/DataUser");
ddocs = ddocs.Replace("@Docs", htmlString);
ddocs = ddocs.Replace("@Title", mapData.Name);
DataType.WriteFile(indexFile, ddocs);
GenerHtmlOfDevelop(mapData, mapData.No, workid, enn, path, indexFile, flowNo, nodeID);
return indexFile;
}
//以下就是傻瓜表单.
GEEntity en = new GEEntity(frmID, workid);
#region 生成水文.
string rdt = "";
if (en.EnMap.Attrs.Contains("RDT"))
{
rdt = en.GetValStringByKey("RDT");
if (rdt.Length > 10)
rdt = rdt.Substring(0, 10);
}
//先判断节点中水印的设置
//判断是否打印水印
bool isPrintShuiYin = BP.Difference.SystemConfig.GetValByKeyBoolen("IsPrintBackgroundWord", false);
Node nd = null;
if (gwf != null)
nd = new Node(gwf.FK_Node);
if (isPrintShuiYin == true)
{
string words = "";
if (nd.NodeID != 0)
words = nd.ShuiYinModle;
if (DataType.IsNullOrEmpty(words) == true)
words = Glo.PrintBackgroundWord;
words = words.Replace("@RDT", rdt);
if (words.Contains("@") == true)
words = Glo.DealExp(words, en);
string templateFilePathMy = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/";
WaterImageManage wim = new WaterImageManage();
wim.DrawWords(templateFilePathMy + "ShuiYin.png", words, float.Parse("0.15"), ImagePosition.Center, path + "/ShuiYin.png");
}
#endregion
//生成 表单的 html.
StringBuilder sb = new System.Text.StringBuilder();
#region 替换模版文件..
//首先判断是否有约定的文件.
string docs = "";
string tempFile = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/" + mapData.No + ".htm";
if (System.IO.File.Exists(tempFile) == false)
{
if (gwf != null)
{
if (nd.HisFormType == NodeFormType.Develop)
mapData.HisFrmType = FrmType.Develop;
else if (nd.HisFormType == NodeFormType.FoolForm || nd.HisFormType == NodeFormType.FoolTruck)
mapData.HisFrmType = FrmType.FoolForm;
else if (nd.HisFormType == NodeFormType.SelfForm)
mapData.HisFrmType = FrmType.Url;
//如果是应用表单.
if (nd.HisFormType == NodeFormType.RefNodeFrm)
{
MapData myMapData = new MapData(nd.NodeFrmID);
mapData.HisFrmType = myMapData.HisFrmType;
}
}
if (mapData.HisFrmType == FrmType.FoolForm)
{
docs = DataType.ReadTextFile(BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/indexFool.htm");
sb = BP.WF.MakeForm2Html.GenerHtmlOfFool(mapData, frmID, workid, en, path, flowNo, nodeID, nd.HisFormType);
docs = docs.Replace("@Width", mapData.FrmW.ToString() + "px");
}
}
docs = docs.Replace("@Docs", sb.ToString());
String dateFormat = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
docs = docs.Replace("@PrintDT", dateFormat);
if (flowNo != null)
{
gwf = new GenerWorkFlow(workid);
gwf.WorkID = workid;
gwf.RetrieveFromDBSources();
docs = docs.Replace("@Title", gwf.Title);
if (gwf.WFState == WFState.Runing)
{
if (BP.Difference.SystemConfig.CustomerNo == "TianYe" && gwf.NodeName.Contains("反馈") == true)
{
nd = new Node(gwf.FK_Node);
if (nd.IsEndNode == true)
{
//让流程自动结束.
BP.WF.Dev2Interface.Flow_DoFlowOver(workid, "打印并自动结束", 0);
}
}
}
//替换模版尾部的打印说明信息.
String pathInfo = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/EndInfo/" + flowNo + ".txt";
if (System.IO.File.Exists(pathInfo) == false)
pathInfo = BP.Difference.SystemConfig.PathOfDataUser + "InstancePacketOfData/Template/EndInfo/Default.txt";
docs = docs.Replace("@EndInfo", DataType.ReadTextFile(pathInfo));
}
//indexFile = BP.Difference.SystemConfig.getPathOfDataUser() + "/InstancePacketOfData/" + frmID + "/" + workid + "/index.htm";
DataType.WriteFile(indexFile, docs);
return indexFile;
}
catch (Exception ex)
{
return "err@报表生成错误:" + ex.StackTrace;
}
}
public static void Html2Pdf(string pdfFileExe, string htmFile, string pdf)
{
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
try
{
startInfo.FileName = pdfFileExe;//设定需要执行的命令
startInfo.Arguments = " --disable-external-links " + htmFile + " " + pdf;//“/C”表示执行完命令后马上退出
startInfo.UseShellExecute = false;//不使用系统外壳程序启动
startInfo.RedirectStandardInput = false;//不重定向输入
startInfo.RedirectStandardOutput = true; //重定向输出
startInfo.CreateNoWindow = true;//不创建窗口
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process p = Process.Start(startInfo);
p.WaitForExit();
p.Close();
}
catch (Exception ex)
{
process.Dispose();
BP.DA.Log.DebugWriteError("@生成PDF错误:" + ex.Message + " --@pdf=" + pdf + "@htmFile=" + htmFile);
throw ex;
}
}
///
/// 签名
///
///
///
private static string SignPic(string userNo)
{
if (string.IsNullOrWhiteSpace(userNo))
{
return "";
}
//如果文件存在
String path = BP.Difference.SystemConfig.PathOfDataUser + "Siganture/" + userNo + ".jpg";
if (File.Exists(path) == false)
{
path = BP.Difference.SystemConfig.PathOfDataUser + "Siganture/" + userNo + ".jpg";
if (File.Exists(path) == true)
return "";
else
{
Emp emp = new Emp(userNo);
return emp.Name;
}
}
else
{
return "";
}
}
}
}
#endregion