using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using GThinking.N_MODEL.Page; using System.Collections.Generic; using GThinking.N_MISPRO.Data; using GThinking.N_MISPRO.Utility; using GThinking.N_MISPROAS; using GThinking.N_CONTROL; namespace GThinking.N_XLXSBJ { public partial class BJYFDRInfo : SingleCardBase { BJYFDR entity = new BJYFDR(); protected void Page_Load(object sender, EventArgs e) { this.UMID = 100860071; this.UMName = "线缆销售报价单运费"; base.CurMaster = Master; this.CurEntity = entity; this.PageHeight = 180; this.PageWidth = 420; this.Master.EnableAttachBtn = false; this.Master.EnableCancelBtn = false; this.Master.EnableCopyBtn = false; this.Master.EnableDeleteBtn = false; this.Master.EnableEditBtn = false; this.Master.EnableInsertBtn = false; this.Master.EnablePrintBtn = false; this.Master.EnableRefreshBtn = false; this.Master.EnableSaveBtn = false; Server.ScriptTimeout = 3600; fupdPost.FileSaveType = gtAsyncFileUpload.DFileSaveType.SaveToPath; if (AppRuntime.BitType == AppBitType.Bit32) fupdPost.Filter = "XLS"; else // AppBitType.Bit64 fupdPost.Filter = "XLS,XLSX"; base.InitPage(); Server.ScriptTimeout = 3600; btnUn.Style["display"] = "none"; } #region 控件事件 protected void btnQX_Click(object sender, EventArgs e) { CloseWindowNoQuery(); } protected void btnUnDis_Click(object sender, EventArgs e) { TDatabase dberp = TContextDatabases.GetDatabase("DBERP"); TSQL sSQL = new TSQL(dberp); try { lblTitle.Text = "正在导入数据,请稍后..."; dberp.BeginTrans(); DataSet aDataExcel = new DataSet(); if (AppRuntime.BitType == AppBitType.Bit32) { aDataExcel = XLBJDUtils.ReadFromExcelFile(fupdPost.FilePath, 0, ""); } else // AppBitType.Bit64 { ReadWJ(fupdPost.FilePath, ref aDataExcel); } ExcelColumnValid(aDataExcel); ProcessAndImportData(aDataExcel, dberp, sSQL); dberp.CommitTrans(); ShowMessage("导入成功!"); DialogOperationScript dos = new DialogOperationScript(this); //dos.ClickOwnerButton(PageParam.GetRTrimString("btnRefreshCID")); dos.CloseSelf(); dos.Execute(); } catch (Exception ex) { lblTitle.Text = ""; dberp.RollbackTrans(); ShowMessage(ex.Message); } finally { System.IO.File.Delete(fupdPost.FilePath.Trim()); } CloseWindowNoQuery(); } #endregion #region 自定义函数 private void ProcessAndImportData(DataSet dataSet, TDatabase database, TSQL sql) { DataTable dataTable = dataSet.Tables[0]; // 清空现有数据 ClearExistingData(database, sql); // 解析重量区间列 List weightColumns = ParseWeightIntervalColumns(dataTable); // 插入重量区间数据 Dictionary intervalIdMap = InsertWeightIntervalData(database, sql, weightColumns); // 插入地区运费数据 InsertRegionFreightData(dataTable, database, sql, intervalIdMap, weightColumns); } private void ClearExistingData(TDatabase database, TSQL sql) { sql.Clear(); if (PageParam.ContainsKey("YFJSFS") && PageParam.GetRTrimString("YFJSFS") == "6") sql.Add(" DELETE FROM XLXSBJYFJZQJ where XLXSBJYFJZQJ_YFJSGS='6' "); else sql.Add(" DELETE FROM XLXSBJYFJZQJ where XLXSBJYFJZQJ_YFJSGS='运价*运重' "); database.ExecSQL(sql); } private string GetXZQHID(string sPro,string sCity) { TDatabase dberp = TContextDatabases.GetDatabase("DBERP"); TSQL sSQL = new TSQL(dberp); sSQL.Clear(); sSQL.Add(" select XZQH_XZQHID from XZQH where XZQH_PROVINCE like :pPRO and XZQH_CITY=:pCity "); sSQL.ParamByName("pPRO").Value = sPro + "%"; sSQL.ParamByName("pCity").Value = sCity; DataSet ds=dberp.OpenDataSet(sSQL); if (ds.Tables[0].Rows.Count > 0) { return ds.Tables[0].Rows[0][0].ToString().Trim(); } return ""; } private List ParseWeightIntervalColumns(DataTable dataTable) { List weightColumns = new List(); // 从第5列开始解析重量区间列(索引4) for (int i = 2; i < dataTable.Columns.Count; i++) { string columnName = dataTable.Columns[i].ColumnName.Trim(); WeightIntervalColumn column = ParseWeightInterval(columnName); column.ColumnIndex = i; weightColumns.Add(column); } if (weightColumns.Count == 0) { throw new Exception("Excel文件中未找到重量区间列"); } return weightColumns; } private WeightIntervalColumn ParseWeightInterval(string columnName) { WeightIntervalColumn column = new WeightIntervalColumn(); column.ColumnName = columnName; try { if (PageParam.ContainsKey("YFJSFS") && PageParam.GetRTrimString("YFJSFS") == "6") { string separator = columnName.Contains("-") ? "-" : (columnName.Contains("~") ? "~" : "至"); string cleanName = columnName.Replace("铜价", "").Replace("铝价", ""); string[] parts = cleanName.Split(new string[] { separator }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length >= 2) { double minValue, maxValue; if (double.TryParse(parts[0], out minValue) && double.TryParse(parts[1], out maxValue)) { column.MinValue = minValue; column.MaxValue = maxValue; return column; } } } // 尝试解析各种重量区间格式 else if (columnName.Contains("以下") || columnName.Contains("以内")) { // 处理 "X吨以下" 格式 string valueStr = columnName.Replace("吨以下", "").Replace("吨以内", "").Replace("零担报价",""); double maxValue; if (double.TryParse(valueStr, out maxValue)) { column.MinValue = 0; column.MaxValue = maxValue; return column; } } else if (columnName.Contains("以上")) { // 处理 "X吨以上" 格式 string valueStr = columnName.Replace("吨以上", ""); double minValue; if (double.TryParse(valueStr, out minValue)) { column.MinValue = minValue; column.MaxValue = 9999; return column; } } else if (columnName.Contains("-") || columnName.Contains("~") || columnName.Contains("至")) { // 处理 "X-Y吨" 格式 string separator = columnName.Contains("-") ? "-" : (columnName.Contains("~") ? "~" : "至"); string cleanName = columnName.Substring(0, columnName.IndexOf("吨")).Replace("吨", "").Replace("零担报价", ""); string[] parts = cleanName.Split(new string[] { separator }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length >= 2) { double minValue, maxValue; if (double.TryParse(parts[0], out minValue) && double.TryParse(parts[1], out maxValue)) { column.MinValue = minValue; column.MaxValue = maxValue; return column; } } } } catch { // 解析失败时使用默认值 } // 如果无法解析,使用默认范围 column.MinValue = 0; column.MaxValue = 9999; column.IsUnparsed = true; return column; } private Dictionary InsertWeightIntervalData(TDatabase database, TSQL sql, List weightColumns) { Dictionary intervalIdMap = new Dictionary(); int intervalId = 1; foreach (WeightIntervalColumn column in weightColumns) { sql.Clear(); sql.Add(@"INSERT INTO XLXSBJYFJZQJ (XLXSBJYFJZQJ_YFJZQH, XLXSBJYFJZQJ_YFJZQJMC, XLXSBJYFJZQJ_YFJZXX, XLXSBJYFJZQJ_YFJZSX, XLXSBJYFJZQJ_YFJSGS,XLXSBJYFJZQJ_WHR,XLXSBJYFJZQJ_WHRID,XLXSBJYFJZQJ_WHSJ) VALUES (:XLXSBJYFJZQJ_YFJZQH, :XLXSBJYFJZQJ_YFJZQJMC, :XLXSBJYFJZQJ_YFJZXX, :XLXSBJYFJZQJ_YFJZSX, :XLXSBJYFJZQJ_YFJSGS,:XLXSBJYFJZQJ_WHR,:XLXSBJYFJZQJ_WHRID,:XLXSBJYFJZQJ_WHSJ) "); sql.ParamByName("XLXSBJYFJZQJ_YFJZQH").Value = intervalId; sql.ParamByName("XLXSBJYFJZQJ_YFJZQJMC").Value = column.ColumnName; sql.ParamByName("XLXSBJYFJZQJ_YFJZXX").Value = column.MinValue; sql.ParamByName("XLXSBJYFJZQJ_YFJZSX").Value = column.MaxValue; sql.ParamByName("XLXSBJYFJZQJ_YFJSGS").Value = "运价*运重"; if (PageParam.ContainsKey("YFJSFS") && PageParam.GetRTrimString("YFJSFS")=="6") sql.ParamByName("XLXSBJYFJZQJ_YFJSGS").Value = "6"; sql.ParamByName("XLXSBJYFJZQJ_WHR").Value = tSession.UserName; sql.ParamByName("XLXSBJYFJZQJ_WHRID").Value = tSession.UserId; sql.ParamByName("XLXSBJYFJZQJ_WHSJ").Value = DateTime.Now; database.ExecSQL(sql); intervalIdMap[column.ColumnName] = intervalId; intervalId++; } return intervalIdMap; } private void InsertRegionFreightData(DataTable dataTable, TDatabase database, TSQL sql, Dictionary intervalIdMap, List weightColumns) { // 从第2行开始读取数据(跳过表头) for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++) { DataRow row = dataTable.Rows[rowIndex]; // 获取基本数据 string province = row[0].ToString().Trim(); string city = row[1].ToString().Trim(); string sXZQHID = GetXZQHID(province, city); sql.Clear(); sql.Add(" delete from XLXSBJDQYFZB where XLXSBJDQYFZB_XZQHID=:pID "); sql.ParamByName("pID").Value = sXZQHID; database.ExecSQL(sql); sql.Clear(); sql.Add(" delete from XLXSBJDQYFB where XLXSBJDQYFB_XZQHID=:pID "); sql.ParamByName("pID").Value = sXZQHID; database.ExecSQL(sql); sql.Clear(); sql.Add(@"INSERT INTO XLXSBJDQYFZB (XLXSBJDQYFZB_XZQHID, XLXSBJDQYFZB_YFJSFS, XLXSBJDQYFZB_WHR, XLXSBJDQYFZB_WHRID, XLXSBJDQYFZB_WHSJ,XLXSBJDQYFZB_GCID) VALUES (:XLXSBJDQYFZB_XZQHID, :XLXSBJDQYFZB_YFJSFS, :XLXSBJDQYFZB_WHR, :XLXSBJDQYFZB_WHRID, :XLXSBJDQYFZB_WHSJ,' ') "); sql.ParamByName("XLXSBJDQYFZB_XZQHID").Value = sXZQHID; sql.ParamByName("XLXSBJDQYFZB_YFJSFS").Value = "1"; if (PageParam.ContainsKey("YFJSFS") && PageParam.GetRTrimString("YFJSFS") == "6") sql.ParamByName("XLXSBJDQYFZB_YFJSFS").Value = "6"; sql.ParamByName("XLXSBJDQYFZB_WHR").Value = tSession.UserName; sql.ParamByName("XLXSBJDQYFZB_WHRID").Value = tSession.UserId; sql.ParamByName("XLXSBJDQYFZB_WHSJ").Value = DateTime.Now; database.ExecSQL(sql); // 为每个重量区间插入记录 foreach (WeightIntervalColumn weightColumn in weightColumns) { if (weightColumn.ColumnIndex < row.Table.Columns.Count && row[weightColumn.ColumnIndex] != DBNull.Value && !string.IsNullOrEmpty(row[weightColumn.ColumnIndex].ToString())) { double YFDJ = 0; if (double.TryParse(row[weightColumn.ColumnIndex].ToString().Replace("%",""), out YFDJ)) { int JZQH = intervalIdMap[weightColumn.ColumnName]; if (PageParam.ContainsKey("YFJSFS") && PageParam.GetRTrimString("YFJSFS") == "6") { sql.Clear(); sql.Add(@"INSERT INTO XLXSBJDQYFB (XLXSBJDQYFB_XZQHID, XLXSBJDQYFB_YFJZQH, XLXSBJDQYFB_YSFL, XLXSBJDQYFB_WHR, XLXSBJDQYFB_WHRID, XLXSBJDQYFB_WHSJ,XLXSBJDQYFB_GCID) VALUES (:XLXSBJDQYFB_XZQHID, :XLXSBJDQYFB_YFJZQH, :XLXSBJDQYFB_YSFL, :XLXSBJDQYFB_WHR, :XLXSBJDQYFB_WHRID, :XLXSBJDQYFB_WHSJ,' ') "); sql.ParamByName("XLXSBJDQYFB_XZQHID").Value = sXZQHID; sql.ParamByName("XLXSBJDQYFB_YFJZQH").Value = JZQH; sql.ParamByName("XLXSBJDQYFB_YSFL").Value = YFDJ; sql.ParamByName("XLXSBJDQYFB_WHR").Value = tSession.UserName; sql.ParamByName("XLXSBJDQYFB_WHRID").Value = tSession.UserId; sql.ParamByName("XLXSBJDQYFB_WHSJ").Value = DateTime.Now; } else { sql.Clear(); sql.Add(@"INSERT INTO XLXSBJDQYFB (XLXSBJDQYFB_XZQHID, XLXSBJDQYFB_YFJZQH, XLXSBJDQYFB_YFDJ, XLXSBJDQYFB_WHR, XLXSBJDQYFB_WHRID, XLXSBJDQYFB_WHSJ,XLXSBJDQYFB_GCID) VALUES (:XLXSBJDQYFB_XZQHID, :XLXSBJDQYFB_YFJZQH, :XLXSBJDQYFB_YFDJ, :XLXSBJDQYFB_WHR, :XLXSBJDQYFB_WHRID, :XLXSBJDQYFB_WHSJ,' ') "); sql.ParamByName("XLXSBJDQYFB_XZQHID").Value = sXZQHID; sql.ParamByName("XLXSBJDQYFB_YFJZQH").Value = JZQH; sql.ParamByName("XLXSBJDQYFB_YFDJ").Value = YFDJ; sql.ParamByName("XLXSBJDQYFB_WHR").Value = tSession.UserName; sql.ParamByName("XLXSBJDQYFB_WHRID").Value = tSession.UserId; sql.ParamByName("XLXSBJDQYFB_WHSJ").Value = DateTime.Now; } database.ExecSQL(sql); } } } } } private void ExcelColumnValid(DataSet dataSet) { DataTable dataTable = dataSet.Tables[0]; if (PageParam.ContainsKey("YFJSFS") && PageParam.GetRTrimString("YFJSFS") == "6") { if (dataTable.Rows.Count < 1) { throw new Exception("Excel文件行数不足,至少需要1行表头"); } } else { if (dataTable.Rows.Count < 2) { throw new Exception("Excel文件行数不足,至少需要2行表头"); } DataRow headerRow1 = dataTable.Rows[0]; DataRow headerRow2 = dataTable.Rows[1]; // 处理重量区间列(从索引2开始) for (int i = 2; i < dataTable.Columns.Count; i++) { string header1 = headerRow1[i].ToString().Trim(); string header2 = headerRow2[i].ToString().Trim(); // 合并两行表头内容 string combinedHeader = header1.Trim(); if (!string.IsNullOrEmpty(header2)) { combinedHeader += header2.Trim(); } // 更新列名 dataTable.Columns[i].ColumnName = combinedHeader; } // 移除表头行,保留数据行 dataTable.Rows.RemoveAt(0); dataTable.Rows.RemoveAt(0); } } private void ReadWJ(string sPath, ref DataSet aDataExcel) { string sMessage = ""; aDataExcel = TExcelData.ReadExcel(sPath.Trim(), "", "", false, ref sMessage); if (!sMessage.Trim().Equals("")) { throw new Exception("文件读取失败!"); } } #endregion } #region 辅助类 public class WeightIntervalColumn { private string columnName=string.Empty; private int columnIndex=0; private double minValue=0; private double maxValue=0; private bool isUnparsed=false; public string ColumnName { get { return columnName; } set { columnName = value; } } public int ColumnIndex { get { return columnIndex; } set { columnIndex = value; } } public double MinValue { get { return minValue; } set { minValue = value; } } public double MaxValue { get { return maxValue; } set { maxValue = value; } } public bool IsUnparsed { get { return isUnparsed; } set { isUnparsed = value; } } } #endregion }