using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using Curtain.DataAccess;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
///
/// 同步到恒洁中台
///
public class SyncZhongTai
{
#region 固定常量
// 固定常量
public static string _ft_gcdm = "1"; // 凤塘
public static string _ss_gcdm = "2"; // 三水
public static string _gt_gcdm = "7"; // 官塘
public static string _grant_type = "client_credentials";
public static DateTime _startDate = Convert.ToDateTime("2022-01-01");
// 数据库连接字符串
public static string _connStr_ss = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.18.32.116)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dkmes)));User Id=hgiboss;Password=dongke";
public static string _connStr_cz2 = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.22.61)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=hgcz2)));User Id=hgcz2;Password=dongke";
public static string _connStr_cz3 = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.22.61)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=hgcz3)));User Id=hgcz3;Password=dongke";
// 测试环境
//public static string _urlToken = "https://hapcloudq.hegii.com/api/auth/oauth/token";
//public static string _urlPush = "https://hapcloudq.hegii.com/api/product/prodBarcode/synUniqueCode";
//public static string _client_id_cz = "83263e79b909439bbd03caaada592b46";
//public static string _client_secret_cz = "867eeba1e3624645ab18333589780677";
//public static string _client_id_ss = "e86762528ada4cc3919346f107a7f7ec";
//public static string _client_secret_ss = "de3e8f5e762c4f948807498a513688c4";
// 正式环境
public static string _urlToken = "https://hapcloud.hegii.com/api/auth/oauth/token";
public static string _urlPush = "https://hapcloud.hegii.com/api/product/prodBarcode/synUniqueCode";
public static string _client_id_cz = "94cbe967808941b895c636541f28557a";
public static string _client_secret_cz = "1cd2011b447042e4b60e5411988b35f7";
public static string _client_id_ss = "90c8310d77ae453685e9b0c16b386fb5";
public static string _client_secret_ss = "5775f44f16b64124b9e854c1ae659444";
#endregion
#region 推送方法
///
/// 同步产成品交接数据到恒洁中台
///
/// 同步日期
/// 是否推送当天剩余所有数据
///
public static string SyncFinishedProduct(DateTime syncDate, bool isPushTodayAllData)
{
string msg = string.Empty;
msg += "ss:" + SyncFinishedProduct_ss(syncDate, isPushTodayAllData);
msg += ",cz2:" + SyncFinishedProduct_cz2(syncDate, isPushTodayAllData);
msg += ",cz3:" + SyncFinishedProduct_cz3(syncDate, isPushTodayAllData);
return msg;
}
///
/// 同步产成品交接数据到恒洁中台_三水
///
/// 同步日期
/// 是否推送当天剩余所有数据
///
public static string SyncFinishedProduct_ss(DateTime syncDate, bool isPushTodayAllData)
{
int returnRows = 0;
string sql = string.Empty;
string sqlUpdate = string.Empty;
// 本次推送的数据
DataTable dtSyncFinishProduct = null;
// 返回json
JObject returnObj;
// 推送结果
string message = string.Empty;
using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_ss))
{
try
{
#region 获取产成品交接数据
// 从gdd表上更新流水号和首次交接日期(预防有交接完又回产线的产品)
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT P
SET (P.FIRSTFHDATE, P.FIRSTFHNO) =
(SELECT GDD.FIRSTFHDATE,
GDD.FIRSTFHNO
FROM TP_PM_GROUTINGDAILYDETAIL GDD
WHERE GDD.FIRSTFHNO IS NOT NULL
AND GDD.BARCODE = P.BARCODE)
WHERE P.FIRSTFHNO IS NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 获取当日最大流水号
sql = @"
SELECT NVL(MAX(FIRSTFHNO), 0) AS MAXFIRSTFHNO
FROM TP_PM_FINISHEDPRODUCT FP
WHERE FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@ ";
object objMaxFirstFhNo = connSS.ExecuteScalar(sql,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
int maxFirstFhNo = 0;
int.TryParse(objMaxFirstFhNo + "", out maxFirstFhNo);
// 更新流水号和首次交接日期
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT P
SET P.FIRSTFHDATE = @DATEBEGIN@,
P.FIRSTFHNO =
(SELECT T2.FIRSTFHNO
FROM (SELECT T.BARCODE,
ROWNUM + @MAXFIRSTFHNO@ AS FIRSTFHNO
FROM (SELECT FP.BARCODE
FROM TP_PM_FINISHEDPRODUCT FP
WHERE FP.FIRSTFHNO IS NULL
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FHTIME,
FP.BARCODE) T) T2
WHERE T2.BARCODE = P.BARCODE)
WHERE P.FIRSTFHNO IS NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("MAXFIRSTFHNO", maxFirstFhNo, DataType.Int32),
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 将流水号和首次交接日期更新到gdd表上
sqlUpdate = @"
UPDATE TP_PM_GROUTINGDAILYDETAIL GDD
SET (GDD.FIRSTFHDATE, GDD.FIRSTFHNO) =
(SELECT P.FIRSTFHDATE,
P.FIRSTFHNO
FROM TP_PM_FINISHEDPRODUCT P
WHERE GDD.BARCODE = P.BARCODE
AND P.FIRSTFHNO IS NOT NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@)
WHERE GDD.FIRSTFHNO IS NULL
AND EXISTS (SELECT 1
FROM TP_PM_FINISHEDPRODUCT P
WHERE GDD.BARCODE = P.BARCODE
AND P.FIRSTFHNO IS NOT NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@) ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 是否推送当天剩余的所有数据
if (isPushTodayAllData)
{
sql = @"
SELECT GDD.OUTLABELCODE,
GDD.MATERIALCODE,
FP.FIRSTFHDATE,
FP.FIRSTFHNO,
FP.BARCODE, gdd.servicecode
FROM TP_PM_FINISHEDPRODUCT FP
INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
WHERE FP.FIRSTFHNO IS NOT NULL
AND FP.TOZHONGTAIFLAG = '0'
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FHTIME,
FP.BARCODE ";
}
else
{
// 获取本次推送的数据(每次推送数据不超过100条)
sql = @"
SELECT T.*,
ROWNUM
FROM (SELECT GDD.OUTLABELCODE,
GDD.MATERIALCODE,
FP.FIRSTFHDATE,
FP.FIRSTFHNO,
FP.BARCODE, gdd.servicecode
FROM TP_PM_FINISHEDPRODUCT FP
INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
WHERE FP.FIRSTFHNO IS NOT NULL
AND FP.TOZHONGTAIFLAG = '0'
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FIRSTFHNO) T
WHERE ROWNUM <= 100 ";
}
dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
if (dtSyncFinishProduct.Rows.Count == 0)
{
return "本时段没有要推送的数据";
}
#endregion
#region 获取token
sql = @"
SELECT TOKEN
FROM TP_SYS_ZHONGTAI_TOKEN
WHERE ENDTIME > SYSDATE + 1 / 24 ";
string access_token = connSS.ExecuteScalar(sql);
if (string.IsNullOrEmpty(access_token))
{
string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
string jsonStr = GetToken(_urlToken, paras);
returnObj = JsonConvert.DeserializeObject(jsonStr);
access_token = returnObj["access_token"].ToString();
DateTime nowDate;
DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
int expires_in;
int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
DateTime endTime = nowDate.AddMilliseconds(expires_in);
sqlUpdate = @"
UPDATE TP_SYS_ZHONGTAI_TOKEN
SET TOKEN = @TOKEN@,
ENDTIME = @ENDTIME@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOKEN", access_token, DataType.NVarChar),
new CDAParameter("ENDTIME", endTime, DataType.DateTime)
);
}
#endregion
#region 向接口推送数据
DateTime firstfhdate;
string differDays36 = string.Empty;
int firstFhNo = 0;
JObject jObject = null;
string firstFhNo36 = string.Empty;
JArray jArray = new JArray();
foreach (DataRow row in dtSyncFinishProduct.Rows)
{
string servicecode = row["servicecode"] + "";
if (string.IsNullOrWhiteSpace(servicecode))
{
// 当前日期与2022-01-01的时间间隔,转化为36进制数,0~9+A~Z,不满3位左边补0
DateTime.TryParse(row["FIRSTFHDATE"].ToString(), out firstfhdate);
differDays36 = Scale36.ToCurr36(firstfhdate.Subtract(_startDate).Days).PadLeft(3, '0');
// 流水(4位,36进制数流水,0~9+A~Z)
int.TryParse(row["FIRSTFHNO"] + "", out firstFhNo);
//firstFhNo36 = Scale36.ToCurr36(firstFhNo).PadLeft(4, '0');
firstFhNo36 = "Z" + Scale36.ToCurr36(firstFhNo).PadLeft(3, '0');
jObject = new JObject();
jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + row["OUTLABELCODE"]));
jObject.Add(new JProperty("serviceCode", _ss_gcdm + differDays36 + firstFhNo36));
jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
jArray.Add(jObject);
}
else
{
jObject = new JObject();
jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + servicecode));
jObject.Add(new JProperty("serviceCode", servicecode));
jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
jArray.Add(jObject);
}
}
string jsonPara = JsonConvert.SerializeObject(jArray);
Curtain.Log.Logger.Info("三水_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
string returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
Curtain.Log.Logger.Info("三水_中台同步结束:\n" + returnJsonStr);
// 如果token过期了,重新获取一遍,再推一次试试
if (returnJsonStr.Contains("未经授权"))
{
string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
string jsonStr = GetToken(_urlToken, paras);
returnObj = JsonConvert.DeserializeObject(jsonStr);
access_token = returnObj["access_token"].ToString();
DateTime nowDate;
DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
int expires_in;
int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
DateTime endTime = nowDate.AddMilliseconds(expires_in);
sqlUpdate = @"
UPDATE TP_SYS_ZHONGTAI_TOKEN
SET TOKEN = @TOKEN@,
ENDTIME = @ENDTIME@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOKEN", access_token, DataType.NVarChar),
new CDAParameter("ENDTIME", endTime, DataType.DateTime)
);
Curtain.Log.Logger.Info("三水_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
Curtain.Log.Logger.Info("三水_中台同步结束:\n" + returnJsonStr);
}
try
{
returnObj = JsonConvert.DeserializeObject(returnJsonStr);
if (returnObj.ContainsKey("data"))
{
message = returnObj["data"] + "";
}
if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("msg"))
{
message = returnObj["msg"] + "";
}
if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("message"))
{
message = returnObj["message"] + "";
}
}
catch (Exception ex)
{
if (string.IsNullOrEmpty(returnJsonStr))
{
message = ex.Message;
}
else
{
message = returnJsonStr;
}
}
#endregion
#region 结果处理
char tozhongtaiflag = message.Equals("条码保存成功") ? '1' : '0';
// 超时也当作成功
//if (tozhongtaiflag.Equals('0') && message.Contains("超时"))
//{
// tozhongtaiflag = '1';
//}
// 更新推送结果
string barcodes = "('" + string.Join("','", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field("BARCODE")).ToArray()) + "')";
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT
SET TOZHONGTAIFLAG = @TOZHONGTAIFLAG@,
ZHONGTAIMSG = @ZHONGTAIMSG@,
TOZHONGTAITIME = SYSDATE
WHERE BARCODE IN " + barcodes;
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOZHONGTAIFLAG", tozhongtaiflag, DataType.Char),
new CDAParameter("ZHONGTAIMSG", message, DataType.NVarChar)
);
#endregion
}
catch (Exception ex)
{
message = ex.Message;
}
}
return message;
}
///
/// 同步产成品交接数据到恒洁中台_潮州2厂
///
/// 同步日期
/// 是否推送当天剩余所有数据
///
public static string SyncFinishedProduct_cz2(DateTime syncDate, bool isPushTodayAllData)
{
int returnRows = 0;
string sql = string.Empty;
string sqlUpdate = string.Empty;
// 本次推送的数据
DataTable dtSyncFinishProduct = null;
// 返回json
JObject returnObj;
// 推送结果
string message = string.Empty;
using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_cz2))
{
try
{
#region 获取产成品交接数据
// 从gdd表上更新流水号和首次交接日期(预防有交接完又回产线的产品)
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT P
SET (P.FIRSTFHDATE, P.FIRSTFHNO) =
(SELECT GDD.FIRSTFHDATE,
GDD.FIRSTFHNO
FROM TP_PM_GROUTINGDAILYDETAIL GDD
WHERE GDD.FIRSTFHNO IS NOT NULL
AND GDD.BARCODE = P.BARCODE)
WHERE P.FIRSTFHNO IS NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 获取当日最大流水号
sql = @"
SELECT NVL(MAX(FIRSTFHNO), 0) AS MAXFIRSTFHNO
FROM TP_PM_FINISHEDPRODUCT FP
WHERE FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@ ";
object objMaxFirstFhNo = connSS.ExecuteScalar(sql,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
int maxFirstFhNo = 0;
int.TryParse(objMaxFirstFhNo + "", out maxFirstFhNo);
// 更新流水号和首次交接日期
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT P
SET P.FIRSTFHDATE = @DATEBEGIN@,
P.FIRSTFHNO =
(SELECT T2.FIRSTFHNO
FROM (SELECT T.BARCODE,
ROWNUM + @MAXFIRSTFHNO@ AS FIRSTFHNO
FROM (SELECT FP.BARCODE
FROM TP_PM_FINISHEDPRODUCT FP
WHERE FP.FIRSTFHNO IS NULL
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FHTIME,
FP.BARCODE) T) T2
WHERE T2.BARCODE = P.BARCODE)
WHERE P.FIRSTFHNO IS NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("MAXFIRSTFHNO", maxFirstFhNo, DataType.Int32),
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 将流水号和首次交接日期更新到gdd表上
sqlUpdate = @"
UPDATE TP_PM_GROUTINGDAILYDETAIL GDD
SET (GDD.FIRSTFHDATE, GDD.FIRSTFHNO) =
(SELECT P.FIRSTFHDATE,
P.FIRSTFHNO
FROM TP_PM_FINISHEDPRODUCT P
WHERE GDD.BARCODE = P.BARCODE
AND P.FIRSTFHNO IS NOT NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@)
WHERE GDD.FIRSTFHNO IS NULL
AND EXISTS (SELECT 1
FROM TP_PM_FINISHEDPRODUCT P
WHERE GDD.BARCODE = P.BARCODE
AND P.FIRSTFHNO IS NOT NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@) ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 是否推送当天剩余的所有数据
if (isPushTodayAllData)
{
sql = @"
SELECT GDD.OUTLABELCODE,
GDD.MATERIALCODE,
FP.FIRSTFHDATE,
FP.FIRSTFHNO,
FP.BARCODE, gdd.servicecode
FROM TP_PM_FINISHEDPRODUCT FP
INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
WHERE FP.FIRSTFHNO IS NOT NULL
AND FP.TOZHONGTAIFLAG = '0'
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FHTIME,
FP.BARCODE ";
}
else
{
// 获取本次推送的数据(每次推送数据不超过100条)
sql = @"
SELECT T.*,
ROWNUM
FROM (SELECT GDD.OUTLABELCODE,
GDD.MATERIALCODE,
FP.FIRSTFHDATE,
FP.FIRSTFHNO,
FP.BARCODE, gdd.servicecode
FROM TP_PM_FINISHEDPRODUCT FP
INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
WHERE FP.FIRSTFHNO IS NOT NULL
AND FP.TOZHONGTAIFLAG = '0'
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FIRSTFHNO) T
WHERE ROWNUM <= 100 ";
}
dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
if (dtSyncFinishProduct.Rows.Count == 0)
{
return "本时段没有要推送的数据";
}
#endregion
#region 获取token
sql = @"
SELECT TOKEN
FROM TP_SYS_ZHONGTAI_TOKEN
WHERE ENDTIME > SYSDATE + 1 / 24 ";
string access_token = connSS.ExecuteScalar(sql);
if (string.IsNullOrEmpty(access_token))
{
string[] paras = new string[] { _grant_type, _client_id_cz, _client_secret_cz };
string jsonStr = GetToken(_urlToken, paras);
returnObj = JsonConvert.DeserializeObject(jsonStr);
access_token = returnObj["access_token"].ToString();
DateTime nowDate;
DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
int expires_in;
int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
DateTime endTime = nowDate.AddMilliseconds(expires_in);
sqlUpdate = @"
UPDATE TP_SYS_ZHONGTAI_TOKEN
SET TOKEN = @TOKEN@,
ENDTIME = @ENDTIME@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOKEN", access_token, DataType.NVarChar),
new CDAParameter("ENDTIME", endTime, DataType.DateTime)
);
}
#endregion
#region 向接口推送数据
DateTime firstfhdate;
string differDays36 = string.Empty;
int firstFhNo = 0;
JObject jObject = null;
string firstFhNo36 = string.Empty;
JArray jArray = new JArray();
foreach (DataRow row in dtSyncFinishProduct.Rows)
{
string servicecode = row["servicecode"] + "";
if (string.IsNullOrWhiteSpace(servicecode))
{
// 当前日期与2022-01-01的时间间隔,转化为36进制数,0~9+A~Z,不满3位左边补0
DateTime.TryParse(row["FIRSTFHDATE"].ToString(), out firstfhdate);
differDays36 = Scale36.ToCurr36(firstfhdate.Subtract(_startDate).Days).PadLeft(3, '0');
// 流水(4位,36进制数流水,0~9+A~Z)
int.TryParse(row["FIRSTFHNO"] + "", out firstFhNo);
//firstFhNo36 = Scale36.ToCurr36(firstFhNo).PadLeft(4, '0');
firstFhNo36 = "Z" + Scale36.ToCurr36(firstFhNo).PadLeft(3, '0');
jObject = new JObject();
jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + row["OUTLABELCODE"]));
jObject.Add(new JProperty("serviceCode", _ft_gcdm + differDays36 + firstFhNo36));
jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
jArray.Add(jObject);
}
else
{
jObject = new JObject();
jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + servicecode));
jObject.Add(new JProperty("serviceCode", servicecode));
jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
jArray.Add(jObject);
}
}
string jsonPara = JsonConvert.SerializeObject(jArray);
Curtain.Log.Logger.Info("凤塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
string returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
Curtain.Log.Logger.Info("凤塘_中台同步结束:\n" + returnJsonStr);
// 如果token过期了,重新获取一遍,再推一次试试
if (returnJsonStr.Contains("未经授权"))
{
string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
string jsonStr = GetToken(_urlToken, paras);
returnObj = JsonConvert.DeserializeObject(jsonStr);
access_token = returnObj["access_token"].ToString();
DateTime nowDate;
DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
int expires_in;
int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
DateTime endTime = nowDate.AddMilliseconds(expires_in);
sqlUpdate = @"
UPDATE TP_SYS_ZHONGTAI_TOKEN
SET TOKEN = @TOKEN@,
ENDTIME = @ENDTIME@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOKEN", access_token, DataType.NVarChar),
new CDAParameter("ENDTIME", endTime, DataType.DateTime)
);
Curtain.Log.Logger.Info("凤塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
Curtain.Log.Logger.Info("凤塘_中台同步结束:\n" + returnJsonStr);
}
try
{
returnObj = JsonConvert.DeserializeObject(returnJsonStr);
if (returnObj.ContainsKey("data"))
{
message = returnObj["data"] + "";
}
if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("msg"))
{
message = returnObj["msg"] + "";
}
if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("message"))
{
message = returnObj["message"] + "";
}
}
catch (Exception ex)
{
if (string.IsNullOrEmpty(returnJsonStr))
{
message = ex.Message;
}
else
{
message = returnJsonStr;
}
}
#endregion
#region 结果处理
char tozhongtaiflag = message.Equals("条码保存成功") ? '1' : '0';
// 超时也当作成功
//if (tozhongtaiflag.Equals('0') && message.Contains("超时"))
//{
// tozhongtaiflag = '1';
//}
// 更新推送结果
string barcodes = "('" + string.Join("','", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field("BARCODE")).ToArray()) + "')";
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT
SET TOZHONGTAIFLAG = @TOZHONGTAIFLAG@,
ZHONGTAIMSG = @ZHONGTAIMSG@,
TOZHONGTAITIME = SYSDATE
WHERE BARCODE IN " + barcodes;
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOZHONGTAIFLAG", tozhongtaiflag, DataType.Char),
new CDAParameter("ZHONGTAIMSG", message, DataType.NVarChar)
);
#endregion
}
catch (Exception ex)
{
message = ex.Message;
}
}
return message;
}
///
/// 同步产成品交接数据到恒洁中台_官塘厂
///
/// 同步日期
/// 是否推送当天剩余所有数据
///
public static string SyncFinishedProduct_cz3(DateTime syncDate, bool isPushTodayAllData)
{
int returnRows = 0;
string sql = string.Empty;
string sqlUpdate = string.Empty;
// 本次推送的数据
DataTable dtSyncFinishProduct = null;
// 返回json
JObject returnObj;
// 推送结果
string message = string.Empty;
using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_cz3))
{
try
{
#region 获取产成品交接数据
// 从gdd表上更新流水号和首次交接日期(预防有交接完又回产线的产品)
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT P
SET (P.FIRSTFHDATE, P.FIRSTFHNO) =
(SELECT GDD.FIRSTFHDATE,
GDD.FIRSTFHNO
FROM TP_PM_GROUTINGDAILYDETAIL GDD
WHERE GDD.FIRSTFHNO IS NOT NULL
AND GDD.BARCODE = P.BARCODE)
WHERE P.FIRSTFHNO IS NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 获取当日最大流水号
sql = @"
SELECT NVL(MAX(FIRSTFHNO), 0) AS MAXFIRSTFHNO
FROM TP_PM_FINISHEDPRODUCT FP
WHERE FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@ ";
object objMaxFirstFhNo = connSS.ExecuteScalar(sql,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
int maxFirstFhNo = 0;
int.TryParse(objMaxFirstFhNo + "", out maxFirstFhNo);
// 更新流水号和首次交接日期
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT P
SET P.FIRSTFHDATE = @DATEBEGIN@,
P.FIRSTFHNO =
(SELECT T2.FIRSTFHNO
FROM (SELECT T.BARCODE,
ROWNUM + @MAXFIRSTFHNO@ AS FIRSTFHNO
FROM (SELECT FP.BARCODE
FROM TP_PM_FINISHEDPRODUCT FP
WHERE FP.FIRSTFHNO IS NULL
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FHTIME,
FP.BARCODE) T) T2
WHERE T2.BARCODE = P.BARCODE)
WHERE P.FIRSTFHNO IS NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("MAXFIRSTFHNO", maxFirstFhNo, DataType.Int32),
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 将流水号和首次交接日期更新到gdd表上
sqlUpdate = @"
UPDATE TP_PM_GROUTINGDAILYDETAIL GDD
SET (GDD.FIRSTFHDATE, GDD.FIRSTFHNO) =
(SELECT P.FIRSTFHDATE,
P.FIRSTFHNO
FROM TP_PM_FINISHEDPRODUCT P
WHERE GDD.BARCODE = P.BARCODE
AND P.FIRSTFHNO IS NOT NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@)
WHERE GDD.FIRSTFHNO IS NULL
AND EXISTS (SELECT 1
FROM TP_PM_FINISHEDPRODUCT P
WHERE GDD.BARCODE = P.BARCODE
AND P.FIRSTFHNO IS NOT NULL
AND P.FHTIME >= @DATEBEGIN@
AND P.FHTIME < @DATEEND@) ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
// 是否推送当天剩余的所有数据
if (isPushTodayAllData)
{
sql = @"
SELECT GDD.OUTLABELCODE,
GDD.MATERIALCODE,
FP.FIRSTFHDATE,
FP.FIRSTFHNO,
FP.BARCODE, gdd.servicecode
FROM TP_PM_FINISHEDPRODUCT FP
INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
WHERE FP.FIRSTFHNO IS NOT NULL
AND FP.TOZHONGTAIFLAG = '0'
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FHTIME,
FP.BARCODE ";
}
else
{
// 获取本次推送的数据(每次推送数据不超过100条)
sql = @"
SELECT T.*,
ROWNUM
FROM (SELECT GDD.OUTLABELCODE,
GDD.MATERIALCODE,
FP.FIRSTFHDATE,
FP.FIRSTFHNO,
FP.BARCODE, gdd.servicecode
FROM TP_PM_FINISHEDPRODUCT FP
INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
WHERE FP.FIRSTFHNO IS NOT NULL
AND FP.TOZHONGTAIFLAG = '0'
AND FP.FHTIME >= @DATEBEGIN@
AND FP.FHTIME < @DATEEND@
ORDER BY FP.FIRSTFHNO) T
WHERE ROWNUM <= 100 ";
}
dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
);
if (dtSyncFinishProduct.Rows.Count == 0)
{
return "本时段没有要推送的数据";
}
#endregion
#region 获取token
sql = @"
SELECT TOKEN
FROM TP_SYS_ZHONGTAI_TOKEN
WHERE ENDTIME > SYSDATE + 1 / 24 ";
string access_token = connSS.ExecuteScalar(sql);
if (string.IsNullOrEmpty(access_token))
{
string[] paras = new string[] { _grant_type, _client_id_cz, _client_secret_cz };
string jsonStr = GetToken(_urlToken, paras);
returnObj = JsonConvert.DeserializeObject(jsonStr);
access_token = returnObj["access_token"].ToString();
DateTime nowDate;
DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
int expires_in;
int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
DateTime endTime = nowDate.AddMilliseconds(expires_in);
sqlUpdate = @"
UPDATE TP_SYS_ZHONGTAI_TOKEN
SET TOKEN = @TOKEN@,
ENDTIME = @ENDTIME@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOKEN", access_token, DataType.NVarChar),
new CDAParameter("ENDTIME", endTime, DataType.DateTime)
);
}
#endregion
#region 向接口推送数据
DateTime firstfhdate;
string differDays36 = string.Empty;
int firstFhNo = 0;
JObject jObject = null;
string firstFhNo36 = string.Empty;
JArray jArray = new JArray();
foreach (DataRow row in dtSyncFinishProduct.Rows)
{
string servicecode = row["servicecode"] + "";
if (string.IsNullOrWhiteSpace(servicecode))
{
// 当前日期与2022-01-01的时间间隔,转化为36进制数,0~9+A~Z,不满3位左边补0
DateTime.TryParse(row["FIRSTFHDATE"].ToString(), out firstfhdate);
differDays36 = Scale36.ToCurr36(firstfhdate.Subtract(_startDate).Days).PadLeft(3, '0');
// 流水(4位,36进制数流水,0~9+A~Z)
int.TryParse(row["FIRSTFHNO"] + "", out firstFhNo);
//firstFhNo36 = Scale36.ToCurr36(firstFhNo).PadLeft(4, '0');
firstFhNo36 = "Z" + Scale36.ToCurr36(firstFhNo).PadLeft(3, '0');
jObject = new JObject();
jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + row["OUTLABELCODE"]));
jObject.Add(new JProperty("serviceCode", _gt_gcdm + differDays36 + firstFhNo36));
jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
jArray.Add(jObject);
}
else
{
jObject = new JObject();
jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + servicecode));
jObject.Add(new JProperty("serviceCode", servicecode));
jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
jArray.Add(jObject);
}
}
string jsonPara = JsonConvert.SerializeObject(jArray);
Curtain.Log.Logger.Info("官塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
string returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
Curtain.Log.Logger.Info("官塘_中台同步结束:\n" + returnJsonStr);
// 如果token过期了,重新获取一遍,再推一次试试
if (returnJsonStr.Contains("未经授权"))
{
string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
string jsonStr = GetToken(_urlToken, paras);
returnObj = JsonConvert.DeserializeObject(jsonStr);
access_token = returnObj["access_token"].ToString();
DateTime nowDate;
DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
int expires_in;
int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
DateTime endTime = nowDate.AddMilliseconds(expires_in);
sqlUpdate = @"
UPDATE TP_SYS_ZHONGTAI_TOKEN
SET TOKEN = @TOKEN@,
ENDTIME = @ENDTIME@ ";
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOKEN", access_token, DataType.NVarChar),
new CDAParameter("ENDTIME", endTime, DataType.DateTime)
);
Curtain.Log.Logger.Info("官塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
Curtain.Log.Logger.Info("官塘_中台同步结束:\n" + returnJsonStr);
}
try
{
returnObj = JsonConvert.DeserializeObject(returnJsonStr);
if (returnObj.ContainsKey("data"))
{
message = returnObj["data"] + "";
}
if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("msg"))
{
message = returnObj["msg"] + "";
}
if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("message"))
{
message = returnObj["message"] + "";
}
}
catch (Exception ex)
{
if (string.IsNullOrEmpty(returnJsonStr))
{
message = ex.Message;
}
else
{
message = returnJsonStr;
}
}
#endregion
#region 结果处理
char tozhongtaiflag = message.Equals("条码保存成功") ? '1' : '0';
// 超时也当作成功
//if (tozhongtaiflag.Equals('0') && message.Contains("超时"))
//{
// tozhongtaiflag = '1';
//}
// 更新推送结果
string barcodes = "('" + string.Join("','", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field("BARCODE")).ToArray()) + "')";
sqlUpdate = @"
UPDATE TP_PM_FINISHEDPRODUCT
SET TOZHONGTAIFLAG = @TOZHONGTAIFLAG@,
ZHONGTAIMSG = @ZHONGTAIMSG@,
TOZHONGTAITIME = SYSDATE
WHERE BARCODE IN " + barcodes;
returnRows += connSS.ExecuteNonQuery(sqlUpdate,
new CDAParameter("TOZHONGTAIFLAG", tozhongtaiflag, DataType.Char),
new CDAParameter("ZHONGTAIMSG", message, DataType.NVarChar)
);
#endregion
}
catch (Exception ex)
{
message = ex.Message;
}
}
return message;
}
///
/// 获取token
///
///
///
///
private static string GetToken(string url, string[] paras)
{
try
{
string EndResult = "";
string SendMessageAddress = url;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(SendMessageAddress);
request.Method = "POST";
request.AllowAutoRedirect = true;
request.ContentType = "application/x-www-form-urlencoded";
//string PostData = "grant_type=client_credentials&client_id=e86762528ada4cc3919346f107a7f7ec&client_secret=de3e8f5e762c4f948807498a513688c4";
string PostData = string.Format("grant_type={0}&client_id={1}&client_secret={2}", paras[0], paras[1], paras[2]);
byte[] byteArray = Encoding.Default.GetBytes(PostData);
request.ContentLength = byteArray.Length;
using (Stream newStream = request.GetRequestStream())
{
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream rspStream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(rspStream, Encoding.UTF8))
{
EndResult = reader.ReadToEnd();
rspStream.Close();
}
response.Close();
return EndResult;
}
catch (Exception ex)
{
return ex.Message;
}
}
///
/// 推送数据
///
///
///
///
///
private static string PostToZhongTai(string url, string data, string token)
{
try
{
//将单引号转义成双引号
data = data.Replace("'", "\"");
//创建Web访问对象
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
// 接口慢,设置30分钟超时等待
myRequest.Timeout = 1800000;
//把用户传过来的数据转成“UTF-8”的字节流
byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
myRequest.Method = "POST";
myRequest.ContentLength = buf.Length;
myRequest.ContentType = "application/json;charset=UTF-8";
//myRequest.MaximumAutomaticRedirections = 1;
myRequest.AllowAutoRedirect = true;
//string base64Header = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
myRequest.Headers.Add("Authorization", "Bearer " + token);
//发送请求
Stream stream = myRequest.GetRequestStream();
stream.Write(buf, 0, buf.Length);
stream.Close();
//获取接口返回值
//通过Web访问对象获取响应内容
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
//通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
//string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
reader.Close();
myResponse.Close();
return returnXml;
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion
}