OrderItemsApplicationService.cs 89 KB

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