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.

439 lines
22 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 NFine.Application.Models;
  19. using System.Net;
  20. using System.IO;
  21. namespace NFine.Application.WMS
  22. {
  23. public class ICSDisassemblyDocApp : RepositoryFactory<ICSVendor>
  24. {
  25. public DataTable GetGridJson(string queryJson, ref Pagination jqgridparam)
  26. {
  27. DataTable dt = new DataTable();
  28. var queryParam = queryJson.ToJObject();
  29. List<DbParameter> parameter = new List<DbParameter>();
  30. #region [SQL]
  31. string sql = @"
  32. select a.DABDOCType,
  33. a.ExtensionID as ExtensionID,
  34. a.DABDOCCode as Code,
  35. a.Sequence as Seq,
  36. a.Quantity as Qty,
  37. a.InvCode,
  38. a.WHCode,
  39. b.InvName,
  40. CASE WHEN c.TransSequence IS NOT NULL THEN '' ELSE '' END AS isInput,
  41. CASE WHEN f.TransCode IS NOT NULL THEN '' ELSE '' END AS isCreate,e.*
  42. from ICSDisassemblyDoc a
  43. left join ICSInventory b on a.InvCode=b.InvCode and a.WorkPoint=b.WorkPoint
  44. left join (select TransCode,TransSequence,WorkPoint FROM ICSWareHouseLotInfoLog WHERE BusinessCode='37' group by TransCode,TransSequence,WorkPoint)c
  45. ON a.DABDOCCode=c.TransCode AND a.Sequence=c.TransSequence AND a.WorkPoint=c.WorkPoint
  46. left join (select TransCode,WorkPoint FROM ICSInventoryLotDetail group by TransCode,WorkPoint)f
  47. ON a.DABDOCCode=f.TransCode AND a.WorkPoint=f.WorkPoint
  48. LEFT JOIN ICSWarehouse d ON a.WHCode=d.WarehouseCode AND a.WorkPoint=d.WorkPoint
  49. left join ICSExtension e on a.ExtensionID=e.ID and a.WorkPoint=e.WorkPoint
  50. where a.DABDOCType='1'";
  51. sql = string.Format(sql, DbHelper.GetErpIp(), DbHelper.GetErpName());
  52. #endregion
  53. if (!string.IsNullOrWhiteSpace(queryJson))
  54. {
  55. if (!string.IsNullOrWhiteSpace(queryParam["DABDOCCode"].ToString()))
  56. {
  57. sql += " and a.DABDOCCode like '%" + queryParam["DABDOCCode"].ToString() + "%' ";
  58. }
  59. }
  60. if (NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode != "admin")
  61. {
  62. sql += " and a.WorkPoint='" + NFine.Code.OperatorProvider.Provider.GetCurrent().Location + "'";
  63. }
  64. return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
  65. }
  66. public DataTable GetSubGridJson(string Code)
  67. {
  68. DataTable dt = new DataTable();
  69. //var queryParam = queryJson.ToJObject();
  70. string sql = string.Empty;
  71. List<DbParameter> parameter = new List<DbParameter>();
  72. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  73. sql = @"select
  74. a.Sequence,
  75. a.DABDOCType,
  76. a.DABDOCCode as Code,
  77. a.Quantity as Qty,
  78. a.InvCode,
  79. a.WHCode,
  80. e.BatchCode,
  81. b.InvName,
  82. f.LotNo
  83. from ICSDisassemblyDoc a
  84. left join ICSInventory b on a.InvCode=b.InvCode and a.WorkPoint=b.WorkPoint
  85. left join (select TransCode,TransSequence,WorkPoint,LotNo FROM ICSInventoryLotDetail group by TransCode,TransSequence,WorkPoint,LotNo)f
  86. ON a.DABDOCCode=f.TransCode AND a.Sequence=f.TransSequence AND a.WorkPoint=f.WorkPoint
  87. LEFT JOIN ICSWarehouse d ON a.WHCode=d.WarehouseCode AND a.WorkPoint=d.WorkPoint
  88. left join ICSExtension e on a.ExtensionID=e.ID and a.WorkPoint=e.WorkPoint
  89. where a.DABDOCType='2' and a.DABDOCCode='{0}'
  90. order by a.Sequence";
  91. sql = string.Format(sql, Code, WorkPoint);
  92. return Repository().FindTableBySql(sql.ToString());
  93. }
  94. //查询符合套件的在库条码
  95. public DataTable GetLotNoByKit(string InvCode, string WHCode, string ExtensionID, ref Pagination jqgridparam)
  96. {
  97. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  98. List<DbParameter> parameter = new List<DbParameter>();
  99. DataTable table = new DataTable();
  100. //验证是否需要匹配批次信息
  101. string checksql = $"SELECT ID FROM ICSInventoryBatchEnable WHERE WorkPoint='{3}' AND BatchEnable='1' AND InvCode='{InvCode}' AND WHCode='{WorkPoint}'";
  102. var checkdt = SqlHelper.CmdExecuteDataTable(checksql);
  103. string sql = string.Empty;
  104. if (checkdt.Rows.Count > 0)
  105. {
  106. sql = @" select a.LotNo,a.InvCode,d.InvName,d.InvDesc,d.InvStd,d.InvUnit,a.WarehouseCode,a.LocationCode,c.BatchCode,a.Quantity from dbo.ICSWareHouseLotInfo a
  107. left join dbo.ICSInventoryLot b on a.LotNo=b.LotNo and a.WorkPoint=b.WorkPoint
  108. left join ICSExtension c on b.ExtensionID=c.ID and b.WorkPoint=c.WorkPoint
  109. left join ICSInventory d ON a.InvCode=d.InvCode AND a.WorkPoint=d.WorkPoint
  110. where a.InvCode='{0}' and a.WarehouseCode='{1}' and b.ExtensionID='{2}' AND a.WorkPoint='{3}' ";
  111. }
  112. else
  113. {
  114. sql = @" select a.LotNo,a.InvCode,d.InvName,d.InvDesc,d.InvStd,d.InvUnit,a.WarehouseCode,a.LocationCode,'' BatchCode,a.Quantity from dbo.ICSWareHouseLotInfo a
  115. left join dbo.ICSInventoryLot b on a.LotNo=b.LotNo and a.WorkPoint=b.WorkPoint
  116. left join ICSInventory d ON a.InvCode=d.InvCode AND a.WorkPoint=d.WorkPoint
  117. where a.InvCode='{0}' and a.WarehouseCode='{1}' AND a.WorkPoint='{3}' ";
  118. }
  119. sql = string.Format(sql, InvCode, WHCode, ExtensionID, WorkPoint);
  120. //return Repository().FindTableBySql(sql.ToString());
  121. return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
  122. }
  123. //绑定套件
  124. public string CreateLogByKit(string Code, string Parameter)
  125. {
  126. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  127. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  128. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  129. string msg = "";
  130. string sql = string.Empty;
  131. JArray res = (JArray)JsonConvert.DeserializeObject(Parameter);
  132. string Identification = Guid.NewGuid().ToString();
  133. foreach (var item in res)
  134. {
  135. JObject jo = (JObject)item;
  136. sql += @"update ICSWareHouseLotInfo set LockQuantity='{6}' where LotNo='{2}' and WorkPoint='{9}'";
  137. sql += @"INSERT INTO ICSWareHouseLotInfoLog(ID,Identification,TransCode,TransSequence,LotNo,InvCode,FromWarehouseCode,FromLocationCode,
  138. ToWarehouseCode,ToLocationCode,Quantity,Memo,Lock,TransType,BusinessCode,ERPUpload,
  139. ERPID,ERPDetailID,ERPCode,ERPSequence,MUSER,MUSERName,MTIME,WorkPoint,EATTRIBUTE1)
  140. Values(NEWID(),'{0}','{1}','1','{2}','{3}','{4}','{5}','','','{6}','',1,'11','37',0,'','','','','{7}','{8}',getdate(),'{9}','')";
  141. sql = string.Format(sql, Identification, Code, jo["LotNo"].ToString(), jo["InvCode"].ToString(), jo["WHCode"].ToString(), jo["LocationCode"].ToString(), jo["Quantity"].ToString(), MUSER, MUSERNAME, WorkPoint);
  142. }
  143. try
  144. {
  145. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  146. {
  147. }
  148. else
  149. {
  150. msg = "绑定失败";
  151. }
  152. }
  153. catch (Exception ex)
  154. {
  155. throw new Exception(ex.Message);
  156. }
  157. return msg;
  158. }
  159. //批量生成条码
  160. public string CreateInventoryLot(string Code)
  161. {
  162. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  163. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  164. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  165. string msg = "";
  166. string sql = string.Empty;
  167. string sqls= string.Empty;
  168. string sqlLot = string.Empty;
  169. sqls = @"select DABDOCCode,Sequence,InvCode,Quantity,Amount,ExtensionID from ICSDisassemblyDoc where DABDOCType='2' and DABDOCCode='{0}'";
  170. sqls = string.Format(sqls, Code);
  171. var parent = Repository().FindTableBySql(sqls.ToString());
  172. sqlLot = string.Format(@"SELECT A.LotNO AS LOTNO FROM ICSInventoryLot A WHERE A.LotNO LIKE '{0}%'", Code);
  173. var parentLot = Repository().FindTableBySql(sqlLot.ToString());
  174. foreach (DataRow dts in parent.Rows)
  175. {
  176. string LotNo = "";
  177. string DABDOCCode = dts["DABDOCCode"].ToString();
  178. string Sequence = dts["Sequence"].ToString();
  179. var drs=parentLot.Select("LOTNO", "LOTNO DESC");
  180. if (drs.Length==0)
  181. {
  182. LotNo = DABDOCCode + Sequence + "00001";
  183. }
  184. else
  185. {
  186. var OldLotNo = drs[0]["LOTNO"].ToString();
  187. LotNo = DABDOCCode + Sequence + (Convert.ToInt64(OldLotNo.Substring(OldLotNo.Length - 5))+1).ToString().PadLeft(5,'0');
  188. }
  189. sql += @"INSERT INTO ICSInventoryLot(ID,LotNo,InvCode,ProductDate,ExpirationDate,Quantity,Amount,ExtensionID,Type,
  190. PrintTimes,LastPrintUser,LastPrintTime,MUSER,MUSERName,MTIME,WorkPoint)
  191. Values(NEWID(),'{0}','{1}',getdate(),'2999-12-31','{2}','{3}','{4}','100','','','','{5}','{6}',getdate(),'{7}')";
  192. sql+= @"INSERT INTO ICSInventoryLotDetail( LotNo,TransCode,TransSequence,MUSER,MUSERName,MTIME,WorkPoint)
  193. Values('{0}','{8}','{9}','{5}','{6}',getdate(),'{7}')";
  194. sql = string.Format(sql, LotNo, dts["InvCode"].ToString(), dts["Quantity"].ToString(), dts["Amount"].ToString(), dts["ExtensionID"].ToString(), MUSER, MUSERNAME, WorkPoint, dts["DABDOCCode"].ToString(), dts["Sequence"].ToString());
  195. }
  196. try
  197. {
  198. if (SqlHelper.CmdExecuteNonQueryLi(sql.ToString()) > 0)
  199. {
  200. }
  201. else
  202. {
  203. msg = "生成失败";
  204. }
  205. }
  206. catch (Exception ex)
  207. {
  208. throw new Exception(ex.Message);
  209. }
  210. return msg;
  211. }
  212. //批量删除条码
  213. public string DeleteInventoryLot(string Code)
  214. {
  215. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  216. string msg = string.Empty;
  217. string sql = string.Format(@"select * from dbo.ICSInventoryLot a
  218. inner join dbo.ICSInventoryLotDetail b on a.LotNo=b.LotNo and a.WorkPoint=b.WorkPoint
  219. inner join dbo.ICSWareHouseLotInfo c on a.LotNo=c.LotNo and a.WorkPoint=c.WorkPoint
  220. where b.TransCode='{0}' and a.WorkPoint='{1}'", Code, WorkPoint);
  221. DataTable dtASN = SqlHelper.GetDataTableBySql(sql);
  222. if (dtASN != null && dtASN.Rows.Count > 0)
  223. {
  224. msg = "该单据下的条码已入库,无法删除!";
  225. }
  226. if (string.IsNullOrEmpty(msg))
  227. {
  228. string sqls = string.Format("delete a from ICSInventoryLot a inner join ICSInventoryLotDetail b on a.LotNo=b.LotNo and a.WorkPoint=b.WorkPoint where b.TransCode='{0}' and a.WorkPoint='{1}'", Code, WorkPoint);
  229. sqls += string.Format("delete from ICSInventoryLotDetail where TransCode='{0}' and WorkPoint='{1}'", Code, WorkPoint);
  230. SqlHelper.CmdExecuteNonQueryLi(sqls);
  231. }
  232. return msg;
  233. }
  234. /// <summary>
  235. /// 零件一键入库
  236. /// </summary>
  237. /// <param name="Codes"></param>
  238. /// <returns></returns>
  239. public string PostInWareHouse(string Codes)
  240. {
  241. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  242. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  243. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  244. string msg = "";
  245. DateTime TimeNow = DateTime.Now;
  246. string sqls = string.Empty;
  247. string sql = string.Empty;
  248. try
  249. {
  250. Codes = Codes.Substring(1, Codes.Length - 2);
  251. //1.获取需要散件入库的仓库
  252. string whereSql2 = @"
  253. SELECT F_Define1,F_Define2 FROM Sys_SRM_ItemsDetail WHERE F_ItemId=(SELECT F_Id FROM Sys_SRM_Items WHERE F_EnCode='LocationCode' ) AND F_ItemCode='ICSDisassemblyDoc' ";
  254. DataTable dataTable2 = SqlHelper.CmdExecuteDataTable(whereSql2);
  255. if (dataTable2.Rows.Count <= 0)
  256. {
  257. throw new Exception("请先再自定义档案配置需要零件入库的仓库信息!");
  258. }
  259. //判断是否全部生成条码
  260. string isCreate = $@" IF EXISTS ( select a.Sequence,a.DABDOCType,a.DABDOCCode as Code,a.Quantity ,a.InvCode,a.DABDOCQuantity
  261. from ICSDisassemblyDoc a
  262. where a.DABDOCType='2' and a.DABDOCCode in ({Codes}) AND Isnull(a.DABDOCQuantity,0)!=0 and a.WorkPoint='{WorkPoint}')
  263. BEGIN
  264. RAISERROR('',16,1);
  265. RETURN
  266. END;
  267. select a.Sequence,a.DABDOCType,a.DABDOCCode ,a.Quantity ,a.InvCode,a.DABDOCQuantity,a.Amount,a.ExtensionID,b.LotNO
  268. from ICSDisassemblyDoc a
  269. left JOIN ICSInventoryLotDetail b ON a.DABDOCCode=b.TransCode AND a.Sequence=b.TransSequence and a.WorkPoint=b.WorkPoint
  270. where a.DABDOCType='2' and a.DABDOCCode in ({Codes}) and a.WorkPoint='{WorkPoint}' ";
  271. DataTable isCreatedt = SqlHelper.CmdExecuteDataTable(isCreate);
  272. if (isCreatedt.Rows.Count <= 0)
  273. {
  274. throw new Exception("请先确认拆卸单是否绑定套件单信息!");
  275. }
  276. else
  277. {
  278. List<LOTStockUpCreateIModel> models = new List<LOTStockUpCreateIModel>();
  279. LOTStockUpCreateIModel model = new LOTStockUpCreateIModel
  280. {
  281. User = MUSER,
  282. MTime = TimeNow.ToString("yyyy-MM-dd HH:mm:ss"),
  283. WorkPoint = WorkPoint,
  284. TransType = "拆卸单"
  285. };
  286. model.detail = new List<LOTStockUpCreateIModelList>();
  287. for (int i = 0; i < isCreatedt.Rows.Count; i++)
  288. {
  289. //查询需要入库的库位信息
  290. //sql = $@" SELECT top 1 LocationCode,LotNo FROM ICSWareHouseLotInfo WHERE WarehouseCode='{dataTable2.Rows[0]["F_Define1"]}' AND WorkPoint='{WorkPoint}' AND InvCode='{isCreatedt.Rows[i]["InvCode"]}' ORDER BY MTIME ";
  291. //var getSql = SqlHelper.CmdExecuteDataTable(sql);
  292. ////仓库有库存,任选一个库位
  293. //if (getSql.Rows.Count > 0)
  294. //{
  295. // LOTStockUpCreateIModelList detail = new LOTStockUpCreateIModelList
  296. // {
  297. // LotNo = getSql.Rows[0]["LotNo"].ToString(),
  298. // WarehouseCode = dataTable2.Rows[0]["F_Define1"].ToString(),
  299. // LocationCode = getSql.Rows[0]["LocationCode"].ToString(),
  300. // TransCode = isCreatedt.Rows[i]["DABDOCCode"].ToString(),
  301. // TransSequence = isCreatedt.Rows[i]["Sequence"].ToString(),
  302. // Quantity = isCreatedt.Rows[i]["Quantity"].ToString(),
  303. // InvCode = isCreatedt.Rows[i]["InvCode"].ToString()
  304. // };
  305. // model.detail.Add(detail);
  306. //}
  307. //else
  308. //{
  309. //查询该单据是否已经生成条码信息
  310. //创建新的条码入库
  311. string LotNo = "";
  312. if (string.IsNullOrEmpty(isCreatedt.Rows[i]["LotNO"].ToString()))
  313. {
  314. string DABDOCCode = isCreatedt.Rows[i]["DABDOCCode"].ToString();
  315. string Sequence = isCreatedt.Rows[i]["Sequence"].ToString();
  316. var sqlLot = string.Format(@"SELECT A.LotNO AS LOTNO FROM ICSInventoryLot A WHERE A.LotNO LIKE '{0}%'", DABDOCCode);
  317. var parentLot = Repository().FindTableBySql(sqlLot.ToString());
  318. var drs = parentLot.Select("LOTNO", "LOTNO DESC");
  319. if (drs.Length == 0)
  320. {
  321. LotNo = DABDOCCode + Sequence + "00001";
  322. }
  323. else
  324. {
  325. var OldLotNo = drs[0]["LOTNO"].ToString();
  326. LotNo = DABDOCCode + Sequence + (Convert.ToInt64(OldLotNo.Substring(OldLotNo.Length - 5)) + 1).ToString().PadLeft(5, '0');
  327. }
  328. sqls += @"INSERT INTO ICSInventoryLot(ID,LotNo,InvCode,ProductDate,ExpirationDate,Quantity,Amount,ExtensionID,Type,
  329. PrintTimes,LastPrintUser,LastPrintTime,MUSER,MUSERName,MTIME,WorkPoint)
  330. Values(NEWID(),'{0}','{1}',getdate(),'2999-12-31','{2}','{3}','{4}','100','','','','{5}','{6}',getdate(),'{7}')";
  331. sqls += @"INSERT INTO ICSInventoryLotDetail( LotNo,TransCode,TransSequence,MUSER,MUSERName,MTIME,WorkPoint)
  332. Values('{0}','{8}','{9}','{5}','{6}',getdate(),'{7}')";
  333. sqls = string.Format(sqls, LotNo, isCreatedt.Rows[i]["InvCode"].ToString(), isCreatedt.Rows[i]["Quantity"].ToString(), isCreatedt.Rows[i]["Amount"].ToString(), isCreatedt.Rows[i]["ExtensionID"].ToString(), MUSER, MUSERNAME, WorkPoint, DABDOCCode, Sequence);
  334. }
  335. else
  336. {
  337. LotNo = isCreatedt.Rows[i]["LotNO"].ToString();
  338. }
  339. LOTStockUpCreateIModelList detail = new LOTStockUpCreateIModelList
  340. {
  341. LotNo = LotNo,
  342. WarehouseCode = dataTable2.Rows[0]["F_Define1"].ToString(),
  343. LocationCode = dataTable2.Rows[0]["F_Define2"].ToString(),
  344. TransCode = isCreatedt.Rows[i]["DABDOCCode"].ToString(),
  345. TransSequence = isCreatedt.Rows[i]["Sequence"].ToString(),
  346. Quantity = isCreatedt.Rows[i]["Quantity"].ToString(),
  347. InvCode = isCreatedt.Rows[i]["InvCode"].ToString()
  348. };
  349. model.detail.Add(detail);
  350. //}
  351. }
  352. if (!String.IsNullOrEmpty(sqls))
  353. {
  354. SqlHelper.CmdExecuteNonQueryLi(sqls);
  355. }
  356. models.Add(model);
  357. var input = models.ToJson();
  358. string APIURL = ConfigurationManager.ConnectionStrings["APIURL"].ConnectionString + "LOTStockUp/Create";
  359. string result = HttpPost(APIURL, input);
  360. Result res = result.ToObject<Result>();
  361. if (!res.Success)
  362. {
  363. throw new Exception(res.Message);
  364. }
  365. msg = "";
  366. }
  367. return msg;
  368. }
  369. catch (Exception ex)
  370. {
  371. throw new Exception(ex.Message);
  372. }
  373. }
  374. public static string HttpPost(string url, string body)
  375. {
  376. try
  377. {
  378. Encoding encoding = Encoding.UTF8;
  379. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  380. request.Method = "POST";
  381. request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
  382. request.ContentType = "application/json; charset=utf-8";
  383. byte[] buffer = encoding.GetBytes(body);
  384. request.ContentLength = buffer.Length;
  385. request.GetRequestStream().Write(buffer, 0, buffer.Length);
  386. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  387. using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
  388. {
  389. return reader.ReadToEnd();
  390. }
  391. }
  392. catch (WebException ex)
  393. {
  394. throw new Exception(ex.Message);
  395. }
  396. }
  397. }
  398. }