SyncKunChuan.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  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. /// 同步到昆船WMS
  12. /// </summary>
  13. public class SyncKunChuan
  14. {
  15. #region 固定常量
  16. // 数据库连接字符串
  17. 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";
  18. 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";
  19. 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";
  20. // 测试环境
  21. //public static string _urlPush = "http://172.17.193.169:8080/com.ksec.l1101.erpif/jbaprpc/interface/unique";
  22. // 正式环境
  23. public static string _urlPush = "http://172.19.252.5:8080/com.ksec.l1101.erpif/jbaprpc/interface/unique";
  24. #endregion
  25. #region 推送方法
  26. /// <summary>
  27. /// 同步产成品交接数据到恒洁中台
  28. /// </summary>
  29. /// <param name="syncDate">同步日期</param>
  30. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  31. /// <returns></returns>
  32. public static string SyncFinishedProduct(DateTime syncDate, bool isPushTodayAllData)
  33. {
  34. string msg = string.Empty;
  35. msg += "ss:" + SyncFinishedProduct_ss(syncDate, isPushTodayAllData);
  36. msg += ",cz2:" + SyncFinishedProduct_cz2(syncDate, isPushTodayAllData);
  37. msg += ",cz3:" + SyncFinishedProduct_cz3(syncDate, isPushTodayAllData);
  38. return msg;
  39. }
  40. /// <summary>
  41. /// 同步产成品交接数据到恒洁中台_三水
  42. /// </summary>
  43. /// <param name="syncDate">同步日期</param>
  44. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  45. /// <returns></returns>
  46. public static string SyncFinishedProduct_ss(DateTime syncDate, bool isPushTodayAllData)
  47. {
  48. int returnRows = 0;
  49. string sql = string.Empty;
  50. string sqlUpdate = string.Empty;
  51. // 本次推送的数据
  52. DataTable dtSyncFinishProduct = null;
  53. // 返回json
  54. JObject returnObj;
  55. // 推送结果
  56. string message = string.Empty;
  57. using (IDataAccess connSS = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_ss))
  58. {
  59. try
  60. {
  61. #region 获取产成品交接数据
  62. // 是否推送当天剩余的所有数据
  63. if (isPushTodayAllData)
  64. {
  65. sql = @"
  66. SELECT FP.OUTCODE AS CODE,
  67. FP.SAPCODE AS SKU,
  68. NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  69. FP.WORKCODE AS FACTORY,
  70. FP.ORDERCODE AS SALENUM,
  71. LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  72. 1 AS QTY,
  73. FP.OUTCODE AS SUSR1,
  74. SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  75. FP.YYYYMMDD AS SUSR4,
  76. FP.BARCODE AS SUSR5,
  77. FP.SECURITYCODE AS SUSR9,
  78. TO_CHAR(FP.LOGID) AS SUSR20,
  79. FP.ID
  80. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  81. WHERE FP.ZTYPE = 'S'
  82. AND FP.TOKUNCHUANFLAG = '0'
  83. AND FP.CREATETIME >= @DATEBEGIN@
  84. AND FP.CREATETIME < @DATEEND@
  85. ORDER BY FP.SAPFLBATCHNO,
  86. FP.OUTCODE ";
  87. }
  88. else
  89. {
  90. // 获取本次推送的数据(每次推送数据不超过200条)
  91. //sql = @"
  92. //SELECT T.*,
  93. // ROWNUM
  94. // FROM (SELECT FP.OUTCODE AS CODE,
  95. // FP.SAPCODE AS SKU,
  96. // NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  97. // FP.WORKCODE AS FACTORY,
  98. // FP.ORDERCODE AS SALENUM,
  99. // LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  100. // 1 AS QTY,
  101. // FP.OUTCODE AS SUSR1,
  102. // SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  103. // FP.YYYYMMDD AS SUSR4,
  104. // FP.BARCODE AS SUSR5,
  105. // FP.SECURITYCODE AS SUSR9,
  106. // TO_CHAR(FP.LOGID) AS SUSR20,
  107. // FP.ID
  108. // FROM TSAP_HEGII_FINISHEDPRODUCT FP
  109. // WHERE FP.ZTYPE = 'S'
  110. // AND FP.TOKUNCHUANFLAG = '0'
  111. // AND FP.CREATETIME >= @DATEBEGIN@
  112. // AND FP.CREATETIME < @DATEEND@
  113. // ORDER BY FP.SAPFLBATCHNO,
  114. // FP.OUTCODE ) T
  115. // WHERE ROWNUM <= 200 ";
  116. //按照成板去推送 edit 2023-09-20 qq
  117. sql = @"
  118. SELECT FP.OUTCODE AS CODE,
  119. FP.SAPCODE AS SKU,
  120. NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  121. FP.WORKCODE AS FACTORY,
  122. FP.ORDERCODE AS SALENUM,
  123. LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  124. 1 AS QTY,
  125. FP.OUTCODE AS SUSR1,
  126. SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  127. FP.YYYYMMDD AS SUSR4,
  128. FP.BARCODE AS SUSR5,
  129. FP.SECURITYCODE AS SUSR9,
  130. TO_CHAR(FP.LOGID) AS SUSR20,
  131. FP.ID,
  132. ROWNUM
  133. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  134. WHERE FP.ZTYPE = 'S'
  135. AND FP.TOKUNCHUANFLAG = '0'
  136. AND FP.SAPFLBATCHNO IN (
  137. SELECT DISTINCT T.SAPFLBATCHNO
  138. FROM (SELECT FP.SAPFLBATCHNO
  139. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  140. WHERE FP.ZTYPE = 'S'
  141. AND FP.TOKUNCHUANFLAG = '0'
  142. AND FP.CREATETIME >= @DATEBEGIN@
  143. AND FP.CREATETIME <= @DATEEND@
  144. ORDER BY FP.SAPFLBATCHNO,
  145. FP.OUTCODE) T
  146. WHERE ROWNUM <= 180
  147. )
  148. ORDER BY FP.SAPFLBATCHNO,
  149. FP.OUTCODE ";
  150. }
  151. dtSyncFinishProduct = connSS.ExecuteDatatable(sql,
  152. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  153. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  154. );
  155. if (dtSyncFinishProduct.Rows.Count == 0)
  156. {
  157. return "本时段没有要推送的数据";
  158. }
  159. #endregion
  160. #region 向接口推送数据
  161. JObject jObject = null;
  162. JArray jArray = new JArray();
  163. foreach (DataRow row in dtSyncFinishProduct.Rows)
  164. {
  165. jObject = new JObject();
  166. jObject.Add(new JProperty("code", row["CODE"]));
  167. jObject.Add(new JProperty("sku", row["SKU"]));
  168. jObject.Add(new JProperty("lpnnum", row["LPNNUM"]));
  169. jObject.Add(new JProperty("factory", row["FACTORY"]));
  170. jObject.Add(new JProperty("saleNum", row["SALENUM"]));
  171. jObject.Add(new JProperty("saleLine", row["SALELINE"]));
  172. jObject.Add(new JProperty("qty", row["QTY"]));
  173. jObject.Add(new JProperty("susr1", row["SUSR1"]));
  174. jObject.Add(new JProperty("susr2", ""));
  175. jObject.Add(new JProperty("susr3", row["SUSR3"]));
  176. jObject.Add(new JProperty("susr4", row["SUSR4"]));
  177. jObject.Add(new JProperty("susr5", row["SUSR5"]));
  178. jObject.Add(new JProperty("susr6", ""));
  179. jObject.Add(new JProperty("susr7", ""));
  180. jObject.Add(new JProperty("susr8", ""));
  181. jObject.Add(new JProperty("susr9", row["SUSR9"]));
  182. jObject.Add(new JProperty("susr10", ""));
  183. jObject.Add(new JProperty("susr11", ""));
  184. jObject.Add(new JProperty("susr12", ""));
  185. jObject.Add(new JProperty("susr13", ""));
  186. jObject.Add(new JProperty("susr14", ""));
  187. jObject.Add(new JProperty("susr15", ""));
  188. jObject.Add(new JProperty("susr16", ""));
  189. jObject.Add(new JProperty("susr17", ""));
  190. jObject.Add(new JProperty("susr18", ""));
  191. jObject.Add(new JProperty("susr19", ""));
  192. jObject.Add(new JProperty("susr20", row["SUSR20"]));
  193. jArray.Add(jObject);
  194. }
  195. JObject data = new JObject();
  196. data.Add(new JProperty("data", jArray));
  197. string jsonPara = JsonConvert.SerializeObject(data);
  198. Curtain.Log.Logger.Info("三水_昆船同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  199. string returnJsonStr = PostToZhongTai(_urlPush, jsonPara);
  200. Curtain.Log.Logger.Info("三水_昆船同步结束:\n" + returnJsonStr);
  201. try
  202. {
  203. returnObj = JsonConvert.DeserializeObject<JObject>(returnJsonStr);
  204. if (returnObj.ContainsKey("message"))
  205. {
  206. message = returnObj["message"] + "";
  207. }
  208. }
  209. catch (Exception ex)
  210. {
  211. if (string.IsNullOrEmpty(returnJsonStr))
  212. {
  213. message = ex.Message;
  214. }
  215. else
  216. {
  217. message = returnJsonStr;
  218. }
  219. }
  220. #endregion
  221. #region 结果处理
  222. char tokunchuanftime = message.Equals("请求成功") ? '1' : '0';
  223. // 更新推送结果
  224. string barcodes = "(" + string.Join(",", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field<decimal>("ID")).ToArray()) + ")";
  225. sqlUpdate = @"
  226. UPDATE TSAP_HEGII_FINISHEDPRODUCT
  227. SET TOKUNCHUANFLAG = @TOKUNCHUANFLAG@,
  228. KUNCHUANMSG = @KUNCHUANFMSG@,
  229. TOKUNCHUANTIME = SYSDATE
  230. WHERE ZTYPE = 'S'
  231. AND TOKUNCHUANFLAG = '0'
  232. AND ID IN " + barcodes;
  233. returnRows += connSS.ExecuteNonQuery(sqlUpdate,
  234. new CDAParameter("TOKUNCHUANFLAG", tokunchuanftime, DataType.Char),
  235. new CDAParameter("KUNCHUANFMSG", message, DataType.NVarChar)
  236. );
  237. #endregion
  238. }
  239. catch (Exception ex)
  240. {
  241. message = ex.Message;
  242. }
  243. }
  244. return message;
  245. }
  246. /// <summary>
  247. /// 同步产成品交接数据到恒洁中台_凤塘
  248. /// </summary>
  249. /// <param name="syncDate">同步日期</param>
  250. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  251. /// <returns></returns>
  252. public static string SyncFinishedProduct_cz2(DateTime syncDate, bool isPushTodayAllData)
  253. {
  254. int returnRows = 0;
  255. string sql = string.Empty;
  256. string sqlUpdate = string.Empty;
  257. // 本次推送的数据
  258. DataTable dtSyncFinishProduct = null;
  259. // 返回json
  260. JObject returnObj;
  261. // 推送结果
  262. string message = string.Empty;
  263. using (IDataAccess connCZ2 = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_cz2))
  264. {
  265. try
  266. {
  267. #region 获取产成品交接数据
  268. // 是否推送当天剩余的所有数据
  269. if (isPushTodayAllData)
  270. {
  271. sql = @"
  272. SELECT FP.OUTCODE AS CODE,
  273. FP.SAPCODE AS SKU,
  274. NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  275. FP.WORKCODE AS FACTORY,
  276. FP.ORDERCODE AS SALENUM,
  277. LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  278. 1 AS QTY,
  279. FP.OUTCODE AS SUSR1,
  280. SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  281. FP.YYYYMMDD AS SUSR4,
  282. FP.BARCODE AS SUSR5,
  283. FP.SECURITYCODE AS SUSR9,
  284. TO_CHAR(FP.LOGID) AS SUSR20,
  285. FP.ID
  286. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  287. WHERE FP.ZTYPE = 'S'
  288. AND FP.TOKUNCHUANFLAG = '0'
  289. AND FP.CREATETIME >= @DATEBEGIN@
  290. AND FP.CREATETIME < @DATEEND@
  291. ORDER BY FP.SAPFLBATCHNO,
  292. FP.OUTCODE ";
  293. }
  294. else
  295. {
  296. // 获取本次推送的数据(每次推送数据不超过200条)
  297. //sql = @"
  298. //SELECT T.*,
  299. // ROWNUM
  300. // FROM (SELECT FP.OUTCODE AS CODE,
  301. // FP.SAPCODE AS SKU,
  302. // NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  303. // FP.WORKCODE AS FACTORY,
  304. // FP.ORDERCODE AS SALENUM,
  305. // LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  306. // 1 AS QTY,
  307. // FP.OUTCODE AS SUSR1,
  308. // SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  309. // FP.YYYYMMDD AS SUSR4,
  310. // FP.BARCODE AS SUSR5,
  311. // FP.SECURITYCODE AS SUSR9,
  312. // TO_CHAR(FP.LOGID) AS SUSR20,
  313. // FP.ID
  314. // FROM TSAP_HEGII_FINISHEDPRODUCT FP
  315. // WHERE FP.ZTYPE = 'S'
  316. // AND FP.TOKUNCHUANFLAG = '0'
  317. // AND FP.CREATETIME >= @DATEBEGIN@
  318. // AND FP.CREATETIME < @DATEEND@
  319. // ORDER BY FP.SAPFLBATCHNO,
  320. // FP.OUTCODE ) T
  321. // WHERE ROWNUM <= 200 ";
  322. //按照成板去推送 edit 2023-09-20 qq
  323. sql = @"
  324. SELECT FP.OUTCODE AS CODE,
  325. FP.SAPCODE AS SKU,
  326. NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  327. FP.WORKCODE AS FACTORY,
  328. FP.ORDERCODE AS SALENUM,
  329. LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  330. 1 AS QTY,
  331. FP.OUTCODE AS SUSR1,
  332. SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  333. FP.YYYYMMDD AS SUSR4,
  334. FP.BARCODE AS SUSR5,
  335. FP.SECURITYCODE AS SUSR9,
  336. TO_CHAR(FP.LOGID) AS SUSR20,
  337. FP.ID,
  338. ROWNUM
  339. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  340. WHERE FP.ZTYPE = 'S'
  341. AND FP.TOKUNCHUANFLAG = '0'
  342. AND FP.SAPFLBATCHNO IN (
  343. SELECT DISTINCT T.SAPFLBATCHNO
  344. FROM (SELECT FP.SAPFLBATCHNO
  345. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  346. WHERE FP.ZTYPE = 'S'
  347. AND FP.TOKUNCHUANFLAG = '0'
  348. AND FP.CREATETIME >= @DATEBEGIN@
  349. AND FP.CREATETIME <= @DATEEND@
  350. ORDER BY FP.SAPFLBATCHNO,
  351. FP.OUTCODE) T
  352. WHERE ROWNUM <= 180
  353. )
  354. ORDER BY FP.SAPFLBATCHNO,
  355. FP.OUTCODE ";
  356. }
  357. dtSyncFinishProduct = connCZ2.ExecuteDatatable(sql,
  358. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  359. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  360. );
  361. if (dtSyncFinishProduct.Rows.Count == 0)
  362. {
  363. return "本时段没有要推送的数据";
  364. }
  365. #endregion
  366. #region 向接口推送数据
  367. JObject jObject = null;
  368. JArray jArray = new JArray();
  369. foreach (DataRow row in dtSyncFinishProduct.Rows)
  370. {
  371. jObject = new JObject();
  372. jObject.Add(new JProperty("code", row["CODE"]));
  373. jObject.Add(new JProperty("sku", row["SKU"]));
  374. jObject.Add(new JProperty("lpnnum", row["LPNNUM"]));
  375. jObject.Add(new JProperty("factory", row["FACTORY"]));
  376. jObject.Add(new JProperty("saleNum", row["SALENUM"]));
  377. jObject.Add(new JProperty("saleLine", row["SALELINE"]));
  378. jObject.Add(new JProperty("qty", row["QTY"]));
  379. jObject.Add(new JProperty("susr1", row["SUSR1"]));
  380. jObject.Add(new JProperty("susr2", ""));
  381. jObject.Add(new JProperty("susr3", row["SUSR3"]));
  382. jObject.Add(new JProperty("susr4", row["SUSR4"]));
  383. jObject.Add(new JProperty("susr5", row["SUSR5"]));
  384. jObject.Add(new JProperty("susr6", ""));
  385. jObject.Add(new JProperty("susr7", ""));
  386. jObject.Add(new JProperty("susr8", ""));
  387. jObject.Add(new JProperty("susr9", row["SUSR9"]));
  388. jObject.Add(new JProperty("susr10", ""));
  389. jObject.Add(new JProperty("susr11", ""));
  390. jObject.Add(new JProperty("susr12", ""));
  391. jObject.Add(new JProperty("susr13", ""));
  392. jObject.Add(new JProperty("susr14", ""));
  393. jObject.Add(new JProperty("susr15", ""));
  394. jObject.Add(new JProperty("susr16", ""));
  395. jObject.Add(new JProperty("susr17", ""));
  396. jObject.Add(new JProperty("susr18", ""));
  397. jObject.Add(new JProperty("susr19", ""));
  398. jObject.Add(new JProperty("susr20", row["SUSR20"]));
  399. jArray.Add(jObject);
  400. }
  401. JObject data = new JObject();
  402. data.Add(new JProperty("data", jArray));
  403. string jsonPara = JsonConvert.SerializeObject(data);
  404. Curtain.Log.Logger.Info("凤塘_昆船同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  405. string returnJsonStr = PostToZhongTai(_urlPush, jsonPara);
  406. Curtain.Log.Logger.Info("凤塘_昆船同步结束:\n" + returnJsonStr);
  407. try
  408. {
  409. returnObj = JsonConvert.DeserializeObject<JObject>(returnJsonStr);
  410. if (returnObj.ContainsKey("message"))
  411. {
  412. message = returnObj["message"] + "";
  413. }
  414. }
  415. catch (Exception ex)
  416. {
  417. if (string.IsNullOrEmpty(returnJsonStr))
  418. {
  419. message = ex.Message;
  420. }
  421. else
  422. {
  423. message = returnJsonStr;
  424. }
  425. }
  426. #endregion
  427. #region 结果处理
  428. char tokunchuanftime = message.Equals("请求成功") ? '1' : '0';
  429. // 更新推送结果
  430. string barcodes = "(" + string.Join(",", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field<decimal>("ID")).ToArray()) + ")";
  431. sqlUpdate = @"
  432. UPDATE TSAP_HEGII_FINISHEDPRODUCT
  433. SET TOKUNCHUANFLAG = @TOKUNCHUANFLAG@,
  434. KUNCHUANMSG = @KUNCHUANFMSG@,
  435. TOKUNCHUANTIME = SYSDATE
  436. WHERE ZTYPE = 'S'
  437. AND TOKUNCHUANFLAG = '0'
  438. AND ID IN " + barcodes;
  439. returnRows += connCZ2.ExecuteNonQuery(sqlUpdate,
  440. new CDAParameter("TOKUNCHUANFLAG", tokunchuanftime, DataType.Char),
  441. new CDAParameter("KUNCHUANFMSG", message, DataType.NVarChar)
  442. );
  443. #endregion
  444. }
  445. catch (Exception ex)
  446. {
  447. message = ex.Message;
  448. }
  449. }
  450. return message;
  451. }
  452. /// <summary>
  453. /// 同步产成品交接数据到恒洁中台_官塘
  454. /// </summary>
  455. /// <param name="syncDate">同步日期</param>
  456. /// <param name="isPushTodayAllData">是否推送当天剩余所有数据</param>
  457. /// <returns></returns>
  458. public static string SyncFinishedProduct_cz3(DateTime syncDate, bool isPushTodayAllData)
  459. {
  460. int returnRows = 0;
  461. string sql = string.Empty;
  462. string sqlUpdate = string.Empty;
  463. // 本次推送的数据
  464. DataTable dtSyncFinishProduct = null;
  465. // 返回json
  466. JObject returnObj;
  467. // 推送结果
  468. string message = string.Empty;
  469. using (IDataAccess connCZ3 = DataAccess.CreateByString(DataBaseType.Oracle, _connStr_cz3))
  470. {
  471. try
  472. {
  473. #region 获取产成品交接数据
  474. // 是否推送当天剩余的所有数据
  475. if (isPushTodayAllData)
  476. {
  477. sql = @"
  478. SELECT FP.OUTCODE AS CODE,
  479. FP.SAPCODE AS SKU,
  480. NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  481. FP.WORKCODE AS FACTORY,
  482. FP.ORDERCODE AS SALENUM,
  483. LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  484. 1 AS QTY,
  485. FP.OUTCODE AS SUSR1,
  486. SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  487. FP.YYYYMMDD AS SUSR4,
  488. FP.BARCODE AS SUSR5,
  489. FP.SECURITYCODE AS SUSR9,
  490. TO_CHAR(FP.LOGID) AS SUSR20,
  491. FP.ID
  492. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  493. WHERE FP.ZTYPE = 'S'
  494. AND FP.TOKUNCHUANFLAG = '0'
  495. AND FP.CREATETIME >= @DATEBEGIN@
  496. AND FP.CREATETIME < @DATEEND@
  497. ORDER BY FP.SAPFLBATCHNO,
  498. FP.OUTCODE ";
  499. }
  500. else
  501. {
  502. // 获取本次推送的数据(每次推送数据不超过200条)
  503. //sql = @"
  504. //SELECT T.*,
  505. // ROWNUM
  506. // FROM (SELECT FP.OUTCODE AS CODE,
  507. // FP.SAPCODE AS SKU,
  508. // NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  509. // FP.WORKCODE AS FACTORY,
  510. // FP.ORDERCODE AS SALENUM,
  511. // LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  512. // 1 AS QTY,
  513. // FP.OUTCODE AS SUSR1,
  514. // SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  515. // FP.YYYYMMDD AS SUSR4,
  516. // FP.BARCODE AS SUSR5,
  517. // FP.SECURITYCODE AS SUSR9,
  518. // TO_CHAR(FP.LOGID) AS SUSR20,
  519. // FP.ID
  520. // FROM TSAP_HEGII_FINISHEDPRODUCT FP
  521. // WHERE FP.ZTYPE = 'S'
  522. // AND FP.TOKUNCHUANFLAG = '0'
  523. // AND FP.CREATETIME >= @DATEBEGIN@
  524. // AND FP.CREATETIME < @DATEEND@
  525. // ORDER BY FP.SAPFLBATCHNO,
  526. // FP.OUTCODE ) T
  527. // WHERE ROWNUM <= 200 ";
  528. //按照成板去推送 edit 2023-09-20 qq
  529. sql = @"
  530. SELECT FP.OUTCODE AS CODE,
  531. FP.SAPCODE AS SKU,
  532. NVL(FP.BANMA, FP.SAPFLBATCHNO) AS LPNNUM,
  533. FP.WORKCODE AS FACTORY,
  534. FP.ORDERCODE AS SALENUM,
  535. LPAD(FP.ORDERITEM, 6, '0') AS SALELINE,
  536. 1 AS QTY,
  537. FP.OUTCODE AS SUSR1,
  538. SUBSTR(FP.OUTCODE, -10, 10) AS SUSR3,
  539. FP.YYYYMMDD AS SUSR4,
  540. FP.BARCODE AS SUSR5,
  541. FP.SECURITYCODE AS SUSR9,
  542. TO_CHAR(FP.LOGID) AS SUSR20,
  543. FP.ID,
  544. ROWNUM
  545. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  546. WHERE FP.ZTYPE = 'S'
  547. AND FP.TOKUNCHUANFLAG = '0'
  548. AND FP.SAPFLBATCHNO IN (
  549. SELECT DISTINCT T.SAPFLBATCHNO
  550. FROM (SELECT FP.SAPFLBATCHNO
  551. FROM TSAP_HEGII_FINISHEDPRODUCT FP
  552. WHERE FP.ZTYPE = 'S'
  553. AND FP.TOKUNCHUANFLAG = '0'
  554. AND FP.CREATETIME >= @DATEBEGIN@
  555. AND FP.CREATETIME <= @DATEEND@
  556. ORDER BY FP.SAPFLBATCHNO,
  557. FP.OUTCODE) T
  558. WHERE ROWNUM <= 180
  559. )
  560. ORDER BY FP.SAPFLBATCHNO,
  561. FP.OUTCODE ";
  562. }
  563. dtSyncFinishProduct = connCZ3.ExecuteDatatable(sql,
  564. new CDAParameter("DATEBEGIN", syncDate, DataType.Date),
  565. new CDAParameter("DATEEND", syncDate.AddDays(1), DataType.Date)
  566. );
  567. if (dtSyncFinishProduct.Rows.Count == 0)
  568. {
  569. return "本时段没有要推送的数据";
  570. }
  571. #endregion
  572. #region 向接口推送数据
  573. JObject jObject = null;
  574. JArray jArray = new JArray();
  575. foreach (DataRow row in dtSyncFinishProduct.Rows)
  576. {
  577. jObject = new JObject();
  578. jObject.Add(new JProperty("code", row["CODE"]));
  579. jObject.Add(new JProperty("sku", row["SKU"]));
  580. jObject.Add(new JProperty("lpnnum", row["LPNNUM"]));
  581. jObject.Add(new JProperty("factory", row["FACTORY"]));
  582. jObject.Add(new JProperty("saleNum", row["SALENUM"]));
  583. jObject.Add(new JProperty("saleLine", row["SALELINE"]));
  584. jObject.Add(new JProperty("qty", row["QTY"]));
  585. jObject.Add(new JProperty("susr1", row["SUSR1"]));
  586. jObject.Add(new JProperty("susr2", ""));
  587. jObject.Add(new JProperty("susr3", row["SUSR3"]));
  588. jObject.Add(new JProperty("susr4", row["SUSR4"]));
  589. jObject.Add(new JProperty("susr5", row["SUSR5"]));
  590. jObject.Add(new JProperty("susr6", ""));
  591. jObject.Add(new JProperty("susr7", ""));
  592. jObject.Add(new JProperty("susr8", ""));
  593. jObject.Add(new JProperty("susr9", row["SUSR9"]));
  594. jObject.Add(new JProperty("susr10", ""));
  595. jObject.Add(new JProperty("susr11", ""));
  596. jObject.Add(new JProperty("susr12", ""));
  597. jObject.Add(new JProperty("susr13", ""));
  598. jObject.Add(new JProperty("susr14", ""));
  599. jObject.Add(new JProperty("susr15", ""));
  600. jObject.Add(new JProperty("susr16", ""));
  601. jObject.Add(new JProperty("susr17", ""));
  602. jObject.Add(new JProperty("susr18", ""));
  603. jObject.Add(new JProperty("susr19", ""));
  604. jObject.Add(new JProperty("susr20", row["SUSR20"]));
  605. jArray.Add(jObject);
  606. }
  607. JObject data = new JObject();
  608. data.Add(new JProperty("data", jArray));
  609. string jsonPara = JsonConvert.SerializeObject(data);
  610. Curtain.Log.Logger.Info("官塘_昆船同步开始:" + dtSyncFinishProduct.Rows.Count + "\n" + jsonPara);
  611. string returnJsonStr = PostToZhongTai(_urlPush, jsonPara);
  612. Curtain.Log.Logger.Info("官塘_昆船同步结束:\n" + returnJsonStr);
  613. try
  614. {
  615. returnObj = JsonConvert.DeserializeObject<JObject>(returnJsonStr);
  616. if (returnObj.ContainsKey("message"))
  617. {
  618. message = returnObj["message"] + "";
  619. }
  620. }
  621. catch (Exception ex)
  622. {
  623. if (string.IsNullOrEmpty(returnJsonStr))
  624. {
  625. message = ex.Message;
  626. }
  627. else
  628. {
  629. message = returnJsonStr;
  630. }
  631. }
  632. #endregion
  633. #region 结果处理
  634. char tokunchuanftime = message.Equals("请求成功") ? '1' : '0';
  635. // 更新推送结果
  636. string barcodes = "(" + string.Join(",", dtSyncFinishProduct.AsEnumerable().Select(d => d.Field<decimal>("ID")).ToArray()) + ")";
  637. sqlUpdate = @"
  638. UPDATE TSAP_HEGII_FINISHEDPRODUCT
  639. SET TOKUNCHUANFLAG = @TOKUNCHUANFLAG@,
  640. KUNCHUANMSG = @KUNCHUANFMSG@,
  641. TOKUNCHUANTIME = SYSDATE
  642. WHERE ZTYPE = 'S'
  643. AND TOKUNCHUANFLAG = '0'
  644. AND ID IN " + barcodes;
  645. returnRows += connCZ3.ExecuteNonQuery(sqlUpdate,
  646. new CDAParameter("TOKUNCHUANFLAG", tokunchuanftime, DataType.Char),
  647. new CDAParameter("KUNCHUANFMSG", message, DataType.NVarChar)
  648. );
  649. #endregion
  650. }
  651. catch (Exception ex)
  652. {
  653. message = ex.Message;
  654. }
  655. }
  656. return message;
  657. }
  658. /// <summary>
  659. /// 推送数据
  660. /// </summary>
  661. /// <param name="url"></param>
  662. /// <param name="data"></param>
  663. /// <param name="token"></param>
  664. /// <returns></returns>
  665. private static string PostToZhongTai(string url, string data)
  666. {
  667. try
  668. {
  669. //将单引号转义成双引号
  670. data = data.Replace("'", "\"");
  671. //创建Web访问对象
  672. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  673. // 接口慢,设置30分钟超时等待
  674. myRequest.Timeout = 1800000;
  675. //把用户传过来的数据转成“UTF-8”的字节流
  676. byte[] buf = Encoding.GetEncoding("UTF-8").GetBytes(data);
  677. myRequest.Method = "POST";
  678. myRequest.ContentLength = buf.Length;
  679. myRequest.ContentType = "application/json;charset=UTF-8";
  680. //myRequest.MaximumAutomaticRedirections = 1;
  681. myRequest.AllowAutoRedirect = true;
  682. //string base64Header = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
  683. //发送请求
  684. Stream stream = myRequest.GetRequestStream();
  685. stream.Write(buf, 0, buf.Length);
  686. stream.Close();
  687. //获取接口返回值
  688. //通过Web访问对象获取响应内容
  689. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  690. //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
  691. StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  692. //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
  693. string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
  694. reader.Close();
  695. myResponse.Close();
  696. return returnXml;
  697. }
  698. catch (Exception ex)
  699. {
  700. return ex.Message;
  701. }
  702. }
  703. #endregion
  704. }