ProductInspectsApplicationService.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using System.Web.Mvc;
  8. using Abp.Application.Services.Dto;
  9. using Abp.Auditing;
  10. using Abp.Authorization;
  11. using Abp.Domain.Repositories;
  12. using Abp.Extensions;
  13. using Abp.Json;
  14. using Abp.Runtime.Caching;
  15. using Abp.Timing;
  16. using IwbZero.Auditing;
  17. using IwbZero.AppServiceBase;
  18. using IwbZero.Helper;
  19. using IwbZero.IdentityFramework;
  20. using IwbZero.Setting;
  21. using ShwasherSys.Authorization.Permissions;
  22. using ShwasherSys.BaseSysInfo;
  23. using ShwasherSys.BaseSysInfo.SysAttachFiles;
  24. using ShwasherSys.BaseSysInfo.SysAttachFiles.Dto;
  25. using ShwasherSys.BasicInfo.OutFactory;
  26. using ShwasherSys.Common;
  27. using ShwasherSys.Lambda;
  28. using ShwasherSys.Inspection.Dto;
  29. using ShwasherSys.ProductionOrderInfo;
  30. using ShwasherSys.ProductionOrderInfo.Dto;
  31. using ShwasherSys.ProductInfo;
  32. using ShwasherSys.SemiProductStoreInfo;
  33. using LambdaExpType = ShwasherSys.Lambda.LambdaExpType;
  34. using LambdaFieldType = ShwasherSys.Lambda.LambdaFieldType;
  35. using LambdaObject = ShwasherSys.Lambda.LambdaObject;
  36. namespace ShwasherSys.Inspection
  37. {
  38. [AbpAuthorize, AuditLog("技术检验信息")]
  39. public class ProductInspectAppService : ShwasherAsyncCrudAppService<ProductInspectInfo, ProductInspectDto, int, PagedRequestDto, ProductInspectCreateDto, ProductInspectUpdateDto >
  40. , IProductInspectAppService
  41. {
  42. public ProductInspectAppService(
  43. IRepository<SysAttachFile> attachRepository,
  44. IRepository<BusinessLog> logRepository,
  45. IRepository<SemiEnterStore> enterStoreRepository,
  46. IRepository<TemplateInfo> templateRepository,
  47. IRepository<ProductInspectReportContent> reportContentRepository,
  48. IRepository<ProductionOrder> productionOrderRepository,
  49. IIwbSettingManager settingManager,
  50. ICacheManager cacheManager,
  51. IRepository<ProductInspectInfo, int> repository, IRepository<SemiProducts, string> semiProductRepository, IRepository<DisqualifiedProduct> disProductRepository, IRepository<ViewSemiEnterStore> viewSemiEnterStoreRepository, IQueryAppService queryAppService, IRepository<ProductInspectReport> reportRepository, IRepository<OutFactory, string> outFactoryRepository) : base(repository, "ProductInspectNo")
  52. {
  53. SettingManager = settingManager;
  54. CacheManager = cacheManager;
  55. AttachRepository = attachRepository;
  56. LogRepository = logRepository;
  57. EnterStoreRepository = enterStoreRepository;
  58. TemplateRepository = templateRepository;
  59. ReportContentRepository = reportContentRepository;
  60. ProductionOrderRepository = productionOrderRepository;
  61. SemiProductRepository = semiProductRepository;
  62. DisProductRepository = disProductRepository;
  63. ViewSemiEnterStoreRepository = viewSemiEnterStoreRepository;
  64. QueryAppService = queryAppService;
  65. ReportRepository = reportRepository;
  66. OutFactoryRepository = outFactoryRepository;
  67. }
  68. protected override bool KeyIsAuto { get; set; } = false;
  69. public IQueryAppService QueryAppService { get; }
  70. public IRepository<SysAttachFile> AttachRepository { get; }
  71. public IRepository<BusinessLog> LogRepository { get; }
  72. public IRepository<SemiEnterStore> EnterStoreRepository { get; }
  73. public IRepository<TemplateInfo> TemplateRepository { get; }
  74. public IRepository<ProductInspectReport> ReportRepository { get; }
  75. public IRepository<ProductInspectReportContent> ReportContentRepository { get; }
  76. public IRepository<ProductionOrder> ProductionOrderRepository { get; }
  77. public IRepository<SemiProducts,string> SemiProductRepository { get; }
  78. public IRepository<ViewSemiEnterStore> ViewSemiEnterStoreRepository { get; }
  79. public IRepository<DisqualifiedProduct> DisProductRepository { get; }
  80. public IRepository<OutFactory,string> OutFactoryRepository { get; }
  81. #region GetSelect
  82. [DisableAuditing]
  83. public async Task<List<SelectListItem>> GetSelectList()
  84. {
  85. var list = await Repository.GetAllListAsync();
  86. var slist = new List<SelectListItem> {new SelectListItem {Text = @"请选择...", Value = "", Selected = true}};
  87. foreach (var l in list)
  88. {
  89. slist.Add(new SelectListItem { Text = l.ProductInspectNo, Value = l.InspectContent });
  90. }
  91. return slist;
  92. }
  93. [DisableAuditing]
  94. public async Task<string> GetSelectStr()
  95. {
  96. var list = await Repository.GetAllListAsync();
  97. string str = "<option value=\"\" selected>请选择...</option>";
  98. foreach (var l in list)
  99. {
  100. str += $"<option value=\"{l.ProductInspectNo}\">{l.InspectContent}</option>";
  101. }
  102. return str;
  103. }
  104. #endregion
  105. #region CURD
  106. #region Get
  107. [DisableAuditing]
  108. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMg)]
  109. public Task<ProductInspectInfo> GetEntityById(int id)
  110. {
  111. return Repository.GetAsync(id);
  112. }
  113. [DisableAuditing]
  114. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMg)]
  115. public Task<ProductInspectInfo> GetEntityByNo(string no)
  116. {
  117. if (KeyFiledName.IsNullOrEmpty())
  118. {
  119. CheckErrors(IwbIdentityResult.Failed("编码/编号字段不明确,请检查后再操作!"));
  120. }
  121. LambdaObject obj = new LambdaObject()
  122. {
  123. FieldType = LambdaFieldType.S,
  124. FieldName = KeyFiledName,
  125. FieldValue = no,
  126. ExpType = LambdaExpType.Equal
  127. };
  128. var exp = obj.GetExp<ProductInspectInfo>();
  129. return Repository.FirstOrDefaultAsync(exp);
  130. }
  131. [DisableAuditing]
  132. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMg)]
  133. public async Task<ProductInspectDto> GetDtoById(int id)
  134. {
  135. var entity = await GetEntityById(id);
  136. return MapToEntityDto(entity);
  137. }
  138. [DisableAuditing]
  139. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMg)]
  140. public async Task<ProductInspectDto> GetDtoByNo(string no)
  141. {
  142. var entity = await GetEntityByNo(no);
  143. return MapToEntityDto(entity);
  144. }
  145. #endregion
  146. #region 创建报告
  147. private IQueryable<ProductionOrderDto> GetAllInspectQueryable(PagedRequestDto input)
  148. {
  149. var query = ProductionOrderRepository.GetAll();
  150. var querySemiPro = SemiProductRepository.GetAll();
  151. var queryOutFactory = OutFactoryRepository.GetAll();
  152. var queryEntity = from u in query
  153. join s in querySemiPro on u.SemiProductNo equals s.Id into pu
  154. from luq in pu.DefaultIfEmpty()
  155. join ofo in queryOutFactory on u.OutsourcingFactory equals ofo.Id into fu
  156. from osfu in fu.DefaultIfEmpty()
  157. select new ProductionOrderDto
  158. {
  159. Model = luq.Model ?? "",
  160. CarNo = u.CarNo,
  161. EnterQuantity = u.EnterQuantity,
  162. Id = u.Id,
  163. CreatorUserId = u.CreatorUserId,
  164. IsChecked = u.IsChecked,
  165. IsLock = u.IsLock,
  166. Material = luq.Material ?? "",
  167. PartNo = luq.PartNo ?? "",
  168. SemiProductName = luq.SemiProductName ?? "",
  169. PlanProduceDate = u.PlanProduceDate,
  170. RawMaterials = u.RawMaterials,
  171. SurfaceColor = luq.SurfaceColor ?? "",
  172. Rigidity = luq.Rigidity ?? "",
  173. Remark = u.Remark,
  174. UserIDLastMod = u.UserIDLastMod,
  175. TimeCreated = u.TimeCreated,
  176. TimeLastMod = u.TimeLastMod,
  177. Size = u.Size,
  178. ProductionType = u.ProductionType,
  179. ProcessingType = u.ProcessingType,
  180. ProcessingLevel = u.ProcessingLevel,
  181. SourceProductionOrderNo = u.SourceProductionOrderNo,
  182. StoveNo = u.StoveNo,
  183. Quantity = u.Quantity,
  184. ProductionOrderNo = u.ProductionOrderNo,
  185. ProductionOrderStatus = u.ProductionOrderStatus,
  186. SemiProductNo = u.SemiProductNo,
  187. OutsourcingFactory = u.OutsourcingFactory,
  188. OutsourcingFactoryName = osfu.OutFactoryName
  189. };
  190. int enterStoredState = ProductionOrderStatusEnum.EnterStore.ToInt();
  191. int storingState = ProductionOrderStatusEnum.Storeing.ToInt();
  192. int endState = ProductionOrderStatusEnum.End.ToInt();
  193. //入库中和已经入库和已结束的可以生成报告
  194. queryEntity = queryEntity
  195. .Where(a => a.IsChecked != 1 && (a.ProductionOrderStatus == storingState || a.ProductionOrderStatus == enterStoredState || a.ProductionOrderStatus == endState));
  196. if (input.SearchList != null && input.SearchList.Count > 0)
  197. {
  198. List<LambdaObject> objList = new List<LambdaObject>();
  199. foreach (var o in input.SearchList)
  200. {
  201. if (o.KeyWords.IsNullOrEmpty())
  202. continue;
  203. object keyWords = o.KeyWords;
  204. objList.Add(new LambdaObject
  205. {
  206. FieldType = (LambdaFieldType)o.FieldType,
  207. FieldName = o.KeyField,
  208. FieldValue = keyWords,
  209. ExpType = (LambdaExpType)o.ExpType
  210. });
  211. }
  212. var exp = objList.GetExp<ProductionOrderDto>();
  213. queryEntity = queryEntity.Where(exp);
  214. }
  215. return queryEntity;
  216. }
  217. [DisableAuditing]
  218. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMgQuery)]
  219. public async Task<PagedResultDto<ProductionOrderDto>> GetAllInspect(PagedRequestDto input)
  220. {
  221. var queryEntity = GetAllInspectQueryable(input);
  222. var totalCount = await AsyncQueryableExecuter.CountAsync(queryEntity);
  223. queryEntity = queryEntity.OrderByDescending(a => a.TimeCreated);
  224. queryEntity = queryEntity.Skip(input.SkipCount).Take(input.MaxResultCount);
  225. var entities = await AsyncQueryableExecuter.ToListAsync(queryEntity);
  226. var dtos = new PagedResultDto<ProductionOrderDto>(
  227. totalCount,
  228. entities
  229. );
  230. return dtos;
  231. }
  232. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMgExport)]
  233. public async Task<string> ExportInspect(PagedRequestDto input)
  234. {
  235. var queryEntity = GetAllInspectQueryable(input);
  236. queryEntity = queryEntity.OrderByDescending(a => a.TimeCreated);
  237. var entities = await AsyncQueryableExecuter.ToListAsync(queryEntity);
  238. var r = entities.Select(i => new
  239. {
  240. i.ProductionOrderNo,
  241. i.SemiProductNo,
  242. i.SemiProductName,
  243. i.SurfaceColor,
  244. i.Model,
  245. i.Material,
  246. i.Rigidity,
  247. i.PartNo,
  248. i.OutsourcingFactoryName,
  249. i.Remark,
  250. }).ToList();
  251. string downloadUrl = await SettingManager.GetSettingValueAsync("SYSTEMDOWNLOADPATH");
  252. string lcFilePath = System.Web.HttpRuntime.AppDomainAppPath + "\\" +
  253. downloadUrl;
  254. var exportEntity = new Dictionary<string, string>()
  255. {
  256. {"ProductionOrderNo", "排产单号"},
  257. {"SemiProductNo", "半成品编码"},
  258. {"SemiProductName", "半成品名称"},
  259. {"SurfaceColor", "表色"},
  260. {"Model", "规格"},
  261. {"Material", "材质"},
  262. {"Rigidity", "硬度"},
  263. {"PartNo", "零件号"},
  264. {"OutsourcingFactoryName", "外协厂商"},
  265. {"Remark", "备注"}
  266. };
  267. string lcResultFileName = ExcelHelper.EntityListToExcel2003(exportEntity, r, "sheet", lcFilePath);
  268. return Path.Combine(downloadUrl, lcResultFileName);
  269. }
  270. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMgTemplate),AuditLog("报告模板")]
  271. public async Task Template(ProductInspectTemplateDto input)
  272. {
  273. if (input.ReportTemplate.IsNullOrEmpty())
  274. {
  275. CheckErrors(IwbIdentityResult.Failed("模板内容不能为空"));
  276. }
  277. var entity = await TemplateRepository.FirstOrDefaultAsync(a => a.TemplateNo == ShwasherConsts.InspectReportTemplateName);
  278. if (entity == null)
  279. {
  280. entity = new TemplateInfo
  281. {
  282. TemplateNo = ShwasherConsts.InspectReportTemplateName,
  283. Name = "检验报告单模板",
  284. Content = input.ReportTemplate,
  285. Type = 0
  286. };
  287. entity = await TemplateRepository.InsertAsync(entity);
  288. }
  289. else
  290. {
  291. entity.Content = input.ReportTemplate;
  292. entity = await TemplateRepository.UpdateAsync(entity);
  293. }
  294. await CacheManager.GetCache(ShwasherConsts.TemplateCache)
  295. .SetAsync(ShwasherConsts.InspectReportTemplateName, entity.Content);
  296. }
  297. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMgCreate), AuditLog("生成报告")]
  298. public async Task<ProductInspectDto> CreateInspect(ProductInspectCreateDto input)
  299. {
  300. if (input.ReportContent.IsNullOrEmpty())
  301. {
  302. CheckErrors(IwbIdentityResult.Failed("报告内容不能为空!"));
  303. return null;
  304. }
  305. //var productOrder =
  306. // await ProductionOrderRepository.FirstOrDefaultAsync(a =>
  307. // a.ProductionOrderNo == input.ProductionOrderNo);
  308. //if (productOrder==null)
  309. //{
  310. // CheckErrors(IwbIdentityResult.Failed("未发现排产单!"));
  311. // return null;
  312. //}
  313. //productOrder.IsChecked = 1;
  314. //productOrder.InspectDate = Clock.Now;
  315. //var enterStores =
  316. // await EnterStoreRepository.GetAllListAsync(a => a.ProductionOrderNo == productOrder.ProductionOrderNo);
  317. //if (enterStores!=null&& enterStores.Any())
  318. //{
  319. // foreach (var store in enterStores)
  320. // {
  321. // store.IsClose = true;
  322. // await EnterStoreRepository.UpdateAsync(store);
  323. // BusinessLogTypeEnum.SStore.WriteLog(LogRepository, "技术检验",
  324. // $"完成检验。关闭入库申请,检验结果为[{result}]", productOrder.ProductionOrderNo);
  325. // }
  326. //}
  327. //await ProductionOrderRepository.UpdateAsync(productOrder);
  328. var report =
  329. await ReportRepository.FirstOrDefaultAsync(a => a.ProductionOrderNo == input.ProductionOrderNo);
  330. if (report == null)
  331. {
  332. report= new ProductInspectReport()
  333. {
  334. ProductInspectReportNo = await InspectConfirmStateDefinition.GetReportNo(ReportRepository),
  335. ProductionOrderNo = input.ProductionOrderNo,
  336. ConfirmStatus = InspectConfirmStateDefinition.New,
  337. InspectCount = 1,
  338. SemiProductNo = input.SemiProductNo
  339. };
  340. await ReportRepository.InsertAsync(report);
  341. }
  342. else
  343. {
  344. if (report.ConfirmStatus == InspectConfirmStateDefinition.Confirm)
  345. {
  346. CheckErrors(IwbIdentityResult.Failed("检测报告已最终确认生成,不能再添加记录!"));
  347. }
  348. report.InspectCount++;
  349. await ReportRepository.UpdateAsync(report);
  350. }
  351. input.InspectMember = AbpSession.UserName;
  352. input.ProductInspectReportNo = report.ProductInspectReportNo;
  353. input.ProductInspectNo = $"{report.ProductInspectReportNo}-{report.InspectCount}";
  354. await CurrentUnitOfWork.SaveChangesAsync();
  355. var dto= await CreateEntity(input);
  356. var reportContent =
  357. await ReportContentRepository.FirstOrDefaultAsync(a =>
  358. a.PtoductInspectNo == report.ProductInspectReportNo);
  359. if (reportContent == null)
  360. {
  361. await ReportContentRepository.InsertAsync(new ProductInspectReportContent()
  362. {
  363. ProductionOrderNo = dto.ProductionOrderNo,
  364. PtoductInspectNo = report.ProductInspectReportNo,
  365. ReportContent = input.ReportContent
  366. });
  367. }
  368. else
  369. {
  370. reportContent.ReportContent = input.ReportContent;
  371. await ReportContentRepository.UpdateAsync(reportContent);
  372. }
  373. await ReportContentRepository.InsertAsync(new ProductInspectReportContent()
  374. {
  375. ProductionOrderNo = dto.ProductionOrderNo,
  376. PtoductInspectNo = dto.ProductInspectNo,
  377. ReportContent = input.ReportContent
  378. });
  379. string result= input.InspectResult == 0 ? "不合格" : "合格";
  380. BusinessLogTypeEnum.Inspect.WriteLog(LogRepository, "生成检验报告",
  381. $"检验项目[{dto.InspectSubject}],检验结果为[{result}],检验报告内容:[{input.ReportContent}]", input.ProductionOrderNo,report.ProductInspectReportNo,dto.ProductInspectNo);
  382. if (input.AttachFiles!=null && input.AttachFiles.Any())
  383. {
  384. foreach (var attach in input.AttachFiles)
  385. {
  386. attach.AttachNo = Guid.NewGuid().ToString("N");
  387. attach.TableName = "Product";
  388. attach.ColumnName = "Inspect";
  389. attach.SourceKey = report.ProductInspectReportNo;
  390. await CreateAttach(attach);
  391. }
  392. }
  393. return dto;
  394. }
  395. /// <summary>
  396. /// 最终确认报告
  397. /// </summary>
  398. /// <param name="input"></param>
  399. /// <returns></returns>
  400. [AbpAuthorize(PermissionNames.PagesProductInspectInspectReportConfirmReport), AuditLog("确认报告")]
  401. public async Task ConfirmReport(ProductReportConfirmDto input)
  402. {
  403. var entity =
  404. await ReportRepository.FirstOrDefaultAsync(
  405. a => a.ProductInspectReportNo == input.ProductInspectReportNo);
  406. if (entity == null)
  407. {
  408. CheckErrors(IwbIdentityResult.Failed("未查询到检测报告记录!"));
  409. return;
  410. }
  411. if ( entity.ConfirmStatus == InspectConfirmStateDefinition.Confirm)
  412. {
  413. CheckErrors(IwbIdentityResult.Failed("检测报告已确认,请勿重复操作!"));
  414. return;
  415. }
  416. var productOrder =
  417. await ProductionOrderRepository.FirstOrDefaultAsync(a =>
  418. a.ProductionOrderNo == entity.ProductionOrderNo);
  419. if (productOrder == null)
  420. {
  421. CheckErrors(IwbIdentityResult.Failed("未发现排产单!"));
  422. return ;
  423. }
  424. productOrder.IsChecked = 1;
  425. productOrder.InspectDate = Clock.Now;
  426. await ProductionOrderRepository.UpdateAsync(productOrder);
  427. entity.ConfirmDate=DateTime.Now;
  428. entity.ConfirmUser = AbpSession.UserName;
  429. entity.ConfirmStatus = InspectConfirmStateDefinition.Confirm;
  430. entity.InspectContent = input.InspectContent;
  431. await ReportRepository.UpdateAsync(entity);
  432. var reportContent =
  433. await ReportContentRepository.FirstOrDefaultAsync(a =>
  434. a.PtoductInspectNo == entity.ProductInspectReportNo);
  435. if (reportContent == null)
  436. {
  437. await ReportContentRepository.InsertAsync(new ProductInspectReportContent()
  438. {
  439. ProductionOrderNo = entity.ProductionOrderNo,
  440. PtoductInspectNo = entity.ProductInspectReportNo,
  441. ReportContent = input.ReportContent
  442. });
  443. }
  444. else
  445. {
  446. reportContent.ReportContent = input.ReportContent;
  447. await ReportContentRepository.UpdateAsync(reportContent);
  448. }
  449. BusinessLogTypeEnum.Inspect.WriteLog(LogRepository, "生成检验报告",
  450. $"最终确认报告,检验报告内容:[{input.ReportContent}]", entity.ProductionOrderNo,entity.ProductInspectReportNo);
  451. if (input.AttachFiles!=null && input.AttachFiles.Any())
  452. {
  453. foreach (var attach in input.AttachFiles)
  454. {
  455. attach.AttachNo = Guid.NewGuid().ToString("N");
  456. attach.TableName = "Product";
  457. attach.ColumnName = "Inspect";
  458. attach.SourceKey = entity.ProductInspectReportNo;
  459. await CreateAttach(attach);
  460. }
  461. }
  462. }
  463. #endregion
  464. [DisableAuditing]
  465. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMgQuery)]
  466. public override async Task<PagedResultDto<ProductInspectDto>> GetAll(PagedRequestDto input)
  467. {
  468. CheckGetAllPermission();
  469. var query = CreateFilteredQuery(input);
  470. var queryOrder = ProductionOrderRepository.GetAll();
  471. var querySemiPro = SemiProductRepository.GetAll();
  472. var queryEntity = from u in query
  473. join s in querySemiPro on u.SemiProductNo equals s.Id into pu
  474. from luq in pu.DefaultIfEmpty()
  475. join o in queryOrder on u.ProductionOrderNo equals o.ProductionOrderNo into ou
  476. from ouq in ou.DefaultIfEmpty()
  477. select new ProductInspectDto
  478. {
  479. Model = luq.Model ?? "",
  480. Id = u.Id,
  481. CreatorUserId = u.CreatorUserId,
  482. IsLock = u.IsLock,
  483. Material = luq.Material ?? "",
  484. SurfaceColor = luq.SurfaceColor ?? "",
  485. Rigidity = luq.Rigidity ?? "",
  486. UserIDLastMod = u.UserIDLastMod,
  487. TimeCreated = u.TimeCreated,
  488. TimeLastMod = u.TimeLastMod,
  489. ProductionOrderNo = u.ProductionOrderNo,
  490. SemiProductNo = u.SemiProductNo,
  491. SemiProductName = luq.SemiProductName,
  492. //InspectStatus = u.InspectStatus,
  493. InspectSubject = u.InspectSubject,
  494. InspectResult = u.InspectResult,
  495. InspectDate = u.InspectDate,
  496. InspectMember = u.InspectMember,
  497. InspectContent = u.InspectContent,
  498. ProductInspectNo = u.ProductInspectNo,
  499. ProcessingLevel = ouq.ProcessingLevel,
  500. ProductionType = ouq.ProductionType
  501. };
  502. if (input.SearchList != null && input.SearchList.Count > 0)
  503. {
  504. List<LambdaObject> objList = new List<LambdaObject>();
  505. foreach (var o in input.SearchList)
  506. {
  507. if (o.KeyWords.IsNullOrEmpty())
  508. continue;
  509. object keyWords = o.KeyWords;
  510. objList.Add(new LambdaObject
  511. {
  512. FieldType = (LambdaFieldType)o.FieldType,
  513. FieldName = o.KeyField,
  514. FieldValue = keyWords,
  515. ExpType = (LambdaExpType)o.ExpType
  516. });
  517. }
  518. var exp = objList.GetExp<ProductInspectDto>();
  519. queryEntity = queryEntity.Where(exp);
  520. }
  521. var totalCount = await AsyncQueryableExecuter.CountAsync(queryEntity);
  522. queryEntity = queryEntity.OrderByDescending(i => i.InspectDate);
  523. queryEntity = queryEntity.Skip(input.SkipCount).Take(input.MaxResultCount);
  524. var entities = await AsyncQueryableExecuter.ToListAsync(queryEntity);
  525. var dtos = new PagedResultDto<ProductInspectDto>(
  526. totalCount,
  527. entities
  528. );
  529. return dtos;
  530. }
  531. [DisableAuditing]
  532. [AbpAuthorize(PermissionNames.PagesProductInspectProductInspectMgQuery)]
  533. public async Task<PagedResultDto<ProductInspectReportDto>> GetAllReport(PagedRequestDto input)
  534. {
  535. var query = ReportRepository.GetAll();
  536. var queryProductionOrder = ProductionOrderRepository.GetAll();
  537. var querySemiPro = SemiProductRepository.GetAll();
  538. var queryEntity = from a in query
  539. join s in querySemiPro on a.SemiProductNo equals s.Id into pu
  540. from luq in pu.DefaultIfEmpty()
  541. join pp in queryProductionOrder on a.ProductionOrderNo equals pp.ProductionOrderNo into ppp
  542. from p in ppp.DefaultIfEmpty()
  543. select new ProductInspectReportDto
  544. {
  545. ProductInspectReportNo = a.ProductInspectReportNo,
  546. ProductionOrderNo = a.ProductionOrderNo,
  547. ConfirmStatus = a.ConfirmStatus,
  548. ConfirmDate = a.ConfirmDate,
  549. ConfirmUser = a.ConfirmUser,
  550. InspectCount = a.InspectCount,
  551. SemiProductNo = a.SemiProductNo,
  552. SemiProductName = luq.SemiProductName??"",
  553. PartNo = luq.PartNo ?? "",
  554. Model = luq.Model ?? "",
  555. Material = luq.Material ?? "",
  556. SurfaceColor = luq.SurfaceColor ?? "",
  557. Rigidity = luq.Rigidity ?? "",
  558. ProductionType = p.ProductionType,
  559. ProcessingType = p.ProcessingType,
  560. ProcessingLevel = p.ProcessingLevel,
  561. };
  562. if (input.SearchList != null && input.SearchList.Count > 0)
  563. {
  564. List<LambdaObject> objList = new List<LambdaObject>();
  565. foreach (var o in input.SearchList)
  566. {
  567. if (o.KeyWords.IsNullOrEmpty())
  568. continue;
  569. object keyWords = o.KeyWords;
  570. objList.Add(new LambdaObject
  571. {
  572. FieldType = (LambdaFieldType)o.FieldType,
  573. FieldName = o.KeyField,
  574. FieldValue = keyWords,
  575. ExpType = (LambdaExpType)o.ExpType
  576. });
  577. }
  578. var exp = objList.GetExp<ProductInspectReportDto>();
  579. if (exp != null)
  580. {
  581. queryEntity = queryEntity.Where(exp);
  582. }
  583. }
  584. int total = await queryEntity.CountAsync();
  585. queryEntity = queryEntity.OrderBy(a => a.ConfirmStatus).ThenBy(a => a.ProductInspectReportNo);
  586. queryEntity = queryEntity.Skip(input.SkipCount).Take(input.MaxResultCount);
  587. var entities = await queryEntity.ToListAsync();
  588. return new PagedResultDto<ProductInspectReportDto>(total,entities.Select(ObjectMapper.Map<ProductInspectReportDto>).ToList());
  589. }
  590. //[AbpAuthorize(PermissionNames.PagesProductInspectInspectReportUpdate), AuditLog("修改报告")]
  591. // public async Task<ProductInspectDto> UpdateInspect(ProductInspectUpdateDto input)
  592. // {
  593. // if (input.ReportContent.IsNullOrEmpty())
  594. // {
  595. // CheckErrors(IwbIdentityResult.Failed("报告内容不能为空!"));
  596. // return null;
  597. // }
  598. // var dto= await UpdateEntity(input);
  599. // var entity = await ReportContentRepository.FirstOrDefaultAsync(a => a.PtoductInspectNo == input.ProductInspectNo);
  600. // if (entity==null)
  601. // {
  602. // entity = new ProductInspectReportContent()
  603. // {
  604. // PtoductInspectNo = dto.ProductInspectNo,
  605. // ReportContent = input.ReportContent
  606. // };
  607. // await ReportContentRepository.InsertAsync(entity);
  608. // }
  609. // else
  610. // {
  611. // entity.ReportContent = input.ReportContent;
  612. // await ReportContentRepository.UpdateAsync(entity);
  613. // }
  614. // string result = input.InspectResult == 0 ? "不合格" : "合格";
  615. // BusinessLogTypeEnum.Inspect.WriteLog(LogRepository, "修改检验报告",
  616. // $"修改结果为[{result}],检验报告内容:[{entity.ReportContent}]", dto.ProductionOrderNo,
  617. // entity.PtoductInspectNo);
  618. // if (input.AttachFiles != null && input.AttachFiles.Any())
  619. // {
  620. // foreach (var attach in input.AttachFiles)
  621. // {
  622. // attach.AttachNo = Guid.NewGuid().ToString("N");
  623. // attach.TableName = "Product";
  624. // attach.ColumnName = "Inspect";
  625. // attach.SourceKey = dto.ProductInspectNo;
  626. // await CreateAttach(attach);
  627. // }
  628. // }
  629. // return dto;
  630. // }
  631. [AbpAuthorize(PermissionNames.PagesProductInspectInspectReportQueryReport),DisableAuditing]
  632. public async Task<string> QueryReport(string no,int isProduct)
  633. {
  634. string template = "";
  635. if (no.IsNullOrEmpty())
  636. {
  637. CheckErrors(IwbIdentityResult.Failed("检验遍码不能为空!"));
  638. return template;
  639. }
  640. if (no.ToLower() == "new")
  641. {
  642. template = (string) await CacheManager.GetCache(ShwasherConsts.TemplateCache).GetOrDefaultAsync(ShwasherConsts.InspectReportTemplateName);
  643. if (template.IsNullOrEmpty())
  644. {
  645. template = (await TemplateRepository.FirstOrDefaultAsync(a =>
  646. a.TemplateNo == ShwasherConsts.InspectReportTemplateName))?.Content;
  647. }
  648. return template;
  649. }
  650. if (isProduct==0)
  651. {
  652. var report = await ReportContentRepository.FirstOrDefaultAsync(a => a.PtoductInspectNo == no);
  653. if (report == null)
  654. {
  655. CheckErrors(IwbIdentityResult.Failed("检验报告不存在!"));
  656. return "";
  657. }
  658. template = report.ReportContent;
  659. }
  660. else
  661. {
  662. var productInspect = await ReportRepository.FirstOrDefaultAsync(a => a.ProductionOrderNo == no);
  663. if (productInspect != null)
  664. template = (await ReportContentRepository.FirstOrDefaultAsync(a =>
  665. a.PtoductInspectNo == productInspect.ProductInspectReportNo))?.ReportContent;
  666. if (template.IsNullOrEmpty())
  667. {
  668. string proNo = no.Substring(0, 7);//先找他前7位排查单的报告
  669. //LogHelper.LogError(this,"前7位编码"+proNo);
  670. var productInspectPre = (await ReportRepository.GetAllListAsync(a => a.ProductionOrderNo == proNo)).OrderByDescending(i=>i.CreationTime).FirstOrDefault();
  671. //LogHelper.LogError(this, "productInspectPre" + productInspectPre?.ToJsonString());
  672. if (productInspectPre != null)
  673. template = (await ReportContentRepository.FirstOrDefaultAsync(a =>
  674. a.PtoductInspectNo == productInspectPre.ProductInspectReportNo))?.ReportContent;
  675. //LogHelper.LogError(this, "template" + template);
  676. if (template.IsNullOrEmpty())
  677. {
  678. template = (string)await CacheManager.GetCache(ShwasherConsts.TemplateCache).GetOrDefaultAsync(ShwasherConsts.InspectReportTemplateName);
  679. if (template.IsNullOrEmpty())
  680. {
  681. template = (await TemplateRepository.FirstOrDefaultAsync(a =>
  682. a.TemplateNo == ShwasherConsts.InspectReportTemplateName))?.Content;
  683. }
  684. }
  685. }
  686. }
  687. return template;
  688. }
  689. /// <summary>
  690. /// 查询附件
  691. /// </summary>
  692. /// <param name="input"></param>
  693. /// <returns></returns>
  694. public async Task<List<SysAttachFileDto>> QueryAttach(QueryAttachDto input)
  695. {
  696. var report = await ReportRepository.FirstOrDefaultAsync(a => a.ProductionOrderNo == input.Key);
  697. if (report==null)
  698. {
  699. return null;
  700. }
  701. var entities = await AttachRepository.GetAllListAsync(a =>
  702. a.TableName == input.TableName && a.ColumnName == input.ColName && a.SourceKey.StartsWith(report.ProductInspectReportNo));
  703. return entities.Select(ObjectMapper.Map<SysAttachFileDto>).ToList();
  704. }
  705. public override Task Delete(EntityDto<int> input)
  706. {
  707. return Task.CompletedTask;
  708. }
  709. public async Task DeleteAttach(string attachNo)
  710. {
  711. var entity = await AttachRepository.FirstOrDefaultAsync(a => a.AttachNo == attachNo);
  712. if (entity==null)
  713. {
  714. CheckErrors(IwbIdentityResult.Failed("未查询到附件。"));
  715. return;
  716. }
  717. await AttachRepository.DeleteAsync(a => a.AttachNo == attachNo);
  718. BusinessLogTypeEnum.Inspect.WriteLog(LogRepository, "修改检验报告",
  719. $"删除附件:[{entity.AttachNo}]-{entity.FileTitle}-{entity.FileName}.{entity.FileExt}", entity.SourceKey, entity.AttachNo);
  720. }
  721. private async Task CreateAttach(SysAttachFileCreateDto input)
  722. {
  723. if (await IsValidFileType(input.FileExt))
  724. {
  725. string filePath =
  726. $"{SettingManager.GetSettingValue(SettingNames.DownloadPath)}/{input.TableName}/{input.ColumnName}";
  727. var lcRetVal = SysAttachFileAppService.Base64ToFile(input.FileInfo,
  728. $"{input.FileName}-{DateTime.Now:yyMMddHHmmss}{new Random().Next(1000, 9999)}", input.FileExt,
  729. filePath);
  730. if (lcRetVal.StartsWith("error@"))
  731. {
  732. CheckErrors(
  733. IwbIdentityResult.Failed(lcRetVal.Split(new[] {'@'},
  734. StringSplitOptions.RemoveEmptyEntries)[1]));
  735. return;
  736. }
  737. input.FilePath = lcRetVal;
  738. var entity = ObjectMapper.Map<SysAttachFile>(input);
  739. entity = await AttachRepository.InsertAsync(entity);
  740. BusinessLogTypeEnum.Inspect.WriteLog(LogRepository, "修改检验报告",
  741. $"添加附件:[{entity.AttachNo}]-{entity.FileTitle}-{entity.FileName}.{entity.FileExt}",
  742. entity.SourceKey, entity.AttachNo);
  743. return;
  744. }
  745. CheckErrors(IwbIdentityResult.Failed("文件类型不合法,请上传合法文件。"));
  746. }
  747. private async Task<bool> IsValidFileType(string fileName ,bool isName=false)
  748. {
  749. string ext = isName ? GetFileExt(fileName) : fileName;
  750. string lcExts = await SettingManager.GetSettingValueAsync(SettingNames.UploadFileExt);
  751. string[] loList = lcExts.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  752. foreach (var lcExt in loList)
  753. {
  754. if (ext.ToLower() == lcExt.ToLower())
  755. return true;
  756. }
  757. this.LogError("上传的文件非法:" + fileName);
  758. return false;
  759. }
  760. private string GetFileExt(string fileName)
  761. {
  762. string fileExt = fileName.Substring(fileName.LastIndexOf(".", StringComparison.Ordinal) + 1, fileName.Length - fileName.LastIndexOf(".", StringComparison.Ordinal) - 1);
  763. return fileExt.ToLower();
  764. }
  765. //protected override IQueryable<ProductInspectInfo> ApplySorting(IQueryable<ProductInspectInfo> query, PagedRequestDto input)
  766. //{
  767. // return query.OrderBy(a => a.No);
  768. //}
  769. //protected override IQueryable<ProductInspectInfo> ApplyPaging(IQueryable<ProductInspectInfo> query, PagedRequestDto input)
  770. //{
  771. // if (input is IPagedResultRequest pagedInput)
  772. // {
  773. // return query.Skip(pagedInput.SkipCount).Take(pagedInput.MaxResultCount);
  774. // }
  775. // return query;
  776. //}
  777. #endregion
  778. #region SemiEnterStoreCheck
  779. [AbpAuthorize(PermissionNames.PagesProductionInfoProductionEnterStoreApplyMg), DisableAuditing]
  780. public PagedResultDto<ViewSemiEnterStore> GetSemiEnterStoreCheck(PagedRequestDto input)
  781. {
  782. var checkState = EnterStoreApplyStatusEnum.Audited.ToInt() + "";
  783. var query = ViewSemiEnterStoreRepository.GetAll().Where(a => a.ApplyStatus == checkState);
  784. if (input.SearchList != null && input.SearchList.Count > 0)
  785. {
  786. List<LambdaObject> objList = new List<LambdaObject>();
  787. foreach (var o in input.SearchList)
  788. {
  789. if (o.KeyWords.IsNullOrEmpty())
  790. continue;
  791. object keyWords = o.KeyWords;
  792. objList.Add(new LambdaObject
  793. {
  794. FieldType = (LambdaFieldType)o.FieldType,
  795. FieldName = o.KeyField,
  796. FieldValue = keyWords,
  797. ExpType = (LambdaExpType)o.ExpType
  798. });
  799. }
  800. var exp = objList.GetExp<ViewSemiEnterStore>();
  801. query = query.Where(exp);
  802. }
  803. var totalCount = query.Count();
  804. query = query.OrderByDescending(i => i.TimeCreated);
  805. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  806. var entities = query.ToList();
  807. var dtos = new PagedResultDto<ViewSemiEnterStore>(
  808. totalCount, entities
  809. );
  810. return dtos;
  811. }
  812. [AbpAuthorize(PermissionNames.PagesProductInspectProductItemInspectMgCheck), AuditLog("入库检验合格")]
  813. public async Task Check(EntityDto<int> input)
  814. {
  815. var entity = await EnterStoreRepository.FirstOrDefaultAsync(a => a.Id == input.Id);
  816. if (entity.ApplyStatus == EnterStoreApplyStatusEnum.EnterStored.ToInt() + "")
  817. {
  818. CheckErrors(IwbIdentityResult.Failed("已入库不能再操作!"));
  819. }
  820. if (entity.ApplyStatus != EnterStoreApplyStatusEnum.Audited.ToInt() + "" && entity.ApplyStatus != EnterStoreApplyStatusEnum.UnChecked.ToInt() + "")
  821. {
  822. CheckErrors(IwbIdentityResult.Failed("还未审核,不能检验!"));
  823. }
  824. entity.ApplyStatus = EnterStoreApplyStatusEnum.Checked.ToInt() + "";
  825. await EnterStoreRepository.UpdateAsync(entity);
  826. BusinessLogTypeEnum.SStore.WriteLog(LogRepository, "半成品检验",
  827. $"半成品检验合格,可以入库[{entity.Id}]", $"检验人:{entity.CreatorUserId}",
  828. entity.ProductionOrderNo);
  829. }
  830. [AbpAuthorize(PermissionNames.PagesProductInspectProductItemInspectMgUnCheck), AuditLog("入库检验不合格")]
  831. public async Task UnCheck(EntityDto<int> input)
  832. {
  833. var entity = await EnterStoreRepository.FirstOrDefaultAsync(a => a.Id == input.Id);
  834. if (entity.ApplyStatus == EnterStoreApplyStatusEnum.EnterStored.ToInt() + "")
  835. {
  836. CheckErrors(IwbIdentityResult.Failed("已入库不能再操作!"));
  837. }
  838. if (entity.ApplyStatus != EnterStoreApplyStatusEnum.Audited.ToInt() + "")
  839. {
  840. CheckErrors(IwbIdentityResult.Failed("还未审核,不能检验!"));
  841. }
  842. entity.ApplyStatus = EnterStoreApplyStatusEnum.UnChecked.ToInt() + "";
  843. await EnterStoreRepository.UpdateAsync(entity);
  844. DateTime date= DateTime.Now;
  845. await DisProductRepository.InsertAsync(new DisqualifiedProduct()
  846. {
  847. DisqualifiedNo = await ProductTypeDefinition.GetDisProductNo(DisProductRepository,ProductTypeDefinition.Semi),
  848. ProductOrderNo = entity.ProductionOrderNo,
  849. ProductNo = entity.SemiProductNo,
  850. ProductName = await QueryAppService.GetSemiProductName(entity.SemiProductNo),
  851. ProductType = ProductTypeDefinition.Semi,
  852. QuantityWeight = entity.ActualQuantity,
  853. KgWeight = entity.KgWeight,
  854. QuantityPcs = entity.KgWeight != 0 ? Math.Floor(entity.ActualQuantity / entity.KgWeight) : 0,
  855. CheckUser = AbpSession.UserName,
  856. CheckDate = date,
  857. HandleType = DisProductStateDefinition.NoHandle,
  858. HandleDate = date,
  859. HandleUser = AbpSession.UserName,
  860. DisqualifiedType = DisqualifiedType.ProductionCheck
  861. });
  862. BusinessLogTypeEnum.SStore.WriteLog(LogRepository, "半成品检验",
  863. $"半成品检验不合格,不能入库[{entity.Id}]", $"检验人:{entity.CreatorUserId}",
  864. entity.ProductionOrderNo);
  865. }
  866. #endregion
  867. }
  868. }