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 }