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.

843 lines
39 KiB

3 days ago
  1. using ICSSoft.SendMail;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Linq;
  4. using NFine.Code;
  5. using NFine.Data.Extensions;
  6. using NFine.Domain._03_Entity.SRM;
  7. using NFine.Repository;
  8. using OfficeOpenXml;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Configuration;
  12. using System.Data;
  13. using System.Data.Common;
  14. using System.Data.SqlClient;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Net;
  18. using System.Net.Mail;
  19. using System.Net.Mime;
  20. using System.Net.Security;
  21. using System.Security.Cryptography.X509Certificates;
  22. using System.Text;
  23. using System.Threading.Tasks;
  24. using System.Web;
  25. using System.Web.Mail;
  26. namespace NFine.Application.KBSSRM
  27. {
  28. public class MaterialImportApp : RepositoryFactory<ICSVendor>
  29. {
  30. public DataTable SelectColumnName(string BeginTime, string EndTime)
  31. {
  32. DateTime ETtim;
  33. if (string.IsNullOrEmpty(BeginTime))
  34. {
  35. BeginTime = DateTime.Now.ToString("yyyy-MM-dd");
  36. ETtim = Convert.ToDateTime(BeginTime).AddDays(15);
  37. EndTime = ETtim.ToString("yyyy-MM-dd");
  38. }
  39. string sql = @"declare @StartDate DATETIME = '{0}'
  40. declare @EndDate DATETIME = '{1}'
  41. select ColCaption , ColCaption ColFiledName
  42. from(
  43. select CONVERT(varchar(100), dateadd(day,number,@StartDate), 111) as ColCaption
  44. from master.dbo.spt_values where type ='P'
  45. and number <=DATEDIFF(day, @StartDate, @EndDate)) a";
  46. sql = string.Format(sql, BeginTime, EndTime, Convert.ToDateTime(BeginTime).ToString("yyyy/MM/dd"));
  47. DataTable dt = SqlHelper.GetDataTableBySql(sql);
  48. return dt;
  49. }
  50. public DataTable GetListGridJsonTOZ(string queryJson, ref Pagination jqgridparam)
  51. {
  52. DataTable dt = new DataTable();
  53. var queryParam = queryJson.ToJObject();
  54. List<DbParameter> parameter = new List<DbParameter>();
  55. string wheresql = string.Empty;
  56. if (!string.IsNullOrWhiteSpace(queryJson))
  57. {
  58. if (!string.IsNullOrWhiteSpace(queryParam["VenCode"].ToString()))
  59. {
  60. wheresql += " and VenCode like ''%" + queryParam["VenCode"].ToString() + "%''";
  61. }
  62. if (!string.IsNullOrWhiteSpace(queryParam["VenName"].ToString()))
  63. {
  64. wheresql += " and VenName like ''%" + queryParam["VenName"].ToString() + "%''";
  65. }
  66. if (!string.IsNullOrWhiteSpace(queryParam["InvCode"].ToString()))
  67. {
  68. wheresql += " and InvCode like ''%" + queryParam["InvCode"].ToString() + "%''";
  69. }
  70. if (!string.IsNullOrWhiteSpace(queryParam["InvName"].ToString()))
  71. {
  72. wheresql += " and InvName like ''%" + queryParam["InvName"].ToString() + "%''";
  73. }
  74. }
  75. if (NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode == "Vendor")
  76. {
  77. wheresql += " and VenCode like ''%" + NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode + "%''";
  78. }
  79. string sql = @" if exists(select * from tempdb..sysobjects where id = object_id('tempdb..#table3'))
  80. DROP TABLE #table3
  81. if exists(select * from tempdb..sysobjects where id = object_id('tempdb..#TempForecast'))
  82. DROP TABLE #TempForecast
  83. declare @StartDate DATETIME = '{0}' declare @EndDate DATETIME ='{1}'
  84. select CONVERT(varchar(100), dateadd(day,number,@StartDate), 111) as DATE_NUM
  85. into #table3
  86. from master.dbo.spt_values where type ='P'
  87. and number <=DATEDIFF(day, @StartDate, @EndDate)
  88. declare @sql varchar(MAX)
  89. declare @PlanTime varchar(MAX)
  90. select @sql = isnull(@sql + ',', '') + ' max(case b.PDate when ''' + PlanTime + ''' then REPLACE(CONVERT(VARCHAR(20),CAST(b.Quantity AS MONEY),1),''.00'','''') else ''0'' end) [' + PlanTime + ']'
  91. from(select distinct CONVERT(varchar(100), a.DATE_NUM, 23) PlanTime
  92. from #table3 a
  93. LEFT JOIN ICSInvCodeImport b ON CONVERT(varchar(100), b.PDate, 23) = CONVERT(varchar(100), a.DATE_NUM, 23)
  94. WHERE 1 = 1
  95. ) as a
  96. select @PlanTime = isnull(@PlanTime + ',', '') + ' isnull([' + PlanTime + '] , 0) [' + PlanTime + ']'
  97. from(select distinct CONVERT(varchar(100), a.DATE_NUM, 23) PlanTime
  98. from #table3 a
  99. LEFT JOIN ICSInvCodeImport b ON CONVERT(varchar(100), PDate, 23) = CONVERT(varchar(100), a.DATE_NUM, 23)
  100. WHERE 1 = 1
  101. ) as a
  102. set @sql = 'SELECT b.Code,b.VenCode ,b.VenName ,b.InvCode ,b.InvName ,'+@sql+'
  103. INTO ##TempForecast
  104. FROM [dbo].[ICSInvCodeImport] b
  105. where 1=1 {2}
  106. GROUP BY b.VenCode ,b.VenName ,b.InvCode ,b.InvName,b.Code
  107. '
  108. exec(@sql)
  109. ";
  110. sql = string.Format(sql, Convert.ToDateTime(queryParam["BeginTime"].ToString()).ToString("yyyy/MM/dd"), Convert.ToDateTime(queryParam["EndTime"].ToString()).ToString("yyyy/MM/dd"), wheresql);
  111. return SqlHelper.FindTablePageBySql_OtherTemp2(sql.ToString(), " " + "##TempForecast" + " ", " DROP TABLE #table3;drop table ##TempForecast;", parameter.ToArray(), ref jqgridparam);
  112. }
  113. public object GetStartMonth(string keyValue)
  114. {
  115. var reqInterNme = "http://172.66.9.15:9090/sys/user/login";
  116. var userInfo = new Dictionary<string, string>
  117. {
  118. {"id", "wms"},
  119. {"password", "DrCoffee@wms1114"},
  120. };
  121. string jsonString = JsonConvert.SerializeObject(userInfo, Formatting.Indented);
  122. var responseStr = SqlHelper.HttpPost(reqInterNme, jsonString);
  123. JObject res = (JObject)JsonConvert.DeserializeObject(responseStr);
  124. // string Data = res["data"].ToString();//获取Tockn
  125. string token = (string)res["data"]["token"];//获取Tockn
  126. string APIURLBidversion = "http://172.66.9.15:9090/mrp/need/getExternalVersionByLatest";
  127. var ResultVersion = SqlHelper.httpGetByHeader(APIURLBidversion, "Authorization", token);
  128. JObject resVersion = (JObject)JsonConvert.DeserializeObject(ResultVersion);
  129. string startmonth = (string)resVersion["start_month"];//获取Tockn
  130. string version = (string)resVersion["version"];
  131. var Header = new
  132. {
  133. startmonth = startmonth,
  134. version = version,
  135. };
  136. return Header;
  137. }
  138. public DataTable GetListGridJsonTOZ2(string queryJson, ref Pagination jqgridparam)
  139. {
  140. DataTable dt = new DataTable();
  141. var queryParam = queryJson.ToJObject();
  142. List<DbParameter> parameter = new List<DbParameter>();
  143. var reqInterNme = "http://172.66.9.15:9090/sys/user/login";
  144. var userInfo = new Dictionary<string, string>
  145. {
  146. {"id", "wms"},
  147. {"password", "DrCoffee@wms1114"},
  148. };
  149. string jsonString = JsonConvert.SerializeObject(userInfo, Formatting.Indented);
  150. var responseStr = SqlHelper.HttpPost(reqInterNme, jsonString);
  151. JObject res = (JObject)JsonConvert.DeserializeObject(responseStr);
  152. // string Data = res["data"].ToString();//获取Tockn
  153. string token = (string)res["data"]["token"];//获取Tockn
  154. string APIURLBidversion = "http://172.66.9.15:9090/mrp/need/getExternalVersionByLatest";
  155. var ResultVersion = SqlHelper.httpGetByHeader(APIURLBidversion, "Authorization", token);
  156. JObject resVersion = (JObject)JsonConvert.DeserializeObject(ResultVersion);
  157. string version = (string)resVersion["version"];//获取Tockn
  158. string APIURLBid = "http://172.66.9.15:9090/mrp/need/getMaterialRequirementExternalData?version="+ version;
  159. var Result = SqlHelper.httpGetByHeader(APIURLBid, "Authorization", token);
  160. DataTable inputTable = JsonConvert.DeserializeObject<DataTable>(Result);
  161. inputTable.Columns.Add("ID", typeof(string));
  162. foreach (DataRow row in inputTable.Rows)
  163. {
  164. // 获取 Code 列和 Seq 列的值
  165. string code = row["code"].ToString();
  166. string suppliercode = row["supplier_code"].ToString();
  167. // 将两列的值拼接起来作为新列 "ID" 的值
  168. row["ID"] = suppliercode + code;
  169. }
  170. DataTable resultTable = inputTable.Clone();
  171. DataRow[] rows = inputTable.Select();
  172. bool filterApplied = false;
  173. // 首先检查 queryJson 是否不为空或仅包含空白字符
  174. if (!string.IsNullOrWhiteSpace(queryJson))
  175. {
  176. string filter = "";
  177. // 检查 VenCode 是否不为空或仅包含空白字符
  178. if (!string.IsNullOrWhiteSpace(queryParam["VenCode"]?.ToString()))
  179. {
  180. filter += "supplier_code like '%" + queryParam["VenCode"].ToString() + "%' AND ";
  181. }
  182. // 检查 VenName 是否不为空或仅包含空白字符
  183. if (!string.IsNullOrWhiteSpace(queryParam["VenName"]?.ToString()))
  184. {
  185. filter += "supplier_name like '%" + queryParam["VenName"].ToString() + "%' AND ";
  186. }
  187. // 检查 InvCode 是否不为空或仅包含空白字符
  188. if (!string.IsNullOrWhiteSpace(queryParam["InvCode"]?.ToString()))
  189. {
  190. filter += "code like '%" + queryParam["InvCode"].ToString() + "%' AND ";
  191. }
  192. // 检查 InvName 是否不为空或仅包含空白字符
  193. if (!string.IsNullOrWhiteSpace(queryParam["InvName"]?.ToString()))
  194. {
  195. filter += "materiel_name like '%" + queryParam["InvName"].ToString() + "%' AND ";
  196. }
  197. if (!string.IsNullOrWhiteSpace(queryParam["beforeprincipal"]?.ToString()))
  198. {
  199. filter += "before_principal like '%" + queryParam["beforeprincipal"].ToString() + "%' AND ";
  200. }
  201. if (!string.IsNullOrWhiteSpace(queryParam["afterprincipal"]?.ToString()))
  202. {
  203. filter += "after_principal like '%" + queryParam["afterprincipal"].ToString() + "%' AND ";
  204. }
  205. if (!string.IsNullOrEmpty(filter))
  206. {
  207. filter = filter.Substring(0, filter.Length - 5); // 移除最后的 " AND "
  208. rows = inputTable.Select(filter);
  209. filterApplied = true;
  210. }
  211. }
  212. // 检查角色编码是否为 Vendor
  213. if (NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode == "Vendor")
  214. {
  215. string vendorFilter = "supplier_code like '%" + NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode + "%'";
  216. if (filterApplied)
  217. {
  218. rows = rows.Where(row => row.Table.Select(vendorFilter).Contains(row)).ToArray();
  219. }
  220. else
  221. {
  222. rows = inputTable.Select(vendorFilter);
  223. }
  224. }
  225. foreach (DataRow row in rows)
  226. {
  227. resultTable.ImportRow(row);
  228. }
  229. return SqlHelper.FindTablePageBySql_OtherTempKbs( ref jqgridparam, resultTable);
  230. }
  231. public string SetData_PR(String savePath)
  232. {
  233. DataTable data = FileToExcel.ExcelToTable(savePath);
  234. string msg = EmailNotice(data);
  235. return msg;
  236. }
  237. public string EmailNotice(DataTable data)
  238. {
  239. string msg = "";
  240. //数据获取
  241. try
  242. {
  243. DataTable DtEmail = new DataTable();
  244. DtEmail.Columns.Add("供应商编码", typeof(string));
  245. DtEmail.Columns.Add("供应商名称", typeof(string));
  246. DtEmail.Columns.Add("料品编码", typeof(string));
  247. DtEmail.Columns.Add("料品名称", typeof(string));
  248. DtEmail.Columns.Add("日期", typeof(string));
  249. DtEmail.Columns.Add("采购订单号", typeof(string));
  250. DtEmail.Columns.Add("采购订行号", typeof(string));
  251. DtEmail.Columns.Add("单据数量", typeof(string));
  252. string sqlVbl = @"select top 0 *,'' as PoNum,'' as PDate,'' as Code from dbo.ICSPurchaseOrder";
  253. DataTable dtVbl = SqlHelper.GetDataTableBySql(sqlVbl);
  254. string UserCode = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  255. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  256. SqlConnection conn = SqlHelper.GetDataCenterConn();
  257. string sql = "";
  258. int count = 0;
  259. string sqlCode = @"select distinct max(code) from ICSInvCodeImport";
  260. object Code = SqlHelper.ExecuteScalar(sqlCode);
  261. if (data != null && data.Rows.Count > 0)
  262. {
  263. foreach (DataRow dr in data.Rows)
  264. {
  265. bool Flag = false;
  266. if (Code.ToString()=="")
  267. {
  268. Code = "00001";
  269. }
  270. else
  271. {
  272. Code = (Convert.ToInt32(Code) + 1).ToString("D6");
  273. }
  274. string GUID = Guid.NewGuid().ToString();
  275. if (string.IsNullOrWhiteSpace(dr["供应商编码"].ToString()))
  276. throw new Exception("供应商编码不能为空!");
  277. if (string.IsNullOrWhiteSpace(dr["物料编码"].ToString()))
  278. throw new Exception("物料编码不能为空!");
  279. string sqlVendor = "SELECT VenName FROM ICSVendor WHERE VenCode='" + dr["供应商编码"].ToString() + "'";
  280. DataTable dtVendor = SqlHelper.GetDataTableBySql(sqlVendor);
  281. if (dtVendor == null || dtVendor.Rows.Count < 0)
  282. {
  283. msg += "供应商编码" + dr["供应商编码"].ToString() + "不存在";
  284. continue;
  285. }
  286. string VenName = dtVendor.Rows[0]["VenName"].ToString();
  287. string sqlInv = "SELECT INVName FROM ICSINVENTORY WHERE INVCODE='" + dr["物料编码"].ToString() + "'";
  288. DataTable dtInv = SqlHelper.GetDataTableBySql(sqlInv);
  289. if (dtInv == null || dtInv.Rows.Count <= 0)
  290. {
  291. msg += "物料编码" + dr["物料编码"].ToString() + "不存在";
  292. continue;
  293. }
  294. string INVName = dtInv.Rows[0]["INVName"].ToString();
  295. string sqlSeach = @"select *,Quantity-isnull(InQuantity,0) as PoNum,'' as PDate,'' as Code from dbo.ICSPurchaseOrder where Quantity-isnull(InQuantity,0)>0 and InvCode='" + dr["物料编码"].ToString() + "' and VenCode='" + dr["供应商编码"].ToString() + "' order by MTIME desc ";
  296. DataTable dtPo = SqlHelper.GetDataTableBySql(sqlSeach);
  297. foreach (DataColumn dc in data.Columns)
  298. {
  299. if (dc.Caption == "供应商编码" || dc.Caption == "供应商名称" || dc.Caption == "物料编码" || dc.Caption == "物料名称")
  300. continue;
  301. sql += @"INSERT into ICSInvCodeImport(ID, VenCode, VenName, InvCode, InvName,
  302. PDate, cModifyPerson, dModifyDate, SendDate, WorkPoint, Quantity, Code)
  303. values( newid(),'{0}','{1}','{2}','{3}','{4}','{5}',getdate(),'',{6},'{7}','{8}' )";
  304. sql = string.Format(sql, dr["供应商编码"].ToString(), dtVendor.Rows[0]["VenName"].ToString(), dr["物料编码"].ToString(), dtInv.Rows[0]["INVName"].ToString(),
  305. dc.Caption, UserCode, WorkPoint, string.IsNullOrWhiteSpace(dr[dc.Caption].ToString()) ? 0 : Convert.ToDouble((dr[dc.Caption].ToString())), Code);
  306. double ss = string.IsNullOrWhiteSpace(dr[dc.Caption].ToString()) ? 0 : Convert.ToDouble((dr[dc.Caption].ToString()));
  307. if (dtPo == null || data.Rows.Count <= 0)
  308. {
  309. if (ss < 0)
  310. {
  311. // msg += "提示采购人员供应商:" + dr["供应商编码"].ToString() + "物料:" + dr["物料编码"].ToString() + "订单数量不足了";
  312. // msg += "供应商" + dtVendor.Rows[0]["cVenName"].ToString() + "请在" + dc.Caption + "日前,完成物料" + dr["物料编码"].ToString() + "数量" + data.Columns + "送货";
  313. Flag = true;
  314. }
  315. }
  316. if (ss < 0)
  317. {
  318. //100
  319. double RequiredNum = Math.Abs(ss);
  320. //循环该行供应商有未入库数量的采购订单
  321. for (int i = dtPo.Rows.Count - 1; i >= 0; i--)
  322. {
  323. //判断导入日期下的数量是否全部匹配完了
  324. if (RequiredNum == 0)
  325. continue;
  326. sql += @"INSERT into ICSInvCodeImportByPO(ID,VenCode,InvCode,PDate,PoCode,Sequence,
  327. Quantity,ParentQuantity,CreateTime,CreateUser)
  328. values( newid(),'{0}','{1}','{2}','{3}','{4}','{5}','{6}',getdate(),'{7}' )";
  329. //需求100 订单数500
  330. if (Convert.ToDouble(dtPo.Rows[i]["PoNum"].ToString()) - RequiredNum > 0)
  331. {
  332. var PoNum = Convert.ToDouble(dtPo.Rows[i]["PoNum"].ToString()) - RequiredNum;
  333. dtPo.Rows[i]["PoNum"] = PoNum;
  334. RequiredNum = 0;
  335. //在这里做订单与导入行的关联操作(需要记录订单实际匹配过去的数量)
  336. sql = string.Format(sql, dr["供应商编码"].ToString(), dr["物料编码"].ToString(), dc.Caption, dtPo.Rows[i]["POCode"].ToString(), dtPo.Rows[i]["Sequence"].ToString()
  337. , PoNum, Math.Abs(ss),UserCode);
  338. // 供应商dt (001号单据 数 100)
  339. DataRow newrow = DtEmail.NewRow();
  340. newrow["供应商编码"] = dr["供应商编码"].ToString();
  341. newrow["供应商名称"] = dtVendor.Rows[0]["VenName"].ToString();
  342. newrow["料品编码"] = dr["物料编码"].ToString();
  343. newrow["料品名称"] = dtInv.Rows[0]["INVName"].ToString();
  344. newrow["日期"] = dc.Caption;
  345. newrow["采购订单号"] = dtPo.Rows[i]["POCode"].ToString();
  346. newrow["采购订行号"] = dtPo.Rows[i]["Sequence"].ToString();
  347. newrow["单据数量"] = Math.Round(PoNum, 3);
  348. DtEmail.Rows.Add(newrow);
  349. }
  350. else
  351. {
  352. RequiredNum = RequiredNum - Convert.ToDouble(dtPo.Rows[i]["PoNum"].ToString());
  353. //在这里做订单与导入行的关联操作(订单的未入库数量)
  354. sql = string.Format(sql, dr["供应商编码"].ToString(), dr["物料编码"].ToString(), dc.Caption, dtPo.Rows[i]["POCode"].ToString(), dtPo.Rows[i]["Sequence"].ToString()
  355. , dtPo.Rows[i]["PoNum"].ToString(), Math.Abs(ss), UserCode);
  356. //采购dt ( 001号单据 数400)
  357. DataRow newrow = DtEmail.NewRow();
  358. newrow["供应商编码"] = dr["供应商编码"].ToString();
  359. newrow["供应商名称"] = dtVendor.Rows[0]["VenName"].ToString();
  360. newrow["料品编码"] = dr["物料编码"].ToString();
  361. newrow["料品名称"] = dtInv.Rows[0]["INVName"].ToString();
  362. newrow["日期"] = dc.Caption;
  363. newrow["采购订单号"] = dtPo.Rows[i]["POCode"].ToString();
  364. newrow["采购订行号"] = dtPo.Rows[i]["Sequence"].ToString();
  365. newrow["单据数量"] = Math.Round(dtPo.Rows[i]["PoNum"].ToDouble(), 3) ;
  366. DtEmail.Rows.Add(newrow);
  367. dtPo.Rows.Remove(dtPo.Rows[i]);
  368. }
  369. }
  370. if (RequiredNum > 0)
  371. {
  372. //标记给供应商发送邮件
  373. Flag = true;
  374. }
  375. //else
  376. //{
  377. // msg += "发给供应商告诉他发货.";
  378. // SendEmailBySupplier(dr["供应商编码"].ToString(), dtVendor.Rows[0]["VenName"].ToString(), dc.Caption, dr[dc.Caption].ToString(), WorkPoint, dr["物料编码"].ToString(), dtInv.Rows[0]["INVName"].ToString());
  379. //}
  380. }
  381. }
  382. if (Flag == true)
  383. {
  384. SendEmailByProcurement(dr["供应商编码"].ToString(), VenName,WorkPoint, dr["物料编码"].ToString(), INVName);
  385. // msg += "提示采购人员供应商:" + dr["供应商编码"].ToString() + "物料:" + dr["物料编码"].ToString() + "订单数量不足了.";
  386. }
  387. }
  388. }
  389. //在导入方法的最后去给供应商发送邮件
  390. count = SqlHelper.CmdExecuteNonQueryLi(sql);
  391. if (count > 0)
  392. {
  393. var groupedData = DtEmail.Select("1=1").GroupBy(x => new { Sty1 = x["供应商编码"].ToString(), Sty2 = x["供应商名称"].ToString() });
  394. foreach (var datas in groupedData)
  395. {
  396. string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + datas.Key.Sty1;
  397. string filePath = ConvertToExcel(datas.ToList(), fileName);
  398. SendEmailBySupplier(datas.Key.Sty1, datas.Key.Sty2, filePath, WorkPoint);
  399. }
  400. msg = "导入成功" + msg.TrimEnd(';');
  401. }
  402. else
  403. {
  404. throw new Exception("无有效的导入数据!");
  405. }
  406. return msg;
  407. }
  408. catch (Exception ex)
  409. {
  410. throw new Exception("" + msg + "异常信息:" + ex.Message + "!");
  411. }
  412. }
  413. public static string ConvertToExcel(List<DataRow> dataRows, string fileName)
  414. {
  415. fileName = $"Excel_{fileName}.xlsx";
  416. string Paths = HttpContext.Current.Server.MapPath("/File/VendorsFileSendemail");
  417. if (!Directory.Exists(Paths))
  418. {
  419. Directory.CreateDirectory(Paths);
  420. }
  421. string filePath = HttpContext.Current.Server.MapPath("/File/VendorsFileSendemail/"+ fileName);
  422. FileInfo fileInfo = new FileInfo(filePath);
  423. using (ExcelPackage package = new ExcelPackage(fileInfo))
  424. {
  425. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");
  426. // 将列名写入第一行
  427. for (int i = 0; i < dataRows[0].Table.Columns.Count; i++)
  428. {
  429. worksheet.Cells[1, i + 1].Value = dataRows[0].Table.Columns[i].ColumnName;
  430. }
  431. // 将数据写入Excel中
  432. for (int i = 0; i < dataRows.Count; i++)
  433. {
  434. for (int j = 0; j < dataRows[i].Table.Columns.Count; j++)
  435. {
  436. worksheet.Cells[i + 2, j + 1].Value = dataRows[i][j];
  437. }
  438. }
  439. package.Save();
  440. // 返回文件的保存路径
  441. return fileInfo.FullName;
  442. }
  443. }
  444. #region 发邮件
  445. public static void SendEmail(string ConnectionString, string SendHost, int SendPort, string SendDisplayName, string SendAddress, string SendPassword, string TOAddress, string CCAddress, string Subject, bool IsBodyHtml, string Body, string File)
  446. {
  447. try
  448. {
  449. SmtpClient smtpClient = new SmtpClient
  450. {
  451. //EnableSsl = false,
  452. UseDefaultCredentials = false,
  453. Host = SendHost,
  454. Port = SendPort,
  455. Credentials = new NetworkCredential(SendAddress, SendPassword)
  456. };
  457. System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage
  458. {
  459. Subject = Subject,
  460. SubjectEncoding = Encoding.GetEncoding("utf-8"),
  461. BodyEncoding = Encoding.GetEncoding("utf-8"),
  462. From = new MailAddress(SendAddress, SendDisplayName),
  463. IsBodyHtml = IsBodyHtml,
  464. Body = Body
  465. };
  466. string SUpFile = File;
  467. Attachment data = new Attachment(SUpFile, MediaTypeNames.Application.Octet);
  468. //附件资料
  469. System.Net.Mime.ContentDisposition disposition = data.ContentDisposition;
  470. disposition.CreationDate = System.IO.File.GetCreationTime(SUpFile);
  471. disposition.ModificationDate = System.IO.File.GetLastWriteTime(SUpFile);
  472. disposition.ReadDate = System.IO.File.GetLastAccessTime(SUpFile);
  473. //加入邮件附件
  474. mailMessage.Attachments.Add(data);
  475. string[] array = TOAddress.Split(new char[]
  476. {
  477. ','
  478. });
  479. string[] array2 = array;
  480. for (int i = 0; i < array2.Length; i++)
  481. {
  482. string text = array2[i];
  483. if (!string.IsNullOrEmpty(text))
  484. {
  485. mailMessage.To.Add(text);
  486. }
  487. }
  488. string[] array3 = CCAddress.Split(new char[]
  489. {
  490. ','
  491. });
  492. array2 = array3;
  493. for (int i = 0; i < array2.Length; i++)
  494. {
  495. string text2 = array2[i];
  496. if (!string.IsNullOrEmpty(text2))
  497. {
  498. mailMessage.CC.Add(text2);
  499. }
  500. }
  501. ServicePointManager.ServerCertificateValidationCallback = ((object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true);
  502. smtpClient.Send(mailMessage);
  503. }
  504. catch (Exception ex)
  505. {
  506. throw;
  507. }
  508. }
  509. #endregion
  510. public void SendEmailBySupplier(string VenCode,string VenName, string filePath, string WorkPoint)
  511. {
  512. string MailOpen = ConfigurationManager.ConnectionStrings["MailOpen"].ConnectionString;
  513. if (MailOpen == "true")
  514. {
  515. string SendHost = ConfigurationManager.ConnectionStrings["SendHost"].ConnectionString;
  516. string StrSendPort = ConfigurationManager.ConnectionStrings["SendPort"].ConnectionString;
  517. int SendPort = 25;
  518. if (!string.IsNullOrEmpty(StrSendPort))
  519. SendPort = Convert.ToInt32(ConfigurationManager.ConnectionStrings["SendPort"].ConnectionString);
  520. string SendDisplayName = ConfigurationManager.ConnectionStrings["SendDisplayName"].ConnectionString;
  521. string SendAddress = ConfigurationManager.ConnectionStrings["SendAddress"].ConnectionString;
  522. string SendPassword = ConfigurationManager.ConnectionStrings["SendPassword"].ConnectionString;
  523. string cVenCode = VenCode;
  524. string TOAddress = GetVendorEmail(cVenCode).TrimEnd(',');
  525. string CCAddress = "";
  526. string Subject = "有来自咖博士SRM平台新发布的采购订单信息";
  527. bool isBodyHtml = false;
  528. // string POCode = dr["POCode"].ToString();
  529. string NowDate = DateTime.Now.GetDateTimeFormats('D')[0].ToString();
  530. // double Nums = Math.Abs(Convert.ToDouble(Num));
  531. string body = VenName + ":";
  532. body += "\r\n";
  533. body += " 您好!您有采购订单需要进行发货,详情请见邮件附件! !";
  534. body += "\r\n";
  535. body += " 顺颂商祺!";
  536. body += "\r\n";
  537. body += " 苏州咖博士咖啡系统科技有限公司";
  538. body += "\r\n";
  539. body += " " + NowDate;
  540. if (string.IsNullOrWhiteSpace(TOAddress))
  541. {
  542. throw new Exception("未维护邮箱,请到ERP维护供应商邮箱地址!");
  543. }
  544. string StrConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
  545. // ICSSendMail.SendEmail(StrConn, SendHost, SendPort, SendDisplayName, SendAddress, SendPassword, TOAddress, CCAddress, Subject, isBodyHtml, body);
  546. SendEmail(StrConn, SendHost, SendPort, SendDisplayName, SendAddress, SendPassword, TOAddress, CCAddress, Subject, isBodyHtml, body, filePath);
  547. }
  548. }
  549. public void SendEmailByProcurement(string VenCode, string VenName, string WorkPoint, string InvCode, string InvName)
  550. {
  551. string MailOpen = ConfigurationManager.ConnectionStrings["MailOpen"].ConnectionString;
  552. if (MailOpen == "true")
  553. {
  554. string SendHost = ConfigurationManager.ConnectionStrings["SendHost"].ConnectionString;
  555. string StrSendPort = ConfigurationManager.ConnectionStrings["SendPort"].ConnectionString;
  556. int SendPort = 25;
  557. if (!string.IsNullOrEmpty(StrSendPort))
  558. SendPort = Convert.ToInt32(ConfigurationManager.ConnectionStrings["SendPort"].ConnectionString);
  559. string SendDisplayName = ConfigurationManager.ConnectionStrings["SendDisplayName"].ConnectionString;
  560. string SendAddress = ConfigurationManager.ConnectionStrings["SendAddress"].ConnectionString;
  561. string SendPassword = ConfigurationManager.ConnectionStrings["SendPassword"].ConnectionString;
  562. string cVenCode = VenCode;
  563. string TOAddress = GetVendorEmail(cVenCode).TrimEnd(',');
  564. string CCAddress = "";
  565. string Subject = "有来自咖博士SRM平台采购订单信息";
  566. bool isBodyHtml = false;
  567. // string POCode = dr["POCode"].ToString();
  568. string NowDate = DateTime.Now.GetDateTimeFormats('D')[0].ToString();
  569. string body = "采购人员:";
  570. body += "\r\n";
  571. body += " 您好!" + VenName + "供应商," + InvCode + "物料的订单数量不满足本次的需求数量,请登陆SRM系统查看相关信息 !";
  572. body += "\r\n";
  573. body += " 顺颂商祺!";
  574. body += "\r\n";
  575. body += " 苏州咖博士咖啡系统科技有限公司";
  576. body += "\r\n";
  577. body += " " + NowDate;
  578. if (string.IsNullOrWhiteSpace(TOAddress))
  579. {
  580. throw new Exception("未维护邮箱,请到ERP维护供应商邮箱地址!");
  581. }
  582. string StrConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
  583. ICSSendMail.SendEmail(StrConn, SendHost, SendPort, SendDisplayName, SendAddress, SendPassword, TOAddress, CCAddress, Subject, isBodyHtml, body);
  584. }
  585. }
  586. public string GetVendorEmail(string VenCode)
  587. {
  588. string sql = " SELECT F_Email FROM dbo.Sys_SRM_User WHERE F_VenCode='" + VenCode + "'";
  589. DataTable dt = SqlHelper.GetDataTableBySql(sql);
  590. string Email = string.Empty;
  591. foreach (DataRow dr in dt.Rows)
  592. {
  593. Email += dr["F_Email"].ToString() + ",";
  594. }
  595. return Email;
  596. }
  597. public string SaveAndUpdate(string ICSInvImport)
  598. {
  599. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  600. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  601. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  602. string msg = "";
  603. string sql = string.Empty;
  604. JArray res = (JArray)JsonConvert.DeserializeObject(ICSInvImport);
  605. foreach (var item in res)
  606. {
  607. JObject jo = (JObject)item;
  608. sql += @"IF EXISTS(SELECT a.PDate FROM ICSInvCodeImport a WHERE a.Code='{0}' AND a.PDate='{3}')
  609. BEGIN
  610. UPDATE ICSInvCodeImport SET Quantity='{2}'
  611. WHERE Code='{0}' AND PDate='{3}'
  612. END
  613. ELSE
  614. BEGIN
  615. insert into ICSInvCodeImport(ID, VenCode, VenName, InvCode, InvName,
  616. PDate, cModifyPerson, dModifyDate, SendDate, WorkPoint, Quantity, Code)
  617. values( newid(),'{4}','{5}','{6}','{7}','{3}','{8}',getdate(),'',{1},'{2}','{0}' )
  618. END ";
  619. sql = string.Format(sql, jo["Code"].ToString(), WorkPoint,jo["DateColValue"].ToString(),Convert.ToDateTime(jo["DateCol"]).ToString("yyyy-MM-dd"),
  620. jo["VenCode"].ToString(), jo["VenName"].ToString(), jo["InvCode"].ToString(), jo["InvName"].ToString(), MUSER);
  621. }
  622. try
  623. {
  624. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  625. {
  626. }
  627. else
  628. {
  629. msg = "保存失败";
  630. }
  631. }
  632. catch (Exception ex)
  633. {
  634. msg = ex.Message;
  635. }
  636. return msg;
  637. }
  638. public string Delete(string ICSInvImport)
  639. {
  640. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  641. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  642. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  643. string msg = "";
  644. string sql = string.Empty;
  645. JArray res = (JArray)JsonConvert.DeserializeObject(ICSInvImport);
  646. foreach (var item in res)
  647. {
  648. JObject jo = (JObject)item;
  649. sql += @"delete ICSInvCodeImport where Code='{0}' and PDate>='{1}' and PDate<='{2}'";
  650. sql = string.Format(sql, jo["Code"].ToString(), jo["DateColStart"].ToString(), jo["DateColEnd"].ToString() );
  651. }
  652. try
  653. {
  654. if (SqlHelper.CmdExecuteNonQueryLi(sql) > 0)
  655. {
  656. }
  657. else
  658. {
  659. msg = "删除失败";
  660. }
  661. }
  662. catch (Exception ex)
  663. {
  664. msg = ex.Message;
  665. }
  666. return msg;
  667. }
  668. public string KBSTZ(string ICSInvImport)
  669. {
  670. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  671. string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
  672. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
  673. string msg = "";
  674. string sql = string.Empty;
  675. try
  676. {
  677. DataTable dt = JsonConvert.DeserializeObject<DataTable>(ICSInvImport);
  678. var distinctRows = dt.AsEnumerable()
  679. .Select(row => new
  680. {
  681. = row.Field<string>("供应商编号"),
  682. = row.Field<string>("供应商名称")
  683. })
  684. .Distinct();
  685. foreach (var rows in distinctRows)
  686. {
  687. var filteredRows = dt.AsEnumerable()
  688. .Where(r => r.Field<string>("供应商编号") == rows. &&
  689. r.Field<string>("供应商名称") == rows.);
  690. // 将 IEnumerable<DataRow> 转换为 DataTable
  691. DataTable filteredDataTable = filteredRows.CopyToDataTable();
  692. string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + rows.;
  693. string filePath = ConvertToExcel(filteredRows.ToList(), fileName);
  694. SendEmailBySupplier(rows..ToString(), rows., filePath, WorkPoint);
  695. }
  696. }
  697. catch (Exception ex)
  698. {
  699. msg = ex.Message;
  700. }
  701. return msg;
  702. }
  703. }
  704. }