GoodsRepository.cs 40 KB

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