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.

401 lines
20 KiB

3 weeks ago
  1. using NFine.Data.Extensions;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using NFine.Code;
  9. using NFine.Repository;
  10. using System.Data.Common;
  11. using NFine.Domain._03_Entity.SRM;
  12. using ICS.Application.Entity;
  13. using Newtonsoft.Json;
  14. using System.Configuration;
  15. using System.Data.SqlClient;
  16. using ICS.Data;
  17. using Newtonsoft.Json.Linq;
  18. using System.Net;
  19. using System.IO;
  20. using NFine.Domain._03_Entity.WMS;
  21. namespace NFine.Application.WMSKBS
  22. {
  23. public class ICSLotFreezeDHApp : RepositoryFactory<ICSVendor>
  24. {
  25. /// <summary>
  26. /// 点击委外退料生成条码
  27. /// </summary>
  28. public string GetNewLotNo(string LotNO)
  29. {
  30. DataTable dt = new DataTable();
  31. List<DbParameter> parameter = new List<DbParameter>();
  32. //string sql = @"select max(LotNo) as NewLotNo from ICSInventoryLot where EATTRIBUTE1='{0}' ";
  33. string sql = @"SELECT TOP 1 LotNO as NewLotNo FROM ICSInventoryLot WHERE EATTRIBUTE1='{0}'
  34. ORDER BY CAST(SUBSTRING(LotNO, (LEN(LotNO)-CHARINDEX('-',REVERSE(LotNO))+1)+1,CHARINDEX('-',REVERSE(LotNO))-1) AS INT) DESC";
  35. sql = string.Format(sql, LotNO);
  36. dt = Repository().FindTableBySql(sql.ToString());
  37. if (dt == null || dt.Rows.Count == 0 || dt.Rows[0]["NewLotNo"].ToString() == "")
  38. {
  39. return LotNO + "-1";
  40. }
  41. else
  42. {
  43. string newLotNO = dt.Rows[0]["NewLotNo"].ToString();
  44. int COUNT = Convert.ToInt32(newLotNO.Substring(newLotNO.LastIndexOf('-') + 1)) + 1;
  45. return LotNO + "-" + COUNT.ToString();
  46. }
  47. }
  48. /// <summary>
  49. /// 查询冻结条码是否填写过
  50. /// </summary>
  51. public string GetBathCode(string BatchCode)
  52. {
  53. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  54. //string sql = @"select max(LotNo) as NewLotNo from ICSInventoryLot where EATTRIBUTE1='{0}' ";
  55. string sql = $@" SELECT top 1 LotNo FROM ICSWareHouseLotInfoLog WHERE BusinessCode='52' AND EATTRIBUTE6='{BatchCode}' AND WorkPoint='{WorkPoint}' ";
  56. DataTable dt = Repository().FindTableBySql(sql.ToString());
  57. if (dt == null || dt.Rows.Count == 0 )
  58. {
  59. return "";
  60. }
  61. else
  62. {
  63. return $"该批次已经绑定过条码{dt.Rows[0]["LotNo"]}";
  64. }
  65. }
  66. public string Freeze(string LotNOList, string Memo, string BatchCode)
  67. {
  68. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  69. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  70. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  71. string Identification = Guid.NewGuid().ToString();
  72. string msg = "";
  73. string sql = string.Empty;
  74. string LotList = "";
  75. foreach (string LotNO in LotNOList.Split(','))
  76. {
  77. LotList += "'" + LotNO + "',";
  78. }
  79. try
  80. {
  81. LotList = LotList.TrimEnd(',');
  82. string switchsql = @"select CASE when Enable='true' Then '是' ELSE '否' END AS Switch from ICSConfiguration
  83. where Code ='LotFreezeToERP' and WorkPoint='{0}'";
  84. switchsql = string.Format(switchsql, WorkPoint);
  85. DataTable switchdt = Repository().FindTableBySql(switchsql.ToString());
  86. if (switchdt.Rows.Count == 0 || switchdt.Rows[0]["Switch"].ToString() == "否")
  87. //if (switchdt.Rows.Count != 0)
  88. {
  89. sql = @"update ICSWareHouseLotInfo set Freeze=1
  90. where LotNo IN ({0}) and WorkPoint='{1}'
  91. insert into ICSWareHouseLotInfoLog
  92. (ID,Identification,LotNo,InvCode,FromWarehouseCode,FromLocationCode,Quantity,Memo,Lock,TransType,BusinessCode,ERPUpload
  93. ,MUSER,MUSERName,MTIME,WorkPoint,EATTRIBUTE6)
  94. SELECT NEWID(),'{2}',LotNo,InvCode,WarehouseCode,LocationCode,Quantity,'{3}','0','10','52','0'
  95. ,'{4}','{5}',GETDATE(),'{1}','{6}' FROM ICSWareHouseLotInfo
  96. WHERE LotNo IN ({0}) AND WorkPoint='{1}'";
  97. sql = string.Format(sql, LotList, WorkPoint, Identification, Memo, MUSER, MUSERNAME, BatchCode);
  98. if (SqlHelper.ExecuteNonQuery(sql) == LotNOList.Split(',').Count() * 2)
  99. {
  100. msg = "";
  101. }
  102. else
  103. {
  104. msg = "冻结失败";
  105. }
  106. }
  107. else
  108. {
  109. sql = @" update ICSWareHouseLotInfo set Freeze=1
  110. where LotNo IN ({0}) and WorkPoint='{1}'
  111. insert into ICSWareHouseLotInfoLog
  112. (ID,Identification,LotNo,InvCode,FromWarehouseCode,FromLocationCode,Quantity,Memo,Lock,TransType,BusinessCode,ERPUpload
  113. ,MUSER,MUSERName,MTIME,WorkPoint,EATTRIBUTE6)
  114. SELECT NEWID(),'{2}',LotNo,InvCode,WarehouseCode,LocationCode,Quantity,'{3}','0','10','52','0'
  115. ,'{4}','{5}',GETDATE(),'{6}','{7}' FROM ICSWareHouseLotInfo
  116. WHERE LotNo IN ({0}) AND WorkPoint='{1}'
  117. select '' as Costre , '' as DepCode,d.WarehouseCode as InWhCode, (row_number() over(order by b.LotNo,d.WarehouseCode,b.InvCode)-1)/2+1 as GroupNO ,
  118. d.WarehouseCode as OutWhCode,row_number() over(order by b.LotNo,d.WarehouseCode,b.InvCode) as Sequence,b.InvCode,'' as [Type] ,d.WarehouseCode as WHCode,'false' AS UpdateStock,
  119. d.Quantity as Quantity ,b.Amount,'{4}' as [User],b.WorkPoint,
  120. isnull(c.BatchCode,'') as BatchCode ,isnull(c.ProjectCode,'') as ProjectCode,isnull(c.Version,'') as Version,isnull(c.Brand,'') as Brand,isnull(c.cFree1,'') as cFree1,isnull(c.cFree2,'') as cFree2,isnull(c.cFree3,'') as cFree3,isnull(c.cFree4,'') as cFree4,isnull(c.cFree5,'') as cFree5,isnull(c.cFree6,'') as cFree6,
  121. isnull(c.cFree7,'') as cFree7,isnull(c.cFree8,'') as cFree8,isnull(c.cFree9,'') as cFree9,isnull(c.cFree10,'') as cFree10
  122. INTO #TempERP
  123. from ICSInventoryLot b
  124. left join ICSExtension c on b.ExtensionID=c.ID and b.WorkPoint=c.WorkPoint
  125. left join ICSWareHouseLotInfo d on d.LotNo=b.LotNo and d.WorkPoint=b.WorkPoint
  126. where b.LotNo in ({0}) and b.WorkPoint='{1}'
  127. select distinct Costre, DepCode,InWhCode,OutWhCode,[User],getdate() as MTime,WorkPoint,UpdateStock,'TransForm002' as TransferType FROM #TempERP
  128. select Costre, Sequence,GroupNO,[Type],InvCode,WHCode,BatchCode,ProjectCode,Quantity,Amount,Version,Brand,cFree1,cFree2,cFree3,cFree4,cFree5,cFree6,cFree7,cFree8,cFree9,cFree10 FROM #TempERP
  129. DROP TABLE #TempERP ";
  130. sql = string.Format(sql, LotList, WorkPoint, Identification, Memo, MUSER, MUSERNAME, WorkPoint,BatchCode);
  131. msg = CmdExecuteData(sql);
  132. }
  133. }
  134. catch (Exception ex)
  135. {
  136. throw new Exception(ex.Message);
  137. }
  138. return msg;
  139. }
  140. public string UnFreeze(string LotNOList, string Memo)
  141. {
  142. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  143. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  144. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  145. string Identification = Guid.NewGuid().ToString();
  146. string msg = "";
  147. string sql = string.Empty;
  148. string LotList = "";
  149. foreach (string LotNO in LotNOList.Split(','))
  150. {
  151. LotList += "'" + LotNO + "',";
  152. }
  153. try
  154. {
  155. LotList = LotList.TrimEnd(',');
  156. string switchsql = @"select CASE when Enable='true' Then '是' ELSE '否' END AS Switch from ICSConfiguration
  157. where Code ='LotFreezeToERP' and WorkPoint='{0}'";
  158. switchsql = string.Format(switchsql, WorkPoint);
  159. DataTable switchdt = Repository().FindTableBySql(switchsql.ToString());
  160. if (switchdt.Rows.Count == 0 || switchdt.Rows[0]["Switch"].ToString() == "否")
  161. {
  162. sql = @"update ICSWareHouseLotInfo set Freeze=0
  163. where LotNo IN ({0}) and WorkPoint='{1}'
  164. UPDATE ICSWareHouseLotInfoLog SET EATTRIBUTE6='',EATTRIBUTE7=EATTRIBUTE6 WHERE LotNo IN ({0}) and WorkPoint='{1}' AND BusinessCode='52' AND ISNULL(EATTRIBUTE6, '')!=''
  165. insert into ICSWareHouseLotInfoLog
  166. (ID,Identification,LotNo,InvCode,FromWarehouseCode,FromLocationCode,Quantity,Memo,Lock,TransType,BusinessCode,ERPUpload
  167. ,MUSER,MUSERName,MTIME,WorkPoint)
  168. SELECT NEWID(),'{2}',LotNo,InvCode,WarehouseCode,LocationCode,Quantity,'{3}','0','10','53','0'
  169. ,'{4}','{5}',GETDATE(),'{1}' FROM ICSWareHouseLotInfo
  170. WHERE LotNo IN ({0}) AND WorkPoint='{1}'";
  171. sql = string.Format(sql, LotList, WorkPoint, Identification, Memo, MUSER, MUSERNAME);
  172. if (SqlHelper.ExecuteNonQuery(sql) >0)
  173. {
  174. msg = "";
  175. }
  176. else
  177. {
  178. msg = "解除冻结失败";
  179. }
  180. }
  181. else
  182. {
  183. sql = @" update ICSWareHouseLotInfo set Freeze=0
  184. where LotNo IN ({0}) and WorkPoint='{1}'
  185. UPDATE ICSWareHouseLotInfoLog SET EATTRIBUTE6='',EATTRIBUTE7=EATTRIBUTE6 WHERE LotNo IN ({0}) and WorkPoint='{1}' AND BusinessCode='52' AND ISNULL(EATTRIBUTE6, '')!=''
  186. insert into ICSWareHouseLotInfoLog
  187. (ID,Identification,LotNo,InvCode,FromWarehouseCode,FromLocationCode,Quantity,Memo,Lock,TransType,BusinessCode,ERPUpload
  188. ,MUSER,MUSERName,MTIME,WorkPoint)
  189. SELECT NEWID(),'{2}',LotNo,InvCode,WarehouseCode,LocationCode,Quantity,'{3}','0','10','53','0'
  190. ,'{4}','{5}',GETDATE(),'{6}' FROM ICSWareHouseLotInfo
  191. WHERE LotNo IN ({0}) AND WorkPoint='{1}'
  192. select '' as Costre , '' as DepCode,d.WarehouseCode as InWhCode, (row_number() over(order by b.LotNo,d.WarehouseCode,b.InvCode)-1)/2+1 as GroupNO ,
  193. d.WarehouseCode as OutWhCode,row_number() over(order by b.LotNo,d.WarehouseCode,b.InvCode) as Sequence,b.InvCode,'' as [Type] ,d.WarehouseCode as WHCode,'false' AS UpdateStock,
  194. d.Quantity as Quantity ,b.Amount,'{2}' as [User],b.WorkPoint,
  195. isnull(c.BatchCode,'') as BatchCode ,isnull(c.ProjectCode,'') as ProjectCode,isnull(c.Version,'') as Version,isnull(c.Brand,'') as Brand,isnull(c.cFree1,'') as cFree1,isnull(c.cFree2,'') as cFree2,isnull(c.cFree3,'') as cFree3,isnull(c.cFree4,'') as cFree4,isnull(c.cFree5,'') as cFree5,isnull(c.cFree6,'') as cFree6,
  196. isnull(c.cFree7,'') as cFree7,isnull(c.cFree8,'') as cFree8,isnull(c.cFree9,'') as cFree9,isnull(c.cFree10,'') as cFree10
  197. INTO #TempERP
  198. from ICSInventoryLot b
  199. left join ICSExtension c on b.ExtensionID=c.ID and b.WorkPoint=c.WorkPoint
  200. left join ICSWareHouseLotInfo d on d.LotNo=b.LotNo and d.WorkPoint=b.WorkPoint
  201. where b.LotNo in ({0}) and b.WorkPoint='{1}'
  202. select distinct Costre, DepCode,InWhCode,OutWhCode,[User],getdate() as MTime,WorkPoint,UpdateStock,'TransForm002' as TransferType FROM #TempERP
  203. select Costre, Sequence,GroupNO,[Type],InvCode,WHCode,BatchCode,ProjectCode,Quantity,Amount,Version,Brand,cFree1,cFree2,cFree3,cFree4,cFree5,cFree6,cFree7,cFree8,cFree9,cFree10 FROM #TempERP
  204. DROP TABLE #TempERP ";
  205. sql = string.Format(sql, LotList, WorkPoint, Identification, Memo, MUSER, MUSERNAME, WorkPoint);
  206. CmdExecuteData(sql);
  207. }
  208. }
  209. catch (Exception ex)
  210. {
  211. throw new Exception(ex.Message);
  212. }
  213. return msg;
  214. }
  215. public string CmdExecuteData(string sql)
  216. {
  217. string msg = "";
  218. try
  219. {
  220. string connString = SqlHelper.DataCenterConnString;
  221. SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString);
  222. conn.Open();
  223. SqlTransaction sqlTran = conn.BeginTransaction();
  224. SqlCommand cmd = new SqlCommand();
  225. cmd.Transaction = sqlTran;
  226. cmd.Connection = conn;
  227. try
  228. {
  229. DataSet DSet = SqlCommandHelper.SQlReturnDataSet(sql, cmd);
  230. string Inputstr = SqlHelper.DataSetToJson(DSet, "details", "Costre");
  231. string APIURL = ConfigurationManager.ConnectionStrings["ERPAPIURL"].ConnectionString + "MorphologicalTransformationToFreezeDoc/Create";
  232. string result = HttpPost(APIURL, Inputstr);
  233. JObject Obj = (JObject)JsonConvert.DeserializeObject(result);//或者JObject jo = JObject.Parse(jsonText);
  234. string MessAge = Obj["Message"].ToString();
  235. string Success = Obj["Success"].ToString();
  236. string ERPSql = "";
  237. if (Success.ToUpper() == "FALSE")
  238. {
  239. throw new Exception(MessAge);
  240. }
  241. else
  242. {
  243. //try
  244. //{
  245. // JArray res = (JArray)JsonConvert.DeserializeObject(Obj["Data"].ToString());
  246. // foreach (var item in res)
  247. // {
  248. // JObject jo = (JObject)item;
  249. // JArray resdetail = (JArray)JsonConvert.DeserializeObject(jo["details"].ToString());
  250. // foreach (var detail in resdetail)
  251. // {
  252. // JObject det = (JObject)detail;
  253. // ERPSql += @"UPDATE a set ERPID='{3}',ERPDetailID='{4}',ERPCode='{5}',ERPSequence='{6}',ERPUpload='1'
  254. // from ICSWareHouseLotInfoLog a
  255. // inner join ICSMTDOC b on a.LotNo=b.LotNo and a.WorkPoint=b.WorkPoint
  256. // where b.MTDOCCode='{0}' and b.Sequence='{1}' and a.Identification='{2}'";
  257. // ERPSql += @" update ICSMTDOC set MTDOCID='{3}',MTDOCDetailID='{4}' where MTDOCCode='{0}' and Sequence='{1}'";
  258. // ERPSql = string.Format(ERPSql, MTDOCCode, det["Sequence"].ToString(), Identification, jo["ID"].ToString(), det["DetailID"].ToString(), jo["MTCode"].ToString(), det["Sequence"].ToString());
  259. // }
  260. // }
  261. // SqlCommandHelper.CmdExecuteNonQuery(ERPSql, cmd);
  262. //}
  263. //catch (Exception ex)
  264. //{
  265. // msg = ex.Message;
  266. //}
  267. }
  268. cmd.Transaction.Commit();
  269. //return dt;
  270. }
  271. catch (Exception ex)
  272. {
  273. cmd.Transaction.Rollback();
  274. msg = ex.Message;
  275. }
  276. finally
  277. {
  278. if (conn.State == ConnectionState.Open)
  279. {
  280. conn.Close();
  281. }
  282. conn.Dispose();
  283. }
  284. }
  285. catch (Exception ex)
  286. {
  287. msg = ex.Message;
  288. }
  289. return msg;
  290. }
  291. //接口api解析
  292. public static string HttpPost(string url, string body)
  293. {
  294. try
  295. {
  296. Encoding encoding = Encoding.UTF8;
  297. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  298. request.Method = "POST";
  299. request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
  300. request.ContentType = "application/json; charset=utf-8";
  301. byte[] buffer = encoding.GetBytes(body);
  302. request.ContentLength = buffer.Length;
  303. request.GetRequestStream().Write(buffer, 0, buffer.Length);
  304. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  305. using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
  306. {
  307. return reader.ReadToEnd();
  308. }
  309. }
  310. catch (WebException ex)
  311. {
  312. throw new Exception(ex.Message);
  313. }
  314. }
  315. /// <summary>
  316. /// 根据ID获取条码
  317. /// </summary>
  318. /// <returns></returns>
  319. public DataTable GetLotNoByID(string ID)
  320. {
  321. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  322. string sql = @"select '' as ID,'' as LotNo union all
  323. SELECT ID,LotNo FROM ICSWareHouseLotInfo WITH (NOLOCK) WHERE ID in ({0}) ";
  324. sql = string.Format(sql, ID.TrimEnd(','));
  325. //string role = NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode;
  326. //if (role != "admin")
  327. //{
  328. // sql += " and b.WorkPoint='" + WorkPoint + "'";
  329. //}
  330. DataTable dt = SqlHelper.GetDataTableBySql(sql);
  331. return dt;
  332. }
  333. //合批
  334. public string Combine(string LotNo, string ID)
  335. {
  336. string msg = "";
  337. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  338. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  339. string sql = @" select distinct LotNo,Quantity from ICSWareHouseLotInfo WHERE ID IN (" + ID.TrimEnd(',') + ")";
  340. DataTable dt = Repository().FindTableBySql(sql.ToString());
  341. List<LotNoCombineHead> asn = new List<LotNoCombineHead>();
  342. LotNoCombineHead ass = new LotNoCombineHead();
  343. for (int i = 0; i < dt.Rows.Count; i++)
  344. {
  345. if (LotNo == dt.Rows[i]["LotNo"].ToString())
  346. {
  347. continue;
  348. }
  349. LotNoCombineBody DetailList = new LotNoCombineBody();
  350. DetailList.CurrentLotNo = dt.Rows[i]["LotNo"].ToString();
  351. DetailList.CurrentQuantity = dt.Rows[i]["Quantity"].ToString();
  352. ass.detail.Add(DetailList);
  353. }
  354. ass.LotNo = LotNo;
  355. ass.User = MUSER;
  356. ass.WorkPoint = WorkPoint;
  357. ass.MTIME = System.DateTime.Now.ToString("s");
  358. asn.Add(ass);
  359. string input = JsonConvert.SerializeObject(asn);
  360. string APIURL = ConfigurationManager.ConnectionStrings["APIURL"].ConnectionString + "LOTMerge/Create";
  361. string result = HttpPost(APIURL, input);
  362. JObject Obj = (JObject)JsonConvert.DeserializeObject(result);//或者JObject jo = JObject.Parse(jsonText);
  363. string MessAge = Obj["Message"].ToString();
  364. string Success = Obj["Success"].ToString();
  365. if (Success.ToUpper() == "FALSE")
  366. {
  367. msg = MessAge;
  368. }
  369. return msg;
  370. }
  371. }
  372. }