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.

1382 lines
63 KiB

3 weeks ago
  1. using Newtonsoft.Json.Linq;
  2. using Newtonsoft.Json;
  3. using NFine.Code;
  4. using NFine.Data.Extensions;
  5. using NFine.Domain._03_Entity.SRM;
  6. using NFine.Repository;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Configuration;
  10. using System.Data;
  11. using System.Data.Common;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Threading;
  16. using System.Reflection.Emit;
  17. using NFine.Application.WMS;
  18. using System.Net;
  19. using System.IO;
  20. using System.Reflection;
  21. using System.Data.SqlClient;
  22. namespace NFine.Application.WMS
  23. {
  24. public class WMSCreateMOApplyApp : RepositoryFactory<ICSVendor>
  25. {
  26. public static DataTable Invmes = new DataTable();
  27. PickMaterialApp App = new PickMaterialApp();
  28. #region 删除辅料材料出库单
  29. public string DeleteICSMOApply(string keyValue)
  30. {
  31. //站点信息
  32. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  33. string msg = "";
  34. keyValue = keyValue.Substring(1, keyValue.Length - 2);
  35. string sql = string.Empty;
  36. sql += string.Format(@"DELETE FROM dbo.ICSMOApply WHERE ApplyCode IN ({0}) and WorkPoint ='{1}'", keyValue.TrimEnd(','), WorkPoint);
  37. try
  38. {
  39. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  40. {
  41. }
  42. }
  43. catch (Exception ex)
  44. {
  45. throw new Exception(ex.Message);
  46. }
  47. return msg;
  48. }
  49. #endregion
  50. #region 保存发料信息
  51. public string SaveICSMOApply(string ICSASN)
  52. {
  53. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  54. string UserName = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  55. string msg = "";
  56. List<JsonData> parsedData = JsonConvert.DeserializeObject<List<JsonData>>(ICSASN);
  57. string sql = "";
  58. string Colspan = "";
  59. string str1 = "";
  60. List<string> ExtensionIDList = new List<string>();
  61. // 获取解析后的数据
  62. JsonData data = parsedData[0];
  63. foreach (var detail in data.Detail)
  64. {
  65. Colspan ="~" + detail.Batch + "~~~~~~~~~~~~";
  66. string sqls = string.Format(@"select ID from ICSExtension where Colspan='{0}' and WorkPoint='{1}'", Colspan, WorkPoint);
  67. object ExtensionID = SqlHelper.ExecuteScalar(sqls);
  68. bool flag = true;
  69. foreach (var item in ExtensionIDList)
  70. {
  71. if (item == Colspan + WorkPoint)
  72. {
  73. flag = false;
  74. }
  75. }
  76. if (ExtensionID == null && flag == true)
  77. {
  78. str1 = Guid.NewGuid().ToString();
  79. sql += string.Format(@"Insert into ICSExtension(ID, Colspan, ProjectCode, BatchCode, Version, Brand, cFree1, cFree2, cFree3, cFree4, cFree5, cFree6, cFree7, cFree8, cFree9, cFree10, MTIME, MUSER, MUSERName, WorkPoint)
  80. Values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}',getdate(),'{16}','{17}','{18}' )",
  81. str1, Colspan, "", detail.Batch, "", "", "", "", "", "", "", "", "", "", "", "",
  82. data.User, UserName, WorkPoint);
  83. }
  84. else if (ExtensionID != null)
  85. {
  86. str1 = ExtensionID.ToString();
  87. }
  88. ExtensionIDList.Add(Colspan + WorkPoint);
  89. sql += "INSERT INTO ICSMOApply(ID,ApplyCode,WHCode,Sequence,InvCode,Quantity,CreatePerson,CreateDateTime,WorkPoint,Status,ApplyID,ApplyDetailID,ExtensionID,MUSER,MUSERName,MTIME,EATTRIBUTE,EATTRIBUTE2,EATTRIBUTE3,EATTRIBUTE4,EATTRIBUTE5,EATTRIBUTE6,EATTRIBUTE7,EATTRIBUTE10,SourceCode,Type,EATTRIBUTE8,EATTRIBUTE9,IssueQuantity,DepCode,EATTRIBUTE11)" +
  90. " select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',newID(),newID(),'{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','1','{23}','{24}',0,'{25}','{26}'";
  91. sql = string.Format(sql, detail.ID, data.Code, detail.WHCode, detail.Sequence, detail.InvCode, detail.Quantity, data.User, data.MTIME, WorkPoint, '1', str1, data.User, UserName, data.MTIME, data.Dept, data.CodeType, data.ApplyNegCode, data.Custmer, data.Remarks, detail.DetailReamrk, detail.SYproject, "杂发", detail.SourceCode, data.Remarks2, detail.DetailReamrk2, data.LYDept,data.Remarks3);
  92. }
  93. try
  94. {
  95. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  96. {
  97. }
  98. }
  99. catch (Exception ex)
  100. {
  101. msg=ex.Message;
  102. }
  103. return msg;
  104. }
  105. #region 辅料材料出库单主表信息查询
  106. public DataTable GetICSMOApply(ref Pagination jqgridparam, string queryJson)
  107. {
  108. string ParentId = "";
  109. DataTable dt = new DataTable();
  110. List<DbParameter> parameter = new List<DbParameter>();
  111. var queryParam = queryJson.ToJObject();
  112. string sql = @" SELECT DISTINCT
  113. a.ApplyCode
  114. ,a.Status
  115. ,a.CreatePerson
  116. ,a.CreateDateTime
  117. ,a.MUSER
  118. ,a.MUSERName
  119. ,a.WHCode
  120. ,case when c.Quantity=Isnull(c.IssueQuantity,0) then '1' else '2' END as FLStatus
  121. from dbo.ICSMOApply a
  122. INNER JOIN (SELECT Sum(a.Quantity) AS Quantity,
  123. Sum(Isnull(a.IssueQuantity,0)) AS IssueQuantity,a.ApplyCode,a.WorkPoint FROM ICSMOApply a GROUP BY a.ApplyCode,a.WorkPoint ) c ON a.ApplyCode=c.ApplyCode AND a.WorkPoint=c.workpoint
  124. left join ICSWarehouse b on a.WHCode=b.WarehouseCode and a.WorkPoint=b.WorkPoint
  125. where 1=1 ";
  126. if (!string.IsNullOrWhiteSpace(queryJson))
  127. {
  128. if (!string.IsNullOrWhiteSpace(queryParam["POCode"].ToString()))
  129. {
  130. sql += " and a.ApplyCode like '%" + queryParam["POCode"].ToString() + "%' ";
  131. }
  132. if (!string.IsNullOrWhiteSpace(queryParam["InvCode"].ToString()))
  133. {
  134. sql += " and a.InvCode like '%" + queryParam["InvCode"].ToString() + "%' ";
  135. }
  136. if (!string.IsNullOrWhiteSpace(queryParam["CreatedBy"].ToString()))
  137. {
  138. sql += " and a.CreatePerson like '%" + queryParam["CreatedBy"].ToString() + "%' ";
  139. }
  140. if (!string.IsNullOrWhiteSpace(queryParam["Status"].ToString()))
  141. {
  142. if (queryParam["Status"].ToString()=="1")
  143. {
  144. sql += " and c.Quantity=Isnull(c.IssueQuantity,0) ";
  145. }
  146. else if(queryParam["Status"].ToString() == "2")
  147. {
  148. sql += " and c.Quantity!=Isnull(c.IssueQuantity,0) and Status='1' ";
  149. }
  150. else if (queryParam["Status"].ToString() == "3")
  151. {
  152. sql += " and c.Quantity!=Isnull(c.IssueQuantity,0) and Status='2' ";
  153. }
  154. }
  155. if (!string.IsNullOrWhiteSpace(queryParam["TimeFrom"].ToString()))
  156. {
  157. sql += " and convert(nvarchar(20),a.CreateDateTime,23) >= '" + queryParam["TimeFrom"].ToString() + "' ";
  158. }
  159. if (!string.IsNullOrWhiteSpace(queryParam["TimeArrive"].ToString()))
  160. {
  161. sql += " and convert(nvarchar(20),a.CreateDateTime,23) <= '" + queryParam["TimeArrive"].ToString() + "' ";
  162. }
  163. if (!string.IsNullOrWhiteSpace(queryParam["WHCode"].ToString()))
  164. {
  165. sql += " and a.WHCode like '%" + queryParam["WHCode"].ToString() + "%' ";
  166. }
  167. }
  168. sql = string.Format(sql);
  169. ParentId = SqlHelper.Organize_F_ParentId(NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode);
  170. string UserCode = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  171. if (!string.IsNullOrWhiteSpace(ParentId) && ParentId != "0" && NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode != "Vendor")
  172. {
  173. return SqlHelper.FindTablePageBySql_OtherTempByRole(sql.ToString(), sql, ParentId, UserCode, parameter.ToArray(),"", ref jqgridparam);
  174. }
  175. else
  176. {
  177. //if (NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode!="admin")
  178. //{
  179. // sql += " and a.CreatePerson like '%" + NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode + "%' ";
  180. //}
  181. return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
  182. }
  183. }
  184. #endregion
  185. #region 辅料材料出库单主表信息查询
  186. public DataTable GetICSMOApplyByApplyCode(string ApplyCode)
  187. {
  188. DataTable dt = new DataTable();
  189. List<DbParameter> parameter = new List<DbParameter>();
  190. string sql = @" SELECT DISTINCT
  191. a.ApplyCode
  192. ,a.Status
  193. ,a.CreatePerson
  194. ,a.CreateDateTime
  195. ,a.MUSER
  196. ,a.MUSERName
  197. ,a.SourceCode
  198. from dbo.ICSMOApply a
  199. left join ICSWarehouse b on a.WHCode=b.WarehouseCode and a.WorkPoint=b.WorkPoint
  200. WHERE a.ApplyCode='{0}'";
  201. sql = string.Format(sql, ApplyCode);
  202. return Repository().FindTableBySql(sql.ToString());
  203. }
  204. #endregion
  205. #region 主页面子表信息查询
  206. public DataTable GetICSMOApplyDetail(string ApplyCode, string queryJson, ref Pagination jqgridparam)
  207. {
  208. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  209. DataTable dt = new DataTable();
  210. var queryParam = queryJson.ToJObject();
  211. //var queryParam = queryJson.ToJObject();
  212. List<DbParameter> parameter = new List<DbParameter>();
  213. string sql = @" select a.ID
  214. ,a.ApplyCode
  215. ,a.Sequence
  216. ,a.InvCode
  217. ,b.InvName
  218. ,b.InvStd
  219. ,a.Quantity
  220. ,a.Amount
  221. ,a.ExtensionID
  222. ,a.MUSER
  223. ,a.MUSERName
  224. ,a.MTIME
  225. ,a.WHCode
  226. ,c.WarehouseName as WHName
  227. ,a.SourceCode
  228. ,IssueQuantity
  229. ,f.Colspan
  230. ,f.ProjectCode
  231. ,f.BatchCode
  232. ,f.Version
  233. ,f.Brand
  234. ,f.cFree1
  235. ,f.cFree2
  236. ,f.cFree3
  237. ,f.cFree4
  238. ,f.cFree5
  239. ,f.cFree6
  240. ,f.cFree7
  241. ,f.cFree8
  242. ,f.cFree9
  243. ,f.cFree10
  244. from ICSMOApply a
  245. LEFT JOIN ICSInventory b ON a.InvCode=b.InvCode AND a.WorkPoint=b.WorkPoint
  246. left join ICSExtension f on a.ExtensionID=f.ID and a.WorkPoint=f.WorkPoint
  247. left join ICSWarehouse c On c.WarehouseCode= a.WHCode AND c.WorkPoint=a.WorkPoint
  248. WHERE a.ApplyCode='" + ApplyCode + "' ";
  249. if (!string.IsNullOrWhiteSpace(queryJson))
  250. {
  251. if (!string.IsNullOrWhiteSpace(queryParam["POCode"].ToString()))
  252. {
  253. sql += " and a.ApplyCode like '%" + queryParam["POCode"].ToString() + "%' ";
  254. }
  255. if (!string.IsNullOrWhiteSpace(queryParam["InvCode"].ToString()))
  256. {
  257. sql += " and a.InvCode like '%" + queryParam["InvCode"].ToString() + "%' ";
  258. }
  259. if (!string.IsNullOrWhiteSpace(queryParam["CreatedBy"].ToString()))
  260. {
  261. sql += " and a.CreatePerson like '%" + queryParam["CreatedBy"].ToString() + "%' ";
  262. }
  263. if (!string.IsNullOrWhiteSpace(queryParam["TimeFrom"].ToString()))
  264. {
  265. sql += " and convert(nvarchar(20),a.CreateDateTime,23) >= '" + queryParam["TimeFrom"].ToString() + "' ";
  266. }
  267. if (!string.IsNullOrWhiteSpace(queryParam["TimeArrive"].ToString()))
  268. {
  269. sql += " and convert(nvarchar(20),a.CreateDateTime,23) <= '" + queryParam["TimeArrive"].ToString() + "' ";
  270. }
  271. }
  272. return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
  273. }
  274. #endregion
  275. public string DeleteICSMOApplyByCode(string keyValue)
  276. {
  277. //站点信息
  278. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  279. string msg = "";
  280. keyValue = keyValue.Substring(1, keyValue.Length - 2);
  281. string sql = string.Empty;
  282. sql += string.Format(@"IF EXISTS( select ID from ICSMOApply where ApplyCode IN ({0}) and WorkPoint ='{1}' AND IssueQuantity>0)
  283. BEGIN
  284. RAISERROR('',16,1);
  285. RETURN
  286. END;
  287. IF EXISTS( select ID from ICSMOApply where ApplyCode IN ({0}) and WorkPoint ='{1}' AND Status='2')
  288. BEGIN
  289. RAISERROR('',16,1);
  290. RETURN
  291. END;
  292. DELETE FROM dbo.ICSMOApply WHERE ApplyCode IN ({0}) and WorkPoint ='{1}'", keyValue.TrimEnd(','), WorkPoint);
  293. try
  294. {
  295. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  296. {
  297. }
  298. }
  299. catch (Exception ex)
  300. {
  301. msg = ex.Message;
  302. }
  303. return msg;
  304. }
  305. /// <summary>
  306. /// 审核单据
  307. /// </summary>
  308. /// <param name="keyValue"></param>
  309. /// <returns></returns>
  310. public string ApproveICSMOApplyByCode(string keyValue)
  311. {
  312. //站点信息
  313. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  314. string UserName = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  315. string UserCode = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  316. string msg = "";
  317. keyValue = keyValue.Substring(1, keyValue.Length - 2);
  318. string sql = string.Empty;
  319. sql += string.Format(@"IF EXISTS( select ID from ICSMOApply where ApplyCode IN ({0}) and WorkPoint ='{1}' AND status!='1')
  320. BEGIN
  321. RAISERROR('',16,1);
  322. RETURN
  323. END
  324. UPDATE dbo.ICSMOApply SET Status='2', EATTRIBUTE12='{2}',EATTRIBUTE13='{3}',EATTRIBUTE14='{4}' WHERE ApplyCode IN ({0}) and WorkPoint ='{1}'", keyValue.TrimEnd(','), WorkPoint,UserCode,UserName,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  325. try
  326. {
  327. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  328. {
  329. }
  330. }
  331. catch (Exception ex)
  332. {
  333. msg=ex.Message;
  334. }
  335. return msg;
  336. }
  337. /// <summary>
  338. /// 弃审单据
  339. /// </summary>
  340. /// <param name="keyValue"></param>
  341. /// <returns></returns>
  342. public string AbandonICSMOApplyByCode(string keyValue)
  343. {
  344. //站点信息
  345. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  346. string msg = "";
  347. keyValue = keyValue.Substring(1, keyValue.Length - 2);
  348. string sql = string.Empty;
  349. sql += string.Format(@"IF EXISTS( select ID from ICSMOApply where ApplyCode IN ({0}) and WorkPoint ='{1}' AND status!='2')
  350. BEGIN
  351. RAISERROR('!',16,1);
  352. RETURN
  353. END
  354. IF EXISTS( select ID from ICSMOApply where ApplyCode IN ({0}) and WorkPoint ='{1}' AND IssueQuantity>0)
  355. BEGIN
  356. RAISERROR('',16,1);
  357. RETURN
  358. END
  359. UPDATE dbo.ICSMOApply SET Status='1' WHERE ApplyCode IN ({0}) and WorkPoint ='{1}'", keyValue.TrimEnd(','), WorkPoint);
  360. try
  361. {
  362. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  363. {
  364. }
  365. }
  366. catch (Exception ex)
  367. {
  368. msg = ex.Message;
  369. }
  370. return msg;
  371. }
  372. /// <summary>
  373. /// 发料
  374. /// </summary>
  375. /// <param name="keyValue"></param>
  376. /// <returns></returns>
  377. public string ICSMOApplyByCodeFL(string ID, string Type, string Mechanism, string InvCode)
  378. {
  379. string msg = string.Empty;
  380. try
  381. {
  382. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  383. string UserName = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  384. string UserCode = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  385. List<LOTStockModel> lOTStockModels = new List<LOTStockModel>();
  386. ID = ID.TrimEnd(',');
  387. //单据先进行拣料
  388. DataTable dateTable = App.GetICSMOPickMergeTemp(ID, Type, Mechanism, InvCode);
  389. DataRow[] dateRows = dateTable?.Select($@"LotNo <> '' And LotNo is not null");
  390. decimal ToltalCount = 0.0M;
  391. string ZDsql = $@" SELECT Sum(Quantity) AS Quantity FROM ICSMOApply WHERE ApplyCode in({ID}) and WorkPoint='{WorkPoint}' ";
  392. var dt=SqlHelper.CmdExecuteDataTable(ZDsql);
  393. if (dateRows == null || dateRows.Length <= 0)
  394. {
  395. msg = "库存不足,请先检查库存";
  396. }
  397. else
  398. {
  399. string docCode = string.Empty;
  400. string docCodeAfter = string.Empty;
  401. LOTStockModel lOTStockModel = null;
  402. // 使用 LINQ 根据 Code 字段对 DataRow[] 进行分组
  403. var groups = dateRows.Cast<DataRow>().GroupBy(row => new {
  404. Code = row.Field<string>("Code"),
  405. Sequence = row.Field<string>("Sequence"),
  406. iQuantity = row.Field<string>("iQuantity")
  407. });
  408. foreach (var group in groups)
  409. {
  410. var firstRow = group.First();
  411. var code = firstRow["Code"];
  412. decimal count = 0.0M;
  413. lOTStockModel = new LOTStockModel
  414. {
  415. TransCode = firstRow["Code"].ToString(),
  416. TransSequence = firstRow["Sequence"].ToString(),
  417. Amount = "0",
  418. User = UserCode,
  419. MTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  420. WorkPoint = WorkPoint,
  421. Detail = new List<LOTStockModelList>(),
  422. };
  423. foreach (var row in group)
  424. {
  425. count += row["QTY"].ToDecimal();
  426. LOTStockModelList lOTStockModelList = new LOTStockModelList
  427. {
  428. TransSequence = firstRow["Sequence"].ToString(),
  429. CurrentQuantity = row["QTY"].ToString(),
  430. LotNo = row["LotNo"].ToString(),
  431. CurrentAmount = "0",
  432. Sequence = row["Sequence"].ToString(),
  433. WarehouseCode = row["WarehouseCode"].ToString(),
  434. LocationCode = row["LocationCode"].ToString()
  435. };
  436. lOTStockModel.Detail.Add(lOTStockModelList);
  437. }
  438. lOTStockModel.Quantity = count.ToString();
  439. lOTStockModels.Add(lOTStockModel);
  440. ToltalCount += count;
  441. }
  442. if (ToltalCount != dt.Rows[0]["Quantity"].ToDecimal())
  443. {
  444. msg = "库存不足,请先检查库存";
  445. return msg;
  446. }
  447. string Inputstr = JsonConvert.SerializeObject(lOTStockModels);
  448. string APIURL = ConfigurationManager.ConnectionStrings["APIURL"].ConnectionString + "LOTStockDown/Create";
  449. string result = HttpPost(APIURL, Inputstr);
  450. JObject Obj = (JObject)JsonConvert.DeserializeObject(result);//或者JObject jo = JObject.Parse(jsonText);
  451. string MessAge = Obj["Message"].ToString();
  452. string Success = Obj["Success"].ToString();
  453. if (Success.ToUpper() == "FALSE")
  454. {
  455. msg = MessAge;
  456. }
  457. }
  458. }
  459. catch (Exception ex)
  460. {
  461. msg = ex.Message;
  462. }
  463. return msg;
  464. }
  465. #region 获取物料信息
  466. public DataTable GetItemList(string queryJson, ref Pagination jqgridparam)
  467. {
  468. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  469. var queryParam = queryJson.ToJObject();
  470. List<DbParameter> parameter = new List<DbParameter>();
  471. string sql = @"SELECT a.INVCODE,a.INVNAME,ISnull(c.Quantity,0)-ISnull(b.Quantity,0) AS Quantity,a.EATTRIBUTE2,a.InvStd
  472. FROM ICSInventory a
  473. LEFT JOIN
  474. (SELECT Sum(ISnull(Quantity,0)) as Quantity,WorkPoint,INVCode FROM (SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(OutQuantity, 0)),0) as Quantity,WorkPoint,INVCode FROM ICSOtherOut GROUP BY WorkPoint,INVCode
  475. UNION ALL
  476. SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(IssueQuantity, 0)),0) as Quantity,WorkPoint,INVCode FROM ICSMOApply GROUP BY WorkPoint,INVCode
  477. UNION ALL
  478. SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(SDNQuantity, 0)),0) as Quantity,WorkPoint,INVCode FROM ICSSDN where EATTRIBUTE10='' GROUP BY WorkPoint,INVCode
  479. UNION ALL
  480. SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(IssueQuantity, 0)),0) as Quantity,WorkPoint,INVCode from ICSMOIssue
  481. GROUP BY WorkPoint,INVCode)d
  482. GROUP BY d.INVCode,d.WorkPoint) b
  483. ON a.InvCode=b.InvCode AND a.WorkPoint=b.WorkPoint
  484. left JOIN( SELECT Sum(ISnull(Quantity,0)) AS Quantity,InvCode, WorkPoint FROM ICSWareHouseLotInfo where Freeze<>1 GROUP BY InvCode, WorkPoint ) c ON c.InvCode=a.INVCode AND c.WorkPoint=a.WorkPoint
  485. where 1=1";
  486. if (!string.IsNullOrEmpty(queryJson))
  487. {
  488. if (!string.IsNullOrWhiteSpace(queryParam["INVCODE"].ToString()))
  489. sql += " and a.INVCODE like '%" + queryParam["INVCODE"].ToString() + "%'";
  490. if (!string.IsNullOrWhiteSpace(queryParam["INVNAME"].ToString()))
  491. sql += " and a.INVNAME like '%" + queryParam["INVNAME"].ToString() + "%'";
  492. }
  493. //string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  494. sql += " and a.WorkPoint=('" + WorkPoint + "') ";
  495. return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
  496. }
  497. #endregion
  498. public DataTable GetItemListCount(string queryJson, ref Pagination jqgridparam)
  499. {
  500. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  501. var queryParam = queryJson.ToJObject();
  502. List<DbParameter> parameter = new List<DbParameter>();
  503. string sql = @"SELECT a.INVCODE,a.INVNAME,ISnull(c.Quantity,0)-ISnull(b.Quantity,0) + ISnull(d.Quantity,0) AS Quantity,a.EATTRIBUTE2,a.InvStd
  504. FROM ICSInventory a
  505. LEFT JOIN
  506. (SELECT Sum(ISnull(Quantity,0)) as Quantity,WorkPoint,INVCode FROM (SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(OutQuantity, 0)),0) as Quantity,WorkPoint,INVCode FROM ICSOtherOut GROUP BY WorkPoint,INVCode
  507. UNION ALL
  508. SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(IssueQuantity, 0)),0) as Quantity,WorkPoint,INVCode FROM ICSMOIssue GROUP BY WorkPoint,INVCode
  509. UNION ALL
  510. SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(SDNQuantity, 0)),0) as Quantity,WorkPoint,INVCode FROM ICSSDN GROUP BY WorkPoint,INVCode )d
  511. GROUP BY d.INVCode,d.WorkPoint
  512. UNION ALL
  513. SELECT ISNUll(sum(ISNULL(Quantity,0))-sum(ISNULL(IssueQuantity, 0)),0) as Quantity,WorkPoint,INVCode from ICSMOIssue
  514. GROUP BY WorkPoint,INVCode ) b
  515. ON a.InvCode=b.InvCode AND a.WorkPoint=b.WorkPoint
  516. left JOIN( SELECT Sum(ISnull(Quantity,0)) AS Quantity,InvCode, WorkPoint FROM ICSWareHouseLotInfo where Freeze<>1 GROUP BY InvCode, WorkPoint) c ON c.InvCode=a.INVCode AND c.WorkPoint=a.WorkPoint
  517. left join ICSMOIssue d ON d.InvCode=a.InvCode AND a.WorkPoint=d.WorkPoint
  518. where 1=1";
  519. if (!string.IsNullOrEmpty(queryJson))
  520. {
  521. if (!string.IsNullOrWhiteSpace(queryParam["INVCODE"].ToString()))
  522. sql += " and a.INVCODE like '%" + queryParam["INVCODE"].ToString() + "%'";
  523. if (!string.IsNullOrWhiteSpace(queryParam["ApplyCode"].ToString()))
  524. sql += " and d.ApplyCode like '%" + queryParam["ApplyCode"].ToString() + "%'";
  525. }
  526. //string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  527. sql += " and a.WorkPoint=('" + WorkPoint + "') ";
  528. return SqlHelper.CmdExecuteDataTable(sql);
  529. }
  530. #endregion
  531. #region
  532. public decimal GetInvCodeCount(string invCode,string whCode,string batchCode)
  533. {
  534. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  535. string sql = $@"EXEC Proc_GetLotStorageQty '{WorkPoint}','{invCode}','{whCode}','{batchCode}'";
  536. var dt= SqlHelper.CmdExecuteDataTable(sql);
  537. return dt.Rows[0]["Quantity"].ToDecimal();
  538. }
  539. #endregion
  540. #region 获取领料部门
  541. public DataTable GetLYDep()
  542. {
  543. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  544. string sql = @"SELECT b.F_ItemName as Name,b.F_ItemCode as Code FROM [dbo].[Sys_SRM_Items] a
  545. INNER JOIN Sys_SRM_ItemsDetail b ON b.F_ItemId = a.F_Id
  546. WHERE F_EnCode = 'LYDep'";
  547. return SqlHelper.CmdExecuteDataTable(sql);
  548. }
  549. #endregion
  550. #region 获取单据类型
  551. /// <summary>
  552. /// 获取U9单据类型
  553. /// </summary>
  554. /// <returns></returns>
  555. public string GetU9CodeType(string type)
  556. {
  557. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  558. string result=String.Empty;
  559. try
  560. {
  561. TypeModel model = new TypeModel
  562. {
  563. TypeName = type,
  564. OrgCode = WorkPoint
  565. };
  566. string Inputstr = JsonConvert.SerializeObject(model);
  567. string APIURL = ConfigurationManager.ConnectionStrings["ERPAPIURL"].ConnectionString + "GetU9DocType ";
  568. result = HttpPost(APIURL, Inputstr);
  569. }
  570. catch (Exception ex)
  571. {
  572. result = ex.Message;
  573. }
  574. return result;
  575. }
  576. #endregion
  577. /// <summary>
  578. /// 关闭单据
  579. /// </summary>
  580. /// <param name="keyValue"></param>
  581. /// <returns></returns>
  582. public string CloseICSMOApplyByCode(string keyValue)
  583. {
  584. //站点信息
  585. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  586. string msg = "";
  587. keyValue = keyValue.Substring(1, keyValue.Length - 2);
  588. string sql = string.Empty;
  589. sql += string.Format(@"IF EXISTS( select ID from ICSMOApply where ApplyCode IN ({0}) and WorkPoint ='{1}' AND IssueQuantity>0)
  590. BEGIN
  591. RAISERROR('',16,1);
  592. RETURN
  593. END
  594. UPDATE dbo.ICSMOApply SET Status='3' WHERE ApplyCode IN ({0}) and WorkPoint ='{1}'", keyValue.TrimEnd(','), WorkPoint);
  595. try
  596. {
  597. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  598. {
  599. }
  600. }
  601. catch (Exception ex)
  602. {
  603. msg=ex.Message;
  604. }
  605. return msg;
  606. }
  607. /// <summary>
  608. /// 获取单号
  609. /// </summary>
  610. /// <param name="WorkPoint"></param>
  611. /// <returns></returns>
  612. public string GetBidCode(string WorkPoint)
  613. {
  614. WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  615. string BidCide = string.Empty;
  616. if (!string.IsNullOrEmpty(WorkPoint))
  617. {
  618. string DateString = DateTime.Now.ToString("yyyyMMdd");
  619. string Pre = "CLCK" + DateString;
  620. BidCide = GetSerialCode(WorkPoint, "ICSMOApply", "ApplyCode", Pre, 4);
  621. }
  622. if (!string.IsNullOrWhiteSpace(BidCide))
  623. {
  624. string sqlISHave = @"SELECT ApplyCode FROM ICSMOApply a
  625. WHERE a.ApplyCode = '{0}'";
  626. sqlISHave = string.Format(sqlISHave, BidCide);
  627. DataTable dtIsHave = SqlHelper.GetDataTableBySql(sqlISHave);
  628. if (dtIsHave.Rows.Count > 0)
  629. {
  630. throw new Exception("单号已存在!");
  631. }
  632. }
  633. return BidCide;
  634. }
  635. public string GetSerialCode(string workPointCode, string tbName, string colName, string Pre, int numLen)
  636. {
  637. string sql = "EXEC Addins_GetSerialCode '{0}','{1}','{2}','{3}',{4}";
  638. sql = string.Format(sql, new object[] { workPointCode, tbName, colName, Pre, numLen });
  639. return SqlHelper.ExecuteScalar(sql).ToString();
  640. }
  641. /// <summary>
  642. /// 修改单据
  643. /// </summary>
  644. /// <param name="ICSASN"></param>
  645. /// <returns></returns>
  646. public string UpdateICSMOApply(string ICSASN)
  647. {
  648. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  649. string UserName = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  650. string msg = "";
  651. try
  652. {
  653. // 获取解析后的数据
  654. JsonData data = JsonConvert.DeserializeObject<JsonData>(ICSASN);
  655. string sql = $@"IF EXISTS( select ID from ICSMOApply where ApplyCode = '{data.Code}' and WorkPoint ='{WorkPoint}' AND Status='2')
  656. BEGIN
  657. RAISERROR('',16,1);
  658. RETURN
  659. END;
  660. DECLARE @CreatedCode VARCHAR(50);
  661. DECLARE @CreatedName VARCHAR(50);
  662. SET @CreatedCode =(SELECT top 1 MUSER from ICSMOApply where ApplyCode = '{data.Code}' and WorkPoint ='{WorkPoint}');
  663. SET @CreatedName=(SELECT top 1 MUSERName from ICSMOApply where ApplyCode = '{data.Code}' and WorkPoint ='{WorkPoint}') ;
  664. delete from ICSMOApply where ApplyCode = '{data.Code}'; ";
  665. string str1 = "";
  666. List<string> ExtensionIDList = new List<string>();
  667. foreach (var detail in data.Detail)
  668. {
  669. string Colspan = "~" + detail.Batch + "~~~~~~~~~~~~";
  670. string sqls = string.Format(@"select ID from ICSExtension where Colspan='{0}' and WorkPoint='{1}'", Colspan, WorkPoint);
  671. object ExtensionID = SqlHelper.ExecuteScalar(sqls);
  672. bool flag = true;
  673. foreach (var item in ExtensionIDList)
  674. {
  675. if (item == Colspan + WorkPoint)
  676. {
  677. flag = false;
  678. }
  679. }
  680. if (ExtensionID == null && flag == true)
  681. {
  682. str1 = Guid.NewGuid().ToString();
  683. sql += string.Format(@"Insert into ICSExtension(ID, Colspan, ProjectCode, BatchCode, Version, Brand, cFree1, cFree2, cFree3, cFree4, cFree5, cFree6, cFree7, cFree8, cFree9, cFree10, MTIME, MUSER, MUSERName, WorkPoint)
  684. Values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}',getdate(),'{16}','{17}','{18}' )",
  685. str1, Colspan, "", detail.Batch, "", "", "", "", "", "", "", "", "", "", "", "",
  686. data.User, UserName, WorkPoint);
  687. }
  688. else if (ExtensionID != null)
  689. {
  690. str1 = ExtensionID.ToString();
  691. }
  692. ExtensionIDList.Add(Colspan + WorkPoint);
  693. sql += "INSERT INTO ICSMOApply(ID,ApplyCode,WHCode,Sequence,InvCode,Quantity,CreatePerson,CreateDateTime,WorkPoint,Status,ApplyID,ApplyDetailID,ExtensionID,MUSER,MUSERName,MTIME,EATTRIBUTE,EATTRIBUTE2,EATTRIBUTE3,EATTRIBUTE4,EATTRIBUTE5,EATTRIBUTE6,EATTRIBUTE7,EATTRIBUTE10,SourceCode,Type,EATTRIBUTE8,EATTRIBUTE9,IssueQuantity,DepCode,EATTRIBUTE11)" +
  694. " select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',newID(),newID(),'{10}','{11}',{12},{13},'{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','1','{23}','{24}',0,'{25}','{26}'";
  695. sql = string.Format(sql, detail.ID, data.Code, detail.WHCode, detail.Sequence, detail.InvCode, detail.Quantity, data.User, data.MTIME, WorkPoint, '1', str1, "@CreatedCode", "@CreatedName", data.MTIME, data.Dept, data.CodeType, data.ApplyNegCode, data.Custmer, data.Remarks, detail.DetailReamrk, detail.SYproject, "杂发", detail.SourceCode, data.Remarks2, detail.DetailReamrk2, data.LYDept, data.Remarks3);
  696. }
  697. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  698. {
  699. }
  700. }
  701. catch (Exception ex)
  702. {
  703. msg = ex.Message;
  704. }
  705. return msg;
  706. }
  707. public DataTable GetICSReturnTemporary(string rfqno)
  708. {
  709. string sql = @"SELECT
  710. a.ID,
  711. a.ApplyCode,
  712. a.InvCode,
  713. b.InvName as INVNAME,
  714. b.InvStd,
  715. a.Quantity,
  716. a.SourceCode,
  717. a.WHCode,
  718. a.WHCode as WHCodeHHH,
  719. a.EATTRIBUTE6,
  720. a.EATTRIBUTE9,
  721. a.SourceCode,
  722. a.Quantity
  723. ,f.BatchCode as Batch
  724. ,c.WarehouseName as WHCodeName
  725. ,a.EATTRIBUTE7 as SYproject,
  726. a.EATTRIBUTE11 ,
  727. a.DepCode
  728. FROM ICSMOApply a
  729. LEFT JOIN ICSInventory b ON a.InvCode = b.InvCode
  730. left join ICSExtension f on a.ExtensionID=f.ID and a.WorkPoint=f.WorkPoint
  731. LEFT JOIN dbo.ICSWarehouse c ON a.WHCode=c.WarehouseCode AND a.WorkPoint=c.WorkPoint
  732. where a.ApplyCode='" + rfqno + "'";
  733. DataTable table = Repository().FindDataSetBySql(sql).Tables[0];
  734. DataTable dtCloned = table.Clone();
  735. foreach (DataColumn col in dtCloned.Columns)
  736. {
  737. col.DataType = typeof(string);
  738. }
  739. foreach (DataRow row in table.Rows)
  740. {
  741. DataRow newrow = dtCloned.NewRow();
  742. foreach (DataColumn column in dtCloned.Columns)
  743. {
  744. newrow[column.ColumnName] = row[column.ColumnName].ToString();
  745. }
  746. dtCloned.Rows.Add(newrow);
  747. }
  748. if (Invmes.Rows.Count > 0)
  749. {
  750. dtCloned.Merge(Invmes, false);
  751. }
  752. return dtCloned;
  753. }
  754. //拣料
  755. public DataTable GetICSMOPickMergeTemp(string ID, string Type, string Mechanism, string InvCode)
  756. {
  757. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  758. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  759. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  760. ID = string.IsNullOrWhiteSpace(ID) ? "''" : ID.TrimEnd(',');
  761. string sqls = "";
  762. string wheresql = "";
  763. #region 各单据sql
  764. string Code = SqlHelper.GetItemsDetailEnabledMark("MtimeControl");
  765. if (Type == "2")
  766. {
  767. if (!string.IsNullOrWhiteSpace(InvCode))
  768. {
  769. wheresql = " and a.InvCode = '" + InvCode + "' ";
  770. }
  771. sqls = @"select
  772. a.ApplyCode as Code,a.Sequence, a.InvCode, b.InvName as INVNAME, b.InvStd, b.InvUnit,a.Quantity, (SUM(ISNULL(a.Quantity, 0))-SUM(ISNULL(a.IssueQuantity, 0))) AS iQuantity, a.WhCode,a.ExtensionID,
  773. f.ProjectCode ,f.BatchCode ,f.Version ,f.Brand ,f.cFree1 ,f.cFree2 ,f.cFree3 ,f.cFree4
  774. ,f.cFree5 ,f.cFree6 ,f.cFree7 ,f.cFree8 ,f.cFree9 ,f.cFree10
  775. FROM
  776. ICSMOApply a
  777. LEFT JOIN ICSINVENTORY b ON a.InvCode = b.InvCode AND a.WorkPoint=b.WorkPoint
  778. LEFT JOIN ICSExtension f on a.ExtensionID=f.ID and a.WorkPoint=f.WorkPoint
  779. WHERE a.ApplyCode in ({0}) AND a.WorkPoint = '{1}' AND ISNULL(a.Quantity, 0)>ISNULL(a.IssueQuantity, 0)
  780. GROUP BY a.ApplyCode,a.InvCode,b.InvName,b.InvStd,b.InvUnit,a.WhCode,a.ExtensionID,a.Sequence,f.ProjectCode ,f.BatchCode ,f.Version ,f.Brand ,f.cFree1 ,f.cFree2 ,f.cFree3 ,f.cFree4
  781. ,f.cFree5 ,f.cFree6 ,f.cFree7 ,f.cFree8 ,f.cFree9 ,f.cFree10";
  782. }
  783. #endregion
  784. sqls = string.Format(sqls, ID, WorkPoint);
  785. string sql = $@"SELECT row_number() over ( order by c.Code,c.InvCode,d.MTIME,d.LotNO) AS rowNo,
  786. c.Code,
  787. c.Sequence,
  788. c.InvCode,
  789. c.InvName as INVNAME,
  790. c.InvStd,
  791. c.InvUnit,
  792. c.iQuantity AS iQuantity,
  793. c.WHCode AS WarehouseCode,
  794. d.LotNO,
  795. ISNULL(d.Quantity, 0) AS QTY,
  796. ISNULL(d.Quantity, 0) AS QTYLeft,
  797. CONVERT(decimal(18,6),0) AS SendQTY,
  798. d.LocationCode AS LocationCode,
  799. CONVERT(varchar(100),d.MTIME, 23) MTIME,
  800. f.QTYTotal QTYTotal,c.ExtensionID
  801. FROM
  802. ({sqls}) c
  803. left join (select d.WarehouseCode,d.Quantity-d.LockQuantity as Quantity,d.INVCode, m.LotNo, d.MTIME,d.inDate,d.LocationCode,m.ExtensionID ,m.ProductDate,m.ExpirationDate,
  804. f.ProjectCode ,f.BatchCode ,f.Version ,f.Brand ,f.cFree1 ,f.cFree2 ,f.cFree3 ,f.cFree4
  805. ,f.cFree5 ,f.cFree6 ,f.cFree7 ,f.cFree8 ,f.cFree9 ,f.cFree10
  806. from ICSWareHouseLotInfo d ,ICSInventoryLot m
  807. LEFT JOIN ICSExtension f on m.ExtensionID=f.ID and m.WorkPoint=f.WorkPoint
  808. where d.LotNo=m.LotNo and d.WorkPoint=m.WorkPoint
  809. and d.WorkPoint='{WorkPoint}' AND d.Quantity-d.LockQuantity>0 AND d.Quantity>0
  810. ) d
  811. on c.InvCode=d.INVCode
  812. AND (LEN(ISNULL(c.WHCode,''))<=0 OR (LEN(ISNULL(c.WHCode,''))>0 AND c.WHCode=d.WarehouseCode))
  813. AND (LEN(ISNULL(c.ProjectCode,''))<=0 OR (LEN(ISNULL(c.ProjectCode,''))>0 AND c.ProjectCode=d.ProjectCode))
  814. AND (LEN(ISNULL(c.BatchCode,''))<=0 OR (LEN(ISNULL(c.BatchCode,''))>0 AND c.BatchCode=d.BatchCode))
  815. AND (LEN(ISNULL(c.Version,''))<=0 OR (LEN(ISNULL(c.Version,''))>0 AND c.Version=d.Version))
  816. AND (LEN(ISNULL(c.Brand,''))<=0 OR (LEN(ISNULL(c.Brand,''))>0 AND c.Brand=d.Brand))
  817. AND (LEN(ISNULL(c.cFree1,''))<=0 OR (LEN(ISNULL(c.cFree1,''))>0 AND c.cFree1=d.cFree1))
  818. AND (LEN(ISNULL(c.cFree2,''))<=0 OR (LEN(ISNULL(c.cFree2,''))>0 AND c.cFree2=d.cFree2))
  819. AND (LEN(ISNULL(c.cFree3,''))<=0 OR (LEN(ISNULL(c.cFree3,''))>0 AND c.cFree3=d.cFree3))
  820. AND (LEN(ISNULL(c.cFree4,''))<=0 OR (LEN(ISNULL(c.cFree4,''))>0 AND c.cFree4=d.cFree4))
  821. AND (LEN(ISNULL(c.cFree5,''))<=0 OR (LEN(ISNULL(c.cFree5,''))>0 AND c.cFree5=d.cFree5))
  822. AND (LEN(ISNULL(c.cFree6,''))<=0 OR (LEN(ISNULL(c.cFree6,''))>0 AND c.cFree6=d.cFree6))
  823. AND (LEN(ISNULL(c.cFree7,''))<=0 OR (LEN(ISNULL(c.cFree7,''))>0 AND c.cFree7=d.cFree7))
  824. AND (LEN(ISNULL(c.cFree8,''))<=0 OR (LEN(ISNULL(c.cFree8,''))>0 AND c.cFree8=d.cFree8))
  825. AND (LEN(ISNULL(c.cFree9,''))<=0 OR (LEN(ISNULL(c.cFree9,''))>0 AND c.cFree9=d.cFree9))
  826. AND (LEN(ISNULL(c.cFree10,''))<=0 OR (LEN(ISNULL(c.cFree10,''))>0 AND c.cFree10=d.cFree10))
  827. LEFT JOIN (SELECT INVCode,WarehouseCode,SUM(Quantity-LockQuantity) AS QTYTotal FROM ICSWareHouseLotInfo WHERE WorkPoint='{WorkPoint}' GROUP BY INVCode,WarehouseCode) f ON c.InvCode=f.INVCode AND c.WhCode=f.WarehouseCode
  828. ";
  829. // sql = string.Format(sql, sqls)1;
  830. if (Code == "MC00002")
  831. {
  832. sql += "order by d.inDate";
  833. }
  834. else if (Code == "MC00001")
  835. {
  836. sql += " order BY ISNULL(d.ProductDate,d.ExpirationDate)";
  837. }
  838. else
  839. {
  840. sql += " order BY ISNULL(d.ExpirationDate,d.ProductDate)";
  841. }
  842. var dataset = Repository().FindDataSetBySql(sql);
  843. if (dataset.Tables[0].Rows.Count == 0)
  844. return null;
  845. DataTable table = dataset.Tables[0];
  846. decimal qtyCount = 0;
  847. bool remove = false;
  848. List<int> removeList = new List<int>();
  849. for (int i = 0; i < table.Rows.Count; i++)
  850. {
  851. if (i != 0
  852. && (!table.Rows[i]["InvCode"].ToString().Equals(table.Rows[i - 1]["InvCode"].ToString())
  853. || !table.Rows[i]["Sequence"].ToString().Equals(table.Rows[i - 1]["Sequence"].ToString())
  854. || !table.Rows[i]["Code"].ToString().Equals(table.Rows[i - 1]["Code"].ToString())
  855. || !table.Rows[i]["ExtensionID"].ToString().Equals(table.Rows[i - 1]["ExtensionID"].ToString()))
  856. )
  857. {
  858. qtyCount = 0;
  859. remove = false;
  860. }
  861. if (table.Rows[i]["QTYLeft"].ToString().ToDecimal() == 0 && table.Rows[i]["LotNO"].ToString() != "")
  862. {
  863. table.Rows[i]["LotNO"] = "";
  864. string a = "0.000000";
  865. table.Rows[i]["QTY"] = Convert.ToDecimal(a);
  866. //removeList.Add(i);
  867. continue;
  868. }
  869. if (remove && table.Rows[i]["LotNO"].ToString() != "")
  870. {
  871. removeList.Add(i);
  872. }
  873. else
  874. {
  875. var lotQty = table.Rows[i]["QTYLeft"].ToString().ToDecimal();
  876. var orderQty = table.Rows[i]["iQuantity"].ToString().ToDecimal();
  877. qtyCount += lotQty;
  878. foreach (DataRow dr in table.Rows)
  879. {
  880. if (dr["LotNO"].ToString() == table.Rows[i]["LotNO"].ToString())
  881. {
  882. if (qtyCount > orderQty)
  883. {
  884. dr["QTYLeft"] = Convert.ToDecimal(qtyCount) - Convert.ToDecimal(orderQty);
  885. }
  886. else
  887. {
  888. dr["QTYLeft"] = 0;
  889. }
  890. }
  891. }
  892. if (qtyCount >= orderQty)
  893. {
  894. table.Rows[i]["SendQTY"] = Convert.ToDecimal(lotQty) - (Convert.ToDecimal(qtyCount) - Convert.ToDecimal(orderQty));
  895. remove = true;
  896. }
  897. else
  898. {
  899. table.Rows[i]["SendQTY"] = lotQty;
  900. }
  901. }
  902. }
  903. if (removeList.Count > 0)
  904. {
  905. removeList.Reverse();
  906. foreach (var item in removeList)
  907. {
  908. table.Rows.RemoveAt(item);
  909. }
  910. }
  911. try
  912. {
  913. #region 旧卡控
  914. #endregion
  915. DataRow[] dss = table.Select("LotNO=''");
  916. foreach (var item in dss)
  917. {
  918. DataRow[] dsss = table.Select("Code='" + item["Code"].ToString() + "' and Sequence='" + item["Sequence"].ToString() + "' and LotNO <> '' ");
  919. if (dsss != null && dsss.Length > 0)
  920. {
  921. table.Rows.Remove(item);
  922. }
  923. }
  924. var result = App.ConvertCellToString(table);
  925. if (Invmes.Rows.Count > 0)
  926. {
  927. result.Merge(Invmes, false);
  928. }
  929. return result;
  930. }
  931. catch (Exception ex)
  932. {
  933. throw new Exception(ex.Message);
  934. }
  935. }
  936. //接口api解析
  937. public static string HttpPost(string url, string body)
  938. {
  939. try
  940. {
  941. Encoding encoding = Encoding.UTF8;
  942. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  943. request.Method = "POST";
  944. request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
  945. request.ContentType = "application/json; charset=utf-8";
  946. byte[] buffer = encoding.GetBytes(body);
  947. request.ContentLength = buffer.Length;
  948. request.GetRequestStream().Write(buffer, 0, buffer.Length);
  949. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  950. using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
  951. {
  952. return reader.ReadToEnd();
  953. }
  954. }
  955. catch (WebException ex)
  956. {
  957. throw new Exception(ex.Message);
  958. }
  959. }
  960. //深拷贝
  961. #region
  962. public static T DeepCopyByReflect<T>(T obj)
  963. {
  964. if (obj == null)
  965. return obj;
  966. var type = obj.GetType();
  967. //如果是字符串或值类型则直接返回
  968. if (obj is string || type.IsValueType) return obj;
  969. if(type.IsArray)
  970. {
  971. var elementType = Type.GetType(type.FullName.Replace("[]", null));
  972. var array = obj as Array;
  973. var copied = Array.CreateInstance(elementType, array.Length);
  974. for (int idx = 0; idx < copied.Length; idx++)
  975. {
  976. copied.SetValue(DeepCopyByReflect(array.GetValue(idx)), idx);
  977. }
  978. return (T)Convert.ChangeType(copied,type);
  979. }
  980. object retval = Activator.CreateInstance(obj.GetType());
  981. FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.Static);
  982. foreach (FieldInfo field in fields)
  983. {
  984. try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
  985. catch { }
  986. }
  987. return (T)retval;
  988. }
  989. #endregion
  990. #region
  991. /// <summary>
  992. /// 数据导入
  993. /// </summary>
  994. /// <param name="savePath"></param>
  995. /// <param name="Year"></param>
  996. /// <returns></returns>
  997. public string SetData_PR(String savePath, string Year)
  998. {
  999. //数据获取
  1000. try
  1001. {
  1002. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  1003. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  1004. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  1005. SqlConnection conn = SqlHelper.GetDataCenterConn();
  1006. DataTable data = FileToExcel.ExcelToTable(savePath);
  1007. int index = 1;
  1008. string Tday = DateTime.Now.ToString("yyyyMMdd");
  1009. string sql = string.Empty;
  1010. string[] nameString = {"单据类型名称","受益部门名称","料品编码","数量"};
  1011. //获取单据类型
  1012. string jsonstring=GetU9CodeType("杂发");
  1013. //获取项目信息
  1014. string jsonProject = GetU9CodeType("项目");
  1015. //获取部门信息
  1016. string jsonDep = GetU9CodeType("部门");
  1017. var docType= JsonConvert.DeserializeObject<List<DocTypeModel>>(jsonstring);
  1018. var projectType = JsonConvert.DeserializeObject<List<DocTypeModel>>(jsonProject);
  1019. var depType = JsonConvert.DeserializeObject<List<DocTypeModel>>(jsonDep);
  1020. var LYDepType = JsonConvert.DeserializeObject <List<DocTypeModel>>(GetLYDep().ToJson());
  1021. string applyCode = GetBidCode(WorkPoint);
  1022. Pagination pagination=new Pagination();
  1023. pagination.rows = 20;
  1024. pagination.sidx = "INVCODE";
  1025. pagination.sord = "desc";
  1026. pagination.page = 1;
  1027. if (data != null && data.Rows.Count > 0)
  1028. {
  1029. foreach (DataRow dr in data.Rows)
  1030. {
  1031. index++;
  1032. for(int i=0;i< nameString.Length;i++)
  1033. {
  1034. if (string.IsNullOrWhiteSpace(dr[i].ToString()))
  1035. {
  1036. throw new Exception($"第{index}行,{nameString[i]}不能为空!");
  1037. }
  1038. }
  1039. string queryJson="{\"INVCODE\":\""+ dr["料品编码"].ToString() + "\",\"ApplyCode\":\"\"}";
  1040. DataTable ListData = GetItemListCount(queryJson, ref pagination);
  1041. decimal count = ListData.Rows[0]["Quantity"].ToDecimal();
  1042. string DocTypeName = dr["单据类型名称"].ToString();
  1043. string SYDep=string.Empty;
  1044. string SYDepName = dr["受益部门名称"].ToString();
  1045. string InvCode = dr["料品编码"].ToString();
  1046. string Count = dr["数量"].ToString();
  1047. string ZJProject = dr["在建工程项目"].ToString();
  1048. string CusCode = dr["客户编码"].ToString();
  1049. string RDCode = dr["RD编码"].ToString();
  1050. string ProjectCode = dr["项目编码"].ToString();
  1051. string LYDep = string.Empty;
  1052. string LYDepName = dr["领用部门名称"].ToString();
  1053. string WHCode = dr["仓库编码"].ToString();
  1054. string BatchCode = dr["批号"].ToString();
  1055. string SYProject = string.Empty;
  1056. string SYProjectName = dr["受益项目名称"].ToString();
  1057. string MOCode = dr["工单"].ToString();
  1058. string ReturnCount = dr["回收数量"].ToString();
  1059. string Ramark = dr["备注"].ToString();
  1060. string str1=string.Empty;
  1061. //单据类型
  1062. List<DocTypeModel> DocTypeModel = docType.Where(e => e.Name == DocTypeName).ToList();
  1063. if (DocTypeModel.IsEmpty())
  1064. {
  1065. throw new Exception($"第{index}行,单据类型不存在!");
  1066. }
  1067. string DocType = DocTypeModel[0].Code;
  1068. //受益部门
  1069. if (!string.IsNullOrEmpty(SYDepName))
  1070. {
  1071. List<DocTypeModel> depTypeModel = depType.Where(e => e.Name == SYDepName).ToList();
  1072. if (depTypeModel.IsEmpty())
  1073. {
  1074. throw new Exception($"第{index}行,受益部门不存在!");
  1075. }
  1076. SYDep = depTypeModel[0].Code;
  1077. }
  1078. //领用部门
  1079. if (!string.IsNullOrEmpty(LYDepName))
  1080. {
  1081. List<DocTypeModel> LYDepModel = LYDepType.Where(e => e.Name == LYDepName).ToList();
  1082. if (LYDepModel.IsEmpty())
  1083. {
  1084. throw new Exception($"第{index}行,领用部门不存在!");
  1085. }
  1086. LYDep = LYDepModel[0].Code;
  1087. }
  1088. //受益项目
  1089. if (!string.IsNullOrEmpty(SYProjectName))
  1090. {
  1091. List<DocTypeModel> SYprojectModel = projectType.Where(e => e.Name == SYProjectName).ToList();
  1092. if (SYprojectModel.IsEmpty())
  1093. {
  1094. throw new Exception($"第{index}行,受益项目不存在!");
  1095. }
  1096. SYProject = SYprojectModel[0].Code;
  1097. }
  1098. if (count< Count.ToDecimal())
  1099. {
  1100. throw new Exception($"第{index}行,物料编码:{InvCode},创建单据数量不能超过库存数量!");
  1101. }
  1102. if (!string.IsNullOrWhiteSpace(dr["批号"].ToString()))
  1103. {
  1104. var Colspan = "~" + dr["批号"].ToString() + "~~~~~~~~~~~~";
  1105. string sqls = string.Format(@"select ID from ICSExtension where Colspan='{0}' and WorkPoint='{1}'", Colspan, WorkPoint);
  1106. object ExtensionID = SqlHelper.ExecuteScalar(sqls);
  1107. if (ExtensionID == null)
  1108. {
  1109. str1 = Guid.NewGuid().ToString();
  1110. sql += $@"Insert into ICSExtension(ID, Colspan, ProjectCode, BatchCode, Version, Brand, MTIME, MUSER, MUSERName, WorkPoint)
  1111. Values('{str1}','{Colspan}','','{dr["批号"]}','','',getdate(),'{MUSER}','{MUSERNAME}','{WorkPoint}')";
  1112. }
  1113. else
  1114. {
  1115. str1 = ExtensionID.ToString();
  1116. }
  1117. }
  1118. sql += $@"IF not EXISTS( SELECT ID FROM ICSInventory WHERE InvCode='{InvCode}' AND WorkPoint='{WorkPoint}')
  1119. BEGIN
  1120. RAISERROR('{index}',16,1);
  1121. RETURN
  1122. END;
  1123. INSERT INTO ICSMOApply(ID,ApplyCode,WHCode,Sequence,InvCode,Quantity,CreatePerson,CreateDateTime,WorkPoint,Status,ApplyID,ApplyDetailID,ExtensionID,MUSER,MUSERName,MTIME,EATTRIBUTE,EATTRIBUTE2,EATTRIBUTE3,EATTRIBUTE4,EATTRIBUTE5,EATTRIBUTE6,EATTRIBUTE7,EATTRIBUTE10,SourceCode,Type,EATTRIBUTE8,EATTRIBUTE9,IssueQuantity,DepCode) Values(newID(),'{applyCode}','{WHCode}','{index}','{InvCode}','{Count}','{MUSER}','{Tday}','{WorkPoint}','1',newID(),newID(),'{str1}','{MUSER}','{MUSERNAME}','{Tday}','{SYDep}','{DocType}','{ZJProject}','{CusCode}','{RDCode}','{ReturnCount}','{SYProject}','','{MOCode}','1','{ProjectCode}','{Ramark}',0,'{LYDep}');";
  1124. }
  1125. if (SqlHelper.CmdExecuteNonQueryLi(sql) <= 0)
  1126. {
  1127. return "导入失败,新增数据错误!";
  1128. }
  1129. }
  1130. else
  1131. {
  1132. return "无有效的导入数据。";
  1133. }
  1134. return "true";
  1135. }
  1136. catch (Exception ex)
  1137. {
  1138. return ex.Message;
  1139. }
  1140. }
  1141. #endregion
  1142. // 定义一个类来表示 JSON 数据的结构
  1143. public class JsonData
  1144. {
  1145. public string Dept { get; set; }
  1146. public string LYDept { get; set; }
  1147. public string CodeType { get; set; }
  1148. public string ApplyNegCode { get; set; }
  1149. public string Custmer { get; set; }
  1150. public string Remarks { get; set; }
  1151. public string Remarks2 { get; set; }
  1152. public string Remarks3 { get; set; }
  1153. public string Code { get; set; }
  1154. public string MTIME { get; set; }
  1155. public string User { get; set; }
  1156. public List<JsonDetail> Detail { get; set; }
  1157. }
  1158. public class JsonDetail
  1159. {
  1160. public string ID;
  1161. public int Sequence { get; set; }
  1162. public string InvCode { get; set; }
  1163. public decimal Quantity { get; set; }
  1164. public string SYproject { get; set; }
  1165. public string WHCode { get; set; }
  1166. /// <summary>
  1167. /// 工单号
  1168. /// </summary>
  1169. public string SourceCode { get; set; }
  1170. public string DetailReamrk { get; set; }
  1171. public string DetailReamrk2 { get; set; }
  1172. public string Batch { get; set; }
  1173. }
  1174. /// <summary>
  1175. /// 材料出库
  1176. /// </summary>
  1177. public class LOTStockModel
  1178. {
  1179. /// <summary>
  1180. /// 源头单据号
  1181. /// </summary>
  1182. public string TransCode { get; set; }
  1183. /// <summary>
  1184. /// 源头单据行号
  1185. /// </summary>
  1186. public string TransSequence { get; set; }
  1187. /// <summary>
  1188. /// 数量
  1189. /// </summary>
  1190. public string Quantity { get; set; }
  1191. /// <summary>
  1192. /// 辅计量数量
  1193. /// </summary>
  1194. public string Amount { get; set; }
  1195. /// <summary>
  1196. /// 操作类型
  1197. /// </summary>
  1198. public string TransType { get; set; } = "生产发料-领料申请单";
  1199. /// <summary>
  1200. /// 操作人
  1201. /// </summary>
  1202. public string User { get; set; }
  1203. /// <summary>
  1204. /// 操作时间
  1205. /// </summary>
  1206. public string MTime { get; set; }
  1207. public string WorkPoint { get; set; }
  1208. public List<LOTStockModelList> Detail { get; set; }
  1209. }
  1210. public class LOTStockModelList
  1211. {
  1212. /// <summary>
  1213. /// 源头单据行号
  1214. /// </summary>
  1215. public string TransSequence { get; set; }
  1216. /// <summary>
  1217. /// 条码
  1218. /// </summary>
  1219. public string LotNo { get; set; }
  1220. /// <summary>
  1221. /// 数量
  1222. /// </summary>
  1223. public string CurrentQuantity { get; set; }
  1224. /// <summary>
  1225. /// 辅计量数量
  1226. /// </summary>
  1227. public string CurrentAmount { get; set; }
  1228. public string Sequence { get; set; }
  1229. /// <summary>
  1230. /// 仓库代码
  1231. /// </summary>
  1232. public string WarehouseCode { get; set; }
  1233. /// <summary>
  1234. /// 库位代码
  1235. /// </summary>
  1236. public string LocationCode { get; set; }
  1237. /// <summary>
  1238. /// LogID
  1239. /// </summary>
  1240. public string LogID { get; set; }
  1241. }
  1242. public class TypeModel
  1243. {
  1244. /// <summary>
  1245. /// 名称
  1246. /// </summary>
  1247. public string TypeName { get; set; }
  1248. /// <summary>
  1249. /// 组织
  1250. /// </summary>
  1251. public string OrgCode { get; set; }
  1252. }
  1253. public class DocTypeModel
  1254. {
  1255. /// <summary>
  1256. /// 名称
  1257. /// </summary>
  1258. public string Name { get; set; }
  1259. /// <summary>
  1260. /// 编码
  1261. /// </summary>
  1262. public string Code { get; set; }
  1263. }
  1264. }
  1265. }