GoodsRepository.cs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. using AutoMapper;
  2. using EyeSoft.IO;
  3. using OASystem.Domain.Dtos.PersonnelModule;
  4. using OASystem.Domain.Entities.Groups;
  5. using OASystem.Domain.Entities.PersonnelModule;
  6. using OASystem.Domain.ViewModels.PersonnelModule;
  7. using System.Drawing;
  8. using Newtonsoft.Json;
  9. namespace OASystem.Infrastructure.Repositories.PersonnelModule
  10. {
  11. /// <summary>
  12. /// 物品进销存
  13. /// 仓储
  14. /// </summary>
  15. public class GoodsRepository : BaseRepository<Pm_GoodsInfo, GoodsInfoView>
  16. {
  17. private readonly IMapper _mapper;
  18. private JsonView _jv;
  19. public GoodsRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
  20. {
  21. _mapper = mapper;
  22. _jv = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = "操作失败!" };
  23. }
  24. /// <summary>
  25. /// 基础数据
  26. /// </summary>
  27. /// <returns></returns>
  28. public async Task<JsonView> InitDataSource()
  29. {
  30. var typeData = await _sqlSugar.Queryable<GoodsTypeView>()
  31. .Includes(x => x.SubTypeItems.Where(z => z.IsDel == 0)
  32. //.Select(z => new {
  33. // z.Id,
  34. // z.STid,
  35. // z.Name
  36. //})
  37. .ToList())
  38. .Where(x => x.IsDel == 0 &&
  39. x.Remark.Equals("GoodsType"))
  40. //.Select(x => new {
  41. // x.Id,
  42. // x.Name,
  43. // x.SubTypeItems
  44. //})
  45. .ToListAsync();
  46. var groupData = await _sqlSugar.Queryable<Grp_DelegationInfo>()
  47. .Where(x => x.IsDel == 0)
  48. .Select(x => new
  49. {
  50. id = x.Id,
  51. groupName = x.TeamName
  52. })
  53. .OrderByDescending(x => x.id)
  54. .ToListAsync();
  55. var userData = await _sqlSugar.Queryable<Sys_Users>()
  56. .Where(x => x.IsDel == 0)
  57. .Select(x => new
  58. {
  59. x.Id,
  60. UserName = x.CnName,
  61. })
  62. .ToListAsync();
  63. _jv.Code = StatusCodes.Status200OK;
  64. _jv.Data = new { goodsTypeData = typeData, groupNameData = groupData, userNameData = userData };
  65. _jv.Msg = $"操作成功";
  66. return _jv;
  67. }
  68. /// <summary>
  69. /// 物品列表
  70. /// </summary>
  71. /// <param name="dto"></param>
  72. /// <returns></returns>
  73. public async Task<JsonView> GoodsList(GoodsListDto dto)
  74. {
  75. var ids = new List<int>();
  76. if (!string.IsNullOrEmpty(dto.TypeIds))
  77. {
  78. var strArray = dto.TypeIds.Split(',');
  79. foreach (var str in strArray)
  80. {
  81. if (int.TryParse(str, out int id))
  82. {
  83. ids.Add(id);
  84. }
  85. }
  86. }
  87. RefAsync<int> total = 0;
  88. var data = await _sqlSugar.Queryable<Pm_GoodsInfo>()
  89. .LeftJoin<Sys_SetData>((gi, sd) => gi.Type == sd.Id)
  90. .LeftJoin<Sys_Users>((gi, sd, u) => gi.LastUpdateUserId == u.Id)
  91. .Where((gi, sd, u) => gi.IsDel == 0)
  92. .WhereIF(ids.Count > 0, (gi, sd, u) => ids.Contains(gi.Type))
  93. .WhereIF(!string.IsNullOrEmpty(dto.GoodsName), (gi, sd, u) => gi.Name.Contains(dto.GoodsName))
  94. .Select((gi, sd, u) => new
  95. {
  96. gi.Id,
  97. gi.Name,
  98. gi.Type,
  99. TypeName = sd.Name,
  100. gi.StockQuantity,
  101. LastUpdateUserName = u.CnName,
  102. gi.LastUpdateTime,
  103. gi.Remark,
  104. })
  105. .OrderByDescending(gi => gi.LastUpdateTime)
  106. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  107. _jv.Code = StatusCodes.Status200OK;
  108. _jv.Data = data;
  109. _jv.Count = total;
  110. _jv.Msg = $"操作成功";
  111. return _jv;
  112. }
  113. /// <summary>
  114. /// 物品Info
  115. /// </summary>
  116. /// <param name="portType"></param>
  117. /// <param name="id"></param>
  118. /// <returns></returns>
  119. public async Task<JsonView> GoodsInfo(int portType, int id)
  120. {
  121. var data = await _sqlSugar.Queryable<Pm_GoodsInfo>()
  122. .LeftJoin<Sys_SetData>((gi, sd) => gi.Type == sd.Id)
  123. .LeftJoin<Sys_Users>((gi, sd, u1) => gi.LastUpdateUserId == u1.Id)
  124. .LeftJoin<Sys_Users>((gi, sd, u1, u2) => gi.CreateUserId == u2.Id)
  125. .Where((gi, sd, u1, u2) => gi.IsDel == 0 && gi.Id == id)
  126. .Select((gi, sd, u1, u2) => new
  127. {
  128. gi.Id,
  129. gi.Name,
  130. ParentType = sd.STid,
  131. gi.Type,
  132. TypeName = sd.Name,
  133. gi.SQ_Total,
  134. gi.OQ_Total,
  135. gi.PriceTotal,
  136. gi.StockQuantity,
  137. gi.Remark,
  138. LastUpdateUserName = u1.CnName,
  139. gi.LastUpdateTime,
  140. CreateUserName = u2.CnName,
  141. gi.CreateTime,
  142. })
  143. .FirstAsync();
  144. _jv.Code = StatusCodes.Status200OK;
  145. _jv.Data = data;
  146. _jv.Msg = $"操作成功";
  147. return _jv;
  148. }
  149. /// <summary>
  150. /// 物品 OP(Create Or Edit)
  151. /// </summary>
  152. /// <param name="dto"></param>
  153. /// <param name="currUserId"></param>
  154. /// <returns></returns>
  155. public async Task<JsonView> GoodsOp(GoodsOpDto dto, int currUserId)
  156. {
  157. var info = new Pm_GoodsInfo()
  158. {
  159. Id = dto.Id,
  160. Name = dto.Name,
  161. Type = dto.Type,
  162. SQ_Total = 0,
  163. OQ_Total = 0,
  164. PriceTotal = 0,
  165. StockQuantity = 0,
  166. Remark = dto.Remark,
  167. LastUpdateUserId = currUserId,
  168. LastUpdateTime = DateTime.Now,
  169. CreateUserId = currUserId
  170. };
  171. if (dto.Id > 0) //Edit
  172. {
  173. var upd = await _sqlSugar.Updateable(info)
  174. .UpdateColumns(x => new
  175. {
  176. x.Name,
  177. x.Type,
  178. x.Remark,
  179. x.LastUpdateUserId,
  180. x.LastUpdateTime,
  181. })
  182. .ExecuteCommandAsync();
  183. if (upd > 0)
  184. {
  185. _jv.Msg = $"修改成功!";
  186. _jv.Code = StatusCodes.Status200OK;
  187. return _jv;
  188. }
  189. }
  190. else if (dto.Id < 1) //添加
  191. {
  192. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().FirstAsync(x => x.Name.Equals(info.Name));
  193. if (selectInfo != null)
  194. {
  195. _jv.Msg = $"“{info.Name}”该物品已存在,请勿重新添加!";
  196. return _jv;
  197. }
  198. var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  199. if (add > 0)
  200. {
  201. _jv.Msg = $"添加成功!";
  202. _jv.Code = StatusCodes.Status200OK;
  203. return _jv;
  204. }
  205. }
  206. return _jv;
  207. }
  208. /// <summary>
  209. /// 物品 Del
  210. /// </summary>
  211. /// <param name="id"></param>
  212. /// <param name="currUserId"></param>
  213. /// <returns></returns>
  214. public async Task<JsonView> GoodsDel(int id, int currUserId)
  215. {
  216. _sqlSugar.BeginTran();
  217. var goods = await _sqlSugar.Updateable<Pm_GoodsInfo>()
  218. .SetColumns(x => new Pm_GoodsInfo()
  219. {
  220. IsDel = 1,
  221. DeleteUserId = currUserId,
  222. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  223. })
  224. .Where(x => x.Id == id)
  225. .ExecuteCommandAsync();
  226. if (goods < 1)
  227. {
  228. _sqlSugar.RollbackTran();
  229. _jv.Msg = $"操作失败";
  230. return _jv;
  231. }
  232. var goodsStorage = await _sqlSugar.Updateable<Pm_GoodsStorage>()
  233. .SetColumns(x => new Pm_GoodsStorage()
  234. {
  235. IsDel = 1,
  236. DeleteUserId = currUserId,
  237. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  238. })
  239. .Where(x => x.Id == id)
  240. .ExecuteCommandAsync();
  241. var goodsReceive = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  242. .SetColumns(x => new Pm_GoodsReceive()
  243. {
  244. IsDel = 1,
  245. DeleteUserId = currUserId,
  246. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  247. })
  248. .Where(x => x.Id == id)
  249. .ExecuteCommandAsync();
  250. _sqlSugar.CommitTran();
  251. _jv.Code = StatusCodes.Status200OK;
  252. _jv.Msg = $"操作成功!";
  253. return _jv;
  254. }
  255. /// <summary>
  256. /// 物品入库列表
  257. /// </summary>
  258. /// <param name="dto"></param>
  259. /// <returns></returns>
  260. public async Task<JsonView> GoodsStorageList(GoodsStorageListDto dto)
  261. {
  262. RefAsync<int> total = 0;
  263. var data = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  264. .LeftJoin<Pm_GoodsInfo>((gs, gi) => gs.GoodsId == gi.Id)
  265. .LeftJoin<Sys_Users>((gs, gi, u) => gs.CreateUserId == u.Id)
  266. .LeftJoin<Sys_Users>((gs, gi, u, u1) => gs.StorageUserId == u1.Id)
  267. .Where((gs, gi, u, u1) => gs.IsDel == 0)
  268. .WhereIF(dto.GoodsId > 0, (gs, gi, u, u1) => gs.GoodsId == dto.GoodsId)
  269. .Select((gs, gi, u, u1) => new
  270. {
  271. gs.Id,
  272. gs.GoodsId,
  273. gs.BatchNo,
  274. GoodsName = gi.Name,
  275. gs.Quantity,
  276. gs.UnitPrice,
  277. gs.TotalPrice,
  278. gs.SupplierName,
  279. gs.SupplierTel,
  280. gs.SupplierAddress,
  281. gs.SupplierSource,
  282. StorageUserName = u1.CnName,
  283. gs.StorageTime,
  284. CreateUserName = u.CnName,
  285. gs.CreateTime,
  286. })
  287. .OrderByDescending(gs => gs.CreateTime)
  288. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  289. _jv.Code = StatusCodes.Status200OK;
  290. _jv.Data = data;
  291. _jv.Count = total;
  292. _jv.Msg = $"操作成功";
  293. return _jv;
  294. }
  295. /// <summary>
  296. /// 物品入库详情
  297. /// </summary>
  298. /// <param name="id"></param>
  299. /// <returns></returns>
  300. public async Task<JsonView> GoodsStorageInfo(int portType, int id)
  301. {
  302. var data = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  303. .LeftJoin<Pm_GoodsInfo>((gs, gi) => gs.GoodsId == gi.Id)
  304. .LeftJoin<Sys_Users>((gs, gi, u) => gs.CreateUserId == u.Id)
  305. .LeftJoin<Sys_Users>((gs, gi, u, u1) => gs.StorageUserId == u1.Id)
  306. .Where((gs, gi, u) => gs.IsDel == 0)
  307. .WhereIF(id > 0, (gs, gi, u) => gs.Id == id)
  308. .Select((gs, gi, u, u1) => new
  309. {
  310. gs.Id,
  311. gs.GoodsId,
  312. GoodsName = gi.Name,
  313. gs.Quantity,
  314. gs.UnitPrice,
  315. gs.TotalPrice,
  316. gs.SupplierName,
  317. gs.SupplierTel,
  318. gs.SupplierAddress,
  319. gs.SupplierSource,
  320. gs.ReceiveQuantity,
  321. gs.StorageUserId,
  322. StorageUser = u1.CnName,
  323. gs.StorageTime,
  324. CreateUserName = u.CnName,
  325. gs.CreateUserId,
  326. gs.CreateTime,
  327. gs.Remark
  328. })
  329. .FirstAsync();
  330. _jv.Msg = $"操作成功!";
  331. _jv.Code = StatusCodes.Status200OK;
  332. _jv.Data = data;
  333. return _jv;
  334. }
  335. /// <summary>
  336. /// 物品入库 操作(Create Or Edit)
  337. /// </summary>
  338. /// <param name="dto"></param>
  339. /// <param name="currUserId"></param>
  340. /// <returns></returns>
  341. public async Task<JsonView> GoodsStorageOp(GoodsStorageOpDto dto, int currUserId)
  342. {
  343. var info = _mapper.Map<Pm_GoodsStorage>(dto);
  344. info.CreateUserId = currUserId;
  345. info.BatchNo = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  346. decimal editAgoQuantity = 0.00M,
  347. editAgoTotalPrice = 0.00M;
  348. _sqlSugar.BeginTran();
  349. if (info.Id > 0) //修改
  350. {
  351. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  352. .Where(x => x.Id == dto.Id)
  353. .FirstAsync();
  354. editAgoQuantity = selectInfo.Quantity;
  355. editAgoTotalPrice = selectInfo.TotalPrice;
  356. var storageEdit = await _sqlSugar.Updateable(info)
  357. .UpdateColumns(x => new
  358. {
  359. x.Quantity,
  360. x.UnitPrice,
  361. x.TotalPrice,
  362. x.SupplierName,
  363. x.SupplierTel,
  364. x.SupplierAddress,
  365. x.SupplierSource,
  366. x.StorageUserId,
  367. x.StorageTime
  368. })
  369. .Where(x => x.Id == dto.Id)
  370. .ExecuteCommandAsync();
  371. if (storageEdit < 1)
  372. {
  373. _sqlSugar.RollbackTran();
  374. _jv.Msg = $"修改失败!";
  375. return _jv;
  376. }
  377. }
  378. else if (info.Id < 1) //添加
  379. {
  380. var storageAdd = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  381. if (storageAdd < 1)
  382. {
  383. _sqlSugar.RollbackTran();
  384. _jv.Msg = $"添加失败!";
  385. return _jv;
  386. }
  387. }
  388. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().FirstAsync(x => x.Id == info.GoodsId);
  389. goodsInfo.SQ_Total = goodsInfo.SQ_Total - editAgoQuantity + info.Quantity;
  390. goodsInfo.StockQuantity = goodsInfo.StockQuantity - editAgoQuantity + info.Quantity;
  391. goodsInfo.PriceTotal = goodsInfo.PriceTotal - editAgoTotalPrice + info.TotalPrice;
  392. goodsInfo.LastUpdateUserId = currUserId;
  393. goodsInfo.LastUpdateTime = DateTime.Now;
  394. var goodsEdit = await _sqlSugar.Updateable(goodsInfo)
  395. .UpdateColumns(x => new
  396. {
  397. x.SQ_Total,
  398. x.StockQuantity,
  399. x.PriceTotal,
  400. x.LastUpdateUserId,
  401. x.LastUpdateTime,
  402. })
  403. .Where(x => x.Id == info.GoodsId)
  404. .ExecuteCommandAsync();
  405. if (goodsEdit > 0)
  406. {
  407. _sqlSugar.CommitTran();
  408. _jv.Msg = $"操作成功!";
  409. _jv.Code = StatusCodes.Status200OK;
  410. return _jv;
  411. }
  412. _sqlSugar.RollbackTran();
  413. _jv.Msg = $"操作失败!";
  414. return _jv;
  415. }
  416. /// <summary>
  417. /// 物品入库 Del
  418. /// </summary>
  419. /// <param name="id"></param>
  420. /// <returns></returns>
  421. public async Task<JsonView> GoodsStorageDel(int id, int userId)
  422. {
  423. var storageInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  424. .Where(x => x.Id == id)
  425. .FirstAsync();
  426. if (storageInfo == null) return _jv;
  427. decimal delAgoQuantity = storageInfo.Quantity,
  428. delAgoTotalPrice = storageInfo.TotalPrice;
  429. var goodsId = storageInfo.GoodsId;
  430. _sqlSugar.BeginTran();
  431. var storageDel = await _sqlSugar.Updateable<Pm_GoodsStorage>()
  432. .SetColumns(x => new Pm_GoodsStorage
  433. {
  434. DeleteUserId = userId,
  435. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  436. IsDel = 1
  437. })
  438. .Where(x => x.Id == id)
  439. .ExecuteCommandAsync();
  440. if (storageDel < 1)
  441. {
  442. _sqlSugar.RollbackTran();
  443. _jv.Msg = $"操作失败!";
  444. return _jv;
  445. }
  446. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().FirstAsync(x => x.Id == goodsId);
  447. goodsInfo.SQ_Total = goodsInfo.SQ_Total - delAgoQuantity;
  448. goodsInfo.StockQuantity = goodsInfo.StockQuantity - delAgoQuantity;
  449. goodsInfo.PriceTotal = goodsInfo.PriceTotal - delAgoTotalPrice;
  450. goodsInfo.LastUpdateUserId = userId;
  451. goodsInfo.LastUpdateTime = DateTime.Now;
  452. var goodsEdit = await _sqlSugar.Updateable(goodsInfo)
  453. .UpdateColumns(x => new
  454. {
  455. x.SQ_Total,
  456. x.StockQuantity,
  457. x.PriceTotal,
  458. x.LastUpdateUserId,
  459. x.LastUpdateTime,
  460. })
  461. .Where(x => x.Id == goodsId)
  462. .ExecuteCommandAsync();
  463. if (goodsEdit > 0)
  464. {
  465. _sqlSugar.CommitTran();
  466. _jv.Msg = $"操作成功!";
  467. _jv.Code = StatusCodes.Status200OK;
  468. return _jv;
  469. }
  470. _sqlSugar.RollbackTran();
  471. _jv.Msg = $"操作失败!";
  472. return _jv;
  473. }
  474. /// <summary>
  475. /// 物品领用列表
  476. /// </summary>
  477. /// <param name="dto"></param>
  478. /// <returns></returns>
  479. public async Task<JsonView> GoodsReceiveList(GoodsReceiveListDTO dto)
  480. {
  481. RefAsync<int> total = 0;
  482. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  483. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  484. .LeftJoin<Sys_Users>((gr, gi, u1) => gr.AuditUserId == u1.Id)
  485. .LeftJoin<Sys_Users>((gr, gi, u1, u2) => gr.CreateUserId == u2.Id)
  486. .Where((gr, gi, u1, u2) => gr.IsDel == 0)
  487. .WhereIF(dto.GoodsId > 0, (gr, gi, u1, u2) => gr.GoodsId == dto.GoodsId)
  488. .WhereIF(dto.GoodsId > 0, (gr, gi, u1, u2) => gr.CreateUserId == dto.CurrUserId)
  489. .Select((gr, gi, u1, u2) => new GoodsReceiveListView
  490. {
  491. Id = gr.Id,
  492. GroupId = gr.GroupId,
  493. GoodsId = gr.GoodsId,
  494. GoodsName = gi.Name,
  495. Quantity = gr.Quantity,
  496. Reason = gr.Reason,
  497. Remark = gr.Remark,
  498. AuditStatus = gr.AuditStatus,
  499. //AuditStatusText = gr.AuditStatus.GetEnumDescription(),
  500. AuditUserId = gr.AuditUserId,
  501. AuditUserName = u1.CnName,
  502. AuditTime = gr.AuditTime,
  503. CreateUserName = u2.CnName,
  504. CreateTime = gr.CreateTime
  505. })
  506. .OrderByDescending(gr => gr.CreateTime)
  507. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  508. _jv.Code = StatusCodes.Status200OK;
  509. _jv.Data = data;
  510. _jv.Count = total;
  511. _jv.Msg = $"操作成功";
  512. return _jv;
  513. }
  514. /// <summary>
  515. /// 物品领用详情
  516. /// </summary>
  517. /// <param name="portType"></param>
  518. /// <param name="id"></param>
  519. /// <returns></returns>
  520. public async Task<JsonView> GoodsReceiveInfo(int portType, int id)
  521. {
  522. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  523. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  524. .LeftJoin<Sys_Users>((gr, gi, u1) => gr.AuditUserId == u1.Id)
  525. .LeftJoin<Sys_Users>((gr, gi, u1, u2) => gr.CreateUserId == u2.Id)
  526. .Where((gr, gi, u1, u2) => gr.IsDel == 0)
  527. .WhereIF(id > 0, (gr, gi, u1, u2) => gr.Id == id)
  528. .Select((gr, gi, u1, u2) => new GoodsReceiveInfoView
  529. {
  530. Id = gr.Id,
  531. GroupId = gr.GroupId,
  532. GoodsId = gr.GoodsId,
  533. GoodsName = gi.Name,
  534. Quantity = gr.Quantity,
  535. Reason = gr.Reason,
  536. Remark = gr.Remark,
  537. GoodsStorageInfo = gr.GoodsStorageInfo,
  538. AuditStatus = gr.AuditStatus,
  539. AuditUserId = gr.AuditUserId,
  540. AuditUserName = u1.CnName,
  541. AuditTime = gr.AuditTime,
  542. CreateUserName = u2.CnName,
  543. CreateTime = gr.CreateTime
  544. })
  545. .FirstAsync();
  546. if (!string.IsNullOrEmpty(data.GoodsStorageInfo))
  547. {
  548. var subData = new List<dynamic>();
  549. try
  550. {
  551. var subData1 = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(data.GoodsStorageInfo);
  552. if (subData1.Count > 0)
  553. {
  554. var storageIds = subData1.Select(x => x.StorageId).ToList();
  555. var storages = await _sqlSugar.Queryable<Pm_GoodsStorage>().Where(x => x.IsDel == 0 && storageIds.Contains(x.Id)) .ToListAsync();
  556. foreach (var item in subData1)
  557. {
  558. var storageInfo = storages.Find(x => x.Id == item.StorageId);
  559. if (storageInfo != null)
  560. {
  561. subData.Add(new
  562. {
  563. BatchNo = storageInfo.BatchNo,
  564. RecsiveQuantity = item.Quantity
  565. });
  566. }
  567. }
  568. data.QuantityInfos = data;
  569. }
  570. }
  571. catch (Exception e)
  572. {
  573. Console.WriteLine(e);
  574. }
  575. }
  576. _jv.Code = StatusCodes.Status200OK;
  577. _jv.Data = data;
  578. _jv.Msg = $"操作成功";
  579. return _jv;
  580. }
  581. /// <summary>
  582. /// 物品领用 OP(Add Or Edit)
  583. /// </summary>
  584. /// <param name="dto"></param>
  585. /// <param name="currUserId"></param>
  586. /// <returns></returns>
  587. public async Task<JsonView> GoodsReceiveOp(GoodsReceiveOpDto dto, int currUserId)
  588. {
  589. var info = _mapper.Map<Pm_GoodsReceive>(dto);
  590. info.CreateUserId = currUserId;
  591. _sqlSugar.BeginTran();
  592. //物品现有库存
  593. var stockQuantity = _sqlSugar.Queryable<Pm_GoodsInfo>()
  594. .First(x => x.Id == info.GoodsId)
  595. ?.StockQuantity;
  596. //待审核 该物品数量
  597. var waitAuditQuantity = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  598. .Where(x => x.IsDel == 0 &&
  599. x.GoodsId == dto.GoodsId &&
  600. x.AuditStatus == GoodsAuditEnum.Pending
  601. )
  602. .SumAsync(x => x.Quantity);
  603. if (info.Id > 0) //修改
  604. {
  605. //审核验证
  606. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>().FirstAsync(x => x.Id == info.Id);
  607. if (selectInfo.AuditStatus == GoodsAuditEnum.Approved)
  608. {
  609. _sqlSugar.RollbackTran();
  610. _jv.Msg = $"该条数据已通过审核,不可更改!";
  611. return _jv;
  612. }
  613. //物品数量验证
  614. var editAfterQuantity = waitAuditQuantity - selectInfo.Quantity + info.Quantity;
  615. if (editAfterQuantity > stockQuantity)
  616. {
  617. _sqlSugar.RollbackTran();
  618. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  619. return _jv;
  620. }
  621. var edit = await _sqlSugar.Updateable(info)
  622. .UpdateColumns(x => new
  623. {
  624. x.GroupId,
  625. x.Quantity,
  626. x.Reason,
  627. x.Remark,
  628. })
  629. .Where(x => x.Id == info.Id)
  630. .ExecuteCommandAsync();
  631. if (edit > 0)
  632. {
  633. _sqlSugar.CommitTran();
  634. _jv.Msg = $"操作成功!";
  635. _jv.Code = StatusCodes.Status200OK;
  636. return _jv;
  637. }
  638. }
  639. else if (info.Id < 1) //添加
  640. {
  641. //物品数量验证
  642. decimal addAgoQuantity = waitAuditQuantity + info.Quantity;
  643. if (addAgoQuantity > stockQuantity)
  644. {
  645. _sqlSugar.RollbackTran();
  646. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  647. return _jv;
  648. }
  649. var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  650. if (add > 0)
  651. {
  652. _sqlSugar.CommitTran();
  653. _jv.Msg = $"操作成功!";
  654. _jv.Code = StatusCodes.Status200OK;
  655. return _jv;
  656. }
  657. }
  658. _sqlSugar.RollbackTran();
  659. return _jv;
  660. }
  661. /// <summary>
  662. /// 物品领用 Audit
  663. /// </summary>
  664. /// <param name="idArray"></param>
  665. /// <param name="userId"></param>
  666. /// <param name="auditEnum"></param>
  667. /// <returns></returns>
  668. public async Task<JsonView> GoodsReceiveAudit(int[] idArray, int userId, GoodsAuditEnum auditEnum)
  669. {
  670. if (idArray.Length < 1) return _jv;
  671. //TODO: 审核权限验证
  672. _sqlSugar.BeginTran();
  673. var receiveInfos = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  674. .Where(x => x.IsDel == 0 && idArray.Contains(x.Id))
  675. .ToListAsync();
  676. var status = true;
  677. foreach (var id in idArray)
  678. {
  679. //1.更改审核状态
  680. var currInfo = receiveInfos.Find(x => x.Id == id);
  681. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  682. .SetColumns(x => new Pm_GoodsReceive()
  683. {
  684. AuditStatus = auditEnum,
  685. AuditUserId = userId,
  686. AuditTime = DateTime.Now,
  687. })
  688. .Where(x => x.Id == id)
  689. .ExecuteCommandAsync();
  690. if (edit < 1) status = false;
  691. if (auditEnum != GoodsAuditEnum.Approved) continue;
  692. //2.更改库存
  693. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().Where(x => x.Id == currInfo.GoodsId).FirstAsync();
  694. goodsInfo.StockQuantity = goodsInfo.StockQuantity - currInfo.Quantity;
  695. goodsInfo.OQ_Total += currInfo.Quantity;
  696. goodsInfo.LastUpdateTime = DateTime.Now;
  697. goodsInfo.LastUpdateUserId = userId;
  698. var editGoods = await _sqlSugar.Updateable<Pm_GoodsInfo>(goodsInfo)
  699. .UpdateColumns(x => new
  700. {
  701. x.StockQuantity,
  702. x.OQ_Total,
  703. x.LastUpdateUserId,
  704. x.LastUpdateTime,
  705. })
  706. .Where(x => x.Id == id)
  707. .ExecuteCommandAsync();
  708. if (editGoods < 1) status = false;
  709. //3.入库批次关联领用人 更改批次库存
  710. var goodsStorages = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  711. .Where(x => x.IsDel == 0 &&
  712. x.GoodsId == currInfo.GoodsId &&
  713. (x.Quantity - x.ReceiveQuantity) > 0
  714. )
  715. .OrderBy(x => x.CreateTime)
  716. .ToListAsync();
  717. var goodsReceiveInfos = new List<GoodsReceiveLinkStorageView>();
  718. var batchStorageInfos = new List<Pm_GoodsStorage>();
  719. var receiveQuantity = 0.00M; //领用总数量
  720. foreach (var storage in goodsStorages)
  721. {
  722. if (currInfo.Quantity == receiveQuantity) break;
  723. var thisBatchSurplusQuantity = storage.Quantity - storage.ReceiveQuantity;
  724. if (thisBatchSurplusQuantity <= 0.00M) continue;
  725. var thisBatchReceiveQuantity = 0.00M; //此批次领用数量
  726. const decimal unit = 0.50M;
  727. while (receiveQuantity < currInfo.Quantity)
  728. {
  729. if (thisBatchSurplusQuantity == thisBatchReceiveQuantity) break;
  730. thisBatchReceiveQuantity += unit;
  731. receiveQuantity += unit;
  732. }
  733. goodsReceiveInfos.Add(new GoodsReceiveLinkStorageView
  734. {
  735. StorageId = storage.Id,
  736. Quantity = thisBatchReceiveQuantity
  737. });
  738. storage.ReceiveQuantity += thisBatchReceiveQuantity;
  739. var storageUpd = storage;
  740. //storageUpd.ReceiveQuantity += thisBatchReceiveQuantity;
  741. batchStorageInfos.Add(storageUpd);
  742. }
  743. //3.1 更改批次库存
  744. if (goodsReceiveInfos.Count > 0)
  745. {
  746. var edit1 = await _sqlSugar.Updateable(batchStorageInfos)
  747. .UpdateColumns(x => x.ReceiveQuantity)
  748. .WhereColumns(x => x.Id)
  749. .ExecuteCommandAsync();
  750. if (edit1 < 1) status = false;
  751. }
  752. //3.2 添加入库批次关联领用人
  753. if (goodsReceiveInfos.Count > 0)
  754. {
  755. var edit1 = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  756. .SetColumns(x => new Pm_GoodsReceive()
  757. {
  758. GoodsStorageInfo = JsonConvert.SerializeObject(goodsReceiveInfos)
  759. })
  760. .Where(x => x.Id == id)
  761. .ExecuteCommandAsync();
  762. if (edit1 < 1) status = false;
  763. }
  764. }
  765. if (status)
  766. {
  767. _sqlSugar.CommitTran();
  768. _jv.Msg = $"操作成功!";
  769. _jv.Code = StatusCodes.Status200OK;
  770. return _jv;
  771. }
  772. _sqlSugar.RollbackTran();
  773. return _jv;
  774. }
  775. /// <summary>
  776. /// 物品领用 Del
  777. /// </summary>
  778. /// <param name="id"></param>
  779. /// <param name="currUserId"></param>
  780. /// <returns></returns>
  781. public async Task<JsonView> GoodsReceiveDel(int id, int currUserId)
  782. {
  783. var receiveInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  784. .Where(x => x.IsDel == 0 && x.Id == id)
  785. .FirstAsync();
  786. if (receiveInfo.AuditStatus == GoodsAuditEnum.Approved)
  787. {
  788. _jv.Msg = $"该条数据已通过审核,不可删除!";
  789. return _jv;
  790. }
  791. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  792. .UpdateColumns(x => new Pm_GoodsReceive()
  793. {
  794. IsDel = 1,
  795. DeleteUserId = currUserId,
  796. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  797. })
  798. .Where(x => x.Id == id)
  799. .ExecuteCommandAsync();
  800. if (edit > 0)
  801. {
  802. _jv.Msg = $"操作成功!";
  803. _jv.Code = StatusCodes.Status200OK;
  804. return _jv;
  805. }
  806. return _jv;
  807. }
  808. }
  809. }