/*
2019.7.25,计算扣除非工作日天数
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CpmBigDataImportService;
namespace GT
{
/// <summary>
/// 非工作日天数计算(单例模式)
/// </summary>
public sealed class TsCalc
{
private TsCalc(string connStr) {
string sql = "SELECT rq FROM dbo.GZRL WHERE SFGZR='否' ORDER BY RQ";
DataTable dtRq = MyCommon.GetDt(sql, connStr);
if (dtRq.Rows.Count>0)
{
fgzrs = dtRq.AsEnumerable().Select(d => d.Field<DateTime>("rq")).ToArray();
}
}
private static volatile TsCalc _tsCalc = null;
private static object TsCalc_Lock = new object();
public static TsCalc CreateInstance(string connStr) {
if (null == _tsCalc)
{
lock (TsCalc_Lock)
{
if (null == _tsCalc)
{
_tsCalc = new TsCalc(connStr);
}
}
}
return _tsCalc;
}
/// <summary>
/// 非工作日数组
/// </summary>
private DateTime[] fgzrs;
/// <summary>
/// 计算
/// </summary>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <param name="msg"></param>
/// <returns></returns>
public int Calc(DateTime startDate,DateTime endDate,out string msg) {
int fgzrts = 0;
List<string> msList = new List<string>();
int ts = 0;
while (endDate>=startDate)
{
ts++;
if (fgzrs!= null && fgzrs.Contains(startDate))
{
fgzrts++;
msList.Add(startDate.ToString("MM-dd"));
}
startDate = startDate.AddDays(1);
}
string msg1 = string.Join(",",msList.ToArray());
if (null == msg1 || msg1.Length == 0)
msg = null;
else if (msg1.Length > 50)
msg = msg1.Substring(0, 47) + "...";
else
msg = msg1;
return ts-fgzrts;
}
}
}
/// <summary>
/// 更新天数,没有完成日期默认为当天
/// </summary>
public void Calc()
{
TsCalc tsCalc = TsCalc.CreateInstance(this.ConnectionString);
string sql = "truncate table CYCLBBTEMP";
MyCommon.ExecuteSql(sql, ConnectionString);
BigData bd = new BigData(new BdConfigBase(ConfigPath, "CYCLBBTEMP"));
bd.InitDataTable();
DataTable dt = bd.DtData;
foreach (DataRow drSource in dtSource.Rows)
{
string oid = drSource["oid"].ToString();
DateTime startDate = Convert.ToDateTime(drSource["ycsj"]);
DateTime endDate = (DBNull.Value == drSource["wcsj"]) ? DateTime.Today : Convert.ToDateTime(drSource["wcsj"]);
string ms = null;
int ts = tsCalc.Calc(startDate, endDate, out ms);
DataRow drNew = dt.NewRow();
object[] arrItem = new object[] { oid, ts, ms };
drNew.ItemArray = arrItem;
dt.Rows.Add(drNew);
}
SqlConnectConfig sqc = new SqlConnectConfig();
sqc.ConnectString = this.ConnectionString;
sqc.TableName = "CYCLBBTEMP";
new BigDataToSqlServer(sqc, dt, true);
sql = "UPDATE dbo.CYCLBB SET ts=b.TS,FGZRMS=b.FGZRMS FROM dbo.CYCLBB a JOIN dbo.CYCLBBTEMP b ON a.OBJECT_ID=b.OBJECT_ID WHERE 1 = 1 ";
MyCommon.ExecuteSql(sql, this.ConnectionString);
}