OrderItemsApplicationService.cs 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635
  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. Sequence = 1,
  351. TimeLastMod = Clock.Now
  352. };
  353. }
  354. else
  355. {
  356. if (exist != null && exist.Id != customerDefaultProduct.Id)
  357. {
  358. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  359. }
  360. customerDefaultProduct.PartNo = input.PartNo;
  361. customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  362. customerDefaultProduct.TimeLastMod = Clock.Now;
  363. }
  364. await CustomerDefaultProductRepository.InsertOrUpdateAsync(customerDefaultProduct);
  365. #endregion
  366. input.OrderItemStatusId = OrderItemStatusEnum.NewCreate.ToInt();
  367. input.SendDate ??= new DateTime(1900, 1, 1);
  368. var dto= await CreateEntity(input);
  369. //await CommonAppService.WriteShortMessage(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANLRMSG), "有新订单明细录入", $"新的订单明细录入成功,订单明细流水号为:{dto.Id},请注意查看,并及时跟踪!订单录入明细人为{AbpSession.UserName}");
  370. //await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANLRMSG), "有新订单明细录入", $"新的订单明细录入成功,订单明细流水号为:{dto.Id},请注意查看,并及时跟踪!订单录入明细人为{AbpSession.UserName}", false);
  371. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细创建", $"订单明细创建成功!orderNo:{dto.OrderNo},itemId:{input},userName:{AbpSession.UserName}");
  372. return dto;
  373. }
  374. public override async Task<OrderItemDto> Update(OrderItemUpdateDto input)
  375. {
  376. CheckCreatePermission();
  377. var orderHeader = OrderHeaderRepository.Get(input.OrderNo);
  378. if (orderHeader.IsLock == "Y")
  379. {
  380. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  381. }
  382. var isHasSend = await CommonAppService.CheckOrderHasSend(orderHeader.Id);
  383. var itemEntity= await CheckOrderItem(input.Id);
  384. if (isHasSend)
  385. {
  386. CheckErrors(IwbIdentityResult.Failed("订单已存在发货记录,不可变更信息!详情请联系系统管理员!"));
  387. }
  388. if (input.SendDate==null)
  389. {
  390. input.SendDate= new DateTime(1900,1,1);
  391. }
  392. //var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  393. // i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  394. //if (customerDefaultProduct == null)
  395. //{
  396. // customerDefaultProduct = new CustomerDefaultProduct()
  397. // {
  398. // CustomerId = orderHeader.CustomerId,
  399. // ProductNo = input.ProductNo,
  400. // Sequence = 1,
  401. // TimeLastMod = Clock.Now
  402. // };
  403. //}
  404. //else
  405. //{
  406. // customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  407. // customerDefaultProduct.TimeLastMod = Clock.Now;
  408. //}
  409. //CustomerDefaultProductRepository.InsertOrUpdate(customerDefaultProduct);
  410. //if (!string.IsNullOrEmpty(input.PartNo))
  411. //{
  412. // var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  413. // i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  414. // var exist = CustomerDefaultProductRepository.FirstOrDefault(i => i.CustomerId == orderHeader.CustomerId && i.PartNo == input.PartNo);
  415. // if (customerDefaultProduct == null)
  416. // {
  417. // if (exist != null)
  418. // {
  419. // throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  420. // }
  421. // customerDefaultProduct = new CustomerDefaultProduct()
  422. // {
  423. // CustomerId = orderHeader.CustomerId,
  424. // ProductNo = input.ProductNo,
  425. // PartNo = input.PartNo,
  426. // Sequence = 1,
  427. // TimeLastMod = Clock.Now
  428. // };
  429. // }
  430. // else
  431. // {
  432. // if (exist != null && exist.Id != customerDefaultProduct.Id)
  433. // {
  434. // throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  435. // }
  436. // customerDefaultProduct.PartNo = input.PartNo;
  437. // customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  438. // customerDefaultProduct.TimeLastMod = Clock.Now;
  439. // }
  440. // CustomerDefaultProductRepository.InsertOrUpdate(customerDefaultProduct);
  441. //}
  442. #region 更新客户产品维护信息
  443. var customerDefaultProduct = CustomerDefaultProductRepository.GetAll().Where(i =>
  444. i.ProductNo == input.ProductNo && i.CustomerId == orderHeader.CustomerId)?.FirstOrDefault();
  445. CustomerDefaultProduct exist = !string.IsNullOrEmpty(input.PartNo) ? await CustomerDefaultProductRepository.FirstOrDefaultAsync(i => i.CustomerId == orderHeader.CustomerId && i.PartNo == input.PartNo) : null;
  446. if (customerDefaultProduct == null)
  447. {
  448. if (exist != null)
  449. {
  450. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  451. }
  452. customerDefaultProduct = new CustomerDefaultProduct()
  453. {
  454. CustomerId = orderHeader.CustomerId,
  455. ProductNo = input.ProductNo,
  456. PartNo = input.PartNo,
  457. Sequence = 1,
  458. TimeLastMod = Clock.Now
  459. };
  460. }
  461. else
  462. {
  463. if (exist != null && exist.Id != customerDefaultProduct.Id)
  464. {
  465. throw new UserFriendlyException($"零件号重复!该客户维护的产品{exist.ProductNo },已经使用了零件号{exist.PartNo}!");
  466. }
  467. customerDefaultProduct.PartNo = input.PartNo;
  468. customerDefaultProduct.Sequence = customerDefaultProduct.Sequence + 1;
  469. customerDefaultProduct.TimeLastMod = Clock.Now;
  470. }
  471. await CustomerDefaultProductRepository.InsertOrUpdateAsync(customerDefaultProduct);
  472. #endregion
  473. var prePrice = itemEntity.Price;
  474. var preQuantity = itemEntity.Quantity;
  475. var dto= await UpdateEntity(input);
  476. //await CommonAppService.WriteShortMessage(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANXGMSG), "订单明细信息修改", $"订单明细流水号为:{dto.Id},订单信息已变更,请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}");
  477. string sendMsgType = ShwasherSettingNames.DINGDANXGTOD;
  478. string changeInfo = "";
  479. if (preQuantity != input.Quantity)
  480. {
  481. sendMsgType = ShwasherSettingNames.DINGDANSLXGTOD;
  482. changeInfo = $"明细数量由{preQuantity}K -> {input.Quantity}K |";
  483. }
  484. if (prePrice != input.Price)
  485. {
  486. sendMsgType = ShwasherSettingNames.DINGDANJEXGTOD;
  487. changeInfo += $"明细单价由{prePrice} -> { input.Price}K |";
  488. }
  489. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(sendMsgType), "订单明细信息修改", $"订单(${orderHeader.Id})明细流水号为:{dto.Id},订单信息已变更({changeInfo}),请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}",false);//(itemEntity.OrderItemStatusId ??=0) != (OrderItemStatusEnum.NewCreate.ToInt())
  490. return dto;
  491. }
  492. public override async Task Delete(EntityDto<int> input)
  493. {
  494. CheckDeletePermission();
  495. var entity = await CheckOrderItem(input.Id);
  496. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == entity.OrderNo);
  497. if (orderHeader.IsLock == "Y")
  498. {
  499. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  500. }
  501. var isHasSend = await CommonAppService.CheckOrderHasSend(entity.OrderNo);
  502. if (isHasSend)
  503. {
  504. CheckErrors(IwbIdentityResult.Failed("订单已存在发货记录,不可删除!详情请联系系统管理员!"));
  505. }
  506. await CommonAppService.UnLockOrderStore(entity);//如果存在锁定仓库的库存,提前解除冻结
  507. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细删除", $"订单明细审核通过!orderNo:{entity.OrderNo},itemId:{input}");
  508. await Repository.DeleteAsync(input.Id);
  509. }
  510. #region 订单明细状态信息变更
  511. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgAuditItem), AuditLog("审核订单明细")]
  512. public async Task<OrderItem> Audit(EntityDto<int> input)
  513. {
  514. var orderItem = Repository.Get(input.Id);
  515. var orderHeader =await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  516. if (orderHeader.IsLock == "Y")
  517. {
  518. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  519. }
  520. orderItem.OrderItemStatusId = OrderItemStatusEnum.Audited.ToInt();
  521. orderItem.TimeLastMod = Clock.Now;
  522. orderItem.UserIDLastMod = AbpSession.UserName;
  523. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细审核", $"订单明细审核通过!{orderItem.Id}");
  524. return await Repository.UpdateAsync(orderItem);
  525. }
  526. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgAuditItem), AuditLog("审核所有订单明细")]
  527. public async Task<List<OrderItem>> AuditAllItems(EntityDto<string> input)
  528. {
  529. string[] arrIds = input.Id.Split(',');
  530. if (arrIds.Length > 0)
  531. {
  532. var orderFirstItem = Repository.Get(Convert.ToInt32(arrIds[0]));
  533. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderFirstItem.OrderNo);
  534. if (orderHeader.IsLock == "Y")
  535. {
  536. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  537. }
  538. }
  539. List<OrderItem> alList = new List<OrderItem>();
  540. foreach (var arrId in arrIds)
  541. {
  542. var orderItem = Repository.Get(Convert.ToInt32(arrId));
  543. alList.Add(orderItem);
  544. orderItem.OrderItemStatusId = OrderItemStatusEnum.Audited.ToInt();
  545. orderItem.TimeLastMod = Clock.Now;
  546. orderItem.UserIDLastMod = AbpSession.UserName;
  547. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细审核", $"订单明细审核通过!{orderItem.Id}");
  548. await Repository.UpdateAsync(orderItem);
  549. }
  550. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细审核", $"订单明细审核通过!{alList.ToJsonString()}");
  551. return alList;
  552. }
  553. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgEndItem), AuditLog("结束订单明细")]
  554. public async Task<OrderItemEndCall> End(EntityDto<int> input)
  555. {
  556. var orderItem = Repository.Get(input.Id);
  557. orderItem.OrderItemStatusId = OrderItemStatusEnum.End.ToInt();
  558. orderItem.TimeLastMod = Clock.Now;
  559. orderItem.UserIDLastMod = AbpSession.UserName;
  560. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细结束", $"订单明细结束!{orderItem.ToJsonString()}");
  561. //int endstatus = OrderItemStatusEnum.End.ToInt();
  562. string lcOrderNo = orderItem.OrderNo;
  563. //var notEndItems = Repository.GetAllList(i =>
  564. //i.OrderNo == lcOrderNo && (i.OrderItemStatusId != endstatus||i.OrderItemStatusId ==null)&&i.Id != input.Id);
  565. OrderItemEndCall result = new OrderItemEndCall();
  566. var isHasExOrderItem = IsExOrderItem(lcOrderNo, input.Id);//是否有其它订单明细
  567. if (!isHasExOrderItem)
  568. {
  569. var order = OrderHeaderRepository.Get(lcOrderNo);
  570. order.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  571. await OrderHeaderRepository.UpdateAsync(order);
  572. result.IsAllEnd = true;
  573. }
  574. else
  575. {
  576. if (IsExNotEndItem(lcOrderNo, input.Id)) //判断其它订单明细状态是否都是完成
  577. {
  578. var order = OrderHeaderRepository.Get(lcOrderNo);
  579. order.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  580. await OrderHeaderRepository.UpdateAsync(order);
  581. result.IsAllEnd = true;
  582. }
  583. }
  584. result.OrderItem = await Repository.UpdateAsync(orderItem);
  585. return result;
  586. }
  587. /// <summary>
  588. /// 判断当前订单中是否有其它订单(true:有其它订单)
  589. /// </summary>
  590. /// <param name="pcOrderNo">订单号</param>
  591. /// <param name="piExOrderItemId">排除订单明细Id(如果值不为0,则排除传入订单明细Id,只判断当前订单中其它明细状态是否完成)</param>
  592. /// <param name="poExOrderItems">排除订单明细Id(如果值不为Null,则排除传入订单明细集合,只判断当前订单中其它明细状态是否完成)</param>
  593. /// <returns>true:有其它订单</returns>
  594. private bool IsExOrderItem(string pcOrderNo, int piExOrderItemId = 0, List<OrderItem> poExOrderItems = null)
  595. {
  596. bool lbRetval = false;
  597. var notItems = Repository.GetAllList(i =>
  598. i.OrderNo == pcOrderNo);
  599. if (piExOrderItemId != 0)
  600. {
  601. notItems = notItems.Where(i => i.Id != piExOrderItemId).ToList();
  602. }
  603. if (poExOrderItems != null && poExOrderItems.Any())
  604. {
  605. List<int> lcExOrderItemsId = poExOrderItems.Select(i => i.Id).ToList();
  606. notItems = notItems.Where(i => !lcExOrderItemsId.Contains(i.Id)).ToList();
  607. }
  608. if (notItems.Any())
  609. {
  610. lbRetval = true;
  611. }
  612. return lbRetval;
  613. }
  614. /// <summary>
  615. /// 判断当前订单中订单明细是否为都结束状态(true:其它订单明细都结束了)
  616. /// </summary>
  617. /// <param name="pcOrderNo">订单号</param>
  618. /// <param name="piExOrderItemId">排除订单明细Id(如果值不为0,则排除传入订单明细Id,只判断当前订单中其它明细状态是否完成)</param>
  619. /// <param name="poExOrderItems">排除订单明细Id(如果值不为Null,则排除传入订单明细集合,只判断当前订单中其它明细状态是否完成)</param>
  620. /// <returns>true:订单明细都结束了</returns>
  621. private bool IsExNotEndItem(string pcOrderNo, int piExOrderItemId = 0, List<OrderItem> poExOrderItems = null)
  622. {
  623. bool lbRetval = false;
  624. int endstatus = OrderItemStatusEnum.End.ToInt();
  625. int completeStatus = OrderItemStatusEnum.NegotiationComplete.ToInt();
  626. //过滤掉结束和协商完成的
  627. var notEndItems = Repository.GetAllList(i =>
  628. i.OrderNo == pcOrderNo && i.OrderItemStatusId != endstatus&&i.OrderItemStatusId!= completeStatus);
  629. if (piExOrderItemId != 0)
  630. {
  631. notEndItems = notEndItems.Where(i => i.Id != piExOrderItemId).ToList();
  632. }
  633. if (poExOrderItems != null && poExOrderItems.Any())
  634. {
  635. List<int> lcExOrderItemsId = poExOrderItems.Select(i => i.Id).ToList();
  636. notEndItems = notEndItems.Where(i => !lcExOrderItemsId.Contains(i.Id)).ToList();
  637. }
  638. if (!notEndItems.Any())
  639. {
  640. lbRetval = true;
  641. }
  642. return lbRetval;
  643. }
  644. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgChangeStatus), AuditLog("变更订单明细状态")]
  645. public async Task<List<OrderItem>> ChangeOrderItemStatus(ChangeOrderItemStatusDto input)
  646. {
  647. string ids = input.Id;
  648. if (string.IsNullOrEmpty(ids))
  649. {
  650. CheckErrors(IwbIdentityResult.Failed("未查询到修改的订单明细!"));
  651. return null;
  652. }
  653. var arr = ids.Split(',');
  654. StringBuilder sb = new StringBuilder();
  655. List<OrderItem> items = new List<OrderItem>();
  656. foreach (var id in arr)
  657. {
  658. var item = Repository.Get(Convert.ToInt32(id));
  659. sb.Append($"[ItemId:{item.Id},Status:{item.OrderItemStatusId}]");
  660. item.OrderItemStatusId = input.OrderItemStatusId;
  661. item.TimeLastMod = Clock.Now;
  662. item.UserIDLastMod = AbpSession.UserName;
  663. items.Add(item);
  664. await Repository.UpdateAsync(item);
  665. }
  666. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态修改", $"订单明细状态修改操作,订单明细:{sb.ToString()},变更状态为:{input.OrderItemStatusId}");
  667. return items;
  668. }
  669. /// <summary>
  670. /// 变更同一个订单的订单明细状态
  671. /// </summary>
  672. /// <param name="input"></param>
  673. /// <returns></returns>
  674. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgChangeStatus), AuditLog("变更订单明细状态")]
  675. public async Task<OrderItemsCallAndEnd> ChangeOrderItemStatusOnHeader(ChangeOrderItemStatusDto input)
  676. {
  677. string ids = input.Id;
  678. if (string.IsNullOrEmpty(ids))
  679. {
  680. CheckErrors(IwbIdentityResult.Failed("未查询到修改的订单明细!"));
  681. return null;
  682. }
  683. var arr = ids.Split(',');
  684. StringBuilder sb = new StringBuilder();
  685. List<OrderItem> items = new List<OrderItem>();
  686. foreach (var id in arr)
  687. {
  688. var item = Repository.Get(Convert.ToInt32(id));
  689. sb.Append($"[ItemId:{item.Id},Status:{item.OrderItemStatusId}]");
  690. item.OrderItemStatusId = input.OrderItemStatusId;
  691. item.TimeLastMod = Clock.Now;
  692. item.UserIDLastMod = AbpSession.UserName;
  693. items.Add(item);
  694. await Repository.UpdateAsync(item);
  695. }
  696. OrderItemsCallAndEnd loResult = new OrderItemsCallAndEnd();
  697. if (items.Any() && input.OrderItemStatusId == OrderItemStatusEnum.End.ToInt())
  698. {
  699. string lcOrderNo = items[0].OrderNo;
  700. var isHasExItems = IsExOrderItem(lcOrderNo, poExOrderItems: items);//是否有其它订单明细
  701. if (isHasExItems && IsExNotEndItem(items[0].OrderNo, poExOrderItems: items))//其它订单明细是否都结束了
  702. {
  703. var orderHeader = OrderHeaderRepository.Get(items[0].OrderNo);
  704. orderHeader.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  705. loResult.IsAllEnd = true;
  706. await OrderHeaderRepository.UpdateAsync(orderHeader);
  707. }
  708. else if (!isHasExItems)
  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. }
  716. loResult.OrderItems = items;
  717. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态修改", $"订单明细状态修改操作,订单明细:{sb.ToString()},变更状态为:{input.OrderItemStatusId}");
  718. return loResult;
  719. }
  720. /// <summary>
  721. /// 变更同一个订单的订单明细是否库存配货完成状态
  722. /// </summary>
  723. /// <param name="input"></param>
  724. /// <returns></returns>
  725. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgChangeStatus), AuditLog("变更订单明细状态")]
  726. public async Task<OrderItemsCallAndEnd> ChangeOrderItemCompleteStoreStatus(ChangeOrderItemStoreCompleteStatusDto input)
  727. {
  728. string ids = input.Id;
  729. if (string.IsNullOrEmpty(ids))
  730. {
  731. CheckErrors(IwbIdentityResult.Failed("未查询到修改的订单明细!"));
  732. return null;
  733. }
  734. var arr = ids.Split(',');
  735. StringBuilder sb = new StringBuilder();
  736. List<OrderItem> items = new List<OrderItem>();
  737. foreach (var id in arr)
  738. {
  739. var item = Repository.Get(Convert.ToInt32(id));
  740. sb.Append($"[ItemId:{item.Id},Status:{item.OrderItemStatusId},StoreComplete:{input.OrderItemStoreCompleteState}]");
  741. item.StoreCompleteState = input.OrderItemStoreCompleteState;
  742. item.TimeLastMod = Clock.Now;
  743. item.UserIDLastMod = AbpSession.UserName;
  744. items.Add(item);
  745. await Repository.UpdateAsync(item);
  746. }
  747. OrderItemsCallAndEnd loResult = new OrderItemsCallAndEnd();
  748. loResult.OrderItems = items;
  749. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态修改", $"订单明细状态修改操作,订单明细:{sb.ToString()},货物到齐变更状态为:{input.OrderItemStoreCompleteState}");
  750. return loResult;
  751. }
  752. #endregion
  753. #region 订单明细信息变更
  754. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem),AuditLog("修改订单明细价格")]
  755. public async Task<OrderItem> ChangePrice(ChangeOrderItemInfoDto input)
  756. {
  757. if (!decimal.TryParse((await SettingManager.GetSettingValueAsync(ShwasherSettingNames.OrderItemPriceTaxRate)),
  758. out var rate))
  759. {
  760. CheckErrors(IwbIdentityResult.Failed("未查询到税率!"));
  761. }
  762. var orderItem = await CheckOrderItem(input.OrderItemNo);
  763. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  764. if (orderHeader.IsLock == "Y")
  765. {
  766. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  767. }
  768. decimal oldPrice = orderItem.Price;
  769. orderItem.Price = input.NewPrice;
  770. orderItem.AfterTaxPrice = Math.Round(input.NewPrice / (1 + rate / 100), 3);
  771. orderItem.TimeLastMod = Clock.Now;
  772. orderItem.UserIDLastMod = AbpSession.UserName;
  773. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改", $"修改订单明细价格,原价:{oldPrice}!{orderItem.ToJsonString()}");
  774. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANJEXGTOD), "订单明细价格变更", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单税前价格由 {oldPrice} 变更为 {input.NewPrice} ,请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  775. return await Repository.UpdateAsync(orderItem);
  776. //throw new System.NotImplementedException();
  777. }
  778. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细税后价格")]
  779. public async Task<OrderItem> ChangeAfterTaxPrice(ChangeOrderItemInfoDto input)
  780. {
  781. if (!decimal.TryParse((await SettingManager.GetSettingValueAsync(ShwasherSettingNames.OrderItemPriceTaxRate)),
  782. out var rate))
  783. {
  784. CheckErrors(IwbIdentityResult.Failed("未查询到税率!"));
  785. }
  786. var orderItem = await CheckOrderItem(input.OrderItemNo);
  787. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  788. if (orderHeader.IsLock == "Y")
  789. {
  790. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  791. }
  792. decimal oldPrice = orderItem.AfterTaxPrice;
  793. orderItem.AfterTaxPrice = input.NewAfterTaxPrice;
  794. orderItem.Price = Math.Round(input.NewAfterTaxPrice * (1 + rate / 100), 3);
  795. orderItem.TimeLastMod = Clock.Now;
  796. orderItem.UserIDLastMod = AbpSession.UserName;
  797. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改", $"修改订单明细税后价格,原价:{oldPrice}!{orderItem.ToJsonString()}");
  798. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANJEXGTOD), "订单明细价格变更", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单税后价格由 {oldPrice} 变更为 {input.NewAfterTaxPrice} ,请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  799. return await Repository.UpdateAsync(orderItem);
  800. //throw new System.NotImplementedException();
  801. }
  802. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细数量")]
  803. public async Task<OrderItem> ChangeQuantity(ChangeOrderItemInfoDto input)
  804. {
  805. var orderItem = await CheckOrderItem(input.OrderItemNo);
  806. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  807. if (orderHeader.IsLock == "Y")
  808. {
  809. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  810. }
  811. var oldQuantity = orderItem.Quantity;
  812. orderItem.Quantity = input.NewQuantity;
  813. orderItem.TimeLastMod = Clock.Now;
  814. orderItem.UserIDLastMod = AbpSession.UserName;
  815. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改(数量变更)", $"修改订单明细数量,原数量:{oldQuantity}!{orderItem.ToJsonString()}");
  816. await CommonAppService.WriteShortMessageByDep(AbpSession.UserName, SettingManager.GetSettingValue(ShwasherSettingNames.DINGDANSLXGTOD), "订单明细修改", $"订单(${orderHeader.Id})明细流水号为:{orderItem.Id},订单明细数量由 {oldQuantity} 变更为 {input.NewQuantity},请注意查看,并及时跟踪!订单变更人为{AbpSession.UserName}", false);
  817. return await Repository.UpdateAsync(orderItem);
  818. }
  819. //[AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细发货日期")]
  820. //public async Task<OrderItem> ChangeSendDate(ChangeOrderItemInfoDto input)
  821. //{
  822. // var orderItem = await CheckOrderItem(input.OrderItemNo);
  823. // var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  824. // if (orderHeader.IsLock == "Y")
  825. // {
  826. // CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  827. // }
  828. // var oldSendDate = orderItem.SendDate;
  829. // orderItem.SendDate = input.NewSendDate;
  830. // orderItem.TimeLastMod = Clock.Now;
  831. // orderItem.UserIDLastMod = AbpSession.UserName;
  832. // BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改(发货日期变更)", $"修改订单明细发货日期,原日期:{oldSendDate:yyyy-MM-dd}!{orderItem.ToJsonString()}");
  833. // 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);
  834. // return await Repository.UpdateAsync(orderItem);
  835. //}
  836. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("修改订单明细发货日期")]
  837. public async Task<OrderItem> ChangeSendDate(ChangeOrderItemSendDateInfoDto input)
  838. {
  839. var orderItem = await CheckOrderItem(input.OrderItemNo);
  840. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  841. if (orderHeader.IsLock == "Y")
  842. {
  843. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  844. }
  845. var oldSendDate = orderItem.SendDate;
  846. orderItem.SendDate = input.NewSendDate;
  847. orderItem.TimeLastMod = Clock.Now;
  848. orderItem.UserIDLastMod = AbpSession.UserName;
  849. //增加分批次发货日期提醒
  850. var inputSendDateWarns = input.SendDateWarns;
  851. if (inputSendDateWarns != null && inputSendDateWarns.Any())
  852. {
  853. //ScheduleOrderSendRepository.de
  854. await ExecSendWarn(inputSendDateWarns, input.OrderItemNo);
  855. }
  856. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细修改(发货日期变更)", $"修改订单明细发货日期,原日期:{oldSendDate:yyyy-MM-dd}!{orderItem.ToJsonString()}");
  857. 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);
  858. return await Repository.UpdateAsync(orderItem);
  859. }
  860. private async Task ExecSendWarn(List<SendDateWarnDto> input,int orderItemId)
  861. {
  862. foreach (var sendDateWarnDto in input)
  863. {
  864. if (sendDateWarnDto.Id <= 0)
  865. {
  866. await ScheduleOrderSendRepository.InsertAsync(new ScheduleOrderSend()
  867. {
  868. OrderItemId = orderItemId,
  869. PlanDate = sendDateWarnDto.PlanDate,
  870. PlanQuantity = sendDateWarnDto.PlanQuantity,
  871. Remark = sendDateWarnDto.Remark,
  872. SendState = 0
  873. });
  874. }
  875. }
  876. }
  877. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("删除分批次发货提醒")]
  878. public async Task DeleteSendDateWarns(int sendDateWarnId)
  879. {
  880. var item = await ScheduleOrderSendRepository.GetAsync(sendDateWarnId);
  881. if (item.SendState == 1)
  882. {
  883. CheckErrors(IwbIdentityResult.Failed("本次提醒已发货,不能删除!"));
  884. }
  885. await ScheduleOrderSendRepository.DeleteAsync(sendDateWarnId);
  886. }
  887. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderMgUpdateOrderItem), AuditLog("分批次发货提醒修改订单明细发货日期")]
  888. public async Task<List<SendDateWarnDto>> GetSendDateWarns(int orderItemId)
  889. {
  890. var items =await ScheduleOrderSendRepository.GetAllListAsync(i=>i.OrderItemId==orderItemId);
  891. return ObjectMapper.Map<List<SendDateWarnDto>>(items);
  892. }
  893. private async Task<OrderItem> CheckOrderItem(int orderItemNo)
  894. {
  895. var orderItem = await Repository.FirstOrDefaultAsync(a => a.Id == orderItemNo);
  896. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  897. if (orderHeader.IsLock == "Y")
  898. {
  899. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  900. }
  901. if (orderItem == null)
  902. {
  903. CheckErrors(IwbIdentityResult.Failed( "未查询到订单明细。"));
  904. return null;
  905. }
  906. if (orderItem.OrderItemStatusId==OrderItemStatusEnum.Send.ToInt() )
  907. {
  908. CheckErrors(IwbIdentityResult.Failed( "已发货,不能操作。"));
  909. return null;
  910. }
  911. if (orderItem.OrderItemStatusId==OrderItemStatusEnum.End.ToInt() ||orderItem.OrderItemStatusId==OrderItemStatusEnum.NegotiationComplete.ToInt() ||orderItem.OrderItemStatusId==OrderItemStatusEnum.Delete.ToInt() )
  912. {
  913. CheckErrors(IwbIdentityResult.Failed( "已结束,不能操作。"));
  914. return null;
  915. }
  916. return orderItem;
  917. }
  918. #endregion
  919. #region 订单发货
  920. public async Task<List<ViewOrderSend>> QuerySendItem(int id)
  921. {
  922. var sendItems = await ViewOrderSendRepository.GetAllListAsync(i=>i.OrderItemId == id);
  923. return sendItems;
  924. }
  925. /**
  926. * 单条锁定的库存记录发货
  927. */
  928. public async Task<OrderItem> SendBookStoreItem(int orderItemId,int id)
  929. {
  930. var orderItem = Repository.Get(orderItemId);
  931. var bookstore = await OrderBookStoreRepository.GetAsync(id);
  932. var allSendQuantity = GetItemSend(orderItemId);
  933. await InsertOrderSendExceed(allSendQuantity + bookstore.Quantity??0, orderItem);//如果超过订单数量,需要在超额部分中添加记录
  934. //如果超过订单数量直接变更订单状态
  935. if ((allSendQuantity + bookstore.Quantity ?? 0) >= orderItem.Quantity)
  936. {
  937. orderItem.OrderItemStatusId = OrderItemStatusEnum.Send.ToInt();
  938. orderItem.TimeLastMod = DateTime.Now;
  939. orderItem.UserIDLastMod = AbpSession.UserName;
  940. await Repository.UpdateAsync(orderItem);//更新订单明细状态
  941. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态变更", $"订单明细发货完成,发货数量{(allSendQuantity + bookstore.Quantity ?? 0)}!订单明细:{orderItem.ToJsonString()}");
  942. }
  943. if (await CommonAppService.CheckProductCanSendToCustomer(bookstore.ProductBatchNum, bookstore.CustomerId))
  944. {
  945. CheckErrors(IwbIdentityResult.Failed($"批次({bookstore.ProductBatchNum})不能发货给客户({bookstore.CustomerId}),请检查后再试..."));
  946. }
  947. OrderSend orderSend = new OrderSend()
  948. {
  949. OrderItemId = orderItemId,
  950. OrderUnitId = orderItem.OrderUnitId,
  951. SendDate = Clock.Now,
  952. SendQuantity = bookstore.Quantity ?? 0,
  953. UserIDLastMod = AbpSession.UserName,
  954. TimeLastMod = Clock.Now,
  955. TimeCreated = Clock.Now,
  956. QuantityPerPack = bookstore.QuantityPerPack,
  957. PackageCount = bookstore.PackageCount,
  958. ProductBatchNum = bookstore.ProductBatchNum,
  959. StoreLocationNo = bookstore.StoreLocationNo,
  960. CurrentProductStoreHouseNo = bookstore.CurrentProductStoreHouseNo,
  961. CreatorUserId = AbpSession.UserName,
  962. };
  963. if (orderItem.ProductNo != bookstore.ProductNo)
  964. {
  965. orderSend.Remark = $"替换发货,用编号:{bookstore.ProductNo}替换{orderItem.ProductNo}";
  966. }
  967. await CalcLogisticsFeeAndMoldFee(orderSend, orderItem);//计算是否需要添加模具费和运费
  968. var sendId = OrderSendRepository.InsertAndGetId(orderSend); //添加发货记录
  969. //库存变更逻辑,添加仓库出库申请
  970. ProductOutStore loProductOutStore = new ProductOutStore
  971. {
  972. ApplyOutDate = Clock.Now,
  973. ApplyStatus = OutStoreApplyStatusEnum.Applying.ToInt(),
  974. StoreHouseId = 1,
  975. IsClose = false,
  976. CreatorUserId = AbpSession.UserName,
  977. CurrentProductStoreHouseNo = bookstore.CurrentProductStoreHouseNo,
  978. IsConfirm = false,
  979. Quantity = bookstore.Quantity ?? 0,
  980. ProductionOrderNo = bookstore.ProductBatchNum ?? "",
  981. ProductNo = bookstore.ProductNo,
  982. TimeLastMod = Clock.Now,
  983. TimeCreated = Clock.Now,
  984. UserIDLastMod = AbpSession.UserName,
  985. OrderSendId = sendId,
  986. ApplyOutStoreSourceType = OutStoreApplyTypeEnum.SendGood.ToInt()
  987. };
  988. await ProductOutStoreRepository.InsertAsync(loProductOutStore);
  989. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "预先冻结库存发货", $"订单明细发货操作,发货数量{bookstore.Quantity}!订单明细:{orderItem.ToJsonString()},出库库存记录:{loProductOutStore.ToJsonString()}");
  990. //todo 发货之后锁定库存需要状态变更为已解锁
  991. bookstore.Status = OrderBookStoreStatusEnum.UnLock.ToInt();
  992. await OrderBookStoreRepository.UpdateAsync(bookstore);
  993. return orderItem;
  994. }
  995. /**
  996. * 发货前先将提前锁定的库存发货
  997. */
  998. //public async Task<OrderItem> SendBookStore(int orderItemId)
  999. //{
  1000. // var orderItem = Repository.Get(orderItemId);
  1001. // int lockStatus = OrderBookStoreStatusEnum.Locking.ToInt();
  1002. // var orderBookStores = await OrderBookStoreRepository.GetAllListAsync(i=>i.OrderItemId==orderItemId && i.Status== lockStatus);//查询当前订单明细中是否存在未发货解锁的库存记录
  1003. // var allSend = orderBookStores.Select(i=>i.Quantity).Sum();
  1004. // await InsertOrderSendExceed(allSend??0, orderItem);//如果超过订单数量,需要在超额部分中添加记录
  1005. // //如果超过订单数量直接变更订单状态
  1006. // if (allSend >= orderItem.Quantity)
  1007. // {
  1008. // orderItem.OrderItemStatusId = OrderItemStatusEnum.Send.ToInt();
  1009. // orderItem.TimeLastMod = DateTime.Now;
  1010. // orderItem.UserIDLastMod = AbpSession.UserName;
  1011. // await Repository.UpdateAsync(orderItem);//更新订单明细状态
  1012. // BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细状态变更", $"订单明细发货完成,发货数量{allSend}!订单明细:{orderItem.ToJsonString()}");
  1013. // }
  1014. // foreach (OrderBookStore bookStore in orderBookStores)
  1015. // {
  1016. // if (await CommonAppService.CheckProductCanSendToCustomer(bookStore.ProductBatchNum, bookStore.CustomerId))
  1017. // {
  1018. // CheckErrors(IwbIdentityResult.Failed($"批次({bookStore.ProductBatchNum})不能发货给客户({bookStore.CustomerId}),请检查后再试..."));
  1019. // }
  1020. // //var currentStore =await CurrentProductStoreHouseRepository.FirstOrDefaultAsync(i =>
  1021. // // i.CurrentProductStoreHouseNo == bookStore.CurrentProductStoreHouseNo);
  1022. // OrderSend orderSend = new OrderSend()
  1023. // {
  1024. // OrderItemId = orderItemId,
  1025. // OrderUnitId = orderItem.OrderUnitId,
  1026. // SendDate = Clock.Now,
  1027. // SendQuantity = bookStore.Quantity??0,
  1028. // UserIDLastMod = AbpSession.UserName,
  1029. // TimeLastMod = Clock.Now,
  1030. // TimeCreated = Clock.Now,
  1031. // QuantityPerPack = bookStore.QuantityPerPack,
  1032. // PackageCount = bookStore.PackageCount,
  1033. // ProductBatchNum = bookStore.ProductBatchNum,
  1034. // StoreLocationNo = bookStore.StoreLocationNo,
  1035. // CurrentProductStoreHouseNo = bookStore.CurrentProductStoreHouseNo,
  1036. // CreatorUserId = AbpSession.UserName,
  1037. // };
  1038. // if (orderItem.ProductNo != bookStore.ProductNo)
  1039. // {
  1040. // orderSend.Remark = $"替换发货,用编号:{bookStore.ProductNo}替换{orderItem.ProductNo}";
  1041. // }
  1042. // await CalcLogisticsFeeAndMoldFee(orderSend, orderItem);//计算是否需要添加模具费和运费
  1043. // var sendId = OrderSendRepository.InsertAndGetId(orderSend); //添加发货记录
  1044. // //库存变更逻辑,添加仓库出库申请
  1045. // ProductOutStore loProductOutStore = new ProductOutStore
  1046. // {
  1047. // ApplyOutDate = Clock.Now,
  1048. // ApplyStatus = OutStoreApplyStatusEnum.Applying.ToInt(),
  1049. // StoreHouseId = 1,
  1050. // IsClose = false,
  1051. // CreatorUserId = AbpSession.UserName,
  1052. // CurrentProductStoreHouseNo = bookStore.CurrentProductStoreHouseNo,
  1053. // IsConfirm = false,
  1054. // Quantity = bookStore.Quantity??0,
  1055. // ProductionOrderNo = bookStore.ProductBatchNum ?? "",
  1056. // ProductNo = bookStore.ProductNo,
  1057. // TimeLastMod = Clock.Now,
  1058. // TimeCreated = Clock.Now,
  1059. // UserIDLastMod = AbpSession.UserName,
  1060. // OrderSendId = sendId,
  1061. // ApplyOutStoreSourceType = OutStoreApplyTypeEnum.SendGood.ToInt()
  1062. // };
  1063. // await ProductOutStoreRepository.InsertAsync(loProductOutStore);
  1064. // BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "预先冻结库存发货", $"订单明细发货操作,发货数量{bookStore.Quantity}!订单明细:{orderItem.ToJsonString()},出库库存记录:{loProductOutStore.ToJsonString()}");
  1065. // //todo 发货之后锁定库存需要状态变更为已解锁
  1066. // bookStore.Status = OrderBookStoreStatusEnum.UnLock.ToInt();
  1067. // await OrderBookStoreRepository.UpdateAsync(bookStore);
  1068. // }
  1069. // //await OrderBookStoreRepository.DeleteAsync(i => i.OrderItemId == orderItemId);//发货成功后软删除掉锁定的记录
  1070. // return orderItem;
  1071. //}
  1072. /**
  1073. * 计算发货记录中的模具费和运费
  1074. */
  1075. private async Task CalcLogisticsFeeAndMoldFee(OrderSend send,OrderItem orderItem)
  1076. {
  1077. #region 磨具费和运费
  1078. var os = await OrderSendRepository.FirstOrDefaultAsync(i => i.OrderItemId == send.OrderItemId);
  1079. //磨具费和运费算在第一条发货记录中,后续的发货记录都为0
  1080. if (os == null)
  1081. {
  1082. send.LogisticsFee = orderItem.LogisticsFee;
  1083. send.MoldFee = orderItem.MoldFee;
  1084. send.MoldFeeAfterTax = orderItem.MoldFeeAfterTax;
  1085. send.LogisticsFeeAfterTax = orderItem.LogisticsFeeAfterTax;
  1086. }
  1087. #endregion
  1088. }
  1089. private async Task InsertOrderSendExceed(decimal readySendAll,OrderItem orderItem)
  1090. {
  1091. if (readySendAll > orderItem.Quantity)
  1092. {
  1093. var exceedRate = ((readySendAll - orderItem.Quantity) / orderItem.Quantity) * 100;
  1094. if (exceedRate > 5)
  1095. {
  1096. throw new UserFriendlyException("发货数量不能超过 订单明细总数量的5%!");
  1097. }
  1098. //throw new UserFriendlyException("发货数量不能超过 待发货总数量!");
  1099. await OrderSendExceedRepository.InsertAsync(new OrderSendExceed()
  1100. {
  1101. OrderItemId = orderItem.Id,
  1102. ExceedQuantity = (readySendAll - orderItem.Quantity),
  1103. OperatorMan = AbpSession.UserName,
  1104. ProductNo = orderItem.ProductNo,
  1105. OrderNo = orderItem.OrderNo
  1106. });//记录超额发货部分
  1107. }
  1108. }
  1109. /// <summary>
  1110. /// 订单明细发货
  1111. /// </summary>
  1112. /// <param name="input"></param>
  1113. /// <returns></returns>
  1114. [AbpAuthorize(PermissionNames.PagesOrderInfoOrderStatusMgSendItem), AuditLog("订单明细发货")]
  1115. public async Task<OrderItem> SendOrderAction(SendOrderInfoDto input)
  1116. {
  1117. //OrderSendRepository
  1118. var allSendQuantity = GetItemSend(input.Id);
  1119. var orderItem = Repository.Get(input.Id);
  1120. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderItem.OrderNo);
  1121. if (orderHeader.IsLock == "Y")
  1122. {
  1123. CheckErrors(IwbIdentityResult.Failed("订单已是删除状态,不可变更信息!详情请联系系统管理员!"));
  1124. }
  1125. var readySendAll = allSendQuantity + input.SendAllQuantity;
  1126. // if (readySendAll > orderItem.Quantity)
  1127. // {
  1128. // var exceedRate = ((readySendAll - orderItem.Quantity) / orderItem.Quantity) * 100;
  1129. // if (exceedRate > 5)
  1130. // {
  1131. // throw new UserFriendlyException("发货数量不能超过 订单明细总数量的5%!");
  1132. // }
  1133. // //throw new UserFriendlyException("发货数量不能超过 待发货总数量!");
  1134. // OrderSendExceedRepository.Insert(new OrderSendExceed()
  1135. // {
  1136. // OrderItemId = input.Id, ExceedQuantity = (readySendAll - orderItem.Quantity),
  1137. // OperatorMan = AbpSession.UserName,
  1138. // ProductNo = input.ProductNo,
  1139. // OrderNo = orderItem.OrderNo
  1140. // });//记录超额发货部分
  1141. // }
  1142. await InsertOrderSendExceed(readySendAll, orderItem);
  1143. if ((allSendQuantity + input.SendAllQuantity) >= orderItem.Quantity)
  1144. {
  1145. orderItem.OrderItemStatusId = OrderItemStatusEnum.Send.ToInt();
  1146. }
  1147. foreach (var orderSendItemDto in input.SendItems)
  1148. {
  1149. if (await CommonAppService.CheckProductCanSendToCustomer(orderSendItemDto.ProductBatchNum,input.CustomerNo))
  1150. {
  1151. CheckErrors(IwbIdentityResult.Failed($"批次({orderSendItemDto.ProductBatchNum})不能发货给客户({input.CustomerNo}),请检查后再试..."));
  1152. }
  1153. var sendQuantiy = orderSendItemDto.SendQuantity;
  1154. var avgQuantity = orderSendItemDto.AvgQuantity==0? sendQuantiy: orderSendItemDto.AvgQuantity;
  1155. decimal packDecimal = 0;
  1156. if (sendQuantiy <= avgQuantity)
  1157. {
  1158. packDecimal = 1;
  1159. avgQuantity = sendQuantiy;
  1160. }
  1161. else
  1162. {
  1163. packDecimal = sendQuantiy / avgQuantity;
  1164. }
  1165. var currentProductStore = CurrentProductStoreHouseRepository.FirstOrDefault(i =>
  1166. i.CurrentProductStoreHouseNo == orderSendItemDto.CurrentProductStoreHouseNo);
  1167. //CurrentProductStoreHouse loOldCurrentProductStoreHouse = currentProductStore;//原库存记录
  1168. decimal isCanSendQuantity = currentProductStore.Quantity - currentProductStore.FreezeQuantity;
  1169. if (sendQuantiy > isCanSendQuantity)
  1170. {
  1171. CheckErrors(IwbIdentityResult.Failed("发货批次("+ currentProductStore.ProductionOrderNo+")库存数量不足,最多可发:"+ isCanSendQuantity+"千件"));
  1172. }
  1173. currentProductStore.FreezeQuantity += orderSendItemDto.SendQuantity;
  1174. currentProductStore.TimeLastMod = Clock.Now;
  1175. currentProductStore.UserIDLastMod = AbpSession.UserName;
  1176. //currentProductStores.Add(currentProductStore);
  1177. await CurrentProductStoreHouseRepository.UpdateAsync(currentProductStore);//更新库存的冻结数量
  1178. // #region 磨具费和运费
  1179. // var os = await OrderSendRepository.FirstOrDefaultAsync(i => i.OrderItemId == input.Id);
  1180. // decimal logisticsFee = 0, moldFee = 0, logisticsFeeAfterTax = 0, moldFeeAfterTax = 0;
  1181. // //磨具费和运费算在第一条发货记录中,后续的发货记录都为0
  1182. // if (os == null)
  1183. // {
  1184. // logisticsFee = orderItem.LogisticsFee;
  1185. // moldFee = orderItem.MoldFee;
  1186. // moldFeeAfterTax = orderItem.MoldFeeAfterTax;
  1187. // logisticsFeeAfterTax = orderItem.LogisticsFeeAfterTax;
  1188. // }
  1189. // #endregion
  1190. OrderSend orderSend = new OrderSend()
  1191. {
  1192. OrderItemId = input.Id,
  1193. OrderUnitId = orderItem.OrderUnitId,
  1194. SendDate = Clock.Now,
  1195. SendQuantity = orderSendItemDto.SendQuantity,
  1196. UserIDLastMod = AbpSession.UserName,
  1197. TimeLastMod = Clock.Now,
  1198. TimeCreated = Clock.Now,
  1199. QuantityPerPack = avgQuantity,
  1200. PackageCount = packDecimal,
  1201. ProductBatchNum = orderSendItemDto.ProductBatchNum,
  1202. StoreLocationNo = orderSendItemDto.StoreLocationNo,
  1203. CurrentProductStoreHouseNo = orderSendItemDto.CurrentProductStoreHouseNo,
  1204. CreatorUserId = AbpSession.UserName,
  1205. // LogisticsFee = logisticsFee,
  1206. // LogisticsFeeAfterTax = logisticsFeeAfterTax,
  1207. // MoldFee = moldFee,
  1208. // MoldFeeAfterTax = moldFeeAfterTax,
  1209. };
  1210. if (orderItem.ProductNo != input.ProductNo)
  1211. {
  1212. orderSend.Remark = $"替换发货,用编号:{input.ProductNo}替换{orderItem.ProductNo}";
  1213. }
  1214. await CalcLogisticsFeeAndMoldFee(orderSend, orderItem);//计算是否需要添加模具费和运费
  1215. this.LogError(orderSend.ToJsonString());
  1216. var sendId = OrderSendRepository.InsertAndGetId(orderSend); //添加发货记录
  1217. //库存变更逻辑,添加仓库出库申请
  1218. ProductOutStore loProductOutStore = new ProductOutStore
  1219. {
  1220. ApplyOutDate = Clock.Now,
  1221. ApplyStatus = OutStoreApplyStatusEnum.Applying.ToInt(),
  1222. StoreHouseId = 1,
  1223. IsClose = false,
  1224. CreatorUserId = AbpSession.UserName,
  1225. CurrentProductStoreHouseNo = orderSendItemDto.CurrentProductStoreHouseNo,
  1226. IsConfirm = false,
  1227. Quantity = orderSendItemDto.SendQuantity,
  1228. ProductionOrderNo = orderSendItemDto.ProductBatchNum ?? "",
  1229. ProductNo = input.ProductNo,
  1230. TimeLastMod = Clock.Now,
  1231. TimeCreated = Clock.Now,
  1232. UserIDLastMod = AbpSession.UserName,
  1233. OrderSendId = sendId,
  1234. ApplyOutStoreSourceType = OutStoreApplyTypeEnum.SendGood.ToInt()
  1235. };
  1236. await ProductOutStoreRepository.InsertAsync(loProductOutStore);
  1237. this.LogInfo($"订单明细发货操作,发货数量{sendQuantiy}!订单明细:{orderItem.ToJsonString()},库存记录变更:{currentProductStore.ToJsonString()}");
  1238. }
  1239. /*BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细发货", $"订单明细发货操作,发货数量{sendQuantiy}!订单明细:{orderItem.ToJsonString()}原库存记录{loOldCurrentProductStoreHouse.ToJsonString()},库存记录变更:{currentProductStore.ToJsonString()}");*/
  1240. /*for (int i=0;i< currentProductStores.Count;i++)
  1241. {
  1242. BusinessLogTypeEnum.OrderLog.WriteLog(BusinessLogRepository, "订单明细发货", $"订单明细发货操作,发货数量{sendQuantiys[i]}!订单明细:{orderItem.ToJsonString()},库存记录变更:{currentProductStores[i].ToJsonString()}");
  1243. }*/
  1244. //如果存在分批次发货提醒
  1245. if (input.SendDateWarnId > 0)
  1246. {
  1247. var scheduleOrderSend = await ScheduleOrderSendRepository.GetAsync(input.SendDateWarnId);
  1248. if (scheduleOrderSend != null)
  1249. {
  1250. scheduleOrderSend.SendState = 1;
  1251. await ScheduleOrderSendRepository.UpdateAsync(scheduleOrderSend);
  1252. }
  1253. }
  1254. return await Repository.UpdateAsync(orderItem);//更新订单明细状态
  1255. }
  1256. #endregion
  1257. /// <summary>
  1258. /// 根据订单编号获取当前订单的订单明细
  1259. /// </summary>
  1260. /// <param name="pcOrderNo"></param>
  1261. /// <returns></returns>
  1262. [DisableAuditing]
  1263. public async Task<GetOrderItemDto> GetOrderItemsByOrderNo(string pcOrderNo)
  1264. {
  1265. var query = ViewOrderItemsRepository.GetAll().Where(i => i.OrderNo == pcOrderNo)?.OrderBy(i=>i.Id);
  1266. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  1267. GetOrderItemDto lOrderItemDto = new GetOrderItemDto();
  1268. lOrderItemDto.IsAllSend = IsAllItemEnd(pcOrderNo);
  1269. lOrderItemDto.OrderItems = entities;
  1270. return lOrderItemDto;
  1271. }
  1272. /// <summary>
  1273. /// 判断一个订单所有订单明细是否都处于结束状态
  1274. /// </summary>
  1275. /// <param name="orderNo"></param>
  1276. /// <returns></returns>
  1277. [DisableAuditing]
  1278. public bool IsAllItemEnd(string orderNo)
  1279. {
  1280. bool lbRetval = true;
  1281. int endstatus = OrderItemStatusEnum.End.ToInt();
  1282. int negotiationComplete = OrderItemStatusEnum.NegotiationComplete.ToInt();
  1283. var result = Repository.GetAllList(i =>
  1284. i.OrderNo == orderNo && i.OrderItemStatusId != endstatus&&i.OrderItemStatusId!= negotiationComplete);
  1285. if (result.Any())
  1286. {
  1287. lbRetval = false;
  1288. }
  1289. /*else
  1290. {
  1291. var order = OrderHeaderRepository.Get(orderNo);
  1292. order.OrderStatusId = OrderStatusEnum.Completed.ToInt();
  1293. OrderHeaderRepository.UpdateAsync(order);
  1294. }*/
  1295. return lbRetval;
  1296. }
  1297. /// <summary>
  1298. /// 获取单个订单明细已发数量
  1299. /// </summary>
  1300. /// <param name="orderItemId"></param>
  1301. /// <returns></returns>
  1302. [DisableAuditing]
  1303. public decimal GetItemSend(int orderItemId)
  1304. {
  1305. var sendQuantity = OrderSendRepository.GetAll().Where(i => i.OrderItemId == orderItemId).Sum(i => (decimal?)i.SendQuantity) ?? 0;
  1306. return sendQuantity;
  1307. }
  1308. /// <summary>
  1309. /// 查询当前产品库存和被定数量
  1310. /// </summary>
  1311. /// <param name="input"></param>
  1312. /// <returns></returns>
  1313. public ViewQueryCurrentProductNum QueryCurrentProductNum(EntityDto<string> input)
  1314. {
  1315. ViewBookedProductNum entityBook = ViewBookedProductNumRepository.FirstOrDefault(input.Id);
  1316. ViewCanProductStore entityCan = ViewCanProductStoreRepository.FirstOrDefault(input.Id);
  1317. ViewQueryCurrentProductNum entity = new ViewQueryCurrentProductNum();
  1318. if (entityBook != null)
  1319. {
  1320. entity.Id = entityBook.Id;
  1321. entity.BookedQuantity = entityBook.BookedQuantity;
  1322. }
  1323. if (entityCan != null)
  1324. {
  1325. entity.Id = entityCan.Id;
  1326. entity.CanUserQuantity = entityCan.CanUserQuantity;
  1327. }
  1328. return entity;
  1329. }
  1330. public List<StatisticsItem> StatisticsItem(PagedRequestDto input)
  1331. {
  1332. string conn = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["Default"].ToString();
  1333. List<StatisticsItem> resultList = new List<StatisticsItem>();
  1334. using (var loSqlConn = new SqlConnection(conn))
  1335. {
  1336. using (loSqlConn.CreateCommand())
  1337. {
  1338. loSqlConn.Open();
  1339. string queryType = "", dataWhereSql = "where 1=1 and ( t.SaleType=1 or t.SaleType=2 )",sType="", currencyId="CNY";
  1340. if (input.SearchList != null && input.SearchList.Count > 0)
  1341. {
  1342. foreach (var searchDto in input.SearchList)
  1343. {
  1344. if (searchDto.KeyField == "stype")
  1345. {
  1346. sType = searchDto.KeyWords;
  1347. switch (searchDto.KeyWords)
  1348. {
  1349. case "1":
  1350. queryType = "t.CreateOrderDate";
  1351. break;
  1352. case "2":
  1353. queryType = "datepart(week,CreateOrderDate)";
  1354. break;
  1355. case "3":
  1356. queryType = "datepart(mm,CreateOrderDate)";
  1357. break;
  1358. case "4":
  1359. queryType = "datepart(qq,CreateOrderDate)";
  1360. break;
  1361. case "5":
  1362. queryType = "datepart(yyyy,CreateOrderDate)";
  1363. break;
  1364. }
  1365. }
  1366. if (searchDto.KeyField == "startDate" && !searchDto.KeyWords.IsNullOrEmpty())
  1367. {
  1368. dataWhereSql += " and t.CreateOrderDate>='" + searchDto.KeyWords + "' ";
  1369. }
  1370. if (searchDto.KeyField == "endDate" && !searchDto.KeyWords.IsNullOrEmpty())
  1371. {
  1372. dataWhereSql += " and t.CreateOrderDate<='" + searchDto.KeyWords + "' ";
  1373. }
  1374. if (searchDto.KeyField == "saleType" && !searchDto.KeyWords.IsNullOrEmpty())
  1375. {
  1376. if (Int16.Parse(searchDto.KeyWords) == 2)
  1377. {
  1378. currencyId = "USD";
  1379. dataWhereSql += " and t.CurrencyId ='USD' ";
  1380. }
  1381. else if (Int16.Parse(searchDto.KeyWords) == 1)
  1382. {
  1383. dataWhereSql += " and t.CurrencyId ='CNY' ";
  1384. }
  1385. }
  1386. if (searchDto.KeyField == "saleMan" && !searchDto.KeyWords.IsNullOrEmpty())
  1387. {
  1388. dataWhereSql += " and t.SaleMan ='"+ searchDto.KeyWords +"' ";
  1389. }
  1390. }
  1391. if (queryType.IsNullOrEmpty())
  1392. {
  1393. return resultList;
  1394. }
  1395. }
  1396. string lcSql =
  1397. $"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}";
  1398. SqlDataAdapter loDataAdapter = new SqlDataAdapter(lcSql, loSqlConn);
  1399. DataSet loDataSet = new DataSet(); // 创建DataSet
  1400. loDataAdapter.Fill(loDataSet, "OrderInfo");
  1401. DataTable loTable = loDataSet.Tables["OrderInfo"];
  1402. foreach (DataRow row in loTable.Rows)
  1403. {
  1404. StatisticsItem lDailyOrderInfo = new StatisticsItem();
  1405. /*lDailyOrderInfo.CustomerName = row["CustomerName"] + "";
  1406. lDailyOrderInfo.ProductName = row["ProductName"] + "";
  1407. lDailyOrderInfo.ProductNo = row["ProductNo"] + "";*/
  1408. lDailyOrderInfo.OrderCount = (int)row["OrderCount"];
  1409. lDailyOrderInfo.TotalPrice = Convert.ToDecimal(row["TotalPrice"]);
  1410. lDailyOrderInfo.QueryValue = row["QueryValue"];
  1411. lDailyOrderInfo.QueryUnit = sType;
  1412. lDailyOrderInfo.CurrencyId = currencyId;
  1413. resultList.Add(lDailyOrderInfo);
  1414. }
  1415. }
  1416. }
  1417. return resultList;
  1418. }
  1419. public async Task<LockOrderProductQuantity> GetCurrentProductLock(string productNo,string orderNo)
  1420. {
  1421. //int auditStatus = OrderItemStatusEnum.Audited.ToInt();
  1422. //int createStatus = OrderItemStatusEnum.NewCreate.ToInt();
  1423. //var orderItems =await Repository.GetAllListAsync(i =>
  1424. // i.ProductNo == productNo && (i.OrderItemStatusId == null || i.OrderItemStatusId == auditStatus ||
  1425. // i.OrderItemStatusId == createStatus)&&i.OrderNo == orderNo);
  1426. //var itemIds = orderItems.Select(i => i.Id).ToList();
  1427. //var sends = OrderSendRepository.GetAllList(i => itemIds.Contains(i.OrderItemId));
  1428. //LockOrderProductQuantity lockOrderProductQuantity = new LockOrderProductQuantity()
  1429. //{
  1430. // ProductNo = productNo,
  1431. // Quantity = orderItems.Sum(i=>i.Quantity) - sends.Sum(i=>i.SendQuantity)
  1432. //};
  1433. //return lockOrderProductQuantity;
  1434. int auditStatus = OrderItemStatusEnum.Audited.ToInt();
  1435. int createStatus = OrderItemStatusEnum.NewCreate.ToInt();
  1436. var orderItems = await Repository.GetAllListAsync(i =>
  1437. i.ProductNo == productNo && (i.OrderItemStatusId == null || i.OrderItemStatusId == auditStatus ||
  1438. i.OrderItemStatusId == createStatus)
  1439. &&i.IsLock=="N");
  1440. LockOrderProductQuantity lockOrderProductQuantity = new LockOrderProductQuantity()
  1441. {
  1442. ProductNo = productNo,
  1443. Quantity = orderItems.Sum(i => i.Quantity)
  1444. };
  1445. return lockOrderProductQuantity;
  1446. }
  1447. public async Task<CustomerDefaultProduct> GetDefaultPartNoByOrderNo(string orderNo, string productNo)
  1448. {
  1449. if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(productNo))
  1450. {
  1451. CheckErrors(IwbIdentityResult.Failed("传入参数有误!"));
  1452. }
  1453. var orderHeader = await OrderHeaderRepository.FirstOrDefaultAsync(i => i.Id == orderNo);
  1454. var entity = await CustomerDefaultProductRepository.FirstOrDefaultAsync(i =>
  1455. i.CustomerId == orderHeader.CustomerId && i.ProductNo == productNo);
  1456. return entity;
  1457. }
  1458. #region orderProductProcess
  1459. public async Task<List<ProductionProcessDto>> QueryProductProcess(int orderItemId)
  1460. {
  1461. var entity = await QueryAppService.QueryOrderProductProcess(orderItemId);
  1462. List<ProductionProcessDto> result = new List<ProductionProcessDto>();
  1463. var pos = entity.ProductionOrderList;
  1464. var pas = entity.PackageApplyList;
  1465. if (pos != null)
  1466. {
  1467. foreach (var productionOrder in pos)
  1468. {
  1469. string pName = "";
  1470. if (productionOrder.ProcessingLevel == "1")
  1471. {
  1472. pName = productionOrder.ProductionType == "0"
  1473. ? "车间生产"
  1474. : "外购";
  1475. }
  1476. else
  1477. {
  1478. pName = productionOrder.ProcessingType == "2" ? "热处理" : "表面处理";
  1479. }
  1480. pName += $"({productionOrder.ProductionOrderNo})";
  1481. var status = productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Start.ToInt()
  1482. ? "新建"
  1483. : (productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Audited.ToInt() ? "已审核" :
  1484. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Producting.ToInt() ? "生产中" :
  1485. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.Storeing.ToInt() ? "入库中" :
  1486. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.EnterStore.ToInt() ? "已入库" :
  1487. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.HangUp.ToInt() ? "挂起" :
  1488. productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.End.ToInt() ? "结束" : "");
  1489. result.Add(new ProductionProcessDto()
  1490. {
  1491. ProcessName = pName,
  1492. StartDate = productionOrder.TimeCreated,
  1493. CurrentStatus = status,
  1494. EndDate = productionOrder.ProductionOrderStatus == ProductionOrderStatusEnum.End.ToInt()
  1495. ? productionOrder.TimeLastMod
  1496. : null
  1497. });
  1498. }
  1499. }
  1500. if (pas != null)
  1501. {
  1502. foreach (var packageApply in pas)
  1503. {
  1504. string pName = $"包装({packageApply.ProductionOrderNo})";
  1505. var status = packageApply.ApplyStatus == PackageApplyStatusEnum.Applying.ToInt() + ""
  1506. ? "申请中"
  1507. : (packageApply.ApplyStatus == PackageApplyStatusEnum.Audited.ToInt() + "" ? "已审核" : "拒绝");
  1508. result.Add(new ProductionProcessDto()
  1509. {
  1510. ProcessName = pName,
  1511. StartDate = packageApply.ApplyDate,
  1512. CurrentStatus = status
  1513. });
  1514. }
  1515. }
  1516. return result.OrderByDescending(i=>i.StartDate).ToList();
  1517. }
  1518. #endregion
  1519. }
  1520. }