CommonAppService.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Entity;
  5. using System.Data.SqlClient;
  6. using System.Linq;
  7. using System.Linq.Dynamic.Core;
  8. using System.Net.Http.Headers;
  9. using System.Net.Mail;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12. using System.Web.Mvc;
  13. using Abp.Application.Services;
  14. using Abp.Application.Services.Dto;
  15. using Abp.Auditing;
  16. using Abp.Domain.Repositories;
  17. using Abp.Domain.Uow;
  18. using Abp.Extensions;
  19. using Abp.Json;
  20. using Abp.Net.Mail;
  21. using Abp.Net.Mail.Smtp;
  22. using Abp.Runtime.Caching;
  23. using Abp.Runtime.Session;
  24. using Abp.Timing;
  25. using IwbZero.AppServiceBase;
  26. using IwbZero.Helper;
  27. using IwbZero.IdentityFramework;
  28. using IwbZero.Session;
  29. using MailKit;
  30. using Microsoft.AspNet.Identity;
  31. using Microsoft.AspNet.SignalR;
  32. using ShwasherSys.Authorization.Users;
  33. using ShwasherSys.BaseSysInfo;
  34. using ShwasherSys.BaseSysInfo.States;
  35. using ShwasherSys.BaseSysInfo.SysAttachFiles.Dto;
  36. using ShwasherSys.BasicInfo;
  37. using ShwasherSys.Common.Dto;
  38. using ShwasherSys.CompanyInfo;
  39. using ShwasherSys.CustomerInfo;
  40. using ShwasherSys.EntityFramework;
  41. using ShwasherSys.Hubs;
  42. using ShwasherSys.Inspection;
  43. using ShwasherSys.NotificationInfo;
  44. using ShwasherSys.Order;
  45. using ShwasherSys.Order.Dto;
  46. using ShwasherSys.OrderSendInfo;
  47. using ShwasherSys.PackageInfo;
  48. using ShwasherSys.PackageInfo.Dto;
  49. using ShwasherSys.ProductInfo;
  50. using ShwasherSys.ProductInfo.Dto;
  51. using ShwasherSys.ProductionOrderInfo;
  52. using ShwasherSys.ProductionOrderInfo.Dto;
  53. using ShwasherSys.ProductStoreInfo;
  54. using ShwasherSys.ProductStoreInfo.Dto;
  55. using ShwasherSys.SemiProductStoreInfo;
  56. namespace ShwasherSys.Common
  57. {
  58. [DisableAuditing]
  59. public class CommonAppService : ApplicationService,ICommonAppService
  60. {
  61. protected IRepository<ProductionOrder> ProductionOrderRepository { get; }
  62. protected IRepository<CustomerDisabledProduct> CdpRepository;
  63. protected IRepository<ShortMessage> ShortMsgRepository;
  64. protected IRepository<OrderHeader,string> OrderHeaderRepository;
  65. protected IRepository<ViewOrderSend> ViewOrderSendRepository;
  66. protected IRepository<ShortMsgDetail> ShortMsgDetailRepository;
  67. protected IRepository<SysUser,long> SysUserRepository;
  68. protected IRepository<SemiEnterStore> SemiEnterStoreRepository;
  69. protected IUnitOfWorkManager _UnitOfWorkManager;
  70. protected IRepository<SysAttachFile> SysAttachFileRepository;
  71. protected IRepository<Product,string> ProductRepository;
  72. protected IRepository<SemiProducts,string> SemiProductRepository;
  73. protected IRepository<ProductMapper> ProductMapperRepository;
  74. protected ISqlExecuter SqlExecuter;
  75. protected IEmailSender EmailSender;
  76. protected IRepository<CurrentProductStoreHouse> CurrentProductStoreHouseRepository { get; }
  77. protected IRepository<CurrentSemiStoreHouse> CurrentSemiStoreHouseRepository { get; }
  78. protected IRepository<StoreHouseLocation> StoreHouseLocationRepository { get; }
  79. protected IRepository<Customer,string> CustomerRepository { get; }
  80. protected IRepository<CustomerDisabledProduct> CustomerDisabledProductRepository { get; }
  81. protected IRepository<Department,string> DepartmentRepository { get; }
  82. public IHubContext IwbHub { get; }
  83. public EmailMsgSendHandler EmailMsgSendHandler { get; }
  84. public IStatesAppService StatesAppService { get; }
  85. public IRepository<Employee> EmployeeRepository { get; }
  86. public IRepository<ViewPackageApply> ViewPackageApplyRepository { get; }
  87. public IRepository<SemiProducts, string> SemiProductsRepository { get; }
  88. public CommonAppService(ICacheManager cacheManager, IRepository<ShortMsgDetail> shortMsgDetailRepository, IRepository<ShortMessage> shortMsgRepository, IRepository<SysUser, long> sysUserRepository, IUnitOfWorkManager unitOfWorkManager, IRepository<SysAttachFile> sysAttachFileRepository, IRepository<OrderHeader, string> orderHeaderRepository, IRepository<ViewOrderSend> viewOrderSendRepository, ISqlExecuter sqlExecuter, IEmailSender emailSender, IRepository<CurrentProductStoreHouse> currentProductStoreHouseRepository, IRepository<CurrentSemiStoreHouse> currentSemiStoreHouseRepository, IRepository<StoreHouseLocation> storeHouseLocationRepository, IRepository<CustomerDisabledProduct> cdpRepository, IRepository<ProductionOrder> productionOrderRepository, ISmtpEmailSenderConfiguration smtpEmailSenderConfiguration, IRepository<Customer, string> customerRepository, IRepository<CustomerDisabledProduct> customerDisabledProductRepository, IRepository<SemiEnterStore> semiEnterStoreRepository, IRepository<Department, string> departmentRepository, IRepository<SemiProducts, string> semiProductRepository, IRepository<Product, string> productRepository, IRepository<ProductMapper> productMapperRepository, EmailMsgSendHandler emailMsgSendHandler, IStatesAppService statesAppService, IRepository<Employee> employeeRepository,IRepository<ViewPackageApply> viewPackageApplyRepository, IRepository<SemiProducts, string> semiProductsRepository)
  89. {
  90. ShortMsgDetailRepository = shortMsgDetailRepository;
  91. ShortMsgRepository = shortMsgRepository;
  92. SysUserRepository = sysUserRepository;
  93. _UnitOfWorkManager = unitOfWorkManager;
  94. SysAttachFileRepository = sysAttachFileRepository;
  95. OrderHeaderRepository = orderHeaderRepository;
  96. ViewOrderSendRepository = viewOrderSendRepository;
  97. SqlExecuter = sqlExecuter;
  98. IwbHub = GlobalHost.ConnectionManager.GetHubContext<IwbHub>();
  99. EmailSender = emailSender;
  100. CurrentProductStoreHouseRepository = currentProductStoreHouseRepository;
  101. CurrentSemiStoreHouseRepository = currentSemiStoreHouseRepository;
  102. StoreHouseLocationRepository = storeHouseLocationRepository;
  103. CdpRepository = cdpRepository;
  104. ProductionOrderRepository = productionOrderRepository;
  105. SmtpEmailSenderConfiguration = smtpEmailSenderConfiguration;
  106. CustomerRepository = customerRepository;
  107. CustomerDisabledProductRepository = customerDisabledProductRepository;
  108. SemiEnterStoreRepository = semiEnterStoreRepository;
  109. DepartmentRepository = departmentRepository;
  110. SemiProductRepository = semiProductRepository;
  111. ProductMapperRepository = productMapperRepository;
  112. ProductRepository = productRepository;
  113. EmailMsgSendHandler = emailMsgSendHandler;
  114. StatesAppService = statesAppService;
  115. EmployeeRepository = employeeRepository;
  116. ViewPackageApplyRepository = viewPackageApplyRepository;
  117. SemiProductsRepository = semiProductsRepository;
  118. }
  119. public string KeepClock()
  120. {
  121. return Clock.Now.ToString("yyyy-MM-dd HH:mm:ss");
  122. }
  123. private Action<ISqlExecuter,DateTime> CloseProductionOrder = (sqlExecuter, date) =>
  124. {
  125. //var list = repository.GetAllList(a => a.PlanProduceDate < date && a.ProductionOrderStatus != 5);
  126. //if (list.Any())
  127. //{
  128. // foreach (var l in list)
  129. // {
  130. // l.ProductionOrderStatus = 5;
  131. // repository.Update(l);
  132. // }
  133. //}
  134. string sql =
  135. $"UPDATE [dbo].[ProductionOrders] SET ProductionOrderStatus=5 WHERE EnterDate < '{date:yyyy-MM-dd}' AND ProductionOrderStatus=4 AND IsChecked=1 ";
  136. sqlExecuter.Execute(sql);
  137. };
  138. private readonly IRepository<ProductMapper, int> _productMapperRepository;
  139. /// <summary>
  140. /// 关闭三个月前的排产单
  141. /// </summary>
  142. public async Task CloseProductOrder()
  143. {
  144. var date = DateTime.Now.AddMonths(-3);
  145. date= new DateTime(date.Year,date.Month,date.Day);
  146. if (await ProductionOrderRepository.CountAsync(a=>a.IsChecked==1 && a.EnterDate<date && a.ProductionOrderStatus==4)>0)
  147. {
  148. string sql =
  149. $"update [dbo].[ProductionOrders] set ProductionOrderStatus=5 where PlanProduceDate < '{date:yyyy-MM-dd}'";
  150. await SqlExecuter.ExecuteAsync(sql);
  151. }
  152. }
  153. public async Task WriteShortMessageByDep(string sendman,string departments,string title="",string content="",bool isSendMail = true)
  154. {
  155. string lcRecieveIds = "";
  156. var loArr = departments.Split(',');
  157. var ds = DepartmentRepository.GetAllList(i => loArr.Contains(i.DepartmentName));
  158. var dsIds = ds.Select(i => i.Id);
  159. var users = SysUserRepository.GetAllList(i => dsIds.Contains(i.DepartmentID));
  160. if (users.Any())
  161. {
  162. lcRecieveIds = string.Join(",", users.Select(i => i.UserName).ToArray());
  163. await WriteShortMessage(sendman, lcRecieveIds, title, content, isSendMail);
  164. }
  165. }
  166. /// <summary>
  167. /// 写入短消息
  168. /// </summary>
  169. /// <param name="sendman">发送人</param>
  170. /// <param name="recieveIds">接收用户名 eg:shenjianfang,menghanming,jiangjingeng</param>
  171. /// <param name="title"></param>
  172. /// <param name="content"></param>
  173. public async Task WriteShortMessage(string sendman, string recieveIds, string title = "", string content = "", bool isSendMail = false)
  174. {
  175. ShortMessage shortMessage = new ShortMessage()
  176. {
  177. SendUserID = sendman,
  178. SendTime = Clock.Now,
  179. Title = title,
  180. Content = content,
  181. RecieveUserIds = recieveIds,
  182. IsDelete = "N"
  183. };
  184. var shortMsg = await ShortMsgRepository.InsertAsync(shortMessage);
  185. await CurrentUnitOfWork.SaveChangesAsync();
  186. IwbHub.Clients.All.getShortMsg(shortMessage.ToJsonString());
  187. if (!recieveIds.IsNullOrEmpty())
  188. {
  189. var loArr = recieveIds.Split(',');
  190. if (loArr.Any())
  191. {
  192. //MailMessage mail = new MailMessage();
  193. foreach (var u in loArr)
  194. {
  195. ShortMsgDetail shortMsgDetail = new ShortMsgDetail()
  196. {
  197. IsRead = "N",
  198. MsgID = shortMsg.Id,
  199. RecvUserID = u,
  200. };
  201. //var user = SysUserRepository.FirstOrDefault(i => i.UserName == u);
  202. //mail.To.Add(user.EmailAddress);
  203. //await EmailSender.SendAsync(user.EmailAddress, "系统订单变动", content);
  204. await ShortMsgDetailRepository.InsertAsync(shortMsgDetail);
  205. }
  206. }
  207. if (isSendMail)
  208. {
  209. WriteShortMessage2(sendman, recieveIds, title, content);
  210. }
  211. }
  212. }
  213. public void WriteShortMessage2(string sendman, string recieveIds, string title = "", string content = "")
  214. {
  215. if (!recieveIds.IsNullOrEmpty())
  216. {
  217. var loArr = recieveIds.Split(',');
  218. if (loArr.Any())
  219. {
  220. //MailMessage mail = new MailMessage();
  221. //foreach (var u in loArr)
  222. //{
  223. // var user = SysUserRepository.FirstOrDefault(i => i.UserName == u);
  224. // var emailPattern = @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$";
  225. // if (user != null && !string.IsNullOrEmpty(user.EmailAddress) && Regex.IsMatch(user.EmailAddress, emailPattern))
  226. // {
  227. // mail.To.Add(user.EmailAddress);
  228. // mail.Body = content;
  229. // mail.IsBodyHtml = true;
  230. // mail.Subject = title;
  231. // }
  232. //}
  233. //if (mail.To.Any())
  234. //{
  235. // await EmailSender.SendAsync(mail);
  236. //}
  237. List<string> receiveEmails = new List<string>();
  238. foreach (var u in loArr)
  239. {
  240. var user = SysUserRepository.FirstOrDefault(i => i.UserName == u);
  241. var emailPattern = @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$";
  242. if (user != null && !string.IsNullOrEmpty(user.EmailAddress) &&
  243. Regex.IsMatch(user.EmailAddress, emailPattern))
  244. {
  245. receiveEmails.Add(user.EmailAddress);
  246. }
  247. }
  248. if (receiveEmails.Count > 0)
  249. {
  250. EmailMsg mailMsg = new EmailMsg(true, receiveEmails:string.Join(",", receiveEmails) , title, content);
  251. EmailMsgSendHandler.SendEmailMsg(mailMsg);
  252. }
  253. }
  254. }
  255. }
  256. protected virtual void CheckErrors(IdentityResult identityResult)
  257. {
  258. identityResult.CheckErrors(LocalizationManager);
  259. }
  260. public List<SysAttachFile> GetAttachFile(QueryAttachDto input)
  261. {
  262. var query = SysAttachFileRepository.GetAll().Where(i =>
  263. i.TableName == input.TableName && i.ColumnName == input.ColName && i.SourceKey == input.Key);
  264. return query.ToList();
  265. }
  266. /// <summary>
  267. /// 判断订单是否有发货记录
  268. /// </summary>
  269. /// <param name="pcOrderNo"></param>
  270. /// <returns></returns>
  271. public async Task<bool> CheckOrderHasSend(string pcOrderNo)
  272. {
  273. var orderSends = await ViewOrderSendRepository.GetAllListAsync(i => i.OrderNo == pcOrderNo);
  274. return orderSends.Any();
  275. }
  276. /// <summary>
  277. /// 检查改批次产品能否发货给某客户
  278. /// </summary>
  279. /// <param name="productOrderNo"></param>
  280. /// <param name="customerNo"></param>
  281. /// <returns></returns>
  282. public async Task<bool> CheckProductCanSendToCustomer(string productOrderNo,string customerNo)
  283. {
  284. return await CdpRepository.CountAsync(a=>a.CustomerNo==customerNo&&a.ProductOrderNo==productOrderNo)>0;
  285. }
  286. /// <summary>
  287. /// 检查改批次产品能否发货给某客户
  288. /// </summary>
  289. /// <param name="productOrderNos"></param>
  290. /// <param name="customerNo"></param>
  291. /// <returns></returns>
  292. public async Task<bool> CheckProductCanSendToCustomer(List<string> productOrderNos,string customerNo)
  293. {
  294. return await CdpRepository.CountAsync(a=>a.CustomerNo==customerNo&&productOrderNos.Contains(a.ProductOrderNo))>0;
  295. }
  296. public Task PreMonth()
  297. {
  298. return SqlExecuter.ExecuteAsync("update CurrentProductStoreHouse set PreMonthQuantity = Quantity;update CurrentSemiStoreHouse set PreMonthQuantity = ActualQuantity;");
  299. }
  300. [UnitOfWork]
  301. [DisableAuditing]
  302. public int? GetAppGuid(AppGuidType type)
  303. {
  304. var sqlParms = new object[3];
  305. sqlParms[0] = new SqlParameter("@idtype", (int)type);
  306. sqlParms[1] = new SqlParameter("@nextid", SqlDbType.Int) { Direction = ParameterDirection.Output };
  307. sqlParms[2] = new SqlParameter("@maxid", SqlDbType.Int) { Direction = ParameterDirection.Output };
  308. SqlExecuter.Execute(@"exec [dbo].[Sp_AppGuid] @idtype,@nextid out,@maxid out", sqlParms);
  309. int guid = (int)((SqlParameter)sqlParms[2]).Value;
  310. return guid;
  311. }
  312. /// <summary>
  313. /// 检查库存记录是否可以更新
  314. /// </summary>
  315. /// <param name="houseType">仓库类型(1:成品 2:半成品)</param>
  316. /// <param name="houseStoreNo">库存记录编号</param>
  317. /// <returns></returns>
  318. [UnitOfWork]
  319. [DisableAuditing]
  320. public bool CheckStoreRecordCanUpdate(string houseStoreNo,int houseType=1)
  321. {
  322. if (houseType == 1)
  323. {
  324. var houseRecord =
  325. CurrentProductStoreHouseRepository.FirstOrDefault(i =>
  326. i.CurrentProductStoreHouseNo == houseStoreNo);
  327. if (houseRecord != null&&houseRecord.InventoryCheckState==2&&houseRecord.ReturnState==2)
  328. {
  329. return false;
  330. }
  331. }
  332. if (houseType == 2)
  333. {
  334. var houseRecord =
  335. CurrentSemiStoreHouseRepository.FirstOrDefault(i =>
  336. i.CurrentSemiStoreHouseNo == houseStoreNo);
  337. if (houseRecord != null && houseRecord.InventoryCheckState == 2 && houseRecord.ReturnState == 2)
  338. {
  339. return false;
  340. }
  341. }
  342. return true;
  343. }
  344. /// <summary>
  345. /// 检查库存记录是否可以更新
  346. /// </summary>
  347. /// <param name="houseType">仓库类型(1:成品 2:半成品)</param>
  348. /// <param name="locationNo">库位编号</param>
  349. /// <returns></returns>
  350. [UnitOfWork]
  351. [DisableAuditing]
  352. public bool CheckStoreCanUpdateByLocationNo(string locationNo,int houseType=1)
  353. {
  354. if (houseType == 1)
  355. {
  356. if (CurrentProductStoreHouseRepository.Count(a => a.StoreLocationNo == locationNo&& (a.InventoryCheckState==2 || a.ReturnState==2))>0)
  357. {
  358. return false;
  359. }
  360. }else if (houseType == 2)
  361. {
  362. if (CurrentSemiStoreHouseRepository.Count(a => a.StoreLocationNo == locationNo&& (a.InventoryCheckState==2 || a.ReturnState==2))>0)
  363. {
  364. return false;
  365. }
  366. }
  367. return true;
  368. }
  369. /// <summary>
  370. /// 查询库区/货架/排(排可以多选)
  371. /// </summary>
  372. /// <param name="storeId"></param>
  373. /// <param name="areaNo"></param>
  374. /// <param name="shelfNo"></param>
  375. /// <returns></returns>
  376. public List<SelectListItem> FilterLocationInfo(int storeId,string areaNo="",string shelfNo="", string levelNo = "")
  377. {
  378. var query = StoreHouseLocationRepository.GetAll().Where(i => i.StoreHouseId == storeId);
  379. if (areaNo.IsNullOrEmpty())
  380. {
  381. var result = query.Select(i => i.StoreAreaCode).Distinct();
  382. return result.Select(i=>new SelectListItem(){Text = i.ToString(),Value = i.ToString()}).ToList();
  383. }
  384. query = query.Where(i => i.StoreAreaCode == areaNo);
  385. if (shelfNo.IsNullOrEmpty())
  386. {
  387. var result = query.Select(i => i.ShelfNumber).Distinct();
  388. return result.Select(i => new SelectListItem() { Text = i.ToString(), Value = i.ToString() }).ToList();
  389. }
  390. query = query.Where(i => i.ShelfNumber == shelfNo);
  391. if (levelNo.IsNullOrEmpty())
  392. {
  393. var result = query.Select(i => i.ShelfLevel).Distinct();
  394. return result.Select(i => new SelectListItem() { Text = i.ToString(), Value = i.ToString() }).ToList();
  395. }
  396. query = query.Where(i => i.ShelfLevel == levelNo);
  397. return query.Select(i => i.SequenceNo).Distinct().Select(i => new SelectListItem() { Text = i.ToString(), Value = i.ToString() }).ToList();
  398. }
  399. public List<ProductionOrderDisCustomerDto> GetDisCustomerInfo(EntityDto<string> input)
  400. {
  401. return CustomerDisabledProductRepository.GetAll().Where(i => i.ProductOrderNo == input.Id).Join(CustomerRepository.GetAll(), p => p.CustomerNo, c => c.Id,
  402. (p, c) =>
  403. new ProductionOrderDisCustomerDto()
  404. {
  405. ProductionOrderNo = p.ProductOrderNo,
  406. CustomerName = c.CustomerName,
  407. CustomerId = p.CustomerNo
  408. }).ToList();
  409. }
  410. #region 发送邮件
  411. public ISmtpEmailSenderConfiguration SmtpEmailSenderConfiguration { get; }
  412. public void SendEmail(string toEmail,string title,string msg,bool isHtml)
  413. {
  414. //SmtpEmailSender emailSender = new SmtpEmailSender(SmtpEmailSenderConfiguration);
  415. //emailSender.Send("zhangwy@iwbnet.com",toEmail , title, msg,isHtml);
  416. //EmailSendHelper.SendEmail(toEmail,title,msg,"","",isHtml);
  417. EmailHelper.SendEmail(toEmail,title,msg,isHtml);
  418. }
  419. #endregion
  420. #region 创建排产单号
  421. public async Task<string> GetProductionOrderNo(string createType = "", string preOrderNo = "", int isOutsourcing = 0)
  422. {
  423. if (string.IsNullOrEmpty(createType))
  424. {
  425. return await NormalGetProductionOrderNo(isOutsourcing);
  426. }
  427. return await SpecialGetProductionOrderNo(createType, preOrderNo);
  428. }
  429. /// <summary>
  430. /// 常规获取批次号
  431. /// </summary>
  432. /// <param name="isOutsourcing">1是外购</param>
  433. /// <returns></returns>
  434. private async Task<string> NormalGetProductionOrderNo(int isOutsourcing)
  435. {
  436. string lcRetVal;
  437. DateTime loTiem = DateTime.Parse(DateTime.Now.Year + "-" + DateTime.Now.Month + "-01");
  438. //loTiem = loTiem.AddSeconds(-1);
  439. var orders = (await ProductionOrderRepository.GetAllListAsync(i => i.TimeCreated >= loTiem && i.ProcessingLevel == "1")).OrderByDescending(i => i.Id).ToList();
  440. var orderNo = orders.FirstOrDefault()?.ProductionOrderNo;
  441. if (!string.IsNullOrEmpty(orderNo))
  442. {
  443. var liTempNo = Convert.ToInt32(orderNo.Substring(3, 4));
  444. liTempNo++;
  445. lcRetVal = liTempNo.ToString();
  446. while (lcRetVal.Length < 4)
  447. {
  448. lcRetVal = "0" + lcRetVal;
  449. }
  450. }
  451. else
  452. {
  453. lcRetVal = "0001";
  454. }
  455. DateTime loDate = DateTime.Today;
  456. //string lcMonth = liMonth < 10 ? liMonth + "" : Convert.ToString(liMonth, 16);
  457. lcRetVal = loDate.Date.Year + GetMonthString(isOutsourcing) + lcRetVal;
  458. lcRetVal = lcRetVal.Substring(2, lcRetVal.Length - 2);
  459. return lcRetVal;
  460. }
  461. /// <summary>
  462. /// 转换月份
  463. /// </summary>
  464. /// <param name="isOutsourcing"></param>
  465. /// <returns></returns>
  466. private string GetMonthString(int isOutsourcing)
  467. {
  468. DateTime loDate = DateTime.Today;
  469. int liMonth = loDate.Date.Month;
  470. if (isOutsourcing == 0)
  471. {
  472. return liMonth < 10 ? liMonth + "" : Convert.ToString(liMonth, 16).ToUpper();
  473. }
  474. string[] scource = { "", "G", "H", "W", "J", "K", "L", "M", "N", "T", "P", "Q", "R" };
  475. return scource[liMonth];
  476. }
  477. private string GetLastFourChar(string preOrderNo)
  478. {
  479. if (!string.IsNullOrEmpty(preOrderNo) && preOrderNo.Length == 11)
  480. {
  481. return preOrderNo.Substring(7, 4);
  482. }
  483. return "";
  484. }
  485. private async Task<string> SpecialGetProductionOrderNo(string createType, string preOrderNo = "")
  486. {
  487. string lcRetVal;
  488. DateTime loTiem = DateTime.Parse(DateTime.Now.Year + "-" + DateTime.Now.Month + "-01");
  489. string reg = @"/^[A-Za-z0-9]{3}" + createType + @"\w{3,7}$/";
  490. string orderNo = "";
  491. if (createType == "T")
  492. {
  493. var orders = (await SemiEnterStoreRepository
  494. .GetAllListAsync(i => i.TimeCreated >= loTiem && Regex.IsMatch(i.ProductionOrderNo, @"/^[A-Za-z0-9]{3}T\w{3,7}$/"))).OrderByDescending(i => i.Id).ToList();
  495. orderNo = orders.FirstOrDefault()?.ProductionOrderNo;
  496. }else if (createType == "G")
  497. {
  498. var orders = (await ProductionOrderRepository
  499. .GetAllListAsync(i => i.TimeCreated >= loTiem && Regex.IsMatch(i.ProductionOrderNo, @"/^[A-Za-z0-9]{3}T\w{3,7}$/"))).OrderByDescending(i => i.Id).ToList();
  500. orderNo = orders.FirstOrDefault()?.ProductionOrderNo;
  501. }
  502. if (!string.IsNullOrEmpty(orderNo))
  503. {
  504. var liTempNo = Convert.ToInt32(orderNo.Substring(4, 3));
  505. liTempNo++;
  506. lcRetVal = liTempNo.ToString();
  507. while (lcRetVal.Length < 3)
  508. {
  509. lcRetVal = "0" + lcRetVal;
  510. }
  511. }
  512. else
  513. {
  514. lcRetVal = "T001";
  515. }
  516. DateTime loDate = DateTime.Today;
  517. //string lcMonth = liMonth < 10 ? liMonth + "" : Convert.ToString(liMonth, 16);
  518. lcRetVal = loDate.Date.Year + GetMonthString(0) + lcRetVal;
  519. lcRetVal = lcRetVal.Substring(2, lcRetVal.Length - 2);
  520. lcRetVal += GetLastFourChar(preOrderNo);
  521. return lcRetVal;
  522. }
  523. #endregion
  524. /// <summary>
  525. /// 根据对照表搜到新的成品编码
  526. /// </summary>
  527. /// <param name="productNo"></param>
  528. /// <returns></returns>
  529. public async Task<ProductDto> GetNewProductInfo(string productNo)
  530. {
  531. var productMapper =
  532. await ProductMapperRepository.FirstOrDefaultAsync(i =>
  533. i.PreProductNo == productNo && i.PreProductType == 1);
  534. if (productMapper != null)
  535. {
  536. productNo = productMapper.ProductNo;
  537. }
  538. var pEntity = ProductRepository.Get(productNo);
  539. return ObjectMapper.Map<ProductDto>(pEntity);
  540. }
  541. /// <summary>
  542. /// 根据对照表搜到新的半成品编码
  543. /// </summary>
  544. /// <param name="productNo"></param>
  545. /// <returns></returns>
  546. public async Task<SemiProductDto> GetNewSemiProductInfo(string productNo)
  547. {
  548. var productMapper =
  549. await ProductMapperRepository.FirstOrDefaultAsync(i =>
  550. i.PreProductNo == productNo && i.PreProductType == 2);
  551. if (productMapper != null)
  552. {
  553. //CheckErrors(new IdentityResult("未查询到替换信息!"));
  554. productNo = productMapper.ProductNo;
  555. }
  556. var pEntity = SemiProductRepository.Get(productNo);
  557. return ObjectMapper.Map<SemiProductDto>(pEntity);
  558. }
  559. #region 首页提示查询信息
  560. public async Task<List<IndexAlertSumDto>> GetIndexAlertSum()
  561. {
  562. List<IndexAlertSumDto> result = new List<IndexAlertSumDto>();
  563. var user = SysUserRepository.Get(AbpSession.UserId ?? 0);
  564. if (user.UserType == 1 || user.DepartmentID== "002")
  565. {
  566. int notCompleteStatus = OrderStatusEnum.Completed.ToInt();
  567. int deleteStatus = OrderStatusEnum.Delete.ToInt();
  568. var query = OrderHeaderRepository.GetAll().Where(i =>
  569. i.OrderStatusId != notCompleteStatus && i.OrderStatusId != deleteStatus);
  570. int c = await query.CountAsync();
  571. result.Add(new IndexAlertSumDto() { Quantity = c, SumName = "未完成的订单", SumType = "1", TipName = "订单" });
  572. }
  573. if (user.UserType == 1 || user.DepartmentID == "003")
  574. {
  575. int startStatus = ProductionOrderStatusEnum.Start.ToInt();
  576. int auditedStatus = ProductionOrderStatusEnum.Audited.ToInt();
  577. int productingStatus = ProductionOrderStatusEnum.Producting.ToInt();
  578. int storeingStatus = ProductionOrderStatusEnum.Storeing.ToInt();
  579. var query1 = ProductionOrderRepository.GetAll().Where(i =>
  580. i.ProductionOrderStatus == startStatus || i.ProductionOrderStatus == auditedStatus || i.ProductionOrderStatus == productingStatus || i.ProductionOrderStatus == storeingStatus);
  581. int c1 = await query1.CountAsync();
  582. result.Add(new IndexAlertSumDto() { Quantity = c1, SumName = "未完成的排查单", SumType = "2", TipName = "生产" });
  583. }
  584. if (user.UserType == 1 || user.DepartmentID == "005")
  585. {
  586. int applyStatus = PackageApplyStatusEnum.Applying.ToInt();
  587. var query2 = ViewPackageApplyRepository.GetAll().Where(i =>
  588. i.ApplyStatus == applyStatus + "");
  589. int c2 = await query2.CountAsync();
  590. result.Add(new IndexAlertSumDto() { Quantity = c2, SumName = "未审核的包装申请", SumType = "3", TipName = "包装" });
  591. }
  592. return result;
  593. }
  594. public async Task<List<OrderHeaderDto>> GetOrderHeaderForAlert()
  595. {
  596. int notCompleteStatus = OrderStatusEnum.Completed.ToInt();
  597. int deleteStatus = OrderStatusEnum.Delete.ToInt();
  598. var query = OrderHeaderRepository.GetAll().Where(i =>
  599. i.OrderStatusId != notCompleteStatus && i.OrderStatusId != deleteStatus);
  600. var employeeList = EmployeeRepository.GetAllList();
  601. query = query.OrderByDescending(i => i.TimeCreated);
  602. var entityList = await query.Take(20).ToListAsync();
  603. var r = entityList.Select(i => new OrderHeaderDto()
  604. {
  605. CustomerId = i.CustomerId,
  606. CustomerSendId = i.CustomerSendId,
  607. Fax = i.Fax,
  608. LinkName = i.LinkName,
  609. Id = i.Id,
  610. OrderDate = i.OrderDate,
  611. OrderStatusId = i.OrderStatusId,
  612. OrderStatusName =
  613. StatesAppService.GetDisplayValue("OrderHeader", "OrderStatusId", i.OrderStatusId + ""),
  614. StockNo = i.StockNo,
  615. Telephone = i.Telephone,
  616. TimeLastMod = i.TimeLastMod,
  617. UserIDLastMod = i.UserIDLastMod,
  618. TimeCreated = i.TimeCreated,
  619. SaleType = i.SaleType,
  620. SaleTypeName = StatesAppService.GetDisplayValue("OrderHeader", "SaleType", i.SaleType + ""),
  621. SaleMan = i.SaleMan,
  622. SaleManName = employeeList.FirstOrDefault(a => a.No == i.SaleMan)?.Name,
  623. IsLock = i.IsLock
  624. });
  625. return r.ToList();
  626. }
  627. public async Task<List<ProductionOrderDto>> GetProductionOrderForAlert()
  628. {
  629. int startStatus = ProductionOrderStatusEnum.Start.ToInt();
  630. int auditedStatus = ProductionOrderStatusEnum.Audited.ToInt();
  631. int productingStatus = ProductionOrderStatusEnum.Producting.ToInt();
  632. int storeingStatus = ProductionOrderStatusEnum.Storeing.ToInt();
  633. var query = ProductionOrderRepository.GetAll().Where(i =>
  634. i.ProductionOrderStatus == startStatus || i.ProductionOrderStatus == auditedStatus || i.ProductionOrderStatus == productingStatus || i.ProductionOrderStatus == storeingStatus);
  635. query = query.OrderByDescending(i => i.TimeCreated);
  636. var entityList = await query.Take(20).ToListAsync();
  637. return ObjectMapper.Map<List<ProductionOrderDto>>(entityList);
  638. }
  639. public async Task<List<ViewPackageApply>> GetPackageApplyForAlert()
  640. {
  641. int applyStatus = PackageApplyStatusEnum.Applying.ToInt();
  642. var query = ViewPackageApplyRepository.GetAll().Where(i =>
  643. i.ApplyStatus == applyStatus+"");
  644. query = query.OrderByDescending(i => i.TimeCreated);
  645. var entityList = await query.Take(20).ToListAsync();
  646. return entityList;
  647. }
  648. #endregion
  649. public async Task<List<CurrentProductStoreHouseDto>> GetProductStoreInfoByProductNo(string productNo)
  650. {
  651. var cs = await CurrentProductStoreHouseRepository.GetAllListAsync(i =>
  652. i.ProductNo == productNo && i.Quantity > 0);
  653. return ObjectMapper.Map<List<CurrentProductStoreHouseDto>>(cs);
  654. }
  655. /// <summary>
  656. /// 去除已被替换的产品
  657. /// </summary>
  658. /// <param name="input"></param>
  659. /// <returns></returns>
  660. public async Task<PagedResultDto<ProductDto>> GetProductNotContainOld(IwbPagedRequestDto input)
  661. {
  662. var productNoExts =
  663. (await ProductMapperRepository.GetAllListAsync(i =>i.PreProductType == 1)).Select(i=>i.PreProductNo);
  664. var query = ProductRepository.GetAll().Where(a => a.IsLock == "N"&& !productNoExts.Contains(a.Id));
  665. if (input.SearchList != null && input.SearchList.Count > 0)
  666. {
  667. List<LambdaObject> objList = new List<LambdaObject>();
  668. foreach (var o in input.SearchList)
  669. {
  670. if (o.KeyWords.IsNullOrEmpty())
  671. continue;
  672. object keyWords = o.KeyWords;
  673. objList.Add(new LambdaObject
  674. {
  675. FieldType = (LambdaFieldType)o.FieldType,
  676. FieldName = o.KeyField,
  677. FieldValue = keyWords,
  678. ExpType = (LambdaExpType)o.ExpType
  679. });
  680. }
  681. var exp = objList.GetExp<Product>();
  682. query = query.Where(exp);
  683. }
  684. var totalCount = await query.CountAsync();
  685. query = !input.Sorting.IsNullOrWhiteSpace() ? query.OrderBy(input.Sorting) : query.OrderByDescending(i => i.TimeCreated);
  686. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  687. var entities = await query.ToListAsync();
  688. var dtos = new PagedResultDto<ProductDto>(
  689. totalCount,
  690. entities.Select(ObjectMapper.Map<ProductDto>).ToList()
  691. );
  692. return dtos;
  693. }
  694. /// <summary>
  695. /// 查询半成品信息
  696. /// </summary>
  697. /// <param name="input"></param>
  698. /// <returns></returns>
  699. public async Task<PagedResultDto<SemiProductDto>> GetSemiProductNotContainOld(IwbPagedRequestDto input)
  700. {
  701. var productNoExts =
  702. (await ProductMapperRepository.GetAllListAsync(i => i.PreProductType == 2)).Select(i => i.PreProductNo);
  703. var query = SemiProductRepository.GetAll().Where(a => a.IsLock == "N" && !productNoExts.Contains(a.Id));
  704. if (input.SearchList != null && input.SearchList.Count > 0)
  705. {
  706. List<LambdaObject> objList = new List<LambdaObject>();
  707. foreach (var o in input.SearchList)
  708. {
  709. if (o.KeyWords.IsNullOrEmpty())
  710. continue;
  711. object keyWords = o.KeyWords;
  712. //检查查询条件中带有规格且多个分割条件的
  713. ProductModelSearch.CheckModelGreaterOneFilter(o, ref keyWords);
  714. objList.Add(new LambdaObject
  715. {
  716. FieldType = (LambdaFieldType)o.FieldType,
  717. FieldName = o.KeyField,
  718. FieldValue = keyWords,
  719. ExpType = (LambdaExpType)o.ExpType
  720. });
  721. }
  722. var exp = objList.GetExp<SemiProducts>();
  723. query = exp!=null? query.Where(exp): query;
  724. }
  725. var totalCount = await query.CountAsync();
  726. query = query.OrderByDescending(i => i.TimeCreated);
  727. string pattern = ProductModelSearch.GetModelGreaterOneReg(input.SearchList);
  728. List<SemiProducts> entities;
  729. //检查查询条件中带有规格且多个分割条件的
  730. if (!pattern.IsNullOrEmpty())
  731. {
  732. var es = query.ToList();
  733. es = es.Where(f => f.Model != null && Regex.IsMatch(f.Model, pattern)).ToList();
  734. totalCount = es.Count;
  735. entities = es.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
  736. }
  737. else
  738. {
  739. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  740. entities = await query.ToListAsync();
  741. }
  742. //query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  743. //var entities = await query.ToListAsync();
  744. var dtos = new PagedResultDto<SemiProductDto>(
  745. totalCount,
  746. entities.Select(ObjectMapper.Map<SemiProductDto>).ToList()
  747. );
  748. return dtos;
  749. }
  750. }
  751. }