using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Data;
using DSWeb.Areas.CommMng.Models;
using HcUtility.Comm;
using DSWeb.Areas.CommMng.DAL;
using DSWeb.MvcShipping.Helper;
using DSWeb.MvcShipping.Models.MsStevedores;
using System.Transactions;
using System.Data.SqlClient;
using DSWeb.DataAccess;
using DSWeb.MvcShipping.Models.MsOpCtnStatus;
using System.Linq;
using DSWeb.Areas.MvcShipping.Models.MsOpCtnFeeModelModel;
using DSWeb.Areas.MvcShipping.DAL.MsOpCtnFeeModelDAL;
using DSWeb.Areas.MvcShipping.Models.MsOpCtnFeeReport;
using DSWeb.MvcShipping.DAL.MsSysBillNoSet;
namespace DSWeb.Areas.MvcShipping.DAL.MsOpCtnFeeReportDAL
{
public class MsOpCtnFeeReportDAL
{
private static int _Direction;
///
///
///
///
/// 0:国内部分 1:国外部分
///
public static List GetFeeDataList(string condition, int dircetion)
{
_Direction = dircetion;
string whereSql = dircetion == 0 ? " jcyy in ('空箱出场','装船')" : " jcyy in ('卸船','出闸口','空箱还场') ";
if (condition != "" && condition != null)
{
whereSql = whereSql + " and " + condition;
}
List statusList = MsOpCtnStatusDAL.GetDataStatusList(whereSql);
string tempXianghao = "";
List list = new List();
for (int i = 0; i < statusList.Count; i++)
{
MsCtnStatus ms = statusList[i];
if (ms.box_no != tempXianghao)
{
tempXianghao = ms.box_no;
MsOpCtnFeeReport rpt = new MsOpCtnFeeReport();
rpt.MBLNO = ms.blno;
rpt.XiangHao = tempXianghao;
rpt.XiangXing = ms.cntrsize;
rpt.TEU = ms.TEU;
rpt.MuDiGang = _Direction == 0 ?
statusList.Find(s => s.jcyy == "装船").cz :
ms.cz;
var listX = statusList.FindAll(s => s.box_no == tempXianghao);
foreach (var item in listX)
{
if (item.jcyy == "卸船")
{
rpt.DaoGangRiQi = item.jctime;
}
else if (item.jcyy == "出闸口")
{
rpt.ChuZhaKouRiQi = item.cctime;
}
else if (item.jcyy == "空箱还场")
{
rpt.HuanXiangRiQi = item.jctime;
}
else if (item.jcyy == "空箱出场")
{
rpt.KongXiangChuChangRiQi = item.cctime;
}
else if (item.jcyy == "装船")
{
rpt.ZhuangChuanRiQi = item.jctime;
}
else
{
continue;
}
}
//用箱时间
if (_Direction == 1)
{
rpt.YongXiangShiJianGangNei = GetTimeDiff(rpt.DaoGangRiQi, rpt.ChuZhaKouRiQi);
if (rpt.ChuZhaKouRiQi == "")
{
if (rpt.HuanXiangRiQi != "")
{
rpt.YongXiangShiJianGangWai = GetTimeDiff(rpt.DaoGangRiQi, rpt.HuanXiangRiQi);
}
else
{
//无换箱日期,无出闸口日期,则统计至从卸船到当天的用箱天数
int timeDifftmp = GetTimeDiff(rpt.DaoGangRiQi,DateTime.Now.ToString("yyyy-MM-dd"));
rpt.YongXiangShiJianGangWai = timeDifftmp;
rpt.YongXiangShiJianGangNei = timeDifftmp;
}
}
else
{
rpt.YongXiangShiJianGangWai = GetTimeDiff(rpt.ChuZhaKouRiQi, rpt.HuanXiangRiQi);
}
}
else if (_Direction == 0)
{
rpt.YongXiangShiJianGangNei = 0;
if (rpt.ZhuangChuanRiQi=="")
{
//无装船日期的话,国内部分用箱时间统计到当天
rpt.YongXiangShiJianGangWai = GetTimeDiff(rpt.KongXiangChuChangRiQi,DateTime.Now.ToString("yyyy-MM-dd"));
}
else
{
rpt.YongXiangShiJianGangWai = GetTimeDiff(rpt.KongXiangChuChangRiQi, rpt.ZhuangChuanRiQi);
}
}
//免箱使
//获取箱使费模板
string code = GetDiDianCodeWithDiDian(rpt.MuDiGang);
string wheresqlNei = @" MainGID = (select GID from Op_Ctn_FEEMODEL where GangNeiGangWai = 0 and PortAndYardCode = '" + code + "') and XiangXing = '" + rpt.XiangXing + "'";
string wheresqlWai = @" MainGID = (select GID from Op_Ctn_FEEMODEL where GangNeiGangWai = 1 and PortAndYardCode = '" + code + "') and XiangXing = '" + rpt.XiangXing + "'";
List modelListNei = MsOpCtnFeeModelDAL.MsOpCtnFeeModelDAL.GetDataDetailsList(wheresqlNei);
List modelListWai = MsOpCtnFeeModelDAL.MsOpCtnFeeModelDAL.GetDataDetailsList(wheresqlWai);
int freedays1 = 0;
int freedays2 = 0;
freedays1 = GetFreeDaysWithBLNO(rpt.MBLNO, modelListNei, modelListWai, out freedays2);
rpt.MianXiangShiGangNei = freedays1;
rpt.MianXiangShiGangWai = freedays2;
//超期时间
rpt.ChaoQiShiJianGangNei = rpt.YongXiangShiJianGangNei - rpt.MianXiangShiGangNei;
rpt.ChaoQiShiJianGangWai = rpt.YongXiangShiJianGangWai - rpt.MianXiangShiGangWai;
rpt.ChaoQiShiJianGangNei = rpt.ChaoQiShiJianGangNei > 0 ? rpt.ChaoQiShiJianGangNei : 0;
rpt.ChaoQiShiJianGangWai = rpt.ChaoQiShiJianGangWai > 0 ? rpt.ChaoQiShiJianGangWai : 0;
//超期费用
float feeNei = GetFeeWithTimeDiffAndFeeModels(rpt.ChaoQiShiJianGangNei, modelListNei);
float feeWai = GetFeeWithTimeDiffAndFeeModels(rpt.ChaoQiShiJianGangWai, modelListWai);
rpt.ChaoQiFeiYongGangNei = feeNei;
rpt.ChaoQiFeiYongGangWai = feeWai;
rpt.HeJi = feeNei + feeWai;
list.Add(rpt);
}
else
{
continue;
}
}
return list;
}
//获取天数差
private static int GetTimeDiff(string d1str, string d2str)
{
if (d1str == "" || d2str == "")
{
return 0;
}
try
{
DateTime d1 = DateTime.Parse(d1str);
DateTime d2 = DateTime.Parse(d2str);
TimeSpan ts1 = new TimeSpan(d1.Ticks);
TimeSpan ts2 = new TimeSpan(d2.Ticks);
TimeSpan ts3 = ts1.Subtract(ts2).Duration();
return Convert.ToInt32(ts3.TotalDays);
}
catch (Exception)
{
return 0;
throw;
}
}
///
///
///
///
///
///
private static float GetFeeWithTimeDiffAndFeeModels(int timeDiff, List modelList)
{
//剩余的天数
int residueDays = timeDiff;
float fee = 0f;
foreach (var item in modelList)
{
if (item.JiFeiDengJi=="1")
{
continue;
}
if (residueDays <= 0)
{
break;
}
if (residueDays < Convert.ToInt32(item.JiFeiQuJian))
{
fee += float.Parse(item.JiFeiDanJia) * (Math.Abs(residueDays));
residueDays = residueDays - residueDays;
}
else
{
residueDays = residueDays - Convert.ToInt32(item.JiFeiQuJian);
fee += float.Parse(item.JiFeiDanJia) * Convert.ToInt32(item.JiFeiQuJian);
}
}
return fee;
}
//根据提单号获取shippingbox订舱时填写的免箱期
private static int GetFreeDaysWithBLNO(string BLNO, List modelNei, List modelWai, out int FreeDays2)
{
FreeDays2 = 0;
if (BLNO == "")
{
return 0;
}
try
{
Database db = DatabaseFactory.CreateDatabase("SHIPPINGBOX");
string sql = "select FREEDAYS1 from BookingCargoSpace where MBLNO = '" + BLNO + "'";
int freedays1 = Convert.ToInt32(db.ExecuteScalar(CommandType.Text, sql));
string sql2 = "select FREEDAYS2 from BookingCargoSpace where MBLNO = '" + BLNO + "'";
int freedays2 = Convert.ToInt32(db.ExecuteScalar(CommandType.Text, sql2));
//获取箱使费模板中的免箱期
int mFreeNei = 0;
int mFreeWai = 0;
if (modelNei.Count > 0)
{
mFreeNei = Convert.ToInt32(modelNei.Find(m => m.JiFeiDengJi == "1").JiFeiQuJian);
}
if (modelWai.Count > 0)
{
mFreeWai = Convert.ToInt32(modelWai.Find(m => m.JiFeiDengJi == "1").JiFeiQuJian);
}
freedays1 = mFreeNei > freedays1 ? mFreeNei : freedays1;
FreeDays2 = mFreeWai > freedays2 ? mFreeWai : freedays2;
return freedays1;
}
catch (Exception)
{
return 0;
}
}
private static string GetDiDianCodeWithDiDian(string d)
{
//场站
string sql1 = "select codename from info_client where shortname = '" + d + "' ";
Database db = DatabaseFactory.CreateDatabase();
var code = db.ExecuteScalar(CommandType.Text, sql1);
if (code == null || code.ToString() == "")
{
//港口
return d;
}
return code.ToString();
}
public static bool RuZhang(List feeReports,out string msg)
{
bool ruzhangRst = false;
//插入对账表
string GID = Guid.NewGuid().ToString();
string DuiZhangNo = GetDuiZhangNo();
string mblnos = "";
foreach (var rpt in feeReports)
{
insertOp_Ctn_FeeDuiZhuang(rpt, DuiZhangNo);
mblnos+="'"+rpt.MBLNO+"',";
}
//更新动态表
string timeStr = DateTime.Now.ToString("yyyy-MM-dd");
mblnos = mblnos.Length > 0 ? mblnos.Substring(0, mblnos.Length - 1) : "";
updateStatusForContainer_business(mblnos,timeStr);
#region 费用入库
//删除旧数据
Database db = DatabaseFactory.CreateDatabase();
string delSql = "delete from ch_fee where bsno = '" + DuiZhangNo + "'";
db.ExecuteNonQuery(CommandType.Text, delSql);
//计算费用
//去掉已经对账的金额
float yingshou = feeReports.Sum(r=>r.HeJi);
float yiduizhang = GetYiDuiZhangFee(mblnos);
yingshou = yingshou - yiduizhang;
string biBie = "RMB";
//插入新数据
if (yingshou > 0)
{
//应收
StringBuilder sb = new StringBuilder();
sb.Append(@"insert into ch_fee (GID,BSNO,FEETYPE,FEENAME,REMARK,CUSTOMERTYPE,CUSTOMERNAME");
sb.Append(@",UNIT,UNITPRICE,QUANTITY,AMOUNT,CURRENCY,EXCHANGERATE,FEESTATUS,NOTAXAMOUNT,TAXUNITPRICE,WMSOUTBSNO,ENTEROPERATOR)");
sb.Append(@"VALUES(");
sb.Append("'" + Guid.NewGuid() + "',");//GID
sb.Append("'" + DuiZhangNo + "',");//BSNO
sb.Append("1" + ",");//FEETYPE
sb.Append("'" + "修箱费" + "',");//FEENAME
sb.Append("'',");//REMARK
sb.Append("'',");//CUSTOMERTYPE
sb.Append("'ceshi',");//CUSTOMERNAME
sb.Append("'',");//UNIT
sb.Append(yingshou + ",");//UNITPRICE
sb.Append("1" + ",");//QUANTITY
sb.Append(yingshou + ",");//AMOUNT
sb.Append("'" + biBie + "',");//CURRENCY
sb.Append("1" + ",");//EXCHANGERATE
sb.Append("1" + ",");//FEESTATUS
sb.Append(yingshou + ",");//NOTAXAMOUNT
sb.Append(yingshou + ",");//TAXUNITPRICE
sb.Append("'" + DuiZhangNo + "',");//WMSOUTBSNO
sb.Append("''");//ENTEROPERATOR
sb.Append(")");
ruzhangRst = db.ExecuteNonQuery(CommandType.Text, sb.ToString())>0;
msg = "操作完成";
}
else
{
msg = "对账金额为负数!";
ruzhangRst = false;
}
return ruzhangRst;
#endregion
}
private static bool insertOp_Ctn_FeeDuiZhuang(MsOpCtnFeeReport rpt, string DuiZhangNo)
{
string GID = Guid.NewGuid().ToString();
string timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
StringBuilder sb = new StringBuilder();
sb.Append("insert into Op_Ctn_FeeDuiZhuang ");
sb.Append(" (GID,MBLNO,XiangHao,DuiZhangNo,DuiZhangStatus,DuiZhangTime,DuiZhangJinE) ");
sb.Append(" values( ");
sb.Append("'" + GID + "',");
sb.Append("'" + rpt.MBLNO + "',");
sb.Append("'" + rpt.XiangHao + "',");
sb.Append("'" + DuiZhangNo + "',");
sb.Append("'',");//对账时箱子的状态
sb.Append("'" + timeStr + "',");
sb.Append(rpt.HeJi.ToString() + "");
sb.Append(")");
int rst = 0;
try
{
Database db = DatabaseFactory.CreateDatabase();
rst = db.ExecuteNonQuery(CommandType.Text,sb.ToString());
}
catch (Exception)
{
rst = 0;
throw;
}
return rst > 0;
}
private static bool updateStatusForContainer_business(string mblnos,string duizhangriqi)
{
StringBuilder sb = new StringBuilder();
sb.Append("update container_business ");
sb.Append(" set duizhangriqi = '"+duizhangriqi+"',");
sb.Append(" where blno in ("+mblnos+")");
Database db = DatabaseFactory.CreateDatabase();
try
{
int rst = db.ExecuteNonQuery(CommandType.Text, sb.ToString());
return rst > 0;
}
catch (Exception)
{
return false;
throw;
}
}
private static string GetDuiZhangNo() {
string sql = "select max(DuiZhangNo) from Op_Ctn_FeeDuiZhuang ";
Database db = DatabaseFactory.CreateDatabase();
var rst = db.ExecuteScalar(CommandType.Text,sql);
int no=0;
if (rst==DBNull.Value||rst ==null)
{
string year = DateTime.Now.Year.ToString();
no = int.Parse(year + "000001");
}
else
{
no = int.Parse(rst.ToString())+1;
}
return no.ToString();
}
private static float GetYiDuiZhangFee(string mblno)
{
string sql = "select SUM(duizhangjine) from [Op_Ctn_FeeDuiZhuang] where mblno in ( "+mblno+") ";
Database db = DatabaseFactory.CreateDatabase();
var rst = db.ExecuteScalar(CommandType.Text, sql);
float fee = rst == DBNull.Value ? 0 : float.Parse(rst.ToString());
return fee;
}
}
}