SyncZhongTai.cs 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118
  1. using System;
  2. using System.Data;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using Curtain.DataAccess;
  8. using Newtonsoft.Json;
  9. using Newtonsoft.Json.Linq;
  10. /// <summary>
  11. /// 同步到恒洁中台
  12. /// </summary>
  13. public class SyncZhongTai
  14. {
  15. #region 固定常量
  16. // 固定常量
  17. public static string _ft_gcdm = "1"; // 凤塘
  18. public static string _ss_gcdm = "2"; // 三水
  19. public static string _gt_gcdm = "7"; // 官塘
  20. public static string _grant_type = "client_credentials";
  21. public static DateTime _startDate = Convert.ToDateTime("2022-01-01");
  22. // 数据库连接字符串
  23. 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";
  24. 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";
  25. 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";
  26. // 测试环境
  27. //public static string _urlToken = "https://hapcloudq.hegii.com/api/auth/oauth/token";
  28. //public static string _urlPush = "https://hapcloudq.hegii.com/api/product/prodBarcode/synUniqueCode";
  29. //public static string _client_id_cz = "83263e79b909439bbd03caaada592b46";
  30. //public static string _client_secret_cz = "867eeba1e3624645ab18333589780677";
  31. //public static string _client_id_ss = "e86762528ada4cc3919346f107a7f7ec";
  32. //public static string _client_secret_ss = "de3e8f5e762c4f948807498a513688c4";
  33. // 正式环境
  34. public static string _urlToken = "https://hapcloud.hegii.com/api/auth/oauth/token";
  35. public static string _urlPush = "https://hapcloud.hegii.com/api/product/prodBarcode/synUniqueCode";
  36. public static string _client_id_cz = "94cbe967808941b895c636541f28557a";
  37. public static string _client_secret_cz = "1cd2011b447042e4b60e5411988b35f7";
  38. public static string _client_id_ss = "90c8310d77ae453685e9b0c16b386fb5";
  39. public static string _client_secret_ss = "5775f44f16b64124b9e854c1ae659444";
  40. #endregion
  41. #region 推送方法
  42. /// <summary>
  43. /// 同步产成品交接数据到恒洁中台
  44. /// </summary>
  45. /// <param name="syncDate">同步日期</param>
  46. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  47. /// <returns></returns>
  48. public static string SyncFinishedProduct(DateTime syncDate, bool isPushTodayAllData)
  49. {
  50. string msg = string.Empty;
  51. msg += "ss:" + SyncFinishedProduct_ss(syncDate, isPushTodayAllData);
  52. msg += ",cz2:" + SyncFinishedProduct_cz2(syncDate, isPushTodayAllData);
  53. msg += ",cz3:" + SyncFinishedProduct_cz3(syncDate, isPushTodayAllData);
  54. return msg;
  55. }
  56. /// <summary>
  57. /// 同步产成品交接数据到恒洁中台_三水
  58. /// </summary>
  59. /// <param name="syncDate">同步日期</param>
  60. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  61. /// <returns></returns>
  62. public static string SyncFinishedProduct_ss(DateTime syncDate, bool isPushTodayAllData)
  63. {
  64. int returnRows = 0;
  65. string sql = string.Empty;
  66. string sqlUpdate = string.Empty;
  67. // 本次推送的数据
  68. DataTable dtSyncFinishProduct = null;
  69. // 返回json
  70. JObject returnObj;
  71. // 推送结果
  72. string message = string.Empty;
  73. using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_ss))
  74. {
  75. try
  76. {
  77. #region 获取产成品交接数据
  78. // 从gdd表上更新流水号和首次交接日期(预防有交接完又回产线的产品)
  79. sqlUpdate = @"
  80. UPDATE TP_PM_FINISHEDPRODUCT P
  81. SET (P.FIRSTFHDATE, P.FIRSTFHNO) =
  82. (SELECT GDD.FIRSTFHDATE,
  83. GDD.FIRSTFHNO
  84. FROM TP_PM_GROUTINGDAILYDETAIL GDD
  85. WHERE GDD.FIRSTFHNO IS NOT NULL
  86. AND GDD.BARCODE = P.BARCODE)
  87. WHERE P.FIRSTFHNO IS NULL
  88. AND P.FHTIME >= @DATEBEGIN@
  89. AND P.FHTIME < @DATEEND@ ";
  90. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  91. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  92. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  93. );
  94. // 获取当日最大流水号
  95. sql = @"
  96. SELECT NVL(MAX(FIRSTFHNO), 0) AS MAXFIRSTFHNO
  97. FROM TP_PM_FINISHEDPRODUCT FP
  98. WHERE FP.FHTIME >= @DATEBEGIN@
  99. AND FP.FHTIME < @DATEEND@ ";
  100. object objMaxFirstFhNo = connSS.ExecuteScalar(sql,
  101. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  102. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  103. );
  104. int maxFirstFhNo = 0;
  105. int.TryParse(objMaxFirstFhNo + "", out maxFirstFhNo);
  106. // 更新流水号和首次交接日期
  107. sqlUpdate = @"
  108. UPDATE TP_PM_FINISHEDPRODUCT P
  109. SET P.FIRSTFHDATE = @DATEBEGIN@,
  110. P.FIRSTFHNO =
  111. (SELECT T2.FIRSTFHNO
  112. FROM (SELECT T.BARCODE,
  113. ROWNUM + @MAXFIRSTFHNO@ AS FIRSTFHNO
  114. FROM (SELECT FP.BARCODE
  115. FROM TP_PM_FINISHEDPRODUCT FP
  116. WHERE FP.FIRSTFHNO IS NULL
  117. AND FP.FHTIME >= @DATEBEGIN@
  118. AND FP.FHTIME < @DATEEND@
  119. ORDER BY FP.FHTIME,
  120. FP.BARCODE) T) T2
  121. WHERE T2.BARCODE = P.BARCODE)
  122. WHERE P.FIRSTFHNO IS NULL
  123. AND P.FHTIME >= @DATEBEGIN@
  124. AND P.FHTIME < @DATEEND@ ";
  125. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  126. new CDAParameter("MAXFIRSTFHNO", maxFirstFhNo, DataType.Int32),
  127. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  128. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  129. );
  130. // 将流水号和首次交接日期更新到gdd表上
  131. sqlUpdate = @"
  132. UPDATE TP_PM_GROUTINGDAILYDETAIL GDD
  133. SET (GDD.FIRSTFHDATE, GDD.FIRSTFHNO) =
  134. (SELECT P.FIRSTFHDATE,
  135. P.FIRSTFHNO
  136. FROM TP_PM_FINISHEDPRODUCT P
  137. WHERE GDD.BARCODE = P.BARCODE
  138. AND P.FIRSTFHNO IS NOT NULL
  139. AND P.FHTIME >= @DATEBEGIN@
  140. AND P.FHTIME < @DATEEND@)
  141. WHERE GDD.FIRSTFHNO IS NULL
  142. AND EXISTS (SELECT 1
  143. FROM TP_PM_FINISHEDPRODUCT P
  144. WHERE GDD.BARCODE = P.BARCODE
  145. AND P.FIRSTFHNO IS NOT NULL
  146. AND P.FHTIME >= @DATEBEGIN@
  147. AND P.FHTIME < @DATEEND@) ";
  148. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  149. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  150. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  151. );
  152. // 是否推送当天剩余的所有数据
  153. if (isPushTodayAllData)
  154. {
  155. sql = @"
  156. SELECT GDD.OUTLABELCODE,
  157. GDD.MATERIALCODE,
  158. FP.FIRSTFHDATE,
  159. FP.FIRSTFHNO,
  160. FP.BARCODE, gdd.servicecode
  161. FROM TP_PM_FINISHEDPRODUCT FP
  162. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  163. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  164. WHERE FP.FIRSTFHNO IS NOT NULL
  165. AND FP.TOZHONGTAIFLAG = '0'
  166. AND FP.FHTIME >= @DATEBEGIN@
  167. AND FP.FHTIME < @DATEEND@
  168. ORDER BY FP.FHTIME,
  169. FP.BARCODE ";
  170. }
  171. else
  172. {
  173. // 获取本次推送的数据(每次推送数据不超过100条)
  174. sql = @"
  175. SELECT T.*,
  176. ROWNUM
  177. FROM (SELECT GDD.OUTLABELCODE,
  178. GDD.MATERIALCODE,
  179. FP.FIRSTFHDATE,
  180. FP.FIRSTFHNO,
  181. FP.BARCODE, gdd.servicecode
  182. FROM TP_PM_FINISHEDPRODUCT FP
  183. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  184. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  185. WHERE FP.FIRSTFHNO IS NOT NULL
  186. AND FP.TOZHONGTAIFLAG = '0'
  187. AND FP.FHTIME >= @DATEBEGIN@
  188. AND FP.FHTIME < @DATEEND@
  189. ORDER BY FP.FIRSTFHNO) T
  190. WHERE ROWNUM <= 100 ";
  191. }
  192. dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
  193. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  194. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  195. );
  196. if (dtSyncFinishProduct.Rows.Count == 0)
  197. {
  198. return "本时段没有要推送的数据";
  199. }
  200. #endregion
  201. #region 获取token
  202. sql = @"
  203. SELECT TOKEN
  204. FROM TP_SYS_ZHONGTAI_TOKEN
  205. WHERE ENDTIME > SYSDATE + 1 / 24 ";
  206. string access_token = connSS.ExecuteScalar<string>(sql);
  207. if (string.IsNullOrEmpty(access_token))
  208. {
  209. string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
  210. string jsonStr = GetToken(_urlToken, paras);
  211. returnObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
  212. access_token = returnObj["access_token"].ToString();
  213. DateTime nowDate;
  214. DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
  215. int expires_in;
  216. int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
  217. DateTime endTime = nowDate.AddMilliseconds(expires_in);
  218. sqlUpdate = @"
  219. UPDATE TP_SYS_ZHONGTAI_TOKEN
  220. SET TOKEN = @TOKEN@,
  221. ENDTIME = @ENDTIME@ ";
  222. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  223. new CDAParameter("TOKEN", access_token, DataType.NVarChar),
  224. new CDAParameter("ENDTIME", endTime, DataType.DateTime)
  225. );
  226. }
  227. #endregion
  228. #region 向接口推送数据
  229. DateTime firstfhdate;
  230. string differDays36 = string.Empty;
  231. int firstFhNo = 0;
  232. JObject jObject = null;
  233. string firstFhNo36 = string.Empty;
  234. JArray jArray = new JArray();
  235. foreach (DataRow row in dtSyncFinishProduct.Rows)
  236. {
  237. string servicecode = row["servicecode"] + "";
  238. if (string.IsNullOrWhiteSpace(servicecode))
  239. {
  240. // 当前日期与2022-01-01的时间间隔,转化为36进制数,0~9+A~Z,不满3位左边补0
  241. DateTime.TryParse(row["FIRSTFHDATE"].ToString(), out firstfhdate);
  242. differDays36 = Scale36.ToCurr36(firstfhdate.Subtract(_startDate).Days).PadLeft(3, '0');
  243. // 流水(4位,36进制数流水,0~9+A~Z)
  244. int.TryParse(row["FIRSTFHNO"] + "", out firstFhNo);
  245. //firstFhNo36 = Scale36.ToCurr36(firstFhNo).PadLeft(4, '0');
  246. firstFhNo36 = "Z" + Scale36.ToCurr36(firstFhNo).PadLeft(3, '0');
  247. jObject = new JObject();
  248. jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
  249. jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
  250. jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + row["OUTLABELCODE"]));
  251. jObject.Add(new JProperty("serviceCode", _ss_gcdm + differDays36 + firstFhNo36));
  252. jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
  253. jArray.Add(jObject);
  254. }
  255. else
  256. {
  257. jObject = new JObject();
  258. jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
  259. jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
  260. jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + servicecode));
  261. jObject.Add(new JProperty("serviceCode", servicecode));
  262. jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
  263. jArray.Add(jObject);
  264. }
  265. }
  266. string jsonPara = JsonConvert.SerializeObject(jArray);
  267. Curtain.Log.Logger.Info("三水_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  268. string returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
  269. Curtain.Log.Logger.Info("三水_中台同步结束:\n" + returnJsonStr);
  270. // 如果token过期了,重新获取一遍,再推一次试试
  271. if (returnJsonStr.Contains("未经授权"))
  272. {
  273. string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
  274. string jsonStr = GetToken(_urlToken, paras);
  275. returnObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
  276. access_token = returnObj["access_token"].ToString();
  277. DateTime nowDate;
  278. DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
  279. int expires_in;
  280. int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
  281. DateTime endTime = nowDate.AddMilliseconds(expires_in);
  282. sqlUpdate = @"
  283. UPDATE TP_SYS_ZHONGTAI_TOKEN
  284. SET TOKEN = @TOKEN@,
  285. ENDTIME = @ENDTIME@ ";
  286. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  287. new CDAParameter("TOKEN", access_token, DataType.NVarChar),
  288. new CDAParameter("ENDTIME", endTime, DataType.DateTime)
  289. );
  290. Curtain.Log.Logger.Info("三水_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  291. returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
  292. Curtain.Log.Logger.Info("三水_中台同步结束:\n" + returnJsonStr);
  293. }
  294. try
  295. {
  296. returnObj = JsonConvert.DeserializeObject<JObject>(returnJsonStr);
  297. if (returnObj.ContainsKey("data"))
  298. {
  299. message = returnObj["data"] + "";
  300. }
  301. if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("msg"))
  302. {
  303. message = returnObj["msg"] + "";
  304. }
  305. if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("message"))
  306. {
  307. message = returnObj["message"] + "";
  308. }
  309. }
  310. catch (Exception ex)
  311. {
  312. if (string.IsNullOrEmpty(returnJsonStr))
  313. {
  314. message = ex.Message;
  315. }
  316. else
  317. {
  318. message = returnJsonStr;
  319. }
  320. }
  321. #endregion
  322. #region 结果处理
  323. char tozhongtaiflag = message.Equals("条码保存成功") ? '1' : '0';
  324. // 超时也当作成功
  325. //if (tozhongtaiflag.Equals('0') && message.Contains("超时"))
  326. //{
  327. // tozhongtaiflag = '1';
  328. //}
  329. // 更新推送结果
  330. string barcodes = "('" + string.Join("','", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field<string>("BARCODE")).ToArray()) + "')";
  331. sqlUpdate = @"
  332. UPDATE TP_PM_FINISHEDPRODUCT
  333. SET TOZHONGTAIFLAG = @TOZHONGTAIFLAG@,
  334. ZHONGTAIMSG = @ZHONGTAIMSG@,
  335. TOZHONGTAITIME = SYSDATE
  336. WHERE BARCODE IN " + barcodes;
  337. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  338. new CDAParameter("TOZHONGTAIFLAG", tozhongtaiflag, DataType.Char),
  339. new CDAParameter("ZHONGTAIMSG", message, DataType.NVarChar)
  340. );
  341. #endregion
  342. }
  343. catch (Exception ex)
  344. {
  345. message = ex.Message;
  346. }
  347. }
  348. return message;
  349. }
  350. /// <summary>
  351. /// 同步产成品交接数据到恒洁中台_潮州2厂
  352. /// </summary>
  353. /// <param name="syncDate">同步日期</param>
  354. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  355. /// <returns></returns>
  356. public static string SyncFinishedProduct_cz2(DateTime syncDate, bool isPushTodayAllData)
  357. {
  358. int returnRows = 0;
  359. string sql = string.Empty;
  360. string sqlUpdate = string.Empty;
  361. // 本次推送的数据
  362. DataTable dtSyncFinishProduct = null;
  363. // 返回json
  364. JObject returnObj;
  365. // 推送结果
  366. string message = string.Empty;
  367. using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_cz2))
  368. {
  369. try
  370. {
  371. #region 获取产成品交接数据
  372. // 从gdd表上更新流水号和首次交接日期(预防有交接完又回产线的产品)
  373. sqlUpdate = @"
  374. UPDATE TP_PM_FINISHEDPRODUCT P
  375. SET (P.FIRSTFHDATE, P.FIRSTFHNO) =
  376. (SELECT GDD.FIRSTFHDATE,
  377. GDD.FIRSTFHNO
  378. FROM TP_PM_GROUTINGDAILYDETAIL GDD
  379. WHERE GDD.FIRSTFHNO IS NOT NULL
  380. AND GDD.BARCODE = P.BARCODE)
  381. WHERE P.FIRSTFHNO IS NULL
  382. AND P.FHTIME >= @DATEBEGIN@
  383. AND P.FHTIME < @DATEEND@ ";
  384. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  385. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  386. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  387. );
  388. // 获取当日最大流水号
  389. sql = @"
  390. SELECT NVL(MAX(FIRSTFHNO), 0) AS MAXFIRSTFHNO
  391. FROM TP_PM_FINISHEDPRODUCT FP
  392. WHERE FP.FHTIME >= @DATEBEGIN@
  393. AND FP.FHTIME < @DATEEND@ ";
  394. object objMaxFirstFhNo = connSS.ExecuteScalar(sql,
  395. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  396. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  397. );
  398. int maxFirstFhNo = 0;
  399. int.TryParse(objMaxFirstFhNo + "", out maxFirstFhNo);
  400. // 更新流水号和首次交接日期
  401. sqlUpdate = @"
  402. UPDATE TP_PM_FINISHEDPRODUCT P
  403. SET P.FIRSTFHDATE = @DATEBEGIN@,
  404. P.FIRSTFHNO =
  405. (SELECT T2.FIRSTFHNO
  406. FROM (SELECT T.BARCODE,
  407. ROWNUM + @MAXFIRSTFHNO@ AS FIRSTFHNO
  408. FROM (SELECT FP.BARCODE
  409. FROM TP_PM_FINISHEDPRODUCT FP
  410. WHERE FP.FIRSTFHNO IS NULL
  411. AND FP.FHTIME >= @DATEBEGIN@
  412. AND FP.FHTIME < @DATEEND@
  413. ORDER BY FP.FHTIME,
  414. FP.BARCODE) T) T2
  415. WHERE T2.BARCODE = P.BARCODE)
  416. WHERE P.FIRSTFHNO IS NULL
  417. AND P.FHTIME >= @DATEBEGIN@
  418. AND P.FHTIME < @DATEEND@ ";
  419. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  420. new CDAParameter("MAXFIRSTFHNO", maxFirstFhNo, DataType.Int32),
  421. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  422. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  423. );
  424. // 将流水号和首次交接日期更新到gdd表上
  425. sqlUpdate = @"
  426. UPDATE TP_PM_GROUTINGDAILYDETAIL GDD
  427. SET (GDD.FIRSTFHDATE, GDD.FIRSTFHNO) =
  428. (SELECT P.FIRSTFHDATE,
  429. P.FIRSTFHNO
  430. FROM TP_PM_FINISHEDPRODUCT P
  431. WHERE GDD.BARCODE = P.BARCODE
  432. AND P.FIRSTFHNO IS NOT NULL
  433. AND P.FHTIME >= @DATEBEGIN@
  434. AND P.FHTIME < @DATEEND@)
  435. WHERE GDD.FIRSTFHNO IS NULL
  436. AND EXISTS (SELECT 1
  437. FROM TP_PM_FINISHEDPRODUCT P
  438. WHERE GDD.BARCODE = P.BARCODE
  439. AND P.FIRSTFHNO IS NOT NULL
  440. AND P.FHTIME >= @DATEBEGIN@
  441. AND P.FHTIME < @DATEEND@) ";
  442. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  443. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  444. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  445. );
  446. // 是否推送当天剩余的所有数据
  447. if (isPushTodayAllData)
  448. {
  449. sql = @"
  450. SELECT GDD.OUTLABELCODE,
  451. GDD.MATERIALCODE,
  452. FP.FIRSTFHDATE,
  453. FP.FIRSTFHNO,
  454. FP.BARCODE, gdd.servicecode
  455. FROM TP_PM_FINISHEDPRODUCT FP
  456. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  457. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  458. WHERE FP.FIRSTFHNO IS NOT NULL
  459. AND FP.TOZHONGTAIFLAG = '0'
  460. AND FP.FHTIME >= @DATEBEGIN@
  461. AND FP.FHTIME < @DATEEND@
  462. ORDER BY FP.FHTIME,
  463. FP.BARCODE ";
  464. }
  465. else
  466. {
  467. // 获取本次推送的数据(每次推送数据不超过100条)
  468. sql = @"
  469. SELECT T.*,
  470. ROWNUM
  471. FROM (SELECT GDD.OUTLABELCODE,
  472. GDD.MATERIALCODE,
  473. FP.FIRSTFHDATE,
  474. FP.FIRSTFHNO,
  475. FP.BARCODE, gdd.servicecode
  476. FROM TP_PM_FINISHEDPRODUCT FP
  477. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  478. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  479. WHERE FP.FIRSTFHNO IS NOT NULL
  480. AND FP.TOZHONGTAIFLAG = '0'
  481. AND FP.FHTIME >= @DATEBEGIN@
  482. AND FP.FHTIME < @DATEEND@
  483. ORDER BY FP.FIRSTFHNO) T
  484. WHERE ROWNUM <= 100 ";
  485. }
  486. dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
  487. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  488. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  489. );
  490. if (dtSyncFinishProduct.Rows.Count == 0)
  491. {
  492. return "本时段没有要推送的数据";
  493. }
  494. #endregion
  495. #region 获取token
  496. sql = @"
  497. SELECT TOKEN
  498. FROM TP_SYS_ZHONGTAI_TOKEN
  499. WHERE ENDTIME > SYSDATE + 1 / 24 ";
  500. string access_token = connSS.ExecuteScalar<string>(sql);
  501. if (string.IsNullOrEmpty(access_token))
  502. {
  503. string[] paras = new string[] { _grant_type, _client_id_cz, _client_secret_cz };
  504. string jsonStr = GetToken(_urlToken, paras);
  505. returnObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
  506. access_token = returnObj["access_token"].ToString();
  507. DateTime nowDate;
  508. DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
  509. int expires_in;
  510. int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
  511. DateTime endTime = nowDate.AddMilliseconds(expires_in);
  512. sqlUpdate = @"
  513. UPDATE TP_SYS_ZHONGTAI_TOKEN
  514. SET TOKEN = @TOKEN@,
  515. ENDTIME = @ENDTIME@ ";
  516. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  517. new CDAParameter("TOKEN", access_token, DataType.NVarChar),
  518. new CDAParameter("ENDTIME", endTime, DataType.DateTime)
  519. );
  520. }
  521. #endregion
  522. #region 向接口推送数据
  523. DateTime firstfhdate;
  524. string differDays36 = string.Empty;
  525. int firstFhNo = 0;
  526. JObject jObject = null;
  527. string firstFhNo36 = string.Empty;
  528. JArray jArray = new JArray();
  529. foreach (DataRow row in dtSyncFinishProduct.Rows)
  530. {
  531. string servicecode = row["servicecode"] + "";
  532. if (string.IsNullOrWhiteSpace(servicecode))
  533. {
  534. // 当前日期与2022-01-01的时间间隔,转化为36进制数,0~9+A~Z,不满3位左边补0
  535. DateTime.TryParse(row["FIRSTFHDATE"].ToString(), out firstfhdate);
  536. differDays36 = Scale36.ToCurr36(firstfhdate.Subtract(_startDate).Days).PadLeft(3, '0');
  537. // 流水(4位,36进制数流水,0~9+A~Z)
  538. int.TryParse(row["FIRSTFHNO"] + "", out firstFhNo);
  539. //firstFhNo36 = Scale36.ToCurr36(firstFhNo).PadLeft(4, '0');
  540. firstFhNo36 = "Z" + Scale36.ToCurr36(firstFhNo).PadLeft(3, '0');
  541. jObject = new JObject();
  542. jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
  543. jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
  544. jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + row["OUTLABELCODE"]));
  545. jObject.Add(new JProperty("serviceCode", _ft_gcdm + differDays36 + firstFhNo36));
  546. jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
  547. jArray.Add(jObject);
  548. }
  549. else
  550. {
  551. jObject = new JObject();
  552. jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
  553. jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
  554. jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + servicecode));
  555. jObject.Add(new JProperty("serviceCode", servicecode));
  556. jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
  557. jArray.Add(jObject);
  558. }
  559. }
  560. string jsonPara = JsonConvert.SerializeObject(jArray);
  561. Curtain.Log.Logger.Info("凤塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  562. string returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
  563. Curtain.Log.Logger.Info("凤塘_中台同步结束:\n" + returnJsonStr);
  564. // 如果token过期了,重新获取一遍,再推一次试试
  565. if (returnJsonStr.Contains("未经授权"))
  566. {
  567. string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
  568. string jsonStr = GetToken(_urlToken, paras);
  569. returnObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
  570. access_token = returnObj["access_token"].ToString();
  571. DateTime nowDate;
  572. DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
  573. int expires_in;
  574. int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
  575. DateTime endTime = nowDate.AddMilliseconds(expires_in);
  576. sqlUpdate = @"
  577. UPDATE TP_SYS_ZHONGTAI_TOKEN
  578. SET TOKEN = @TOKEN@,
  579. ENDTIME = @ENDTIME@ ";
  580. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  581. new CDAParameter("TOKEN", access_token, DataType.NVarChar),
  582. new CDAParameter("ENDTIME", endTime, DataType.DateTime)
  583. );
  584. Curtain.Log.Logger.Info("凤塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  585. returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
  586. Curtain.Log.Logger.Info("凤塘_中台同步结束:\n" + returnJsonStr);
  587. }
  588. try
  589. {
  590. returnObj = JsonConvert.DeserializeObject<JObject>(returnJsonStr);
  591. if (returnObj.ContainsKey("data"))
  592. {
  593. message = returnObj["data"] + "";
  594. }
  595. if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("msg"))
  596. {
  597. message = returnObj["msg"] + "";
  598. }
  599. if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("message"))
  600. {
  601. message = returnObj["message"] + "";
  602. }
  603. }
  604. catch (Exception ex)
  605. {
  606. if (string.IsNullOrEmpty(returnJsonStr))
  607. {
  608. message = ex.Message;
  609. }
  610. else
  611. {
  612. message = returnJsonStr;
  613. }
  614. }
  615. #endregion
  616. #region 结果处理
  617. char tozhongtaiflag = message.Equals("条码保存成功") ? '1' : '0';
  618. // 超时也当作成功
  619. //if (tozhongtaiflag.Equals('0') && message.Contains("超时"))
  620. //{
  621. // tozhongtaiflag = '1';
  622. //}
  623. // 更新推送结果
  624. string barcodes = "('" + string.Join("','", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field<string>("BARCODE")).ToArray()) + "')";
  625. sqlUpdate = @"
  626. UPDATE TP_PM_FINISHEDPRODUCT
  627. SET TOZHONGTAIFLAG = @TOZHONGTAIFLAG@,
  628. ZHONGTAIMSG = @ZHONGTAIMSG@,
  629. TOZHONGTAITIME = SYSDATE
  630. WHERE BARCODE IN " + barcodes;
  631. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  632. new CDAParameter("TOZHONGTAIFLAG", tozhongtaiflag, DataType.Char),
  633. new CDAParameter("ZHONGTAIMSG", message, DataType.NVarChar)
  634. );
  635. #endregion
  636. }
  637. catch (Exception ex)
  638. {
  639. message = ex.Message;
  640. }
  641. }
  642. return message;
  643. }
  644. /// <summary>
  645. /// 同步产成品交接数据到恒洁中台_官塘厂
  646. /// </summary>
  647. /// <param name="syncDate">同步日期</param>
  648. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  649. /// <returns></returns>
  650. public static string SyncFinishedProduct_cz3(DateTime syncDate, bool isPushTodayAllData)
  651. {
  652. int returnRows = 0;
  653. string sql = string.Empty;
  654. string sqlUpdate = string.Empty;
  655. // 本次推送的数据
  656. DataTable dtSyncFinishProduct = null;
  657. // 返回json
  658. JObject returnObj;
  659. // 推送结果
  660. string message = string.Empty;
  661. using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_cz3))
  662. {
  663. try
  664. {
  665. #region 获取产成品交接数据
  666. // 从gdd表上更新流水号和首次交接日期(预防有交接完又回产线的产品)
  667. sqlUpdate = @"
  668. UPDATE TP_PM_FINISHEDPRODUCT P
  669. SET (P.FIRSTFHDATE, P.FIRSTFHNO) =
  670. (SELECT GDD.FIRSTFHDATE,
  671. GDD.FIRSTFHNO
  672. FROM TP_PM_GROUTINGDAILYDETAIL GDD
  673. WHERE GDD.FIRSTFHNO IS NOT NULL
  674. AND GDD.BARCODE = P.BARCODE)
  675. WHERE P.FIRSTFHNO IS NULL
  676. AND P.FHTIME >= @DATEBEGIN@
  677. AND P.FHTIME < @DATEEND@ ";
  678. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  679. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  680. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  681. );
  682. // 获取当日最大流水号
  683. sql = @"
  684. SELECT NVL(MAX(FIRSTFHNO), 0) AS MAXFIRSTFHNO
  685. FROM TP_PM_FINISHEDPRODUCT FP
  686. WHERE FP.FHTIME >= @DATEBEGIN@
  687. AND FP.FHTIME < @DATEEND@ ";
  688. object objMaxFirstFhNo = connSS.ExecuteScalar(sql,
  689. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  690. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  691. );
  692. int maxFirstFhNo = 0;
  693. int.TryParse(objMaxFirstFhNo + "", out maxFirstFhNo);
  694. // 更新流水号和首次交接日期
  695. sqlUpdate = @"
  696. UPDATE TP_PM_FINISHEDPRODUCT P
  697. SET P.FIRSTFHDATE = @DATEBEGIN@,
  698. P.FIRSTFHNO =
  699. (SELECT T2.FIRSTFHNO
  700. FROM (SELECT T.BARCODE,
  701. ROWNUM + @MAXFIRSTFHNO@ AS FIRSTFHNO
  702. FROM (SELECT FP.BARCODE
  703. FROM TP_PM_FINISHEDPRODUCT FP
  704. WHERE FP.FIRSTFHNO IS NULL
  705. AND FP.FHTIME >= @DATEBEGIN@
  706. AND FP.FHTIME < @DATEEND@
  707. ORDER BY FP.FHTIME,
  708. FP.BARCODE) T) T2
  709. WHERE T2.BARCODE = P.BARCODE)
  710. WHERE P.FIRSTFHNO IS NULL
  711. AND P.FHTIME >= @DATEBEGIN@
  712. AND P.FHTIME < @DATEEND@ ";
  713. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  714. new CDAParameter("MAXFIRSTFHNO", maxFirstFhNo, DataType.Int32),
  715. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  716. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  717. );
  718. // 将流水号和首次交接日期更新到gdd表上
  719. sqlUpdate = @"
  720. UPDATE TP_PM_GROUTINGDAILYDETAIL GDD
  721. SET (GDD.FIRSTFHDATE, GDD.FIRSTFHNO) =
  722. (SELECT P.FIRSTFHDATE,
  723. P.FIRSTFHNO
  724. FROM TP_PM_FINISHEDPRODUCT P
  725. WHERE GDD.BARCODE = P.BARCODE
  726. AND P.FIRSTFHNO IS NOT NULL
  727. AND P.FHTIME >= @DATEBEGIN@
  728. AND P.FHTIME < @DATEEND@)
  729. WHERE GDD.FIRSTFHNO IS NULL
  730. AND EXISTS (SELECT 1
  731. FROM TP_PM_FINISHEDPRODUCT P
  732. WHERE GDD.BARCODE = P.BARCODE
  733. AND P.FIRSTFHNO IS NOT NULL
  734. AND P.FHTIME >= @DATEBEGIN@
  735. AND P.FHTIME < @DATEEND@) ";
  736. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  737. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  738. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  739. );
  740. // 是否推送当天剩余的所有数据
  741. if (isPushTodayAllData)
  742. {
  743. sql = @"
  744. SELECT GDD.OUTLABELCODE,
  745. GDD.MATERIALCODE,
  746. FP.FIRSTFHDATE,
  747. FP.FIRSTFHNO,
  748. FP.BARCODE, gdd.servicecode
  749. FROM TP_PM_FINISHEDPRODUCT FP
  750. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  751. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  752. WHERE FP.FIRSTFHNO IS NOT NULL
  753. AND FP.TOZHONGTAIFLAG = '0'
  754. AND FP.FHTIME >= @DATEBEGIN@
  755. AND FP.FHTIME < @DATEEND@
  756. ORDER BY FP.FHTIME,
  757. FP.BARCODE ";
  758. }
  759. else
  760. {
  761. // 获取本次推送的数据(每次推送数据不超过100条)
  762. sql = @"
  763. SELECT T.*,
  764. ROWNUM
  765. FROM (SELECT GDD.OUTLABELCODE,
  766. GDD.MATERIALCODE,
  767. FP.FIRSTFHDATE,
  768. FP.FIRSTFHNO,
  769. FP.BARCODE, gdd.servicecode
  770. FROM TP_PM_FINISHEDPRODUCT FP
  771. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  772. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  773. WHERE FP.FIRSTFHNO IS NOT NULL
  774. AND FP.TOZHONGTAIFLAG = '0'
  775. AND FP.FHTIME >= @DATEBEGIN@
  776. AND FP.FHTIME < @DATEEND@
  777. ORDER BY FP.FIRSTFHNO) T
  778. WHERE ROWNUM <= 100 ";
  779. }
  780. dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
  781. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  782. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  783. );
  784. if (dtSyncFinishProduct.Rows.Count == 0)
  785. {
  786. return "本时段没有要推送的数据";
  787. }
  788. #endregion
  789. #region 获取token
  790. sql = @"
  791. SELECT TOKEN
  792. FROM TP_SYS_ZHONGTAI_TOKEN
  793. WHERE ENDTIME > SYSDATE + 1 / 24 ";
  794. string access_token = connSS.ExecuteScalar<string>(sql);
  795. if (string.IsNullOrEmpty(access_token))
  796. {
  797. string[] paras = new string[] { _grant_type, _client_id_cz, _client_secret_cz };
  798. string jsonStr = GetToken(_urlToken, paras);
  799. returnObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
  800. access_token = returnObj["access_token"].ToString();
  801. DateTime nowDate;
  802. DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
  803. int expires_in;
  804. int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
  805. DateTime endTime = nowDate.AddMilliseconds(expires_in);
  806. sqlUpdate = @"
  807. UPDATE TP_SYS_ZHONGTAI_TOKEN
  808. SET TOKEN = @TOKEN@,
  809. ENDTIME = @ENDTIME@ ";
  810. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  811. new CDAParameter("TOKEN", access_token, DataType.NVarChar),
  812. new CDAParameter("ENDTIME", endTime, DataType.DateTime)
  813. );
  814. }
  815. #endregion
  816. #region 向接口推送数据
  817. DateTime firstfhdate;
  818. string differDays36 = string.Empty;
  819. int firstFhNo = 0;
  820. JObject jObject = null;
  821. string firstFhNo36 = string.Empty;
  822. JArray jArray = new JArray();
  823. foreach (DataRow row in dtSyncFinishProduct.Rows)
  824. {
  825. string servicecode = row["servicecode"] + "";
  826. if (string.IsNullOrWhiteSpace(servicecode))
  827. {
  828. // 当前日期与2022-01-01的时间间隔,转化为36进制数,0~9+A~Z,不满3位左边补0
  829. DateTime.TryParse(row["FIRSTFHDATE"].ToString(), out firstfhdate);
  830. differDays36 = Scale36.ToCurr36(firstfhdate.Subtract(_startDate).Days).PadLeft(3, '0');
  831. // 流水(4位,36进制数流水,0~9+A~Z)
  832. int.TryParse(row["FIRSTFHNO"] + "", out firstFhNo);
  833. //firstFhNo36 = Scale36.ToCurr36(firstFhNo).PadLeft(4, '0');
  834. firstFhNo36 = "Z" + Scale36.ToCurr36(firstFhNo).PadLeft(3, '0');
  835. jObject = new JObject();
  836. jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
  837. jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
  838. jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + row["OUTLABELCODE"]));
  839. jObject.Add(new JProperty("serviceCode", _gt_gcdm + differDays36 + firstFhNo36));
  840. jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
  841. jArray.Add(jObject);
  842. }
  843. else
  844. {
  845. jObject = new JObject();
  846. jObject.Add(new JProperty("barcode", row["OUTLABELCODE"]));
  847. jObject.Add(new JProperty("productCode", row["MATERIALCODE"]));
  848. jObject.Add(new JProperty("newUniqueCode", "https://hap.hegii.com/jump?state=productInfo-" + servicecode));
  849. jObject.Add(new JProperty("serviceCode", servicecode));
  850. jObject.Add(new JProperty("codeUuid", row["OUTLABELCODE"]));
  851. jArray.Add(jObject);
  852. }
  853. }
  854. string jsonPara = JsonConvert.SerializeObject(jArray);
  855. Curtain.Log.Logger.Info("官塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  856. string returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
  857. Curtain.Log.Logger.Info("官塘_中台同步结束:\n" + returnJsonStr);
  858. // 如果token过期了,重新获取一遍,再推一次试试
  859. if (returnJsonStr.Contains("未经授权"))
  860. {
  861. string[] paras = new string[] { _grant_type, _client_id_ss, _client_secret_ss };
  862. string jsonStr = GetToken(_urlToken, paras);
  863. returnObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
  864. access_token = returnObj["access_token"].ToString();
  865. DateTime nowDate;
  866. DateTime.TryParse(returnObj["nowDate"].ToString(), out nowDate);
  867. int expires_in;
  868. int.TryParse(returnObj["expires_in"].ToString(), out expires_in);
  869. DateTime endTime = nowDate.AddMilliseconds(expires_in);
  870. sqlUpdate = @"
  871. UPDATE TP_SYS_ZHONGTAI_TOKEN
  872. SET TOKEN = @TOKEN@,
  873. ENDTIME = @ENDTIME@ ";
  874. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  875. new CDAParameter("TOKEN", access_token, DataType.NVarChar),
  876. new CDAParameter("ENDTIME", endTime, DataType.DateTime)
  877. );
  878. Curtain.Log.Logger.Info("官塘_中台同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  879. returnJsonStr = PostToZhongTai(_urlPush, jsonPara, access_token);
  880. Curtain.Log.Logger.Info("官塘_中台同步结束:\n" + returnJsonStr);
  881. }
  882. try
  883. {
  884. returnObj = JsonConvert.DeserializeObject<JObject>(returnJsonStr);
  885. if (returnObj.ContainsKey("data"))
  886. {
  887. message = returnObj["data"] + "";
  888. }
  889. if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("msg"))
  890. {
  891. message = returnObj["msg"] + "";
  892. }
  893. if (string.IsNullOrEmpty(message) && returnObj.ContainsKey("message"))
  894. {
  895. message = returnObj["message"] + "";
  896. }
  897. }
  898. catch (Exception ex)
  899. {
  900. if (string.IsNullOrEmpty(returnJsonStr))
  901. {
  902. message = ex.Message;
  903. }
  904. else
  905. {
  906. message = returnJsonStr;
  907. }
  908. }
  909. #endregion
  910. #region 结果处理
  911. char tozhongtaiflag = message.Equals("条码保存成功") ? '1' : '0';
  912. // 超时也当作成功
  913. //if (tozhongtaiflag.Equals('0') && message.Contains("超时"))
  914. //{
  915. // tozhongtaiflag = '1';
  916. //}
  917. // 更新推送结果
  918. string barcodes = "('" + string.Join("','", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field<string>("BARCODE")).ToArray()) + "')";
  919. sqlUpdate = @"
  920. UPDATE TP_PM_FINISHEDPRODUCT
  921. SET TOZHONGTAIFLAG = @TOZHONGTAIFLAG@,
  922. ZHONGTAIMSG = @ZHONGTAIMSG@,
  923. TOZHONGTAITIME = SYSDATE
  924. WHERE BARCODE IN " + barcodes;
  925. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  926. new CDAParameter("TOZHONGTAIFLAG", tozhongtaiflag, DataType.Char),
  927. new CDAParameter("ZHONGTAIMSG", message, DataType.NVarChar)
  928. );
  929. #endregion
  930. }
  931. catch (Exception ex)
  932. {
  933. message = ex.Message;
  934. }
  935. }
  936. return message;
  937. }
  938. /// <summary>
  939. /// 获取token
  940. /// </summary>
  941. /// <param name="url"></param>
  942. /// <param name="paras"></param>
  943. /// <returns></returns>
  944. private static string GetToken(string url, string[] paras)
  945. {
  946. try
  947. {
  948. string EndResult = "";
  949. string SendMessageAddress = url;
  950. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(SendMessageAddress);
  951. request.Method = "POST";
  952. request.AllowAutoRedirect = true;
  953. request.ContentType = "application/x-www-form-urlencoded";
  954. //string PostData = "grant_type=client_credentials&client_id=e86762528ada4cc3919346f107a7f7ec&client_secret=de3e8f5e762c4f948807498a513688c4";
  955. string PostData = string.Format("grant_type={0}&client_id={1}&client_secret={2}", paras[0], paras[1], paras[2]);
  956. byte[] byteArray = Encoding.Default.GetBytes(PostData);
  957. request.ContentLength = byteArray.Length;
  958. using (Stream newStream = request.GetRequestStream())
  959. {
  960. newStream.Write(byteArray, 0, byteArray.Length);//写入参数
  961. newStream.Close();
  962. }
  963. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  964. Stream rspStream = response.GetResponseStream();
  965. using (StreamReader reader = new StreamReader(rspStream, Encoding.UTF8))
  966. {
  967. EndResult = reader.ReadToEnd();
  968. rspStream.Close();
  969. }
  970. response.Close();
  971. return EndResult;
  972. }
  973. catch (Exception ex)
  974. {
  975. return ex.Message;
  976. }
  977. }
  978. /// <summary>
  979. /// 推送数据
  980. /// </summary>
  981. /// <param name="url"></param>
  982. /// <param name="data"></param>
  983. /// <param name="token"></param>
  984. /// <returns></returns>
  985. private static string PostToZhongTai(string url, string data, string token)
  986. {
  987. try
  988. {
  989. //将单引号转义成双引号
  990. data = data.Replace("'", "\"");
  991. //创建Web访问对象
  992. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  993. // 接口慢,设置30分钟超时等待
  994. myRequest.Timeout = 1800000;
  995. //把用户传过来的数据转成“UTF-8”的字节流
  996. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  997. myRequest.Method = "POST";
  998. myRequest.ContentLength = buf.Length;
  999. myRequest.ContentType = "application/json;charset=UTF-8";
  1000. //myRequest.MaximumAutomaticRedirections = 1;
  1001. myRequest.AllowAutoRedirect = true;
  1002. //string base64Header = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
  1003. myRequest.Headers.Add("Authorization", "Bearer " + token);
  1004. //发送请求
  1005. Stream stream = myRequest.GetRequestStream();
  1006. stream.Write(buf, 0, buf.Length);
  1007. stream.Close();
  1008. //获取接口返回值
  1009. //通过Web访问对象获取响应内容
  1010. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  1011. //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
  1012. StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  1013. //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
  1014. string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
  1015. reader.Close();
  1016. myResponse.Close();
  1017. return returnXml;
  1018. }
  1019. catch (Exception ex)
  1020. {
  1021. return ex.Message;
  1022. }
  1023. }
  1024. #endregion
  1025. }