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
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();
|
|
}
|
|
}
|
|
}
|
|
}
|