GoodsRepository.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  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. .WhereIF(!string.IsNullOrEmpty(dto.BatchNo), (gs, gi, u, u1) => gs.BatchNo.Contains(dto.BatchNo))
  268. .Select((gs, gi, u, u1) => new
  269. {
  270. gs.Id,
  271. gs.GoodsId,
  272. gs.BatchNo,
  273. GoodsName = gi.Name,
  274. gs.Quantity,
  275. gs.ReceiveQuantity,
  276. QuantityStatusText = gs.Quantity - gs.ReceiveQuantity == 0 ? "已领用完" : "-",
  277. gs.UnitPrice,
  278. gs.TotalPrice,
  279. gs.SupplierName,
  280. gs.SupplierTel,
  281. gs.SupplierAddress,
  282. gs.SupplierSource,
  283. StorageUserName = u1.CnName,
  284. gs.StorageTime,
  285. CreateUserName = u.CnName,
  286. gs.CreateTime,
  287. })
  288. .OrderByDescending(gs => gs.CreateTime)
  289. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  290. _jv.Code = StatusCodes.Status200OK;
  291. _jv.Data = data;
  292. _jv.Count = total;
  293. _jv.Msg = $"操作成功";
  294. return _jv;
  295. }
  296. /// <summary>
  297. /// 物品入库详情
  298. /// </summary>
  299. /// <param name="id"></param>
  300. /// <returns></returns>
  301. public async Task<JsonView> GoodsStorageInfo(int portType, int id)
  302. {
  303. var data = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  304. .LeftJoin<Pm_GoodsInfo>((gs, gi) => gs.GoodsId == gi.Id)
  305. .LeftJoin<Sys_Users>((gs, gi, u) => gs.CreateUserId == u.Id)
  306. .LeftJoin<Sys_Users>((gs, gi, u, u1) => gs.StorageUserId == u1.Id)
  307. .Where((gs, gi, u) => gs.IsDel == 0)
  308. .WhereIF(id > 0, (gs, gi, u) => gs.Id == id)
  309. .Select((gs, gi, u, u1) => new
  310. {
  311. gs.Id,
  312. gs.GoodsId,
  313. GoodsName = gi.Name,
  314. gs.Quantity,
  315. gs.UnitPrice,
  316. gs.TotalPrice,
  317. gs.SupplierName,
  318. gs.SupplierTel,
  319. gs.SupplierAddress,
  320. gs.SupplierSource,
  321. gs.ReceiveQuantity,
  322. gs.StorageUserId,
  323. StorageUser = u1.CnName,
  324. gs.StorageTime,
  325. CreateUserName = u.CnName,
  326. gs.CreateUserId,
  327. gs.CreateTime,
  328. gs.Remark
  329. })
  330. .FirstAsync();
  331. _jv.Msg = $"操作成功!";
  332. _jv.Code = StatusCodes.Status200OK;
  333. _jv.Data = data;
  334. return _jv;
  335. }
  336. /// <summary>
  337. /// 物品入库 操作(Create Or Edit)
  338. /// </summary>
  339. /// <param name="dto"></param>
  340. /// <param name="currUserId"></param>
  341. /// <returns></returns>
  342. public async Task<JsonView> GoodsStorageOp(GoodsStorageOpDto dto, int currUserId)
  343. {
  344. var info = _mapper.Map<Pm_GoodsStorage>(dto);
  345. info.CreateUserId = currUserId;
  346. info.BatchNo = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  347. decimal editAgoQuantity = 0.00M,
  348. editAgoTotalPrice = 0.00M;
  349. _sqlSugar.BeginTran();
  350. if (info.Id > 0) //修改
  351. {
  352. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  353. .Where(x => x.Id == dto.Id)
  354. .FirstAsync();
  355. editAgoQuantity = selectInfo.Quantity;
  356. editAgoTotalPrice = selectInfo.TotalPrice;
  357. var storageEdit = await _sqlSugar.Updateable(info)
  358. .UpdateColumns(x => new
  359. {
  360. x.Quantity,
  361. x.UnitPrice,
  362. x.TotalPrice,
  363. x.SupplierName,
  364. x.SupplierTel,
  365. x.SupplierAddress,
  366. x.SupplierSource,
  367. x.StorageUserId,
  368. x.StorageTime
  369. })
  370. .Where(x => x.Id == dto.Id)
  371. .ExecuteCommandAsync();
  372. if (storageEdit < 1)
  373. {
  374. _sqlSugar.RollbackTran();
  375. _jv.Msg = $"修改失败!";
  376. return _jv;
  377. }
  378. }
  379. else if (info.Id < 1) //添加
  380. {
  381. var storageAdd = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  382. if (storageAdd < 1)
  383. {
  384. _sqlSugar.RollbackTran();
  385. _jv.Msg = $"添加失败!";
  386. return _jv;
  387. }
  388. }
  389. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().FirstAsync(x => x.Id == info.GoodsId);
  390. goodsInfo.SQ_Total = goodsInfo.SQ_Total - editAgoQuantity + info.Quantity;
  391. goodsInfo.StockQuantity = goodsInfo.StockQuantity - editAgoQuantity + info.Quantity;
  392. goodsInfo.PriceTotal = goodsInfo.PriceTotal - editAgoTotalPrice + info.TotalPrice;
  393. goodsInfo.LastUpdateUserId = currUserId;
  394. goodsInfo.LastUpdateTime = DateTime.Now;
  395. var goodsEdit = await _sqlSugar.Updateable(goodsInfo)
  396. .UpdateColumns(x => new
  397. {
  398. x.SQ_Total,
  399. x.StockQuantity,
  400. x.PriceTotal,
  401. x.LastUpdateUserId,
  402. x.LastUpdateTime,
  403. })
  404. .Where(x => x.Id == info.GoodsId)
  405. .ExecuteCommandAsync();
  406. if (goodsEdit > 0)
  407. {
  408. _sqlSugar.CommitTran();
  409. _jv.Msg = $"操作成功!";
  410. _jv.Code = StatusCodes.Status200OK;
  411. return _jv;
  412. }
  413. _sqlSugar.RollbackTran();
  414. _jv.Msg = $"操作失败!";
  415. return _jv;
  416. }
  417. /// <summary>
  418. /// 物品入库 Del
  419. /// </summary>
  420. /// <param name="id"></param>
  421. /// <returns></returns>
  422. public async Task<JsonView> GoodsStorageDel(int id, int userId)
  423. {
  424. var storageInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  425. .Where(x => x.Id == id)
  426. .FirstAsync();
  427. if (storageInfo == null) return _jv;
  428. decimal delAgoQuantity = storageInfo.Quantity,
  429. delAgoTotalPrice = storageInfo.TotalPrice;
  430. var goodsId = storageInfo.GoodsId;
  431. _sqlSugar.BeginTran();
  432. var storageDel = await _sqlSugar.Updateable<Pm_GoodsStorage>()
  433. .SetColumns(x => new Pm_GoodsStorage
  434. {
  435. DeleteUserId = userId,
  436. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  437. IsDel = 1
  438. })
  439. .Where(x => x.Id == id)
  440. .ExecuteCommandAsync();
  441. if (storageDel < 1)
  442. {
  443. _sqlSugar.RollbackTran();
  444. _jv.Msg = $"操作失败!";
  445. return _jv;
  446. }
  447. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().FirstAsync(x => x.Id == goodsId);
  448. goodsInfo.SQ_Total = goodsInfo.SQ_Total - delAgoQuantity;
  449. goodsInfo.StockQuantity = goodsInfo.StockQuantity - delAgoQuantity;
  450. goodsInfo.PriceTotal = goodsInfo.PriceTotal - delAgoTotalPrice;
  451. goodsInfo.LastUpdateUserId = userId;
  452. goodsInfo.LastUpdateTime = DateTime.Now;
  453. var goodsEdit = await _sqlSugar.Updateable(goodsInfo)
  454. .UpdateColumns(x => new
  455. {
  456. x.SQ_Total,
  457. x.StockQuantity,
  458. x.PriceTotal,
  459. x.LastUpdateUserId,
  460. x.LastUpdateTime,
  461. })
  462. .Where(x => x.Id == goodsId)
  463. .ExecuteCommandAsync();
  464. if (goodsEdit > 0)
  465. {
  466. _sqlSugar.CommitTran();
  467. _jv.Msg = $"操作成功!";
  468. _jv.Code = StatusCodes.Status200OK;
  469. return _jv;
  470. }
  471. _sqlSugar.RollbackTran();
  472. _jv.Msg = $"操作失败!";
  473. return _jv;
  474. }
  475. /// <summary>
  476. /// 物品领用列表
  477. /// </summary>
  478. /// <param name="dto"></param>
  479. /// <returns></returns>
  480. public async Task<JsonView> GoodsReceiveList(GoodsReceiveListDTO dto)
  481. {
  482. RefAsync<int> total = 0;
  483. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  484. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  485. .LeftJoin<Sys_Users>((gr, gi, u1) => gr.AuditUserId == u1.Id)
  486. .LeftJoin<Sys_Users>((gr, gi, u1, u2) => gr.CreateUserId == u2.Id)
  487. .Where((gr, gi, u1, u2) => gr.IsDel == 0)
  488. .WhereIF(dto.GoodsId > 0, (gr, gi, u1, u2) => gr.GoodsId == dto.GoodsId)
  489. .WhereIF(dto.CurrUserId > 0, (gr, gi, u1, u2) => gr.CreateUserId == dto.CurrUserId)
  490. .Select((gr, gi, u1, u2) => new GoodsReceiveListView
  491. {
  492. Id = gr.Id,
  493. GroupId = gr.GroupId,
  494. GoodsId = gr.GoodsId,
  495. GoodsName = gi.Name,
  496. Quantity = gr.Quantity,
  497. Reason = gr.Reason,
  498. Remark = gr.Remark,
  499. AuditStatus = gr.AuditStatus,
  500. //AuditStatusText = gr.AuditStatus.GetEnumDescription(),
  501. AuditUserId = gr.AuditUserId,
  502. AuditUserName = u1.CnName,
  503. AuditTime = gr.AuditTime,
  504. CreateUserName = u2.CnName,
  505. CreateTime = gr.CreateTime
  506. })
  507. .OrderByDescending(gr => gr.CreateTime)
  508. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  509. _jv.Code = StatusCodes.Status200OK;
  510. _jv.Data = data;
  511. _jv.Count = total;
  512. _jv.Msg = $"操作成功";
  513. return _jv;
  514. }
  515. /// <summary>
  516. /// 物品领用详情
  517. /// </summary>
  518. /// <param name="portType"></param>
  519. /// <param name="id"></param>
  520. /// <returns></returns>
  521. public async Task<JsonView> GoodsReceiveInfo(int portType, int id)
  522. {
  523. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  524. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  525. .LeftJoin<Sys_Users>((gr, gi, u1) => gr.AuditUserId == u1.Id)
  526. .LeftJoin<Sys_Users>((gr, gi, u1, u2) => gr.CreateUserId == u2.Id)
  527. .Where((gr, gi, u1, u2) => gr.IsDel == 0)
  528. .WhereIF(id > 0, (gr, gi, u1, u2) => gr.Id == id)
  529. .Select((gr, gi, u1, u2) => new GoodsReceiveInfoView
  530. {
  531. Id = gr.Id,
  532. GroupId = gr.GroupId,
  533. GoodsId = gr.GoodsId,
  534. GoodsName = gi.Name,
  535. Quantity = gr.Quantity,
  536. Reason = gr.Reason,
  537. Remark = gr.Remark,
  538. GoodsStorageInfo = gr.GoodsStorageInfo,
  539. AuditStatus = gr.AuditStatus,
  540. AuditUserId = gr.AuditUserId,
  541. AuditUserName = u1.CnName,
  542. AuditTime = gr.AuditTime,
  543. CreateUserName = u2.CnName,
  544. CreateTime = gr.CreateTime
  545. })
  546. .FirstAsync();
  547. if (!string.IsNullOrEmpty(data.GoodsStorageInfo))
  548. {
  549. var subData = new List<dynamic>();
  550. try
  551. {
  552. var subData1 = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(data.GoodsStorageInfo);
  553. if (subData1.Count > 0)
  554. {
  555. var storageIds = subData1.Select(x => x.StorageId).ToList();
  556. var storages = await _sqlSugar.Queryable<Pm_GoodsStorage>().Where(x => x.IsDel == 0 && storageIds.Contains(x.Id)).ToListAsync();
  557. foreach (var item in subData1)
  558. {
  559. var storageInfo = storages.Find(x => x.Id == item.StorageId);
  560. if (storageInfo != null)
  561. {
  562. subData.Add(new
  563. {
  564. StorageId = item.StorageId,
  565. BatchNo = storageInfo.BatchNo,
  566. RecsiveQuantity = item.Quantity
  567. });
  568. }
  569. }
  570. data.QuantityInfos = subData;
  571. }
  572. }
  573. catch (Exception e)
  574. {
  575. Console.WriteLine(e);
  576. }
  577. }
  578. _jv.Code = StatusCodes.Status200OK;
  579. _jv.Data = data;
  580. _jv.Msg = $"操作成功";
  581. return _jv;
  582. }
  583. /// <summary>
  584. /// 物品领用 OP(Add Or Edit)
  585. /// </summary>
  586. /// <param name="dto"></param>
  587. /// <param name="currUserId"></param>
  588. /// <returns></returns>
  589. public async Task<JsonView> GoodsReceiveOp(GoodsReceiveOpDto dto, int currUserId)
  590. {
  591. var info = _mapper.Map<Pm_GoodsReceive>(dto);
  592. info.CreateUserId = currUserId;
  593. _sqlSugar.BeginTran();
  594. //物品现有库存
  595. var stockQuantity = _sqlSugar.Queryable<Pm_GoodsInfo>()
  596. .First(x => x.Id == info.GoodsId)
  597. ?.StockQuantity;
  598. //待审核 该物品数量
  599. var waitAuditQuantity = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  600. .Where(x => x.IsDel == 0 &&
  601. x.GoodsId == dto.GoodsId &&
  602. x.AuditStatus == GoodsAuditEnum.Pending
  603. )
  604. .SumAsync(x => x.Quantity);
  605. if (info.Id > 0) //修改
  606. {
  607. //审核验证
  608. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>().FirstAsync(x => x.Id == info.Id);
  609. if (selectInfo.AuditStatus == GoodsAuditEnum.Approved)
  610. {
  611. _sqlSugar.RollbackTran();
  612. _jv.Msg = $"该条数据已通过审核,不可更改!";
  613. return _jv;
  614. }
  615. //物品数量验证
  616. var editAfterQuantity = waitAuditQuantity - selectInfo.Quantity + info.Quantity;
  617. if (editAfterQuantity > stockQuantity)
  618. {
  619. _sqlSugar.RollbackTran();
  620. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  621. return _jv;
  622. }
  623. var edit = await _sqlSugar.Updateable(info)
  624. .UpdateColumns(x => new
  625. {
  626. x.GroupId,
  627. x.Quantity,
  628. x.Reason,
  629. x.Remark,
  630. })
  631. .Where(x => x.Id == info.Id)
  632. .ExecuteCommandAsync();
  633. if (edit > 0)
  634. {
  635. _sqlSugar.CommitTran();
  636. _jv.Msg = $"操作成功!";
  637. _jv.Code = StatusCodes.Status200OK;
  638. return _jv;
  639. }
  640. }
  641. else if (info.Id < 1) //添加
  642. {
  643. //物品数量验证
  644. decimal addAgoQuantity = waitAuditQuantity + info.Quantity;
  645. if (addAgoQuantity > stockQuantity)
  646. {
  647. _sqlSugar.RollbackTran();
  648. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  649. return _jv;
  650. }
  651. var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  652. if (add > 0)
  653. {
  654. _sqlSugar.CommitTran();
  655. _jv.Msg = $"操作成功!";
  656. _jv.Code = StatusCodes.Status200OK;
  657. return _jv;
  658. }
  659. }
  660. _sqlSugar.RollbackTran();
  661. return _jv;
  662. }
  663. /// <summary>
  664. /// 物品领用 Audit
  665. /// </summary>
  666. /// <param name="idArray"></param>
  667. /// <param name="userId"></param>
  668. /// <param name="auditEnum"></param>
  669. /// <returns></returns>
  670. public async Task<JsonView> GoodsReceiveAudit(int[] idArray, int userId, GoodsAuditEnum auditEnum)
  671. {
  672. if (idArray.Length < 1) return _jv;
  673. //TODO: 审核权限验证
  674. _sqlSugar.BeginTran();
  675. var receiveInfos = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  676. .Where(x => x.IsDel == 0 && idArray.Contains(x.Id))
  677. .ToListAsync();
  678. var status = true;
  679. foreach (var id in idArray)
  680. {
  681. //1.更改审核状态
  682. var currInfo = receiveInfos.Find(x => x.Id == id);
  683. if (currInfo == null) continue;
  684. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  685. .SetColumns(x => new Pm_GoodsReceive()
  686. {
  687. AuditStatus = auditEnum,
  688. AuditUserId = userId,
  689. AuditTime = DateTime.Now,
  690. })
  691. .Where(x => x.Id == id)
  692. .ExecuteCommandAsync();
  693. if (edit < 1) status = false;
  694. //if (auditEnum != GoodsAuditEnum.Approved) continue;
  695. //2.更改库存
  696. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().Where(x => x.Id == currInfo.GoodsId).FirstAsync();
  697. if (auditEnum == GoodsAuditEnum.Pending)
  698. {
  699. goodsInfo.StockQuantity += currInfo.Quantity;
  700. goodsInfo.OQ_Total -= currInfo.Quantity;
  701. }
  702. else if (auditEnum == GoodsAuditEnum.Approved)
  703. {
  704. goodsInfo.StockQuantity -= currInfo.Quantity;
  705. goodsInfo.OQ_Total += currInfo.Quantity;
  706. }else if(auditEnum == GoodsAuditEnum.UnApproved) continue;
  707. goodsInfo.LastUpdateTime = DateTime.Now;
  708. goodsInfo.LastUpdateUserId = userId;
  709. var editGoods = await _sqlSugar.Updateable<Pm_GoodsInfo>(goodsInfo)
  710. .UpdateColumns(x => new
  711. {
  712. x.StockQuantity,
  713. x.OQ_Total,
  714. x.LastUpdateUserId,
  715. x.LastUpdateTime,
  716. })
  717. .Where(x => x.Id == currInfo.GoodsId)
  718. .ExecuteCommandAsync();
  719. if (editGoods < 1) status = false;
  720. //3.入库批次关联领用人 更改批次库存
  721. var goodsStorages = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  722. .Where(x => x.IsDel == 0 &&
  723. x.GoodsId == currInfo.GoodsId &&
  724. (x.Quantity - x.ReceiveQuantity) > 0
  725. )
  726. .OrderBy(x => x.CreateTime)
  727. .ToListAsync();
  728. var goodsReceiveInfos = new List<GoodsReceiveLinkStorageView>();
  729. var batchStorageInfos = new List<Pm_GoodsStorage>();
  730. var receiveQuantity = 0.00M; //领用总数量
  731. if (auditEnum == GoodsAuditEnum.Approved)
  732. {
  733. foreach (var storage in goodsStorages)
  734. {
  735. if (currInfo.Quantity == receiveQuantity) break;
  736. var thisBatchSurplusQuantity = storage.Quantity - storage.ReceiveQuantity;
  737. if (thisBatchSurplusQuantity <= 0.00M) continue;
  738. var thisBatchReceiveQuantity = 0.00M; //此批次领用数量
  739. const decimal unit = 0.50M;
  740. while (receiveQuantity < currInfo.Quantity)
  741. {
  742. if (thisBatchSurplusQuantity == thisBatchReceiveQuantity) break;
  743. thisBatchReceiveQuantity += unit;
  744. receiveQuantity += unit;
  745. }
  746. goodsReceiveInfos.Add(new GoodsReceiveLinkStorageView
  747. {
  748. StorageId = storage.Id,
  749. Quantity = thisBatchReceiveQuantity
  750. });
  751. storage.ReceiveQuantity += thisBatchReceiveQuantity;
  752. var storageUpd = storage;
  753. //storageUpd.ReceiveQuantity += thisBatchReceiveQuantity;
  754. batchStorageInfos.Add(storageUpd);
  755. }
  756. //3.1 更改批次库存
  757. if (goodsReceiveInfos.Count > 0)
  758. {
  759. var edit1 = await _sqlSugar.Updateable(batchStorageInfos)
  760. .UpdateColumns(x => x.ReceiveQuantity)
  761. .WhereColumns(x => x.Id)
  762. .ExecuteCommandAsync();
  763. if (edit1 < 1) status = false;
  764. }
  765. //3.2 添加入库批次关联领用人
  766. if (goodsReceiveInfos.Count > 0)
  767. {
  768. var edit1 = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  769. .SetColumns(x => new Pm_GoodsReceive()
  770. {
  771. GoodsStorageInfo = JsonConvert.SerializeObject(goodsReceiveInfos)
  772. })
  773. .Where(x => x.Id == id)
  774. .ExecuteCommandAsync();
  775. if (edit1 < 1) status = false;
  776. }
  777. }
  778. else if (auditEnum == GoodsAuditEnum.Pending)
  779. {
  780. var goodsStorageInfo = currInfo.GoodsStorageInfo;
  781. if (!string.IsNullOrEmpty(goodsStorageInfo))
  782. {
  783. var goodsStorageInfos = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(goodsStorageInfo);
  784. if (goodsStorageInfos.Count > 0)
  785. {
  786. foreach (var item in goodsStorageInfos)
  787. {
  788. var newStorageInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  789. .Where(x => x.IsDel == 0 && x.Id == item.StorageId)
  790. .FirstAsync();
  791. if (newStorageInfo != null)
  792. {
  793. var newEdit = await _sqlSugar.Updateable(newStorageInfo)
  794. .ReSetValue(x => x.ReceiveQuantity = x.ReceiveQuantity - item.Quantity)
  795. .ExecuteCommandAsync();
  796. if (newEdit < 1) status = false;
  797. }
  798. }
  799. }
  800. }
  801. }
  802. }
  803. if (status)
  804. {
  805. _sqlSugar.CommitTran();
  806. _jv.Msg = $"操作成功!";
  807. _jv.Code = StatusCodes.Status200OK;
  808. return _jv;
  809. }
  810. _sqlSugar.RollbackTran();
  811. return _jv;
  812. }
  813. /// <summary>
  814. /// 物品领用 Del
  815. /// </summary>
  816. /// <param name="id"></param>
  817. /// <param name="currUserId"></param>
  818. /// <returns></returns>
  819. public async Task<JsonView> GoodsReceiveDel(int id, int currUserId)
  820. {
  821. var receiveInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  822. .Where(x => x.IsDel == 0 && x.Id == id)
  823. .FirstAsync();
  824. if (receiveInfo.AuditStatus == GoodsAuditEnum.Approved)
  825. {
  826. _jv.Msg = $"该条数据已通过审核,不可删除!";
  827. return _jv;
  828. }
  829. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  830. .SetColumns(x => new Pm_GoodsReceive()
  831. {
  832. IsDel = 1,
  833. DeleteUserId = currUserId,
  834. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  835. })
  836. .Where(x => x.Id == id)
  837. .ExecuteCommandAsync();
  838. if (edit > 0)
  839. {
  840. _jv.Msg = $"操作成功!";
  841. _jv.Code = StatusCodes.Status200OK;
  842. return _jv;
  843. }
  844. return _jv;
  845. }
  846. }
  847. }