You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

395 lines
16 KiB

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Web;
using CK.SCP.Controller;
using CK.SCP.Models.ScpEntity;
using CK.SCP.Utils;
namespace SCP.Common
{
public enum PrintType
{
BARCODE_CUSTOM=110,
BARCODE = 101,
ASN = 102,
ARRIVE = 103,
CUSTOM_PAGE = 104,
ASN_PALLET =107,
PALLET=105,
SmallBARCODE = 106,
}
public class TextProvider
{
public static string BuildByRequest(HttpRequest p_request)
{
string text = string.Empty;
if (p_request.Form["dataname"]!=null && !string.IsNullOrEmpty(p_request.Form["dataname"]))
{
text = p_request.Form["dataname"];
}
else
{
string name = p_request.QueryString["data"];
text = JSONReportData.FromDataSet(GetData(name, p_request));
}
return text;
}
private static DataSet GetData(string p_name, HttpRequest p_request)
{
DataSet ds = new DataSet();
switch (int.Parse(p_name))
{
case (int)PrintType.ASN:
ds = GET_ASN(p_request);
break;
case (int)PrintType.BARCODE:
ds = GET_TS_BAR(p_request);
break;
case (int)PrintType.BARCODE_CUSTOM:
ds = GET_TS_BAR_CUSTOM(p_request);
break;
case (int)PrintType.ARRIVE:
ds = GET_ARRIVE(p_request);
break;
case (int)PrintType.CUSTOM_PAGE:
ds =GET_CUSTOM_PAGE(p_request);
break;
case (int)PrintType.ASN_PALLET:
ds = GET_ASN_PALLET(p_request);
break;
case (int)PrintType.PALLET:
ds = GET_TB_PALLETS(p_request);
break;
case (int)PrintType.SmallBARCODE:
ds = GET_TS_BAR_Small(p_request);
break;
}
return ds;
}
/// <summary>
/// 获取发货单(带托盘明细的发货单)
/// </summary>
/// <param name="p_request"></param>
/// <returns></returns>
private static DataSet GET_ASN_PALLET(HttpRequest p_request)
{
DataSet ds = new DataSet();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
var AskBillNum = p_request["AsnBillNum"].ToString();
ds = SCP_ASN_CONTROLLER.ASN_PALLET_REPORT(AskBillNum);
}
return ds;
}
private static DataSet GET_ASN(HttpRequest p_request)
{
DataSet ds = new DataSet();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
var AskBillNum = p_request["AsnBillNum"].ToString();
ds=SCP_ASN_CONTROLLER.ASN_REPORT(AskBillNum);
}
return ds;
}
/// <summary>
/// 获取托盘
/// </summary>
/// <param name="p_request"></param>
/// <returns></returns>
private static DataSet GET_TB_PALLETS(HttpRequest p_request)
{
DataSet ds = new DataSet();
TB_PALLETS _pallet = new TB_PALLETS();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
_pallet.AsnBillNum = p_request["AsnBillNum"].ToString();
}
if (!string.IsNullOrEmpty(_pallet.AsnBillNum))
{
SCP_PALLET_CONTROLLER.Get_TB_PALLETS_List(_pallet, (ret) =>
{
if (ret.State == ReturnStatus.Succeed)
{
var _ls = ret.Result.DistinctBy(t=>t.PalletNum);
var dt = ConvertHelper.ToDataTable(_ls.ToList());
ds.Tables.Add(dt);
}
});
}
return ds;
}
private static DataSet GET_TS_BAR(HttpRequest p_request)
{
DataSet ds = new DataSet();
TS_BARCODE _bar = new TS_BARCODE();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
_bar.BillNum = p_request["AsnBillNum"].ToString();
}
if (!string.IsNullOrEmpty(p_request["Barcode"]))
{
var _ls = p_request["Barcode"].ToString().Split('_').ToList();
_bar.UIDList = new List<long>();
_ls.ForEach(p =>
{
if (!string.IsNullOrEmpty(p))
{
_bar.UIDList.Add(long.Parse(p));
}
});
}
if (!string.IsNullOrEmpty(_bar.BillNum) || _bar.UIDList != null)
{
SCP_TS_BARCODE_CONTROLLER.Get_TS_BARCODE_List(_bar, (ret) =>
{
if (ret.State == ReturnStatus.Succeed)
{
var _ls = ret.Result.ToList();
var _list=_ls.OrderBy(p => p.PartCode).ThenBy(p => p.BarCode).ToList();
var dt = ConvertHelper.ToDataTable(_list);
ds.Tables.Add(dt);
}
});
}
return ds;
}
private static DataSet GET_TS_BAR_Small(HttpRequest p_request)
{
DataSet ds = new DataSet();
TS_BARCODE_SMALL _bar = new TS_BARCODE_SMALL();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
_bar.BillNum = p_request["AsnBillNum"].ToString();
}
if (!string.IsNullOrEmpty(p_request["Barcode"]))
{
var _ls = p_request["Barcode"].ToString().Split('_').ToList();
_bar.UIDList = new List<long>();
_ls.ForEach(p =>
{
if (!string.IsNullOrEmpty(p))
{
_bar.UIDList.Add(long.Parse(p));
}
});
}
if (!string.IsNullOrEmpty(_bar.BillNum) || _bar.UIDList != null)
{
SCP_TS_BARCODE_CONTROLLER.Get_TS_BARCODE_Small_List(_bar, (ret) =>
{
if (ret.State == ReturnStatus.Succeed)
{
var dt = ConvertHelper.ToDataTable(ret.Result.ToList());
ds.Tables.Add(dt);
}
});
}
return ds;
}
private static DataSet GET_TS_BAR_CUSTOM(HttpRequest p_request)
{
DataSet ds = new DataSet();
TS_BARCODE_CUSTOM _bar = new TS_BARCODE_CUSTOM();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
_bar.BillNum = p_request["AsnBillNum"].ToString();
}
if (!string.IsNullOrEmpty(p_request["Barcode"]))
{
var _ls = p_request["Barcode"].ToString().Split('_').ToList();
_bar.UIDList = new List<long>();
_ls.ForEach(p =>
{
if (!string.IsNullOrEmpty(p))
{
_bar.UIDList.Add(long.Parse(p));
}
});
}
if (!string.IsNullOrEmpty(_bar.BillNum) || _bar.UIDList != null)
{
SCP_TS_BARCODE_CONTROLLER.Get_TS_BARCODE_CUSTOM_List(_bar, (ret) =>
{
if (ret.State == ReturnStatus.Succeed)
{
var _ls = ret.Result.ToList();
var _list = _ls.OrderBy(p => p.PartCode).ThenBy(p => p.BarCode).ToList();
var dt = ConvertHelper.ToDataTable(_list);
ds.Tables.Add(dt);
}
});
}
return ds;
}
private static DataSet GET_ARRIVE(HttpRequest p_request)
{
DataSet ds = new DataSet();
if (!string.IsNullOrEmpty(p_request["AsnBillNum"]))
{
var AskBillNum = p_request["AsnBillNum"].ToString();
ds = SCP_ASN_CONTROLLER.ARRIVE_REPORT(AskBillNum);
}
return ds;
}
private static DataSet GET_CUSTOM_PAGE(HttpRequest p_request)
{
DataSet ds = new DataSet();
V_TB_ASN _asn = new V_TB_ASN();
_asn.AsnBillNum= p_request.Params["AsnBillNum"];
var dt=SCP_ASN_CONTROLLER.Get_CUSTOM_PAGE_List(_asn);
ds.Tables.Add(dt);
// string _str= ConvertHelper.SerializeObject(_asn);
return ds;
}
//class JSONReportData 产生报表需要的 JSON 格式数据
public class JSONReportData
{
//根据 DataSet 产生提供给报表需要的JSON文本数据
public static string FromDataSet(DataSet ds)
{
JsonQueryStringConverter jqsc = new JsonQueryStringConverter();
StringBuilder sbJSONText = new StringBuilder("{\n");
foreach (DataTable dt in ds.Tables)
{
//"recordset":[
sbJSONText.Append('"');
sbJSONText.Append(dt.TableName);
sbJSONText.Append("\":[\n");
foreach (DataRow dr in dt.Rows)
{
sbJSONText.Append('{');
for (int i = 0; i < dt.Columns.Count; ++i)
{
if (!dr.IsNull(i))
{
//用 ConvertValueToString 转换,这样数字类型才不会加引号
//如果日期类型也用ConvertValueToString转换,则为 "\/Date(-152438400000+0800)\/" 这样的形式
string Value;
if (dt.Columns[i].DataType.IsArray)
{
Value = "\"" + Convert.ToBase64String((byte[])dr[i]) + "\"";
}
else if (dt.Columns[i].DataType == typeof(System.DateTime))
{
Value = "\"" + dr[i].ToString() + "\"";
}
else
{
Value = jqsc.ConvertValueToString(dr[i], dt.Columns[i].DataType);
}
sbJSONText.AppendFormat("\"{0}\":{1},", dt.Columns[i].ColumnName, Value);
}
}
sbJSONText.Remove(sbJSONText.Length - 1, 1); //去掉每笔记录最后一个字段后面的","
sbJSONText.Append("},\n");
}
if (dt.Rows.Count > 0) //如果无明细记录,则不要回退
sbJSONText.Remove(sbJSONText.Length - 2, 1); //去掉最后一条记录后面的","
sbJSONText.Append("],\n");
}
sbJSONText.Remove(sbJSONText.Length - 2, 1); //去掉最后一记录集后面的","
sbJSONText.Append("}");
return sbJSONText.ToString();
}
//根据 DataTable 产生提供给报表需要的JSON文本数据
public static string FromDataTable(DataTable dt)
{
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return FromDataSet(ds);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//以下枚举指定报表数据的格式类型
public enum ResponseDataType
{
PlainText, //报表数据为XML或JSON文本,在调试时可以查看报表数据。数据未经压缩,大数据量报表采用此种方式不合适
ZipBinary, //报表数据为XML或JSON文本经过压缩得到的二进制数据。此种方式数据量最小(约为原始数据的1/10),但用Ajax方式加载报表数据时不能为此种方式
ZipBase64, //报表数据为将 ZipBinary 方式得到的数据再进行 BASE64 编码的数据。此种方式适合用Ajax方式加载报表数据
};
public class GridReportDataResponse
{
//指定报表的默认数据类型,便于统一定义整个报表系统的数据类型
//在报表开发调试阶段,通常指定为 ResponseDataType.PlainText, 以便在浏览器中查看响应的源文件时能看到可读的文本数据
//在项目部署时,通常指定为 ResponseDataType.ZipBinary 或 ResponseDataType.ZipBase64,这样可以极大减少数据量,提供报表响应速度
public const ResponseDataType DefaultDataType = ResponseDataType.PlainText; //PlainText ZipBinary ZipBase64
//将报表XML数据文本输出到HTTP请求
public static void Response(HttpResponse Response, string DataText, ResponseDataType DataType)
{
//报表XML数据的前后不能附加任何其它数据,否则XML数据将不能成功解析,所以调用ClearContent方法清理网页中前面多余的数据
Response.ClearContent();
if (ResponseDataType.PlainText == DataType)
{
// 把 xml 或 json 文本响应给客户端
//Response.ContentType = "text/xml";
Response.ContentType = "text/plain";
Response.Write(DataText);
}
else
{
//将string数据转换为byte[],以便进行压缩
System.Text.UTF8Encoding converter = new System.Text.UTF8Encoding();
byte[] XmlBytes = converter.GetBytes(DataText);
//在 HTTP 头信息中写入报表数据压缩信息
Response.AppendHeader("gr_zip_type", "deflate"); //指定压缩方法
Response.AppendHeader("gr_zip_size", XmlBytes.Length.ToString()); //指定数据的原始长度
Response.AppendHeader("gr_zip_encode", converter.HeaderName); //指定数据的编码方式 utf-8 utf-16 ...
// 把压缩后的xml数据发送给客户端
if (ResponseDataType.ZipBinary == DataType)
{
DeflateStream compressedzipStream = new DeflateStream(Response.OutputStream, CompressionMode.Compress, true);
compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
compressedzipStream.Close();
}
else //ResponseDataType.ZipBase64
{
MemoryStream memStream = new MemoryStream();
DeflateStream compressedzipStream = new DeflateStream(memStream, CompressionMode.Compress, true);
compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
compressedzipStream.Close(); //这句很重要,这样数据才能全部写入 MemoryStream
// Read bytes from the stream.
memStream.Seek(0, SeekOrigin.Begin); // Set the position to the beginning of the stream.
int count = (int)memStream.Length;
byte[] byteArray = new byte[count];
count = memStream.Read(byteArray, 0, count);
string Base64Text = Convert.ToBase64String(byteArray);
Response.ContentType = "text/plain";
Response.Write(Base64Text);
}
}
//报表XML数据的前后不能附加任何其它数据,否则XML数据将不能成功解析,所以调用End方法放弃网页中后面不必要的数据
Response.End();
}
}
}
}