GoodsRepository.cs 34 KB

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