|
|
@@ -0,0 +1,1073 @@
|
|
|
+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;
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// 同步到恒洁中台
|
|
|
+/// </summary>
|
|
|
+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 推送方法
|
|
|
+ /// <summary>
|
|
|
+ /// 同步产成品交接数据到恒洁中台
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="syncDate">同步日期</param>
|
|
|
+ /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 同步产成品交接数据到恒洁中台_三水
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="syncDate">同步日期</param>
|
|
|
+ /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ 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<string>(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<JObject>(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)
|
|
|
+ {
|
|
|
+ // 当前日期与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');
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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<JObject>(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<JObject>(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<string>("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;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 同步产成品交接数据到恒洁中台_潮州2厂
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="syncDate">同步日期</param>
|
|
|
+ /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ 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<string>(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<JObject>(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)
|
|
|
+ {
|
|
|
+ // 当前日期与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');
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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<JObject>(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<JObject>(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<string>("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;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 同步产成品交接数据到恒洁中台_官塘厂
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="syncDate">同步日期</param>
|
|
|
+ /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ 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<string>(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<JObject>(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)
|
|
|
+ {
|
|
|
+ // 当前日期与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');
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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<JObject>(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<JObject>(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<string>("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;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取token
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="url"></param>
|
|
|
+ /// <param name="paras"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 推送数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="url"></param>
|
|
|
+ /// <param name="data"></param>
|
|
|
+ /// <param name="token"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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
|
|
|
+}
|