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.

357 lines
15 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.WMS
  22. {
  23. public class InspectionDeciliterApp : 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. public string Split(string Parameter)
  49. {
  50. string msg = "";
  51. try
  52. {
  53. if (Parameter != null && !string.IsNullOrWhiteSpace(Parameter.ToString()) && Parameter.ToString() != "[]")
  54. {
  55. List<LOTCreateIModel> model = new List<LOTCreateIModel>();
  56. model = JsonConvert.DeserializeObject<List<LOTCreateIModel>>(Parameter.ToString());
  57. msg= LOTSplitCreate(model);
  58. }
  59. }
  60. catch (Exception ex)
  61. {
  62. msg = ex.Message;
  63. }
  64. return msg;
  65. }
  66. /// <summary>
  67. /// 拆分
  68. /// </summary>
  69. /// <param name="JsonData"></param>
  70. /// <returns></returns>
  71. public static string LOTSplitCreate(List<LOTCreateIModel> JsonData)
  72. {
  73. string newlotno = "";
  74. string msg;
  75. DataTable printTable = new DataTable();
  76. if (JsonData.Count <= 0)
  77. {
  78. throw new Exception("");//"传送数据为空!"
  79. }
  80. try
  81. {
  82. string Identification = Guid.NewGuid().ToString();
  83. foreach (var item in JsonData)
  84. {
  85. if (string.IsNullOrEmpty(item.LotNo))
  86. {
  87. msg = "条码不能为空";
  88. throw new Exception("条码不能为空");//"条码不能为空!"
  89. }
  90. else if (item.detail.Count <= 0)
  91. {
  92. msg = "明细信息不能为空";
  93. throw new Exception("明细信息不能为空");//"明细信息不能为空!");
  94. }
  95. //拆分前日志
  96. WareHouseLotInfoLog(Identification, item.LotNo, item.User, item.WorkPoint, "4", "71", "");
  97. foreach (var info in item.detail)
  98. {
  99. newlotno = info.CurrentLotNo;
  100. //更新条码信息
  101. WareHouseLotInfoSplit(item.LotNo, info.CurrentLotNo, info.CurrentQuantity, item.User, item.WorkPoint);
  102. }
  103. //拆分后日志
  104. printTable = WareHouseLotInfoLog(Identification, item.LotNo, item.User, item.WorkPoint, "4","72",
  105. newlotno);
  106. }
  107. return "";
  108. }
  109. catch (Exception ex)
  110. {
  111. throw new Exception(ex.Message);
  112. }
  113. }
  114. /// <summary>
  115. /// 拆分、合并日志
  116. /// </summary>
  117. /// <param name="Identification"></param>
  118. /// <param name="LotNo"></param>
  119. /// <param name="User"></param>
  120. /// <param name="WorkPoint"></param>
  121. /// <param name="TransType"></param>
  122. /// <param name="BusinessCode"></param>
  123. /// <param name="cmd"></param>
  124. public static DataTable WareHouseLotInfoLog(string Identification, string LotNo, string User, string WorkPoint, string TransType, string BusinessCode, string newLotno)
  125. {
  126. String LotEnable = "";
  127. DataTable dtLotno = new DataTable();
  128. DataTable lstDt = new DataTable();
  129. try
  130. {
  131. //检验是否分批
  132. string sql = @"SELECT b.LotEnable,b.PrintEnable FROM ICSInventoryLot a
  133. LEFT JOIN ICSInventory b ON a.InvCode=b.InvCode AND a.WorkPoint=b.WorkPoint
  134. where a.LotNo='{0}' and a.WorkPoint='{1}'
  135. ";
  136. sql = string.Format(sql, LotNo, WorkPoint);
  137. DataTable dt = SqlHelper.CmdExecuteDataTable(sql);
  138. if (dt.Rows.Count == 0)
  139. {
  140. throw new Exception("条码不存在,操作失败");
  141. }
  142. else
  143. {
  144. LotEnable = dt.Rows[0]["LotEnable"].ToString();
  145. }
  146. ///添加日志
  147. sql = @"IF NOT EXISTS(SELECT F_Account FROM Sys_SRM_User WHERE F_Account='{2}' AND F_Location='{1}')
  148. BEGIN
  149. RAISERROR('',16,1);
  150. RETURN
  151. END
  152. INSERT INTO ICSWareHouseLotInfoLog(ID,Identification,TransCode,TransSequence,LotNo,InvCode,
  153. FromWarehouseCode,FromLocationCode,ToWarehouseCode,ToLocationCode,Quantity,
  154. Memo,Lock,TransType,BusinessCode,ERPUpload,ERPID,
  155. ERPDetailID,ERPCode,ERPSequence,MUSER,MUSERName,
  156. MTIME,WorkPoint,EATTRIBUTE1)
  157. SELECT NEWID(),'{3}',b.TransCode,b.TransSequence,a.LotNo ,a.InvCode ,
  158. '','','','',a.Quantity,
  159. '','0','{4}','{5}','0','',
  160. '','','',f.F_Account ,f.F_RealName ,
  161. SYSDATETIME() ,a.WorkPoint ,''
  162. FROM ICSInventoryLot a
  163. INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint
  164. INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location
  165. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}'
  166. ";
  167. sql = string.Format(sql, LotNo, WorkPoint, User, Identification, TransType, BusinessCode);
  168. if (SqlHelper.ExecuteNonQuery(sql) < 0)
  169. {
  170. throw new Exception("日志表更新失败");
  171. }
  172. }
  173. catch (Exception)
  174. {
  175. throw;
  176. }
  177. return lstDt;
  178. }
  179. /// <summary>
  180. /// 拆分
  181. /// </summary>
  182. /// <param name="Identification"></param>
  183. /// <param name="LotNo"></param>
  184. /// <param name="User"></param>
  185. /// <param name="WorkPoint"></param>
  186. /// <param name="TransType"></param>
  187. /// <param name="BusinessCode"></param>
  188. /// <param name="cmd"></param>
  189. public static void WareHouseLotInfoSplit( string LotNo, string CurrentLotNo, string Quantity, string User, string WorkPoint)
  190. {
  191. try
  192. {
  193. string sql = string.Empty;
  194. #region 添加库存
  195. //插入条码表
  196. sql = @"
  197. IF NOt EXISTS(SELECT a.LotNo FROM ICSInventoryLot a WHERE a.LotNo='{0}' AND a.WorkPoint='{1}')
  198. BEGIN
  199. RAISERROR('',16,1);
  200. RETURN
  201. END
  202. IF EXISTS(SELECT a.LotNo FROM ICSContainerLot a WHERE a.LotNo='{0}' AND a.WorkPoint='{1}')
  203. BEGIN
  204. INSERT INTO ICSContainerLot([ID], [ContainerID], [LotNo], [MUSER], [MUSERName], [WorkPoint], [MTIME], [EATTRIBUTE1], [EATTRIBUTE2], [EATTRIBUTE3], [EATTRIBUTE4], [EATTRIBUTE5], [EATTRIBUTE6], [EATTRIBUTE7], [EATTRIBUTE8], [EATTRIBUTE9], [EATTRIBUTE10])
  205. SELECT NEWID(),ContainerID,'{4}' ,MUSER,MUSERName,WorkPoint ,MTIME,EATTRIBUTE1,EATTRIBUTE2, EATTRIBUTE3, EATTRIBUTE4, EATTRIBUTE5, EATTRIBUTE6, EATTRIBUTE7, EATTRIBUTE8, EATTRIBUTE9, EATTRIBUTE10
  206. FROM ICSContainerLot WHERE LotNo='{4}' AND WorkPoint='{1}'
  207. END
  208. INSERT INTO ICSInventoryLot(ID,LotNo,InvCode,ProductDate,ExpirationDate,Quantity,Amount,ExtensionID,Type,MUSER,MUSERName,MTIME,WorkPoint,EATTRIBUTE1,EATTRIBUTE7)
  209. SELECT NEWID(),'{4}' ,a.InvCode,a.ProductDate,a.ExpirationDate ,'{3}',a.Amount/a.Quantity*{3},a.ExtensionID,'101',f.F_Account ,f.F_RealName ,SYSDATETIME() ,a.WorkPoint ,a.LotNo,''
  210. FROM ICSInventoryLot a
  211. INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location
  212. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}';
  213. UPDATE ICSInventoryLot SET Quantity=Quantity-{3} WHERE LotNo='{0}' AND WorkPoint='{1}';
  214. IF EXISTS(SELECT a.LotNo FROM ICSASNDetail a WHERE a.LotNo='{0}' AND a.WorkPoint='{1}')
  215. BEGIN
  216. INSERT INTO [dbo].[ICSASNDetail] ([ID], [ASNCode], [Sequence], [LotNo], [Quantity], [Amount], [DNQuantity], [DNAmount], [MUSER], [MUSERName], [WorkPoint], [MTIME]) SELECT NEWID(),a.ASNCode,a.Sequence,'{4}',{3},a.Amount,{3},a.DNAmount,f.F_Account ,f.F_RealName,a.WorkPoint,GETDATE() FROM
  217. ICSASNDetail a
  218. INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location
  219. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' ;
  220. UPDATE ICSASNDetail SET Quantity=Quantity-{3} ,DNQuantity=DNQuantity-{3} WHERE LotNo='{0}' AND WorkPoint='{1}'
  221. END";
  222. sql = string.Format(sql, LotNo, WorkPoint, User, Quantity, CurrentLotNo);
  223. if (SqlHelper.ExecuteNonQuery(sql) < 0)
  224. {
  225. throw new Exception("条码表写入失败!");//"条码表写入失败!");
  226. }
  227. //插入条码单据表
  228. sql = @"INSERT INTO ICSInventoryLotDetail(LotNo,TransCode,TransSequence,MUSER,MUSERName,MTIME,WorkPoint)
  229. SELECT '{3}',b.TransCode,b.TransSequence,f.F_Account ,f.F_RealName ,SYSDATETIME() ,a.WorkPoint
  230. FROM ICSInventoryLot a
  231. INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint
  232. INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location
  233. WHERE a.LotNo='{0}' AND a.WorkPoint='{1}'";
  234. sql = string.Format(sql, LotNo, WorkPoint, User, CurrentLotNo);
  235. if (SqlHelper.ExecuteNonQuery(sql) < 0)
  236. {
  237. throw new Exception("条码单据表写入失败!");//"条码单据表写入失败!");
  238. }
  239. #endregion
  240. }
  241. catch (Exception)
  242. {
  243. throw;
  244. }
  245. }
  246. //接口api解析
  247. public static string HttpPost(string url, string body)
  248. {
  249. try
  250. {
  251. Encoding encoding = Encoding.UTF8;
  252. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  253. request.Method = "POST";
  254. request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
  255. request.ContentType = "application/json; charset=utf-8";
  256. byte[] buffer = encoding.GetBytes(body);
  257. request.ContentLength = buffer.Length;
  258. request.GetRequestStream().Write(buffer, 0, buffer.Length);
  259. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  260. using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
  261. {
  262. return reader.ReadToEnd();
  263. }
  264. }
  265. catch (WebException ex)
  266. {
  267. throw new Exception(ex.Message);
  268. }
  269. }
  270. /// <summary>
  271. /// 根据ID获取条码
  272. /// </summary>
  273. /// <returns></returns>
  274. public DataTable GetLotNoByID(string ID)
  275. {
  276. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  277. string sql = @"select '' as ID,'' as LotNo union all
  278. SELECT ID,LotNo FROM ICSWareHouseLotInfo WITH (NOLOCK) WHERE ID in ({0}) ";
  279. sql = string.Format(sql, ID.TrimEnd(','));
  280. //string role = NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode;
  281. //if (role != "admin")
  282. //{
  283. // sql += " and b.WorkPoint='" + WorkPoint + "'";
  284. //}
  285. DataTable dt = SqlHelper.GetDataTableBySql(sql);
  286. return dt;
  287. }
  288. public class LOTCreateIModel
  289. {
  290. /// <summary>
  291. /// 条码
  292. /// </summary>
  293. public string LotNo { get; set; }
  294. /// <summary>
  295. /// 操作人
  296. /// </summary>
  297. public string User { get; set; }
  298. /// <summary>
  299. /// 操作时间
  300. /// </summary>
  301. public DateTime MTime { get; set; }
  302. /// <summary>
  303. /// 站点
  304. /// </summary>
  305. public string WorkPoint { get; set; }
  306. public List<LOTCreateIModelInfo> detail { get; set; }
  307. }
  308. public class LOTCreateIModelInfo
  309. {
  310. /// 合并条码
  311. /// </summary>
  312. public string CurrentLotNo { get; set; }
  313. /// <summary>
  314. /// 合并数量
  315. /// </summary>
  316. public string CurrentQuantity { get; set; }
  317. /// <summary>
  318. /// 站点
  319. /// </summary>
  320. public string WorkPoint { get; set; }
  321. }
  322. }
  323. }