纽威
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

383 lines
19 KiB

3 years ago
3 years ago
  1. using ICSSoft.Common;
  2. using ICSSoft.Entity;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Linq;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data;
  8. using System.Data.SqlClient;
  9. using System.Linq;
  10. using System.Net.Http;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace ICSSoft.DataProject
  14. {
  15. /// <summary>
  16. /// 使用中
  17. /// 销售模块
  18. /// </summary>
  19. public class ICSSalesService
  20. {
  21. private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  22. #region 销售出库
  23. /// <summary>
  24. /// 销售出库
  25. /// </summary>
  26. /// <param name="TransCode"></param>
  27. /// <param name="TransSequence"></param>
  28. /// <param name="Quantity"></param>
  29. /// <param name="WorkPoint"></param>
  30. /// <param name="cmd"></param>
  31. public static void SalesShipmentDoc(string TransCode, string TransSequence, string Quantity, string WorkPoint, SqlCommand cmd)
  32. {
  33. try
  34. {
  35. string sql = @"DECLARE @Status VARCHAR(10)
  36. SELECT @Status=a.Status FROM ICSSDN a
  37. WHERE a.SDNCode='{0}' AND a.Sequence='{3}' AND a.WorkPoint='{1}' AND a.Type='1'
  38. IF (@Status IS NULL)
  39. BEGIN
  40. RAISERROR('{0} ',16,1);
  41. RETURN
  42. END
  43. ELSE IF (@Status!='2')
  44. BEGIN
  45. RAISERROR('{0} ',16,1);
  46. RETURN
  47. END
  48. UPDATE a SET SDNQuantity=ISNULL(SDNQuantity,0)+'{2}'
  49. FROM ICSSDN a
  50. WHERE a.SDNCode='{0}' AND a.Sequence='{3}' AND a.WorkPoint='{1}' AND a.Type='1'
  51. IF EXISTS(SELECT a.ID FROM ICSSDN a
  52. WHERE a.SDNCode='{0}' AND a.Sequence='{3}' and a.WorkPoint='{1}' AND a.Type='1' AND a.Quantity<a.SDNQuantity)
  53. BEGIN
  54. RAISERROR('{0}{3} ',16,1);
  55. RETURN
  56. END";
  57. sql = string.Format(sql, TransCode, WorkPoint, Quantity, TransSequence);
  58. if (!DBHelper.ExecuteNonQuery(sql, cmd))
  59. {
  60. throw new Exception("销售领料单更新失败!");
  61. }
  62. }
  63. catch (Exception)
  64. {
  65. throw;
  66. }
  67. }
  68. /// <summary>
  69. /// 销售出库接口
  70. /// </summary>
  71. /// <param name="TransType"></param>
  72. /// <param name="Identification"></param>
  73. /// <param name="cmd"></param>
  74. public static void SalesShipmentDocERP(string TransType, string Identification, SqlCommand cmd)
  75. {
  76. try
  77. {
  78. #region ERP
  79. string sql = @"SELECT b.CusCode+a.FromWarehouseCode+b.SDNCode+a.MUSER AS Costre,b.CusCode,a.FromWarehouseCode AS WarehouseCode,b.SDNCode,a.MUSER,ROW_NUMBER() OVER (ORDER BY b.CusCode,a.FromWarehouseCode,b.SDNCode,b.SDNDetailID,a.InvCode) AS Sequence,
  80. a.InvCode,SUM(a.Quantity) AS Quantity,0 AS Amount,b.SDNDetailID,Enable AS UpdateTodoQuantity
  81. INTO #TempERP
  82. FROM ICSWareHouseLotInfoLog a
  83. INNER JOIN ICSSDN b ON a.TransCode=b.SDNCode AND a.TransSequence=b.Sequence AND a.WorkPoint=b.WorkPoint
  84. INNER JOIN ICSConfiguration con ON con.Code='Stock002' AND a.WorkPoint=con.WorkPoint
  85. WHERE a.Identification='{0}' AND ERPUpload='0' AND b.Type='1'
  86. GROUP BY b.CusCode,a.FromWarehouseCode,b.SDNCode,a.MUSER,a.InvCode,b.SDNDetailID,Enable
  87. SELECT DISTINCT Costre,CusCode,WarehouseCode AS WHCode,SDNCode AS SDNCode,MUSER AS [User],SYSDATETIME() AS MTime,UpdateTodoQuantity FROM #TempERP
  88. SELECT Costre,Sequence,InvCode,Quantity,Amount,SDNDetailID FROM #TempERP
  89. DROP TABLE #TempERP";
  90. sql = string.Format(sql, Identification);
  91. DataSet ds = DBHelper.SQlReturnDataSet(sql, cmd);
  92. string Inputstr = DataToJsonHelper.DataSetToJson(ds, "details", "Costre");
  93. string resultStr = HTTPHelper.HttpPost(TransType, ERPUrl.SalesDeliveryNoticeURL, Inputstr);
  94. Result result = new Result();
  95. result = JsonConvert.DeserializeObject<Result>(resultStr);
  96. if (result.Success)
  97. {
  98. try
  99. {
  100. JArray res = (JArray)JsonConvert.DeserializeObject(result.Data.ToString());
  101. foreach (var item in res)
  102. {
  103. JObject jo = (JObject)item;
  104. JArray resdetail = (JArray)JsonConvert.DeserializeObject(jo["details"].ToString());
  105. foreach (var detail in resdetail)
  106. {
  107. JObject det = (JObject)detail;
  108. ICSWareHouseLotInfoService.WareHouseLotInfoLogUpdate(TransType, det["SDNDetailID"].ToString(), Identification, jo["ID"].ToString(), det["DetailID"].ToString(), jo["SSDCode"].ToString(), det["Sequence"].ToString(), cmd);
  109. }
  110. }
  111. }
  112. catch (Exception ex)
  113. {
  114. log.Debug(ex.ToString());
  115. log.Debug(resultStr);
  116. }
  117. }
  118. else
  119. {
  120. throw new Exception("ERP接口调用失败:"+result.Message);
  121. }
  122. #endregion
  123. }
  124. catch (Exception)
  125. {
  126. throw;
  127. }
  128. }
  129. #endregion
  130. #region 销售退货
  131. /// <summary>
  132. /// 销售退货
  133. /// </summary>
  134. /// <param name="TransCode"></param>
  135. /// <param name="TransSequence"></param>
  136. /// <param name="Quantity"></param>
  137. /// <param name="WorkPoint"></param>
  138. /// <param name="cmd"></param>
  139. public static void SalesShipmentDocNegative(string LotNo, string Quantity, string WorkPoint, SqlCommand cmd)
  140. {
  141. try
  142. {
  143. string sql = @"DECLARE @Status VARCHAR(10)
  144. SELECT @Status=c.Status FROM ICSInventoryLot a
  145. INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint
  146. INNER JOIN ICSSDN c ON b.TransCode=c.SDNCode AND b.TransSequence=c.Sequence AND b.WorkPoint=c.WorkPoint
  147. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND c.Type='2'
  148. IF (@Status IS NULL)
  149. BEGIN
  150. RAISERROR('{0} ',16,1);
  151. RETURN
  152. END
  153. ELSE IF (@Status!='2')
  154. BEGIN
  155. RAISERROR('{0} ',16,1);
  156. RETURN
  157. END
  158. UPDATE c SET SDNQuantity=ISNULL(SDNQuantity,0)+'{2}'
  159. FROM ICSInventoryLot a
  160. INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint
  161. INNER JOIN ICSSDN c ON b.TransCode=c.SDNCode AND b.TransSequence=c.Sequence AND b.WorkPoint=c.WorkPoint
  162. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND c.Type='2'
  163. IF EXISTS(SELECT a.LotNo FROM ICSInventoryLot a
  164. INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint
  165. INNER JOIN ICSSDN c ON b.TransCode=c.SDNCode AND b.TransSequence=c.Sequence AND b.WorkPoint=c.WorkPoint
  166. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND c.Type='2' AND c.Quantity<c.SDNQuantity)
  167. BEGIN
  168. RAISERROR('{0}退退',16,1);
  169. END";
  170. sql = string.Format(sql, LotNo, WorkPoint, Quantity);
  171. if (!DBHelper.ExecuteNonQuery(sql, cmd))
  172. {
  173. throw new Exception("销售退货单更新失败!");
  174. }
  175. }
  176. catch (Exception)
  177. {
  178. throw;
  179. }
  180. }
  181. /// <summary>
  182. /// 销售退货接口
  183. /// </summary>
  184. /// <param name="TransType"></param>
  185. /// <param name="Identification"></param>
  186. /// <param name="cmd"></param>
  187. public static void SalesShipmentDocNegativeERP(string TransType, string Identification, SqlCommand cmd)
  188. {
  189. try
  190. {
  191. #region ERP
  192. string sql = @"SELECT c.CusCode+a.ToWarehouseCode+c.SDNCode+a.MUSER AS Costre,c.CusCode,a.ToWarehouseCode AS WarehouseCode,c.SDNCode,a.MUSER,ROW_NUMBER() OVER (ORDER BY c.CusCode,a.ToWarehouseCode,c.SDNCode,c.SDNDetailID,a.InvCode) AS Sequence,
  193. a.InvCode,SUM(a.Quantity) AS Quantity,0 AS Amount,c.SDNDetailID,Enable AS UpdateTodoQuantity
  194. INTO #TempERP
  195. FROM ICSWareHouseLotInfoLog a
  196. INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint
  197. INNER JOIN ICSSDN c ON b.TransCode=c.SDNCode AND b.TransSequence=c.Sequence AND b.WorkPoint=c.WorkPoint
  198. INNER JOIN ICSConfiguration con ON con.Code='Stock001' AND a.WorkPoint=con.WorkPoint
  199. WHERE a.Identification='{0}' AND ERPUpload='0' AND c.Type='2'
  200. GROUP BY c.CusCode,a.ToWarehouseCode,c.SDNCode,a.MUSER,a.InvCode,c.SDNDetailID,Enable
  201. SELECT DISTINCT Costre,CusCode,WarehouseCode AS WHCode,SDNCode AS SDNRTCode,MUSER AS [User],SYSDATETIME() AS MTime,UpdateTodoQuantity FROM #TempERP
  202. SELECT Costre,Sequence,InvCode,Quantity,Amount,SDNDetailID AS SDNRTDetailID FROM #TempERP
  203. DROP TABLE #TempERP";
  204. sql = string.Format(sql, Identification);
  205. DataSet ds = DBHelper.SQlReturnDataSet(sql, cmd);
  206. string Inputstr = DataToJsonHelper.DataSetToJson(ds, "details", "Costre");
  207. string resultStr = HTTPHelper.HttpPost(TransType, ERPUrl.SalesReturnBackURL, Inputstr);
  208. Result result = new Result();
  209. result = JsonConvert.DeserializeObject<Result>(resultStr);
  210. if (result.Success)
  211. {
  212. try
  213. {
  214. JArray res = (JArray)JsonConvert.DeserializeObject(result.Data.ToString());
  215. foreach (var item in res)
  216. {
  217. JObject jo = (JObject)item;
  218. JArray resdetail = (JArray)JsonConvert.DeserializeObject(jo["details"].ToString());
  219. foreach (var detail in resdetail)
  220. {
  221. JObject det = (JObject)detail;
  222. ICSWareHouseLotInfoService.WareHouseLotInfoLogUpdate(TransType, det["SDNRTDetailID"].ToString(), Identification, jo["ID"].ToString(), det["DetailID"].ToString(), jo["SDNNEGCode"].ToString(), det["Sequence"].ToString(), cmd);
  223. }
  224. }
  225. }
  226. catch (Exception ex)
  227. {
  228. log.Debug(ex.ToString());
  229. log.Debug(resultStr);
  230. }
  231. }
  232. else
  233. {
  234. throw new Exception("ERP接口调用失败:"+result.Message);
  235. }
  236. #endregion
  237. }
  238. catch (Exception)
  239. {
  240. throw;
  241. }
  242. }
  243. #endregion
  244. #region 销售退货-原条码
  245. /// <summary>
  246. /// 销售退货-原条码
  247. /// </summary>
  248. /// <param name="TransCode"></param>
  249. /// <param name="TransSequence"></param>
  250. /// <param name="Quantity"></param>
  251. /// <param name="WorkPoint"></param>
  252. /// <param name="cmd"></param>
  253. public static void SalesReturnBackIn(string TransCode, string TransSequence, string LotNo, string Quantity, string WorkPoint, SqlCommand cmd)
  254. {
  255. try
  256. {
  257. string sql = @"DECLARE @Status VARCHAR(10)
  258. SELECT @Status=sdn.Status FROM ICSSDN sdn
  259. INNER JOIN ICSWareHouseLotInfoLog log ON sdn.WorkPoint=log.WorkPoint
  260. INNER JOIN ICSWareHouseLotInfo a ON a.LotNo=log.LotNo AND a.WorkPoint=log.WorkPoint
  261. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND sdn.SDNCode='{2}' AND sdn.Sequence='{3}' AND sdn.Type='2'
  262. IF (@Status IS NULL)
  263. BEGIN
  264. RAISERROR('{0} ',16,1);
  265. RETURN
  266. END
  267. ELSE IF (@Status!='2')
  268. BEGIN
  269. RAISERROR('{0} ',16,1);
  270. RETURN
  271. END
  272. UPDATE sdn SET SDNQuantity=ISNULL(SDNQuantity,0)+'{2}'
  273. FROM ICSSDN sdn
  274. INNER JOIN ICSWareHouseLotInfoLog log ON sdn.WorkPoint=log.WorkPoint
  275. INNER JOIN ICSWareHouseLotInfo a ON a.LotNo=log.LotNo AND a.WorkPoint=log.WorkPoint
  276. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND sdn.SDNCode='{2}' AND sdn.Sequence='{3}' AND sdn.Type='2'
  277. IF EXISTS(SELECT a.LotNo FROM ICSSDN sdn
  278. INNER JOIN ICSWareHouseLotInfoLog log ON sdn.WorkPoint=log.WorkPoint
  279. INNER JOIN ICSWareHouseLotInfo a ON a.LotNo=log.LotNo AND a.WorkPoint=log.WorkPoint
  280. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND sdn.SDNCode='{2}' AND sdn.Sequence='{3}' AND sdn.Type='2' AND sdn.Quantity<sdn.SDNQuantity)
  281. BEGIN
  282. RAISERROR('{0}退退',16,1);
  283. END";
  284. sql = string.Format(sql, LotNo, WorkPoint, Quantity, TransCode, TransSequence);
  285. if (!DBHelper.ExecuteNonQuery(sql, cmd))
  286. {
  287. throw new Exception("销售退货单更新失败!");
  288. }
  289. }
  290. catch (Exception)
  291. {
  292. throw;
  293. }
  294. }
  295. /// <summary>
  296. /// 销售退货-原条码接口
  297. /// </summary>
  298. /// <param name="TransType"></param>
  299. /// <param name="Identification"></param>
  300. /// <param name="cmd"></param>
  301. public static void SalesReturnBackInERP(string TransType, string Identification, SqlCommand cmd)
  302. {
  303. try
  304. {
  305. #region ERP
  306. string sql = @"SELECT c.CusCode+a.ToWarehouseCode+c.SDNCode+a.MUSER AS Costre,c.CusCode,a.ToWarehouseCode AS WarehouseCode,c.SDNCode,a.MUSER,ROW_NUMBER() OVER (ORDER BY c.CusCode,a.ToWarehouseCode,c.SDNCode,c.SDNDetailID,a.InvCode) AS Sequence,
  307. a.InvCode,SUM(a.Quantity) AS Quantity,0 AS Amount,c.SDNDetailID,Enable AS UpdateTodoQuantity
  308. INTO #TempERP
  309. FROM ICSWareHouseLotInfoLog a
  310. INNER JOIN ICSSDN c ON a.TransCode=c.SDNCode AND a.TransSequence=c.Sequence AND a.WorkPoint=c.WorkPoint
  311. INNER JOIN ICSConfiguration con ON con.Code='Stock001' AND a.WorkPoint=con.WorkPoint
  312. WHERE a.Identification='{0}' AND ERPUpload='0' AND c.Type='2'
  313. GROUP BY c.CusCode,a.ToWarehouseCode,c.SDNCode,a.MUSER,a.InvCode,c.SDNDetailID,Enable
  314. SELECT DISTINCT Costre,CusCode,WarehouseCode AS WHCode,SDNCode AS SDNRTCode,MUSER AS [User],SYSDATETIME() AS MTime,UpdateTodoQuantity FROM #TempERP
  315. SELECT Costre,Sequence,InvCode,Quantity,Amount,SDNDetailID AS SDNRTDetailID FROM #TempERP
  316. DROP TABLE #TempERP";
  317. sql = string.Format(sql, Identification);
  318. DataSet ds = DBHelper.SQlReturnDataSet(sql, cmd);
  319. string Inputstr = DataToJsonHelper.DataSetToJson(ds, "details", "Costre");
  320. string resultStr = HTTPHelper.HttpPost(TransType, ERPUrl.SalesReturnBackURL, Inputstr);
  321. Result result = new Result();
  322. result = JsonConvert.DeserializeObject<Result>(resultStr);
  323. if (result.Success)
  324. {
  325. try
  326. {
  327. JArray res = (JArray)JsonConvert.DeserializeObject(result.Data.ToString());
  328. foreach (var item in res)
  329. {
  330. JObject jo = (JObject)item;
  331. JArray resdetail = (JArray)JsonConvert.DeserializeObject(jo["details"].ToString());
  332. foreach (var detail in resdetail)
  333. {
  334. JObject det = (JObject)detail;
  335. ICSWareHouseLotInfoService.WareHouseLotInfoLogUpdate(TransType, det["SDNRTDetailID"].ToString(), Identification, jo["ID"].ToString(), det["DetailID"].ToString(), jo["SDNNEGCode"].ToString(), det["Sequence"].ToString(), cmd);
  336. }
  337. }
  338. }
  339. catch (Exception ex)
  340. {
  341. log.Debug(ex.ToString());
  342. log.Debug(resultStr);
  343. }
  344. }
  345. else
  346. {
  347. throw new Exception("ERP接口调用失败:" + result.Message);
  348. }
  349. #endregion
  350. }
  351. catch (Exception)
  352. {
  353. throw;
  354. }
  355. }
  356. #endregion
  357. }
  358. }