OrderItemsApplicationService.cs 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Threading.Tasks;
  10. using System.Web.UI.WebControls;
  11. using Abp.Application.Services.Dto;
  12. using Abp.Auditing;
  13. using Abp.Authorization;
  14. using Abp.Domain.Repositories;
  15. using Abp.Extensions;
  16. using Abp.Json;
  17. using Abp.Timing;
  18. using Abp.UI;
  19. using IwbZero.AppServiceBase;
  20. using IwbZero.Auditing;
  21. using IwbZero.IdentityFramework;
  22. using IwbZero.Setting;
  23. using NPOI.POIFS.FileSystem;
  24. using ShwasherSys.Authorization.Permissions;
  25. using ShwasherSys.BaseSysInfo;
  26. using ShwasherSys.BaseSysInfo.States;
  27. using ShwasherSys.Common;
  28. using ShwasherSys.Common.Dto;
  29. using ShwasherSys.CustomerInfo;
  30. using ShwasherSys.EntityFramework;
  31. using ShwasherSys.Lambda;
  32. using ShwasherSys.Order.Dto;
  33. using ShwasherSys.OrderSendInfo;
  34. using ShwasherSys.ProductStoreInfo;
  35. namespace ShwasherSys.Order
  36. {
  37. [AbpAuthorize]
  38. public class OrderItemsAppService : ShwasherAsyncCrudAppService<OrderItem, OrderItemDto, int, PagedRequestDto, OrderItemCreateDto, OrderItemUpdateDto >, IOrderItemsAppService
  39. {
  40. protected IRepository<CustomerDefaultProduct> CustomerDefaultProductRepository;
  41. protected IRepository<OrderHeader, string> OrderHeaderRepository;
  42. protected IRepository<ViewOrderItems> ViewOrderItemsRepository;
  43. protected IRepository<OrderSend> OrderSendRepository;
  44. protected IStatesAppService StatesAppService;
  45. protected IRepository<ProductOutStore> ProductOutStoreRepository;
  46. protected IRepository<CurrentProductStoreHouse> CurrentProductStoreHouseRepository;
  47. protected IRepository<ViewBookedProductNum, string> ViewBookedProductNumRepository;
  48. protected IRepository<ViewCanProductStore, string> ViewCanProductStoreRepository;
  49. protected IRepository<BusinessLog> BusinessLogRepository;
  50. protected IRepository<OrderSendExceed> OrderSendExceedRepository;
  51. protected IRepository<ScheduleOrderSend> ScheduleOrderSendRepository;
  52. protected IRepository<OrderBookStore,long> OrderBookStoreRepository;
  53. protected IRepository<ViewOrderSend> ViewOrderSendRepository;
  54. protected ICommonAppService CommonAppService { get; }
  55. protected IQueryAppService QueryAppService { get; }
  56. protected ISqlExecuter SqlExecuter { get; }
  57. public OrderItemsAppService(IRepository<OrderItem, int> repository, IRepository<CustomerDefaultProduct> customerDefaultProductRepository, IRepository<OrderHeader, string> orderHeaderRepository, IRepository<ViewOrderItems> viewOrderItemsRepository, IRepository<OrderSend> orderSendRepository, IIwbSettingManager settingManager, IRepository<ProductOutStore> productOutStoreRepository, IRepository<CurrentProductStoreHouse> currentProductStoreHouseRepository, IRepository<ViewBookedProductNum, string> viewBookedProductNumRepository, IRepository<ViewCanProductStore, string> viewCanProductStoreRepository, IRepository<BusinessLog> businessLogRepository, IStatesAppService statesAppService, ICommonAppService commonAppService, IRepository<OrderSendExceed> orderSendExceedRepository, ISqlExecuter sqlExecuter, IQueryAppService queryAppService, IRepository<ScheduleOrderSend> scheduleOrderSendRepository,IRepository<OrderBookStore,long> orderBookStoreRepository, IRepository<ViewOrderSend> viewOrderSendRepository) : base(repository)
  58. {
  59. CustomerDefaultProductRepository = customerDefaultProductRepository;
  60. OrderHeaderRepository = orderHeaderRepository;
  61. ViewOrderItemsRepository = viewOrderItemsRepository;
  62. OrderSendRepository = orderSendRepository;
  63. ProductOutStoreRepository = productOutStoreRepository;
  64. CurrentProductStoreHouseRepository = currentProductStoreHouseRepository;
  65. ViewBookedProductNumRepository = viewBookedProductNumRepository;
  66. ViewCanProductStoreRepository = viewCanProductStoreRepository;
  67. BusinessLogRepository = businessLogRepository;
  68. StatesAppService = statesAppService;
  69. SettingManager = settingManager;
  70. CommonAppService = commonAppService;
  71. OrderSendExceedRepository = orderSendExceedRepository;
  72. SqlExecuter = sqlExecuter;
  73. QueryAppService = queryAppService;
  74. ScheduleOrderSendRepository = scheduleOrderSendRepository;
  75. OrderBookStoreRepository = orderBookStoreRepository;
  76. ViewOrderSendRepository = viewOrderSendRepository;
  77. }
  78. protected override string GetPermissionName { get; set; } = PermissionNames.PagesOrderInfoOrderMg;
  79. protected override string GetAllPermissionName { get; set; } = PermissionNames.PagesOrderInfoOrderMg;
  80. protected override string CreatePermissionName { get; set; } = PermissionNames.PagesOrderInfoOrderMgCreateOrderItem;
  81. protected override string UpdatePermissionName { get; set; } = PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem;
  82. protected override string DeletePermissionName { get; set; } = PermissionNames.PagesOrderInfoOrderMgDeleteOrderItem;
  83. public override async Task<PagedResultDto<OrderItemDto>> GetAll(PagedRequestDto input)
  84. {
  85. CheckGetAllPermission();
  86. var query = CreateFilteredQuery(input);
  87. // CacheManager.GetCache(ShwasherConsts.EmployeeCache).GetAsync("",()=>ViewEmployeeRepository.GetAllList())
  88. if (input.SearchList != null && input.SearchList.Count > 0)
  89. {
  90. List<LambdaObject> objList = new List<LambdaObject>();
  91. foreach (var o in input.SearchList)
  92. {
  93. if (o.KeyWords.IsNullOrEmpty())
  94. continue;
  95. object keyWords = o.KeyWords;
  96. objList.Add(new LambdaObject
  97. {
  98. FieldType = (LambdaFieldType)o.FieldType,
  99. FieldName = o.KeyField,
  100. FieldValue = keyWords,
  101. ExpType = (LambdaExpType)o.ExpType
  102. });
  103. }
  104. var exp = objList.GetExp<OrderItem>();
  105. query = query.Where(exp);
  106. }
  107. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  108. query = ApplySorting(query, input);
  109. query = ApplyPaging(query, input);
  110. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  111. var dtos = new PagedResultDto<OrderItemDto>(
  112. totalCount,
  113. entities.Select(MapToEntityDto).ToList()
  114. );
  115. return dtos;
  116. }
  117. [AbpAuthorize(PermissionNames.PagesOrderInfoNotCompleteOrderItem, PermissionNames.PagesOrderInfoOrderQueryMg)]
  118. public async Task<PagedResultDto<ViewOrderItems>> GetViewAll(PagedRequestDto input)
  119. {
  120. var query = ViewOrderItemsRepository.GetAll();
  121. if (input.SearchList != null && input.SearchList.Count > 0)
  122. {
  123. List<LambdaObject> objList = new List<LambdaObject>();
  124. foreach (var o in input.SearchList)
  125. {
  126. if (o.KeyWords.IsNullOrEmpty())
  127. continue;
  128. object keyWords = o.KeyWords;
  129. //检查查询条件中带有规格且多个分割条件的
  130. ProductModelSearch.CheckModelGreaterOneFilter(o, ref keyWords);
  131. objList.Add(new LambdaObject
  132. {
  133. FieldType = (LambdaFieldType)o.FieldType,
  134. FieldName = o.KeyField,
  135. FieldValue = keyWords,
  136. ExpType = (LambdaExpType)o.ExpType,
  137. });
  138. }
  139. var exp = objList.GetExp<ViewOrderItems>();
  140. query = query.Where(exp);
  141. }
  142. query = query.Where(i => i.IsLock != "Y");
  143. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  144. query = query.OrderByDescending(i => i.OrderNo);
  145. string pattern = ProductModelSearch.GetModelGreaterOneReg(input.SearchList);
  146. List<ViewOrderItems> entities;
  147. //检查查询条件中带有规格且多个分割条件的
  148. if (!pattern.IsNullOrEmpty())
  149. {
  150. var es = query.ToList();
  151. es = es.Where(f => f.Model != null && Regex.IsMatch(f.Model, pattern)).ToList();
  152. totalCount = es.Count;
  153. entities = es.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
  154. }
  155. else
  156. {
  157. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  158. entities = await AsyncQueryableExecuter.ToListAsync(query);
  159. }
  160. var dtos = new PagedResultDto<ViewOrderItems>(
  161. totalCount,
  162. entities
  163. );
  164. return dtos;
  165. }
  166. [AbpAuthorize(PermissionNames.PagesOrderInfoNotCompleteOrderItem, PermissionNames.PagesOrderInfoOrderQueryMg)]
  167. public async Task<PagedResultDto<ViewOrderItems>> GetViewAllNot(PagedRequestDto input)
  168. {
  169. var query = ViewOrderItemsRepository.GetAll();
  170. if (input.SearchList != null && input.SearchList.Count > 0)
  171. {
  172. List<LambdaObject> objList = new List<LambdaObject>();
  173. foreach (var o in input.SearchList)
  174. {
  175. if (o.KeyWords.IsNullOrEmpty())
  176. continue;
  177. object keyWords = o.KeyWords;
  178. //检查查询条件中带有规格且多个分割条件的
  179. ProductModelSearch.CheckModelGreaterOneFilter(o, ref keyWords);
  180. objList.Add(new LambdaObject
  181. {
  182. FieldType = (LambdaFieldType)o.FieldType,
  183. FieldName = o.KeyField,
  184. FieldValue = keyWords,
  185. ExpType = (LambdaExpType)o.ExpType,
  186. });
  187. }
  188. var exp = objList.GetExp<ViewOrderItems>();
  189. query = query.Where(exp);
  190. }
  191. query = query.Where(i => i.IsLock != "Y");
  192. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  193. query = query.OrderByDescending(i => i.SendDate).ThenBy(i=>i.ProductNo);
  194. string pattern = ProductModelSearch.GetModelGreaterOneReg(input.SearchList);
  195. List<ViewOrderItems> entities;
  196. //检查查询条件中带有规格且多个分割条件的
  197. if (!pattern.IsNullOrEmpty())
  198. {
  199. var es = query.ToList();
  200. es = es.Where(f => f.Model != null && Regex.IsMatch(f.Model, pattern)).ToList();
  201. totalCount = es.Count;
  202. entities = es.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
  203. }
  204. else
  205. {
  206. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  207. entities = await AsyncQueryableExecuter.ToListAsync(query);
  208. }
  209. //query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  210. //var entities = await AsyncQueryableExecuter.ToListAsync(query);
  211. var dtos = new PagedResultDto<ViewOrderItems>(
  212. totalCount,
  213. entities
  214. );
  215. return dtos;
  216. }
  217. [AbpAuthorize(PermissionNames.PagesOrderInfoNotCompleteOrderItem, PermissionNames.PagesOrderInfoOrderQueryMg)]
  218. public async Task<string> ExportExcel(List<MultiSearchDtoExt> input)
  219. {
  220. var query = ViewOrderItemsRepository.GetAll();
  221. if (input != null && input.Count > 0)
  222. {
  223. List<LambdaObject> objList = new List<LambdaObject>();
  224. foreach (var o in input)
  225. {
  226. if (o.KeyWords.IsNullOrEmpty())
  227. continue;
  228. object keyWords = o.KeyWords;
  229. //检查查询条件中带有规格且多个分割条件的
  230. ProductModelSearch.CheckModelGreaterOneFilter(o, ref keyWords);
  231. var logicType = LogicType.And;
  232. if (o.LogicType == 1)
  233. {
  234. logicType = LogicType.Or;
  235. }
  236. objList.Add(new LambdaObject
  237. {
  238. FieldType = (LambdaFieldType)o.FieldType,
  239. FieldName = o.KeyField,
  240. FieldValue = keyWords,
  241. ExpType = (LambdaExpType)o.ExpType,
  242. LogicType = logicType
  243. });
  244. }
  245. var exp = objList.GetExp<ViewOrderItems>();
  246. query = query.Where(exp);
  247. }
  248. query = query.Where(i => i.IsLock != "Y");
  249. query = query.OrderByDescending(i => i.OrderNo);
  250. string pattern = ProductModelSearch.GetModelGreaterOneReg(input);
  251. List<ViewOrderItems> entities = await AsyncQueryableExecuter.ToListAsync(query);
  252. //检查查询条件中带有规格且多个分割条件的
  253. if (!pattern.IsNullOrEmpty())
  254. {
  255. entities = entities.Where(f => f.Model != null && Regex.IsMatch(f.Model, pattern)).ToList();
  256. }
  257. //var entities = await AsyncQueryableExecuter.ToListAsync(query);
  258. var r = entities.Select(i => new
  259. {
  260. i.OrderNo,
  261. OrderItemStatusName = StatesAppService.GetDisplayValue("OrderItems", "OrderItemStatusId", i.OrderItemStatusId.ToString()),
  262. i.CustomerName,
  263. i.Model,
  264. i.Rigidity,
  265. i.SurfaceColor,
  266. i.Material,
  267. i.PartNo,
  268. OrderDate = i.OrderDate?.ToString("yyy-MM-dd"),
  269. i.Quantity,
  270. IsPartSend = i.IsPartSend == "Y" ? "是" : "否",
  271. IsReport = i.IsReport == "Y" ? "需要" : "不需要",
  272. i.Price,
  273. i.AfterTaxPrice,
  274. i.TotalPrice,
  275. i.AfterTaxTotalPrice,
  276. i.IsSendQuantity,
  277. i.RemainingQuantity,
  278. i.OrderUnitName,
  279. i.StockNo,
  280. i.ProductNo,
  281. i.ProductName,
  282. SendDate = i.SendDate.ToString("yyy-MM-dd"),
  283. i.OrderItemDesc,
  284. i.SaleType,
  285. SaleTypeName= StatesAppService.GetDisplayValue("OrderHeader", "SaleType", i.SaleType.ToString()),
  286. i.CurrencyId
  287. }).ToList();
  288. string downloadUrl =await SettingManager.GetSettingValueAsync("SYSTEMDOWNLOADPATH");
  289. string lcFilePath = System.Web.HttpRuntime.AppDomainAppPath + "\\" +
  290. downloadUrl;
  291. var exportEntity = new Dictionary<string, string>()
  292. {
  293. {"OrderNo", "订单流水号"},
  294. {"StockNo", "客户订单号"},
  295. {"CustomerName", "客户"},
  296. { "OrderDate","订单日期"},
  297. {"PartNo", "零件号"},
  298. {"ProductName", "产品名称"},
  299. {"Model", "型号"},
  300. {"SurfaceColor", "表色"},
  301. {"Material", "材质"},
  302. {"Rigidity", "硬度"},
  303. {"Quantity", "数量"},
  304. {"IsSendQuantity", "已发数量"},
  305. {"RemainingQuantity", "剩余数"},
  306. {"SendDate", "送货日期"},
  307. {"SaleTypeName", "内销/外销"},
  308. {"IsReport", "检验报告"},
  309. {"IsPartSend", "部分送货"},
  310. {"OrderItemStatusName", "状态"},
  311. {"ProductNo", "产品编号"},
  312. {"OrderUnitName", "单位"},
  313. {"CurrencyId", "货币"},
  314. {"Price", "含税价"},
  315. {"AfterTaxPrice", "不含税价"},
  316. {"TotalPrice", "总价"},
  317. {"AfterTaxTotalPrice", "不含税总价"},
  318. {"OrderItemDesc", "备注"}
  319. };
  320. if (!PermissionChecker.IsGranted(PermissionNames.PagesOrderInfoOrderMgQueryOrderPrice))
  321. {
  322. exportEntity.Remove("TotalPrice");
  323. }
  324. string lcResultFileName = ExcelHelper.EntityListToExcel2003(exportEntity, r, "sheet", lcFilePath);
  325. return Path.Combine(downloadUrl, lcResultFileName);
  326. }
  327. public override async Task<OrderItemDto> Create(OrderItemCreateDto input)
  328. {
  329. CheckCreatePermission();
  330. var orderHeader = await OrderHeaderRepository.GetAsync(input.OrderNo);
  331. if (orderHeader.IsLock == "Y")
  332. {
  333. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  334. }
  335. #region 更新客户产品维护信息
  336. var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  337. i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  338. CustomerDefaultProduct exist = !string.IsNullOrEmpty(input.PartNo) ? await CustomerDefaultProductRepository.FirstOrDefaultAsync(i => i.CustomerId == orderHeader.CustomerId && i.PartNo == input.PartNo) : null;
  339. if (customerDefaultProduct == null)
  340. {
  341. if (exist != null)
  342. {
  343. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  344. }
  345. customerDefaultProduct = new CustomerDefaultProduct()
  346. {
  347. CustomerId = orderHeader.CustomerId,
  348. ProductNo = input.ProductNo,
  349. PartNo = input.PartNo,
  350. ProductHsCode = input.ProductHsCode,
  351. Sequence = 1,
  352. TimeLastMod = Clock.Now
  353. };
  354. }
  355. else
  356. {
  357. if (exist != null && exist.Id != customerDefaultProduct.Id)
  358. {
  359. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  360. }
  361. customerDefaultProduct.PartNo = input.PartNo;
  362. customerDefaultProduct.ProductHsCode = input.ProductHsCode;
  363. customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  364. customerDefaultProduct.TimeLastMod = Clock.Now;
  365. }
  366. await CustomerDefaultProductRepository.InsertOrUpdateAsync(customerDefaultProduct);
  367. #endregion
  368. input.OrderItemStatusId = OrderItemStatusEnum.NewCreate.ToInt();
  369. input.SendDate ??= new DateTime(1900, 1, 1);
  370. var dto= await CreateEntity(input);
  371. //await CommonAppService.WriteShortMessage(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANLRMSG), "有新订单明细录入", $"新的订单明细录入成功,订单明细流水号为:{dto.Id},请注意查看,并及时跟踪!订单录入明细人为{AbpSession.UserName}");
  372. //await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANLRMSG), "有新订单明细录入", $"新的订单明细录入成功,订单明细流水号为:{dto.Id},请注意查看,并及时跟踪!订单录入明细人为{AbpSession.UserName}", false);
  373. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细创建", $"订单明细创建成功!orderNo:{dto.OrderNo},itemId:{input},userName:{AbpSession.UserName}");
  374. return dto;
  375. }
  376. public override async Task<OrderItemDto> Update(OrderItemUpdateDto input)
  377. {
  378. CheckCreatePermission();
  379. var orderHeader = OrderHeaderRepository.Get(input.OrderNo);
  380. if (orderHeader.IsLock == "Y")
  381. {
  382. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  383. }
  384. var isHasSend = await CommonAppService.CheckOrderHasSend(orderHeader.Id);
  385. var itemEntity= await CheckOrderItem(input.Id);
  386. if (isHasSend)
  387. {
  388. CheckErrors(IwbIdentityResult.Failed("订单已存在发货记录,不可变更信息!详情请联系系统管理员!"));
  389. }
  390. if (input.SendDate==null)
  391. {
  392. input.SendDate= new DateTime(1900,1,1);
  393. }
  394. //var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  395. // i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  396. //if (customerDefaultProduct == null)
  397. //{
  398. // customerDefaultProduct = new CustomerDefaultProduct()
  399. // {
  400. // CustomerId = orderHeader.CustomerId,
  401. // ProductNo = input.ProductNo,
  402. // Sequence = 1,
  403. // TimeLastMod = Clock.Now
  404. // };
  405. //}
  406. //else
  407. //{
  408. // customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  409. // customerDefaultProduct.TimeLastMod = Clock.Now;
  410. //}
  411. //CustomerDefaultProductRepository.InsertOrUpdate(customerDefaultProduct);
  412. //if (!string.IsNullOrEmpty(input.PartNo))
  413. //{
  414. // var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  415. // i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  416. // var exist = CustomerDefaultProductRepository.FirstOrDefault(i => i.CustomerId == orderHeader.CustomerId && i.PartNo == input.PartNo);
  417. // if (customerDefaultProduct == null)
  418. // {
  419. // if (exist != null)
  420. // {
  421. // throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  422. // }
  423. // customerDefaultProduct = new CustomerDefaultProduct()
  424. // {
  425. // CustomerId = orderHeader.CustomerId,
  426. // ProductNo = input.ProductNo,
  427. // PartNo = input.PartNo,
  428. // Sequence = 1,
  429. // TimeLastMod = Clock.Now
  430. // };
  431. // }
  432. // else
  433. // {
  434. // if (exist != null && exist.Id != customerDefaultProduct.Id)
  435. // {
  436. // throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  437. // }
  438. // customerDefaultProduct.PartNo = input.PartNo;
  439. // customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  440. // customerDefaultProduct.TimeLastMod = Clock.Now;
  441. // }
  442. // CustomerDefaultProductRepository.InsertOrUpdate(customerDefaultProduct);
  443. //}
  444. #region 更新客户产品维护信息
  445. var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  446. i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  447. CustomerDefaultProduct exist = !string.IsNullOrEmpty(input.PartNo) ? await CustomerDefaultProductRepository.FirstOrDefaultAsync(i => i.CustomerId == orderHeader.CustomerId && i.PartNo == input.PartNo) : null;
  448. if (customerDefaultProduct == null)
  449. {
  450. if (exist != null)
  451. {
  452. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  453. }
  454. customerDefaultProduct = new CustomerDefaultProduct()
  455. {
  456. CustomerId = orderHeader.CustomerId,
  457. ProductNo = input.ProductNo,
  458. PartNo = input.PartNo,
  459. ProductHsCode = input.ProductHsCode,
  460. Sequence = 1,
  461. TimeLastMod = Clock.Now
  462. };
  463. }
  464. else
  465. {
  466. if (exist != null && exist.Id != customerDefaultProduct.Id)
  467. {
  468. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  469. }
  470. customerDefaultProduct.PartNo = input.PartNo;
  471. customerDefaultProduct.ProductHsCode = input.ProductHsCode;
  472. customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  473. customerDefaultProduct.TimeLastMod = Clock.Now;
  474. }
  475. await CustomerDefaultProductRepository.InsertOrUpdateAsync(customerDefaultProduct);
  476. #endregion
  477. var prePrice = itemEntity.Price;
  478. var preQuantity = itemEntity.Quantity;
  479. var dto= await UpdateEntity(input);
  480. //await CommonAppService.WriteShortMessage(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANXGMSG), "订单明细信息修改", $"订单明细流水号为:{dto.Id},订单信息已变更,请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}");
  481. string sendMsgType = ShwasherSettingNames.DINGDANXGTOD;
  482. string changeInfo = "";
  483. if (preQuantity != input.Quantity)
  484. {
  485. sendMsgType = ShwasherSettingNames.DINGDANSLXGTOD;
  486. changeInfo = $"明细数量由{preQuantity}K -> {input.Quantity}K |";
  487. }
  488. if (prePrice != input.Price)
  489. {
  490. sendMsgType = ShwasherSettingNames.DINGDANJEXGTOD;
  491. changeInfo += $"明细单价由{prePrice} -> { input.Price}K |";
  492. }
  493. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(sendMsgType), "订单明细信息修改", $"订单(${orderHeader.Id})明细流水号为:{dto.Id},订单信息已变更({changeInfo}),请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}",false);//(itemEntity.OrderItemStatusId ??=0) != (OrderItemStatusEnum.NewCreate.ToInt())
  494. return dto;
  495. }
  496. public override async Task Delete(EntityDto<int> input)
  497. {
  498. CheckDeletePermission();
  499. var entity = await CheckOrderItem(input.Id);
  500. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == entity.OrderNo);
  501. if (orderHeader.IsLock == "Y")
  502. {
  503. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  504. }
  505. var isHasSend = await CommonAppService.CheckOrderHasSend(entity.OrderNo);
  506. if (isHasSend)
  507. {
  508. CheckErrors(IwbIdentityResult.Failed("订单已存在发货记录,不可删除!详情请联系系统管理员!"));
  509. }
  510. await CommonAppService.UnLockOrderStore(entity);//如果存在锁定仓库的库存,提前解除冻结
  511. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细删除", $"订单明细审核通过!orderNo:{entity.OrderNo},itemId:{input}");
  512. await Repository.DeleteAsync(input.Id);
  513. }
  514. #region 订单明细状态信息变更
  515. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgAuditItem), AuditLog("审核订单明细")]
  516. public async Task<OrderItem> Audit(EntityDto<int> input)
  517. {
  518. var orderItem = Repository.Get(input.Id);
  519. var orderHeader =await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  520. if (orderHeader.IsLock == "Y")
  521. {
  522. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  523. }
  524. orderItem.OrderItemStatusId = OrderItemStatusEnum.Audited.ToInt();
  525. orderItem.TimeLastMod = Clock.Now;
  526. orderItem.UserIDLastMod = AbpSession.UserName;
  527. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细审核", $"订单明细审核通过!{orderItem.Id}");
  528. return await Repository.UpdateAsync(orderItem);
  529. }
  530. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgAuditItem), AuditLog("审核所有订单明细")]
  531. public async Task<List<OrderItem>> AuditAllItems(EntityDto<string> input)
  532. {
  533. string[] arrIds = input.Id.Split(',');
  534. if (arrIds.Length > 0)
  535. {
  536. var orderFirstItem = Repository.Get(Convert.ToInt32(arrIds[0]));
  537. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderFirstItem.OrderNo);
  538. if (orderHeader.IsLock == "Y")
  539. {
  540. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  541. }
  542. }
  543. List<OrderItem> alList = new List<OrderItem>();
  544. foreach (var arrId in arrIds)
  545. {
  546. var orderItem = Repository.Get(Convert.ToInt32(arrId));
  547. alList.Add(orderItem);
  548. orderItem.OrderItemStatusId = OrderItemStatusEnum.Audited.ToInt();
  549. orderItem.TimeLastMod = Clock.Now;
  550. orderItem.UserIDLastMod = AbpSession.UserName;
  551. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细审核", $"订单明细审核通过!{orderItem.Id}");
  552. await Repository.UpdateAsync(orderItem);
  553. }
  554. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细审核", $"订单明细审核通过!{alList.ToJsonString()}");
  555. return alList;
  556. }
  557. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgEndItem), AuditLog("结束订单明细")]
  558. public async Task<OrderItemEndCall> End(EntityDto<int> input)
  559. {
  560. var orderItem = Repository.Get(input.Id);
  561. orderItem.OrderItemStatusId = OrderItemStatusEnum.End.ToInt();
  562. orderItem.TimeLastMod = Clock.Now;
  563. orderItem.UserIDLastMod = AbpSession.UserName;
  564. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细结束", $"订单明细结束!{orderItem.ToJsonString()}");
  565. //int endstatus = OrderItemStatusEnum.End.ToInt();
  566. string lcOrderNo = orderItem.OrderNo;
  567. //var notEndItems = Repository.GetAllList(i =>
  568. //i.OrderNo == lcOrderNo && (i.OrderItemStatusId != endstatus||i.OrderItemStatusId ==null)&&i.Id != input.Id);
  569. OrderItemEndCall result = new OrderItemEndCall();
  570. var isHasExOrderItem = IsExOrderItem(lcOrderNo, input.Id);//是否有其它订单明细
  571. if (!isHasExOrderItem)
  572. {
  573. var order = OrderHeaderRepository.Get(lcOrderNo);
  574. order.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  575. await OrderHeaderRepository.UpdateAsync(order);
  576. result.IsAllEnd = true;
  577. }
  578. else
  579. {
  580. if (IsExNotEndItem(lcOrderNo, input.Id)) //判断其它订单明细状态是否都是完成
  581. {
  582. var order = OrderHeaderRepository.Get(lcOrderNo);
  583. order.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  584. await OrderHeaderRepository.UpdateAsync(order);
  585. result.IsAllEnd = true;
  586. }
  587. }
  588. result.OrderItem = await Repository.UpdateAsync(orderItem);
  589. return result;
  590. }
  591. /// <summary>
  592. /// 判断当前订单中是否有其它订单(true:有其它订单)
  593. /// </summary>
  594. /// <param name="pcOrderNo">订单号</param>
  595. /// <param name="piExOrderItemId">排除订单明细Id(如果值不为0,则排除传入订单明细Id,只判断当前订单中其它明细状态是否完成)</param>
  596. /// <param name="poExOrderItems">排除订单明细Id(如果值不为Null,则排除传入订单明细集合,只判断当前订单中其它明细状态是否完成)</param>
  597. /// <returns>true:有其它订单</returns>
  598. private bool IsExOrderItem(string pcOrderNo, int piExOrderItemId = 0, List<OrderItem> poExOrderItems = null)
  599. {
  600. bool lbRetval = false;
  601. var notItems = Repository.GetAllList(i =>
  602. i.OrderNo == pcOrderNo);
  603. if (piExOrderItemId != 0)
  604. {
  605. notItems = notItems.Where(i => i.Id != piExOrderItemId).ToList();
  606. }
  607. if (poExOrderItems != null && poExOrderItems.Any())
  608. {
  609. List<int> lcExOrderItemsId = poExOrderItems.Select(i => i.Id).ToList();
  610. notItems = notItems.Where(i => !lcExOrderItemsId.Contains(i.Id)).ToList();
  611. }
  612. if (notItems.Any())
  613. {
  614. lbRetval = true;
  615. }
  616. return lbRetval;
  617. }
  618. /// <summary>
  619. /// 判断当前订单中订单明细是否为都结束状态(true:其它订单明细都结束了)
  620. /// </summary>
  621. /// <param name="pcOrderNo">订单号</param>
  622. /// <param name="piExOrderItemId">排除订单明细Id(如果值不为0,则排除传入订单明细Id,只判断当前订单中其它明细状态是否完成)</param>
  623. /// <param name="poExOrderItems">排除订单明细Id(如果值不为Null,则排除传入订单明细集合,只判断当前订单中其它明细状态是否完成)</param>
  624. /// <returns>true:订单明细都结束了</returns>
  625. private bool IsExNotEndItem(string pcOrderNo, int piExOrderItemId = 0, List<OrderItem> poExOrderItems = null)
  626. {
  627. bool lbRetval = false;
  628. int endstatus = OrderItemStatusEnum.End.ToInt();
  629. int completeStatus = OrderItemStatusEnum.NegotiationComplete.ToInt();
  630. //过滤掉结束和协商完成的
  631. var notEndItems = Repository.GetAllList(i =>
  632. i.OrderNo == pcOrderNo && i.OrderItemStatusId != endstatus&&i.OrderItemStatusId!= completeStatus);
  633. if (piExOrderItemId != 0)
  634. {
  635. notEndItems = notEndItems.Where(i => i.Id != piExOrderItemId).ToList();
  636. }
  637. if (poExOrderItems != null && poExOrderItems.Any())
  638. {
  639. List<int> lcExOrderItemsId = poExOrderItems.Select(i => i.Id).ToList();
  640. notEndItems = notEndItems.Where(i => !lcExOrderItemsId.Contains(i.Id)).ToList();
  641. }
  642. if (!notEndItems.Any())
  643. {
  644. lbRetval = true;
  645. }
  646. return lbRetval;
  647. }
  648. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgChangeStatus), AuditLog("变更订单明细状态")]
  649. public async Task<List<OrderItem>> ChangeOrderItemStatus(ChangeOrderItemStatusDto input)
  650. {
  651. string ids = input.Id;
  652. if (string.IsNullOrEmpty(ids))
  653. {
  654. CheckErrors(IwbIdentityResult.Failed("未查询到修改的订单明细!"));
  655. return null;
  656. }
  657. var arr = ids.Split(',');
  658. StringBuilder sb = new StringBuilder();
  659. List<OrderItem> items = new List<OrderItem>();
  660. foreach (var id in arr)
  661. {
  662. var item = Repository.Get(Convert.ToInt32(id));
  663. sb.Append($"[ItemId:{item.Id},Status:{item.OrderItemStatusId}]");
  664. item.OrderItemStatusId = input.OrderItemStatusId;
  665. item.TimeLastMod = Clock.Now;
  666. item.UserIDLastMod = AbpSession.UserName;
  667. items.Add(item);
  668. await Repository.UpdateAsync(item);
  669. }
  670. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态修改", $"订单明细状态修改操作,订单明细:{sb.ToString()},变更状态为:{input.OrderItemStatusId}");
  671. return items;
  672. }
  673. /// <summary>
  674. /// 变更同一个订单的订单明细状态
  675. /// </summary>
  676. /// <param name="input"></param>
  677. /// <returns></returns>
  678. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgChangeStatus), AuditLog("变更订单明细状态")]
  679. public async Task<OrderItemsCallAndEnd> ChangeOrderItemStatusOnHeader(ChangeOrderItemStatusDto input)
  680. {
  681. string ids = input.Id;
  682. if (string.IsNullOrEmpty(ids))
  683. {
  684. CheckErrors(IwbIdentityResult.Failed("未查询到修改的订单明细!"));
  685. return null;
  686. }
  687. var arr = ids.Split(',');
  688. StringBuilder sb = new StringBuilder();
  689. List<OrderItem> items = new List<OrderItem>();
  690. foreach (var id in arr)
  691. {
  692. var item = Repository.Get(Convert.ToInt32(id));
  693. sb.Append($"[ItemId:{item.Id},Status:{item.OrderItemStatusId}]");
  694. item.OrderItemStatusId = input.OrderItemStatusId;
  695. item.TimeLastMod = Clock.Now;
  696. item.UserIDLastMod = AbpSession.UserName;
  697. items.Add(item);
  698. await Repository.UpdateAsync(item);
  699. }
  700. OrderItemsCallAndEnd loResult = new OrderItemsCallAndEnd();
  701. if (items.Any() && input.OrderItemStatusId == OrderItemStatusEnum.End.ToInt())
  702. {
  703. string lcOrderNo = items[0].OrderNo;
  704. var isHasExItems = IsExOrderItem(lcOrderNo, poExOrderItems: items);//是否有其它订单明细
  705. if (isHasExItems && IsExNotEndItem(items[0].OrderNo, poExOrderItems: items))//其它订单明细是否都结束了
  706. {
  707. var orderHeader = OrderHeaderRepository.Get(items[0].OrderNo);
  708. orderHeader.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  709. loResult.IsAllEnd = true;
  710. await OrderHeaderRepository.UpdateAsync(orderHeader);
  711. }
  712. else if (!isHasExItems)
  713. {
  714. var orderHeader = OrderHeaderRepository.Get(items[0].OrderNo);
  715. orderHeader.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  716. loResult.IsAllEnd = true;
  717. await OrderHeaderRepository.UpdateAsync(orderHeader);
  718. }
  719. }
  720. loResult.OrderItems = items;
  721. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态修改", $"订单明细状态修改操作,订单明细:{sb.ToString()},变更状态为:{input.OrderItemStatusId}");
  722. return loResult;
  723. }
  724. /// <summary>
  725. /// 变更同一个订单的订单明细是否库存配货完成状态
  726. /// </summary>
  727. /// <param name="input"></param>
  728. /// <returns></returns>
  729. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgChangeStatus), AuditLog("变更订单明细状态")]
  730. public async Task<OrderItemsCallAndEnd> ChangeOrderItemCompleteStoreStatus(ChangeOrderItemStoreCompleteStatusDto input)
  731. {
  732. string ids = input.Id;
  733. if (string.IsNullOrEmpty(ids))
  734. {
  735. CheckErrors(IwbIdentityResult.Failed("未查询到修改的订单明细!"));
  736. return null;
  737. }
  738. var arr = ids.Split(',');
  739. StringBuilder sb = new StringBuilder();
  740. List<OrderItem> items = new List<OrderItem>();
  741. foreach (var id in arr)
  742. {
  743. var item = Repository.Get(Convert.ToInt32(id));
  744. sb.Append($"[ItemId:{item.Id},Status:{item.OrderItemStatusId},StoreComplete:{input.OrderItemStoreCompleteState}]");
  745. item.StoreCompleteState = input.OrderItemStoreCompleteState;
  746. item.TimeLastMod = Clock.Now;
  747. item.UserIDLastMod = AbpSession.UserName;
  748. items.Add(item);
  749. await Repository.UpdateAsync(item);
  750. }
  751. OrderItemsCallAndEnd loResult = new OrderItemsCallAndEnd();
  752. loResult.OrderItems = items;
  753. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态修改", $"订单明细状态修改操作,订单明细:{sb.ToString()},货物到齐变更状态为:{input.OrderItemStoreCompleteState}");
  754. return loResult;
  755. }
  756. #endregion
  757. #region 订单明细信息变更
  758. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem),AuditLog("修改订单明细价格")]
  759. public async Task<OrderItem> ChangePrice(ChangeOrderItemInfoDto input)
  760. {
  761. if (!decimal.TryParse((await SettingManager.GetSettingValueAsync(ShwasherSettingNames.OrderItemPriceTaxRate)),
  762. out var rate))
  763. {
  764. CheckErrors(IwbIdentityResult.Failed("未查询到税率!"));
  765. }
  766. var orderItem = await CheckOrderItem(input.OrderItemNo);
  767. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  768. if (orderHeader.IsLock == "Y")
  769. {
  770. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  771. }
  772. decimal oldPrice = orderItem.Price;
  773. orderItem.Price = input.NewPrice;
  774. orderItem.AfterTaxPrice = Math.Round(input.NewPrice / (1 + rate / 100), 3);
  775. orderItem.TimeLastMod = Clock.Now;
  776. orderItem.UserIDLastMod = AbpSession.UserName;
  777. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改", $"修改订单明细价格,原价:{oldPrice}!{orderItem.ToJsonString()}");
  778. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANJEXGTOD), "订单明细价格变更", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单税前价格由 {oldPrice} 变更为 {input.NewPrice} ,请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  779. return await Repository.UpdateAsync(orderItem);
  780. //throw new System.NotImplementedException();
  781. }
  782. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细税后价格")]
  783. public async Task<OrderItem> ChangeAfterTaxPrice(ChangeOrderItemInfoDto input)
  784. {
  785. if (!decimal.TryParse((await SettingManager.GetSettingValueAsync(ShwasherSettingNames.OrderItemPriceTaxRate)),
  786. out var rate))
  787. {
  788. CheckErrors(IwbIdentityResult.Failed("未查询到税率!"));
  789. }
  790. var orderItem = await CheckOrderItem(input.OrderItemNo);
  791. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  792. if (orderHeader.IsLock == "Y")
  793. {
  794. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  795. }
  796. decimal oldPrice = orderItem.AfterTaxPrice;
  797. orderItem.AfterTaxPrice = input.NewAfterTaxPrice;
  798. orderItem.Price = Math.Round(input.NewAfterTaxPrice * (1 + rate / 100), 3);
  799. orderItem.TimeLastMod = Clock.Now;
  800. orderItem.UserIDLastMod = AbpSession.UserName;
  801. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改", $"修改订单明细税后价格,原价:{oldPrice}!{orderItem.ToJsonString()}");
  802. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANJEXGTOD), "订单明细价格变更", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单税后价格由 {oldPrice} 变更为 {input.NewAfterTaxPrice} ,请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  803. return await Repository.UpdateAsync(orderItem);
  804. //throw new System.NotImplementedException();
  805. }
  806. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细数量")]
  807. public async Task<OrderItem> ChangeQuantity(ChangeOrderItemInfoDto input)
  808. {
  809. var orderItem = await CheckOrderItem(input.OrderItemNo);
  810. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  811. if (orderHeader.IsLock == "Y")
  812. {
  813. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  814. }
  815. var oldQuantity = orderItem.Quantity;
  816. orderItem.Quantity = input.NewQuantity;
  817. orderItem.TimeLastMod = Clock.Now;
  818. orderItem.UserIDLastMod = AbpSession.UserName;
  819. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改(数量变更)", $"修改订单明细数量,原数量:{oldQuantity}!{orderItem.ToJsonString()}");
  820. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANSLXGTOD), "订单明细修改", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单明细数量由 {oldQuantity} 变更为 {input.NewQuantity},请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  821. return await Repository.UpdateAsync(orderItem);
  822. }
  823. //[AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细发货日期")]
  824. //public async Task<OrderItem> ChangeSendDate(ChangeOrderItemInfoDto input)
  825. //{
  826. // var orderItem = await CheckOrderItem(input.OrderItemNo);
  827. // var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  828. // if (orderHeader.IsLock == "Y")
  829. // {
  830. // CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  831. // }
  832. // var oldSendDate = orderItem.SendDate;
  833. // orderItem.SendDate = input.NewSendDate;
  834. // orderItem.TimeLastMod = Clock.Now;
  835. // orderItem.UserIDLastMod = AbpSession.UserName;
  836. // BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改(发货日期变更)", $"修改订单明细发货日期,原日期:{oldSendDate:yyyy-MM-dd}!{orderItem.ToJsonString()}");
  837. // await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANXGTOD), "订单明细修改", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单发货日期由 {oldSendDate:yyyy-MM-dd} 变更为 {input.NewSendDate:yyyy-MM-dd},请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  838. // return await Repository.UpdateAsync(orderItem);
  839. //}
  840. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细发货日期")]
  841. public async Task<OrderItem> ChangeSendDate(ChangeOrderItemSendDateInfoDto input)
  842. {
  843. var orderItem = await CheckOrderItem(input.OrderItemNo);
  844. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  845. if (orderHeader.IsLock == "Y")
  846. {
  847. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  848. }
  849. var oldSendDate = orderItem.SendDate;
  850. orderItem.SendDate = input.NewSendDate;
  851. orderItem.TimeLastMod = Clock.Now;
  852. orderItem.UserIDLastMod = AbpSession.UserName;
  853. //增加分批次发货日期提醒
  854. var inputSendDateWarns = input.SendDateWarns;
  855. if (inputSendDateWarns != null && inputSendDateWarns.Any())
  856. {
  857. //ScheduleOrderSendRepository.de
  858. await ExecSendWarn(inputSendDateWarns, input.OrderItemNo);
  859. }
  860. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改(发货日期变更)", $"修改订单明细发货日期,原日期:{oldSendDate:yyyy-MM-dd}!{orderItem.ToJsonString()}");
  861. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANXGTOD), "订单明细修改", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单发货日期由 {oldSendDate:yyyy-MM-dd} 变更为 {input.NewSendDate:yyyy-MM-dd},请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  862. return await Repository.UpdateAsync(orderItem);
  863. }
  864. private async Task ExecSendWarn(List<SendDateWarnDto> input,int orderItemId)
  865. {
  866. foreach (var sendDateWarnDto in input)
  867. {
  868. if (sendDateWarnDto.Id <= 0)
  869. {
  870. await ScheduleOrderSendRepository.InsertAsync(new ScheduleOrderSend()
  871. {
  872. OrderItemId = orderItemId,
  873. PlanDate = sendDateWarnDto.PlanDate,
  874. PlanQuantity = sendDateWarnDto.PlanQuantity,
  875. Remark = sendDateWarnDto.Remark,
  876. SendState = 0
  877. });
  878. }
  879. }
  880. }
  881. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("删除分批次发货提醒")]
  882. public async Task DeleteSendDateWarns(int sendDateWarnId)
  883. {
  884. var item = await ScheduleOrderSendRepository.GetAsync(sendDateWarnId);
  885. if (item.SendState == 1)
  886. {
  887. CheckErrors(IwbIdentityResult.Failed("本次提醒已发货,不能删除!"));
  888. }
  889. await ScheduleOrderSendRepository.DeleteAsync(sendDateWarnId);
  890. }
  891. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("分批次发货提醒修改订单明细发货日期")]
  892. public async Task<List<SendDateWarnDto>> GetSendDateWarns(int orderItemId)
  893. {
  894. var items =await ScheduleOrderSendRepository.GetAllListAsync(i=>i.OrderItemId==orderItemId);
  895. return ObjectMapper.Map<List<SendDateWarnDto>>(items);
  896. }
  897. private async Task<OrderItem> CheckOrderItem(int orderItemNo)
  898. {
  899. var orderItem = await Repository.FirstOrDefaultAsync(a => a.Id == orderItemNo);
  900. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  901. if (orderHeader.IsLock == "Y")
  902. {
  903. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  904. }
  905. if (orderItem == null)
  906. {
  907. CheckErrors(IwbIdentityResult.Failed( "未查询到订单明细。"));
  908. return null;
  909. }
  910. if (orderItem.OrderItemStatusId==OrderItemStatusEnum.Send.ToInt() )
  911. {
  912. CheckErrors(IwbIdentityResult.Failed( "已发货,不能操作。"));
  913. return null;
  914. }
  915. if (orderItem.OrderItemStatusId==OrderItemStatusEnum.End.ToInt() ||orderItem.OrderItemStatusId==OrderItemStatusEnum.NegotiationComplete.ToInt() ||orderItem.OrderItemStatusId==OrderItemStatusEnum.Delete.ToInt() )
  916. {
  917. CheckErrors(IwbIdentityResult.Failed( "已结束,不能操作。"));
  918. return null;
  919. }
  920. return orderItem;
  921. }
  922. #endregion
  923. #region 订单发货
  924. public async Task<List<ViewOrderSend>> QuerySendItem(int id)
  925. {
  926. var sendItems = await ViewOrderSendRepository.GetAllListAsync(i=>i.OrderItemId == id);
  927. return sendItems;
  928. }
  929. /**
  930. * 单条锁定的库存记录发货
  931. */
  932. public async Task<OrderItem> SendBookStoreItem(int orderItemId,int id)
  933. {
  934. var orderItem = Repository.Get(orderItemId);
  935. var bookstore = await OrderBookStoreRepository.GetAsync(id);
  936. var allSendQuantity = GetItemSend(orderItemId);
  937. await InsertOrderSendExceed(allSendQuantity + bookstore.Quantity??0, orderItem);//如果超过订单数量,需要在超额部分中添加记录
  938. //如果超过订单数量直接变更订单状态
  939. if ((allSendQuantity + bookstore.Quantity ?? 0) >= orderItem.Quantity)
  940. {
  941. orderItem.OrderItemStatusId = OrderItemStatusEnum.Send.ToInt();
  942. orderItem.TimeLastMod = DateTime.Now;
  943. orderItem.UserIDLastMod = AbpSession.UserName;
  944. await Repository.UpdateAsync(orderItem);//更新订单明细状态
  945. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态变更", $"订单明细发货完成,发货数量{(allSendQuantity + bookstore.Quantity ?? 0)}!订单明细:{orderItem.ToJsonString()}");
  946. }
  947. if (await CommonAppService.CheckProductCanSendToCustomer(bookstore.ProductBatchNum, bookstore.CustomerId))
  948. {
  949. CheckErrors(IwbIdentityResult.Failed($"批次({bookstore.ProductBatchNum})不能发货给客户({bookstore.CustomerId}),请检查后再试..."));
  950. }
  951. OrderSend orderSend = new OrderSend()
  952. {
  953. OrderItemId = orderItemId,
  954. OrderUnitId = orderItem.OrderUnitId,
  955. SendDate = Clock.Now,
  956. SendQuantity = bookstore.Quantity ?? 0,
  957. UserIDLastMod = AbpSession.UserName,
  958. TimeLastMod = Clock.Now,
  959. TimeCreated = Clock.Now,
  960. QuantityPerPack = bookstore.QuantityPerPack,
  961. PackageCount = bookstore.PackageCount,
  962. ProductBatchNum = bookstore.ProductBatchNum,
  963. StoreLocationNo = bookstore.StoreLocationNo,
  964. CurrentProductStoreHouseNo = bookstore.CurrentProductStoreHouseNo,
  965. CreatorUserId = AbpSession.UserName,
  966. };
  967. if (orderItem.ProductNo != bookstore.ProductNo)
  968. {
  969. orderSend.Remark = $"替换发货,用编号:{bookstore.ProductNo}替换{orderItem.ProductNo}";
  970. }
  971. await CalcLogisticsFeeAndMoldFee(orderSend, orderItem);//计算是否需要添加模具费和运费
  972. var sendId = OrderSendRepository.InsertAndGetId(orderSend); //添加发货记录
  973. //库存变更逻辑,添加仓库出库申请
  974. ProductOutStore loProductOutStore = new ProductOutStore
  975. {
  976. ApplyOutDate = Clock.Now,
  977. ApplyStatus = OutStoreApplyStatusEnum.Applying.ToInt(),
  978. StoreHouseId = 1,
  979. IsClose = false,
  980. CreatorUserId = AbpSession.UserName,
  981. CurrentProductStoreHouseNo = bookstore.CurrentProductStoreHouseNo,
  982. IsConfirm = false,
  983. Quantity = bookstore.Quantity ?? 0,
  984. ProductionOrderNo = bookstore.ProductBatchNum ?? "",
  985. ProductNo = bookstore.ProductNo,
  986. TimeLastMod = Clock.Now,
  987. TimeCreated = Clock.Now,
  988. UserIDLastMod = AbpSession.UserName,
  989. OrderSendId = sendId,
  990. ApplyOutStoreSourceType = OutStoreApplyTypeEnum.SendGood.ToInt()
  991. };
  992. await ProductOutStoreRepository.InsertAsync(loProductOutStore);
  993. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "预先冻结库存发货", $"订单明细发货操作,发货数量{bookstore.Quantity}!订单明细:{orderItem.ToJsonString()},出库库存记录:{loProductOutStore.ToJsonString()}");
  994. //todo 发货之后锁定库存需要状态变更为已解锁
  995. bookstore.Status = OrderBookStoreStatusEnum.UnLock.ToInt();
  996. await OrderBookStoreRepository.UpdateAsync(bookstore);
  997. return orderItem;
  998. }
  999. /**
  1000. * 发货前先将提前锁定的库存发货
  1001. */
  1002. //public async Task<OrderItem> SendBookStore(int orderItemId)
  1003. //{
  1004. // var orderItem = Repository.Get(orderItemId);
  1005. // int lockStatus = OrderBookStoreStatusEnum.Locking.ToInt();
  1006. // var orderBookStores = await OrderBookStoreRepository.GetAllListAsync(i=>i.OrderItemId==orderItemId && i.Status== lockStatus);//查询当前订单明细中是否存在未发货解锁的库存记录
  1007. // var allSend = orderBookStores.Select(i=>i.Quantity).Sum();
  1008. // await InsertOrderSendExceed(allSend??0, orderItem);//如果超过订单数量,需要在超额部分中添加记录
  1009. // //如果超过订单数量直接变更订单状态
  1010. // if (allSend >= orderItem.Quantity)
  1011. // {
  1012. // orderItem.OrderItemStatusId = OrderItemStatusEnum.Send.ToInt();
  1013. // orderItem.TimeLastMod = DateTime.Now;
  1014. // orderItem.UserIDLastMod = AbpSession.UserName;
  1015. // await Repository.UpdateAsync(orderItem);//更新订单明细状态
  1016. // BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态变更", $"订单明细发货完成,发货数量{allSend}!订单明细:{orderItem.ToJsonString()}");
  1017. // }
  1018. // foreach (OrderBookStore bookStore in orderBookStores)
  1019. // {
  1020. // if (await CommonAppService.CheckProductCanSendToCustomer(bookStore.ProductBatchNum, bookStore.CustomerId))
  1021. // {
  1022. // CheckErrors(IwbIdentityResult.Failed($"批次({bookStore.ProductBatchNum})不能发货给客户({bookStore.CustomerId}),请检查后再试..."));
  1023. // }
  1024. // //var currentStore =await CurrentProductStoreHouseRepository.FirstOrDefaultAsync(i =>
  1025. // // i.CurrentProductStoreHouseNo == bookStore.CurrentProductStoreHouseNo);
  1026. // OrderSend orderSend = new OrderSend()
  1027. // {
  1028. // OrderItemId = orderItemId,
  1029. // OrderUnitId = orderItem.OrderUnitId,
  1030. // SendDate = Clock.Now,
  1031. // SendQuantity = bookStore.Quantity??0,
  1032. // UserIDLastMod = AbpSession.UserName,
  1033. // TimeLastMod = Clock.Now,
  1034. // TimeCreated = Clock.Now,
  1035. // QuantityPerPack = bookStore.QuantityPerPack,
  1036. // PackageCount = bookStore.PackageCount,
  1037. // ProductBatchNum = bookStore.ProductBatchNum,
  1038. // StoreLocationNo = bookStore.StoreLocationNo,
  1039. // CurrentProductStoreHouseNo = bookStore.CurrentProductStoreHouseNo,
  1040. // CreatorUserId = AbpSession.UserName,
  1041. // };
  1042. // if (orderItem.ProductNo != bookStore.ProductNo)
  1043. // {
  1044. // orderSend.Remark = $"替换发货,用编号:{bookStore.ProductNo}替换{orderItem.ProductNo}";
  1045. // }
  1046. // await CalcLogisticsFeeAndMoldFee(orderSend, orderItem);//计算是否需要添加模具费和运费
  1047. // var sendId = OrderSendRepository.InsertAndGetId(orderSend); //添加发货记录
  1048. // //库存变更逻辑,添加仓库出库申请
  1049. // ProductOutStore loProductOutStore = new ProductOutStore
  1050. // {
  1051. // ApplyOutDate = Clock.Now,
  1052. // ApplyStatus = OutStoreApplyStatusEnum.Applying.ToInt(),
  1053. // StoreHouseId = 1,
  1054. // IsClose = false,
  1055. // CreatorUserId = AbpSession.UserName,
  1056. // CurrentProductStoreHouseNo = bookStore.CurrentProductStoreHouseNo,
  1057. // IsConfirm = false,
  1058. // Quantity = bookStore.Quantity??0,
  1059. // ProductionOrderNo = bookStore.ProductBatchNum ?? "",
  1060. // ProductNo = bookStore.ProductNo,
  1061. // TimeLastMod = Clock.Now,
  1062. // TimeCreated = Clock.Now,
  1063. // UserIDLastMod = AbpSession.UserName,
  1064. // OrderSendId = sendId,
  1065. // ApplyOutStoreSourceType = OutStoreApplyTypeEnum.SendGood.ToInt()
  1066. // };
  1067. // await ProductOutStoreRepository.InsertAsync(loProductOutStore);
  1068. // BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "预先冻结库存发货", $"订单明细发货操作,发货数量{bookStore.Quantity}!订单明细:{orderItem.ToJsonString()},出库库存记录:{loProductOutStore.ToJsonString()}");
  1069. // //todo 发货之后锁定库存需要状态变更为已解锁
  1070. // bookStore.Status = OrderBookStoreStatusEnum.UnLock.ToInt();
  1071. // await OrderBookStoreRepository.UpdateAsync(bookStore);
  1072. // }
  1073. // //await OrderBookStoreRepository.DeleteAsync(i => i.OrderItemId == orderItemId);//发货成功后软删除掉锁定的记录
  1074. // return orderItem;
  1075. //}
  1076. /**
  1077. * 计算发货记录中的模具费和运费
  1078. */
  1079. private async Task CalcLogisticsFeeAndMoldFee(OrderSend send,OrderItem orderItem)
  1080. {
  1081. #region 磨具费和运费
  1082. var os = await OrderSendRepository.FirstOrDefaultAsync(i => i.OrderItemId == send.OrderItemId);
  1083. //磨具费和运费算在第一条发货记录中,后续的发货记录都为0
  1084. if (os == null)
  1085. {
  1086. send.LogisticsFee = orderItem.LogisticsFee;
  1087. send.MoldFee = orderItem.MoldFee;
  1088. send.MoldFeeAfterTax = orderItem.MoldFeeAfterTax;
  1089. send.LogisticsFeeAfterTax = orderItem.LogisticsFeeAfterTax;
  1090. }
  1091. #endregion
  1092. }
  1093. private async Task InsertOrderSendExceed(decimal readySendAll,OrderItem orderItem)
  1094. {
  1095. if (readySendAll > orderItem.Quantity)
  1096. {
  1097. var exceedRate = ((readySendAll - orderItem.Quantity) / orderItem.Quantity) * 100;
  1098. if (exceedRate > 5)
  1099. {
  1100. throw new UserFriendlyException("发货数量不能超过 订单明细总数量的5%!");
  1101. }
  1102. //throw new UserFriendlyException("发货数量不能超过 待发货总数量!");
  1103. await OrderSendExceedRepository.InsertAsync(new OrderSendExceed()
  1104. {
  1105. OrderItemId = orderItem.Id,
  1106. ExceedQuantity = (readySendAll - orderItem.Quantity),
  1107. OperatorMan = AbpSession.UserName,
  1108. ProductNo = orderItem.ProductNo,
  1109. OrderNo = orderItem.OrderNo
  1110. });//记录超额发货部分
  1111. }
  1112. }
  1113. /// <summary>
  1114. /// 订单明细发货
  1115. /// </summary>
  1116. /// <param name="input"></param>
  1117. /// <returns></returns>
  1118. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgSendItem), AuditLog("订单明细发货")]
  1119. public async Task<OrderItem> SendOrderAction(SendOrderInfoDto input)
  1120. {
  1121. //OrderSendRepository
  1122. var allSendQuantity = GetItemSend(input.Id);
  1123. var orderItem = Repository.Get(input.Id);
  1124. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  1125. if (orderHeader.IsLock == "Y")
  1126. {
  1127. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  1128. }
  1129. var readySendAll = allSendQuantity + input.SendAllQuantity;
  1130. // if (readySendAll > orderItem.Quantity)
  1131. // {
  1132. // var exceedRate = ((readySendAll - orderItem.Quantity) / orderItem.Quantity) * 100;
  1133. // if (exceedRate > 5)
  1134. // {
  1135. // throw new UserFriendlyException("发货数量不能超过 订单明细总数量的5%!");
  1136. // }
  1137. // //throw new UserFriendlyException("发货数量不能超过 待发货总数量!");
  1138. // OrderSendExceedRepository.Insert(new OrderSendExceed()
  1139. // {
  1140. // OrderItemId = input.Id, ExceedQuantity = (readySendAll - orderItem.Quantity),
  1141. // OperatorMan = AbpSession.UserName,
  1142. // ProductNo = input.ProductNo,
  1143. // OrderNo = orderItem.OrderNo
  1144. // });//记录超额发货部分
  1145. // }
  1146. await InsertOrderSendExceed(readySendAll, orderItem);
  1147. if ((allSendQuantity + input.SendAllQuantity) >= orderItem.Quantity)
  1148. {
  1149. orderItem.OrderItemStatusId = OrderItemStatusEnum.Send.ToInt();
  1150. }
  1151. foreach (var orderSendItemDto in input.SendItems)
  1152. {
  1153. if (await CommonAppService.CheckProductCanSendToCustomer(orderSendItemDto.ProductBatchNum,input.CustomerNo))
  1154. {
  1155. CheckErrors(IwbIdentityResult.Failed($"批次({orderSendItemDto.ProductBatchNum})不能发货给客户({input.CustomerNo}),请检查后再试..."));
  1156. }
  1157. var sendQuantiy = orderSendItemDto.SendQuantity;
  1158. var avgQuantity = orderSendItemDto.AvgQuantity==0? sendQuantiy: orderSendItemDto.AvgQuantity;
  1159. decimal packDecimal = 0;
  1160. if (sendQuantiy <= avgQuantity)
  1161. {
  1162. packDecimal = 1;
  1163. avgQuantity = sendQuantiy;
  1164. }
  1165. else
  1166. {
  1167. packDecimal = sendQuantiy / avgQuantity;
  1168. }
  1169. var currentProductStore = CurrentProductStoreHouseRepository.FirstOrDefault(i =>
  1170. i.CurrentProductStoreHouseNo == orderSendItemDto.CurrentProductStoreHouseNo);
  1171. //CurrentProductStoreHouse loOldCurrentProductStoreHouse = currentProductStore;//原库存记录
  1172. decimal isCanSendQuantity = currentProductStore.Quantity - currentProductStore.FreezeQuantity;
  1173. if (sendQuantiy > isCanSendQuantity)
  1174. {
  1175. CheckErrors(IwbIdentityResult.Failed("发货批次("+ currentProductStore.ProductionOrderNo+")库存数量不足,最多可发:"+ isCanSendQuantity+"千件"));
  1176. }
  1177. currentProductStore.FreezeQuantity += orderSendItemDto.SendQuantity;
  1178. currentProductStore.TimeLastMod = Clock.Now;
  1179. currentProductStore.UserIDLastMod = AbpSession.UserName;
  1180. //currentProductStores.Add(currentProductStore);
  1181. await CurrentProductStoreHouseRepository.UpdateAsync(currentProductStore);//更新库存的冻结数量
  1182. // #region 磨具费和运费
  1183. // var os = await OrderSendRepository.FirstOrDefaultAsync(i => i.OrderItemId == input.Id);
  1184. // decimal logisticsFee = 0, moldFee = 0, logisticsFeeAfterTax = 0, moldFeeAfterTax = 0;
  1185. // //磨具费和运费算在第一条发货记录中,后续的发货记录都为0
  1186. // if (os == null)
  1187. // {
  1188. // logisticsFee = orderItem.LogisticsFee;
  1189. // moldFee = orderItem.MoldFee;
  1190. // moldFeeAfterTax = orderItem.MoldFeeAfterTax;
  1191. // logisticsFeeAfterTax = orderItem.LogisticsFeeAfterTax;
  1192. // }
  1193. // #endregion
  1194. OrderSend orderSend = new OrderSend()
  1195. {
  1196. OrderItemId = input.Id,
  1197. OrderUnitId = orderItem.OrderUnitId,
  1198. SendDate = Clock.Now,
  1199. SendQuantity = orderSendItemDto.SendQuantity,
  1200. UserIDLastMod = AbpSession.UserName,
  1201. TimeLastMod = Clock.Now,
  1202. TimeCreated = Clock.Now,
  1203. QuantityPerPack = avgQuantity,
  1204. PackageCount = packDecimal,
  1205. ProductBatchNum = orderSendItemDto.ProductBatchNum,
  1206. StoreLocationNo = orderSendItemDto.StoreLocationNo,
  1207. CurrentProductStoreHouseNo = orderSendItemDto.CurrentProductStoreHouseNo,
  1208. CreatorUserId = AbpSession.UserName,
  1209. // LogisticsFee = logisticsFee,
  1210. // LogisticsFeeAfterTax = logisticsFeeAfterTax,
  1211. // MoldFee = moldFee,
  1212. // MoldFeeAfterTax = moldFeeAfterTax,
  1213. };
  1214. if (orderItem.ProductNo != input.ProductNo)
  1215. {
  1216. orderSend.Remark = $"替换发货,用编号:{input.ProductNo}替换{orderItem.ProductNo}";
  1217. }
  1218. await CalcLogisticsFeeAndMoldFee(orderSend, orderItem);//计算是否需要添加模具费和运费
  1219. this.LogError(orderSend.ToJsonString());
  1220. var sendId = OrderSendRepository.InsertAndGetId(orderSend); //添加发货记录
  1221. //库存变更逻辑,添加仓库出库申请
  1222. ProductOutStore loProductOutStore = new ProductOutStore
  1223. {
  1224. ApplyOutDate = Clock.Now,
  1225. ApplyStatus = OutStoreApplyStatusEnum.Applying.ToInt(),
  1226. StoreHouseId = 1,
  1227. IsClose = false,
  1228. CreatorUserId = AbpSession.UserName,
  1229. CurrentProductStoreHouseNo = orderSendItemDto.CurrentProductStoreHouseNo,
  1230. IsConfirm = false,
  1231. Quantity = orderSendItemDto.SendQuantity,
  1232. ProductionOrderNo = orderSendItemDto.ProductBatchNum ?? "",
  1233. ProductNo = input.ProductNo,
  1234. TimeLastMod = Clock.Now,
  1235. TimeCreated = Clock.Now,
  1236. UserIDLastMod = AbpSession.UserName,
  1237. OrderSendId = sendId,
  1238. ApplyOutStoreSourceType = OutStoreApplyTypeEnum.SendGood.ToInt()
  1239. };
  1240. await ProductOutStoreRepository.InsertAsync(loProductOutStore);
  1241. this.LogInfo($"订单明细发货操作,发货数量{sendQuantiy}!订单明细:{orderItem.ToJsonString()},库存记录变更:{currentProductStore.ToJsonString()}");
  1242. }
  1243. /*BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细发货", $"订单明细发货操作,发货数量{sendQuantiy}!订单明细:{orderItem.ToJsonString()}原库存记录{loOldCurrentProductStoreHouse.ToJsonString()},库存记录变更:{currentProductStore.ToJsonString()}");*/
  1244. /*for (int i=0;i< currentProductStores.Count;i++)
  1245. {
  1246. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细发货", $"订单明细发货操作,发货数量{sendQuantiys[i]}!订单明细:{orderItem.ToJsonString()},库存记录变更:{currentProductStores[i].ToJsonString()}");
  1247. }*/
  1248. //如果存在分批次发货提醒
  1249. if (input.SendDateWarnId > 0)
  1250. {
  1251. var scheduleOrderSend = await ScheduleOrderSendRepository.GetAsync(input.SendDateWarnId);
  1252. if (scheduleOrderSend != null)
  1253. {
  1254. scheduleOrderSend.SendState = 1;
  1255. await ScheduleOrderSendRepository.UpdateAsync(scheduleOrderSend);
  1256. }
  1257. }
  1258. return await Repository.UpdateAsync(orderItem);//更新订单明细状态
  1259. }
  1260. #endregion
  1261. /// <summary>
  1262. /// 根据订单编号获取当前订单的订单明细
  1263. /// </summary>
  1264. /// <param name="pcOrderNo"></param>
  1265. /// <returns></returns>
  1266. [DisableAuditing]
  1267. public async Task<GetOrderItemDto> GetOrderItemsByOrderNo(string pcOrderNo)
  1268. {
  1269. var query = ViewOrderItemsRepository.GetAll().Where(i => i.OrderNo == pcOrderNo)?.OrderBy(i=>i.Id);
  1270. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  1271. GetOrderItemDto lOrderItemDto = new GetOrderItemDto();
  1272. lOrderItemDto.IsAllSend = IsAllItemEnd(pcOrderNo);
  1273. lOrderItemDto.OrderItems = entities;
  1274. return lOrderItemDto;
  1275. }
  1276. /// <summary>
  1277. /// 判断一个订单所有订单明细是否都处于结束状态
  1278. /// </summary>
  1279. /// <param name="orderNo"></param>
  1280. /// <returns></returns>
  1281. [DisableAuditing]
  1282. public bool IsAllItemEnd(string orderNo)
  1283. {
  1284. bool lbRetval = true;
  1285. int endstatus = OrderItemStatusEnum.End.ToInt();
  1286. int negotiationComplete = OrderItemStatusEnum.NegotiationComplete.ToInt();
  1287. var result = Repository.GetAllList(i =>
  1288. i.OrderNo == orderNo && i.OrderItemStatusId != endstatus&&i.OrderItemStatusId!= negotiationComplete);
  1289. if (result.Any())
  1290. {
  1291. lbRetval = false;
  1292. }
  1293. /*else
  1294. {
  1295. var order = OrderHeaderRepository.Get(orderNo);
  1296. order.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  1297. OrderHeaderRepository.UpdateAsync(order);
  1298. }*/
  1299. return lbRetval;
  1300. }
  1301. /// <summary>
  1302. /// 获取单个订单明细已发数量
  1303. /// </summary>
  1304. /// <param name="orderItemId"></param>
  1305. /// <returns></returns>
  1306. [DisableAuditing]
  1307. public decimal GetItemSend(int orderItemId)
  1308. {
  1309. var sendQuantity = OrderSendRepository.GetAll().Where(i => i.OrderItemId == orderItemId).Sum(i => (decimal?)i.SendQuantity) ?? 0;
  1310. return sendQuantity;
  1311. }
  1312. /// <summary>
  1313. /// 查询当前产品库存和被定数量
  1314. /// </summary>
  1315. /// <param name="input"></param>
  1316. /// <returns></returns>
  1317. public ViewQueryCurrentProductNum QueryCurrentProductNum(EntityDto<string> input)
  1318. {
  1319. ViewBookedProductNum entityBook = ViewBookedProductNumRepository.FirstOrDefault(input.Id);
  1320. ViewCanProductStore entityCan = ViewCanProductStoreRepository.FirstOrDefault(input.Id);
  1321. ViewQueryCurrentProductNum entity = new ViewQueryCurrentProductNum();
  1322. if (entityBook != null)
  1323. {
  1324. entity.Id = entityBook.Id;
  1325. entity.BookedQuantity = entityBook.BookedQuantity;
  1326. }
  1327. if (entityCan != null)
  1328. {
  1329. entity.Id = entityCan.Id;
  1330. entity.CanUserQuantity = entityCan.CanUserQuantity;
  1331. }
  1332. return entity;
  1333. }
  1334. public List<StatisticsItem> StatisticsItem(PagedRequestDto input)
  1335. {
  1336. string conn = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["Default"].ToString();
  1337. List<StatisticsItem> resultList = new List<StatisticsItem>();
  1338. using (var loSqlConn = new SqlConnection(conn))
  1339. {
  1340. using (loSqlConn.CreateCommand())
  1341. {
  1342. loSqlConn.Open();
  1343. string queryType = "", dataWhereSql = "where 1=1 and ( t.SaleType=1 or t.SaleType=2 )",sType="", currencyId="CNY";
  1344. if (input.SearchList != null && input.SearchList.Count > 0)
  1345. {
  1346. foreach (var searchDto in input.SearchList)
  1347. {
  1348. if (searchDto.KeyField == "stype")
  1349. {
  1350. sType = searchDto.KeyWords;
  1351. switch (searchDto.KeyWords)
  1352. {
  1353. case "1":
  1354. queryType = "t.CreateOrderDate";
  1355. break;
  1356. case "2":
  1357. queryType = "datepart(week,CreateOrderDate)";
  1358. break;
  1359. case "3":
  1360. queryType = "datepart(mm,CreateOrderDate)";
  1361. break;
  1362. case "4":
  1363. queryType = "datepart(qq,CreateOrderDate)";
  1364. break;
  1365. case "5":
  1366. queryType = "datepart(yyyy,CreateOrderDate)";
  1367. break;
  1368. }
  1369. }
  1370. if (searchDto.KeyField == "startDate" && !searchDto.KeyWords.IsNullOrEmpty())
  1371. {
  1372. dataWhereSql += " and t.CreateOrderDate>='" + searchDto.KeyWords + "' ";
  1373. }
  1374. if (searchDto.KeyField == "endDate" && !searchDto.KeyWords.IsNullOrEmpty())
  1375. {
  1376. dataWhereSql += " and t.CreateOrderDate<='" + searchDto.KeyWords + "' ";
  1377. }
  1378. if (searchDto.KeyField == "saleType" && !searchDto.KeyWords.IsNullOrEmpty())
  1379. {
  1380. if (Int16.Parse(searchDto.KeyWords) == 2)
  1381. {
  1382. currencyId = "USD";
  1383. dataWhereSql += " and t.CurrencyId ='USD' ";
  1384. }
  1385. else if (Int16.Parse(searchDto.KeyWords) == 1)
  1386. {
  1387. dataWhereSql += " and t.CurrencyId ='CNY' ";
  1388. }
  1389. }
  1390. if (searchDto.KeyField == "saleMan" && !searchDto.KeyWords.IsNullOrEmpty())
  1391. {
  1392. dataWhereSql += " and t.SaleMan ='"+ searchDto.KeyWords +"' ";
  1393. }
  1394. }
  1395. if (queryType.IsNullOrEmpty())
  1396. {
  1397. return resultList;
  1398. }
  1399. }
  1400. string lcSql =
  1401. $"select count(*) as OrderCount,sum(t.Price*t.Quantity) as TotalPrice,{queryType} as QueryValue from (select Convert(varchar(10),OrderDate,120) as CreateOrderDate,* from N_ViewOrderItems where IsLock!='Y') as t {dataWhereSql} group by {queryType} order by {queryType}";
  1402. SqlDataAdapter loDataAdapter = new SqlDataAdapter(lcSql, loSqlConn);
  1403. DataSet loDataSet = new DataSet(); // 创建DataSet
  1404. loDataAdapter.Fill(loDataSet, "OrderInfo");
  1405. DataTable loTable = loDataSet.Tables["OrderInfo"];
  1406. foreach (DataRow row in loTable.Rows)
  1407. {
  1408. StatisticsItem lDailyOrderInfo = new StatisticsItem();
  1409. /*lDailyOrderInfo.CustomerName = row["CustomerName"] + "";
  1410. lDailyOrderInfo.ProductName = row["ProductName"] + "";
  1411. lDailyOrderInfo.ProductNo = row["ProductNo"] + "";*/
  1412. lDailyOrderInfo.OrderCount = (int)row["OrderCount"];
  1413. lDailyOrderInfo.TotalPrice = Convert.ToDecimal(row["TotalPrice"]);
  1414. lDailyOrderInfo.QueryValue = row["QueryValue"];
  1415. lDailyOrderInfo.QueryUnit = sType;
  1416. lDailyOrderInfo.CurrencyId = currencyId;
  1417. resultList.Add(lDailyOrderInfo);
  1418. }
  1419. }
  1420. }
  1421. return resultList;
  1422. }
  1423. public async Task<LockOrderProductQuantity> GetCurrentProductLock(string productNo,string orderNo)
  1424. {
  1425. //int auditStatus = OrderItemStatusEnum.Audited.ToInt();
  1426. //int createStatus = OrderItemStatusEnum.NewCreate.ToInt();
  1427. //var orderItems =await Repository.GetAllListAsync(i =>
  1428. // i.ProductNo == productNo && (i.OrderItemStatusId == null || i.OrderItemStatusId == auditStatus ||
  1429. // i.OrderItemStatusId == createStatus)&&i.OrderNo == orderNo);
  1430. //var itemIds = orderItems.Select(i => i.Id).ToList();
  1431. //var sends = OrderSendRepository.GetAllList(i => itemIds.Contains(i.OrderItemId));
  1432. //LockOrderProductQuantity lockOrderProductQuantity = new LockOrderProductQuantity()
  1433. //{
  1434. // ProductNo = productNo,
  1435. // Quantity = orderItems.Sum(i=>i.Quantity) - sends.Sum(i=>i.SendQuantity)
  1436. //};
  1437. //return lockOrderProductQuantity;
  1438. int auditStatus = OrderItemStatusEnum.Audited.ToInt();
  1439. int createStatus = OrderItemStatusEnum.NewCreate.ToInt();
  1440. var orderItems = await Repository.GetAllListAsync(i =>
  1441. i.ProductNo == productNo && (i.OrderItemStatusId == null || i.OrderItemStatusId == auditStatus ||
  1442. i.OrderItemStatusId == createStatus)
  1443. &&i.IsLock=="N");
  1444. LockOrderProductQuantity lockOrderProductQuantity = new LockOrderProductQuantity()
  1445. {
  1446. ProductNo = productNo,
  1447. Quantity = orderItems.Sum(i => i.Quantity)
  1448. };
  1449. return lockOrderProductQuantity;
  1450. }
  1451. public async Task<CustomerDefaultProduct> GetDefaultPartNoByOrderNo(string orderNo, string productNo)
  1452. {
  1453. if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(productNo))
  1454. {
  1455. CheckErrors(IwbIdentityResult.Failed("传入参数有误!"));
  1456. }
  1457. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderNo);
  1458. var entity = await CustomerDefaultProductRepository.FirstOrDefaultAsync(i =>
  1459. i.CustomerId == orderHeader.CustomerId && i.ProductNo == productNo);
  1460. return entity;
  1461. }
  1462. #region orderProductProcess
  1463. public async Task<List<ProductionProcessDto>> QueryProductProcess(int orderItemId)
  1464. {
  1465. var entity = await QueryAppService.QueryOrderProductProcess(orderItemId);
  1466. List<ProductionProcessDto> result = new List<ProductionProcessDto>();
  1467. var pos = entity.ProductionOrderList;
  1468. var pas = entity.PackageApplyList;
  1469. if (pos != null)
  1470. {
  1471. foreach (var productionOrder in pos)
  1472. {
  1473. string pName = "";
  1474. if (productionOrder.ProcessingLevel == "1")
  1475. {
  1476. pName = productionOrder.ProductionType == "0"
  1477. ? "车间生产"
  1478. : "外购";
  1479. }
  1480. else
  1481. {
  1482. pName = productionOrder.ProcessingType == "2" ? "热处理" : "表面处理";
  1483. }
  1484. pName += $"({productionOrder.ProductionOrderNo})";
  1485. var status = productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Start.ToInt()
  1486. ? "新建"
  1487. : (productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Audited.ToInt() ? "已审核" :
  1488. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Producting.ToInt() ? "生产中" :
  1489. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Storeing.ToInt() ? "入库中" :
  1490. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.EnterStore.ToInt() ? "已入库" :
  1491. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.HangUp.ToInt() ? "挂起" :
  1492. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.End.ToInt() ? "结束" : "");
  1493. result.Add(new ProductionProcessDto()
  1494. {
  1495. ProcessName = pName,
  1496. StartDate = productionOrder.TimeCreated,
  1497. CurrentStatus = status,
  1498. EndDate = productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.End.ToInt()
  1499. ? productionOrder.TimeLastMod
  1500. : null
  1501. });
  1502. }
  1503. }
  1504. if (pas != null)
  1505. {
  1506. foreach (var packageApply in pas)
  1507. {
  1508. string pName = $"包装({packageApply.ProductionOrderNo})";
  1509. var status = packageApply.ApplyStatus == PackageApplyStatusEnum.Applying.ToInt() + ""
  1510. ? "申请中"
  1511. : (packageApply.ApplyStatus == PackageApplyStatusEnum.Audited.ToInt() + "" ? "已审核" : "拒绝");
  1512. result.Add(new ProductionProcessDto()
  1513. {
  1514. ProcessName = pName,
  1515. StartDate = packageApply.ApplyDate,
  1516. CurrentStatus = status
  1517. });
  1518. }
  1519. }
  1520. return result.OrderByDescending(i=>i.StartDate).ToList();
  1521. }
  1522. #endregion
  1523. }
  1524. }