GoodsRepository.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981
  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. using System.Drawing;
  8. namespace OASystem.Infrastructure.Repositories.PersonnelModule
  9. {
  10. /// <summary>
  11. /// 物品进销存
  12. /// 仓储
  13. /// </summary>
  14. public class GoodsRepository : BaseRepository<Pm_GoodsInfo, GoodsInfoView>
  15. {
  16. private readonly IMapper _mapper;
  17. private JsonView _jv;
  18. public GoodsRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
  19. {
  20. _mapper = mapper;
  21. _jv = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = "操作失败!" };
  22. }
  23. /// <summary>
  24. /// 基础数据
  25. /// </summary>
  26. /// <returns></returns>
  27. public async Task<JsonView> InitDataSource()
  28. {
  29. var typeData = await _sqlSugar.Queryable<GoodsTypeView>()
  30. .Includes(x => x.SubTypeItems.Where(z => z.IsDel == 0)
  31. //.Select(z => new {
  32. // z.Id,
  33. // z.STid,
  34. // z.Name
  35. //})
  36. .ToList())
  37. .Where(x => x.IsDel == 0 &&
  38. x.Remark.Equals("GoodsType"))
  39. //.Select(x => new {
  40. // x.Id,
  41. // x.Name,
  42. // x.SubTypeItems
  43. //})
  44. .ToListAsync();
  45. var groupData = await _sqlSugar.Queryable<Grp_DelegationInfo>()
  46. .Where(x => x.IsDel == 0)
  47. .Select(x => new
  48. {
  49. id = x.Id,
  50. groupName = x.TeamName
  51. })
  52. .OrderByDescending(x => x.id)
  53. .ToListAsync();
  54. var userData = await _sqlSugar.Queryable<Sys_Users>()
  55. .Where(x => x.IsDel == 0)
  56. .Select(x => new
  57. {
  58. x.Id,
  59. UserName = x.CnName,
  60. })
  61. .ToListAsync();
  62. _jv.Code = StatusCodes.Status200OK;
  63. _jv.Data = new { goodsTypeData = typeData, groupNameData = groupData, userNameData = userData };
  64. _jv.Msg = $"操作成功";
  65. return _jv;
  66. }
  67. /// <summary>
  68. /// 物品列表
  69. /// </summary>
  70. /// <param name="dto"></param>
  71. /// <returns></returns>
  72. public async Task<JsonView> GoodsList(GoodsListDto dto)
  73. {
  74. var ids = new List<int>();
  75. if (!string.IsNullOrEmpty(dto.TypeIds))
  76. {
  77. var strArray = dto.TypeIds.Split(',');
  78. foreach (var str in strArray)
  79. {
  80. if (int.TryParse(str, out int id))
  81. {
  82. ids.Add(id);
  83. }
  84. }
  85. }
  86. RefAsync<int> total = 0;
  87. var data = await _sqlSugar.Queryable<Pm_GoodsInfo>()
  88. .LeftJoin<Sys_SetData>((gi, sd) => gi.Type == sd.Id)
  89. .LeftJoin<Sys_Users>((gi, sd, u) => gi.LastUpdateUserId == u.Id)
  90. .Where((gi, sd, u) => gi.IsDel == 0)
  91. .WhereIF(ids.Count > 0, (gi, sd, u) => ids.Contains(gi.Type))
  92. .WhereIF(!string.IsNullOrEmpty(dto.GoodsName), (gi, sd, u) => gi.Name.Contains(dto.GoodsName))
  93. .Select((gi, sd, u) => new
  94. {
  95. gi.Id,
  96. gi.Name,
  97. gi.Type,
  98. TypeName = sd.Name,
  99. gi.StockQuantity,
  100. LastUpdateUserName = u.CnName,
  101. gi.LastUpdateTime,
  102. gi.Remark,
  103. })
  104. .OrderByDescending(gi => gi.LastUpdateTime)
  105. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  106. _jv.Code = StatusCodes.Status200OK;
  107. _jv.Data = data;
  108. _jv.Count = total;
  109. _jv.Msg = $"操作成功";
  110. return _jv;
  111. }
  112. /// <summary>
  113. /// 物品Info
  114. /// </summary>
  115. /// <param name="portType"></param>
  116. /// <param name="id"></param>
  117. /// <returns></returns>
  118. public async Task<JsonView> GoodsInfo(int portType, int id)
  119. {
  120. var data = await _sqlSugar.Queryable<Pm_GoodsInfo>()
  121. .LeftJoin<Sys_SetData>((gi, sd) => gi.Type == sd.Id)
  122. .LeftJoin<Sys_Users>((gi, sd, u1) => gi.LastUpdateUserId == u1.Id)
  123. .LeftJoin<Sys_Users>((gi, sd, u1, u2) => gi.CreateUserId == u2.Id)
  124. .Where((gi, sd, u1, u2) => gi.IsDel == 0 && gi.Id == id)
  125. .Select((gi, sd, u1, u2) => new
  126. {
  127. gi.Id,
  128. gi.Name,
  129. ParentType = sd.STid,
  130. gi.Type,
  131. TypeName = sd.Name,
  132. gi.SQ_Total,
  133. gi.OQ_Total,
  134. gi.PriceTotal,
  135. gi.StockQuantity,
  136. gi.Remark,
  137. LastUpdateUserName = u1.CnName,
  138. gi.LastUpdateTime,
  139. CreateUserName = u2.CnName,
  140. gi.CreateTime,
  141. })
  142. .FirstAsync();
  143. _jv.Code = StatusCodes.Status200OK;
  144. _jv.Data = data;
  145. _jv.Msg = $"操作成功";
  146. return _jv;
  147. }
  148. /// <summary>
  149. /// 物品 OP(Create Or Edit)
  150. /// </summary>
  151. /// <param name="dto"></param>
  152. /// <param name="currUserId"></param>
  153. /// <returns></returns>
  154. public async Task<JsonView> GoodsOp(GoodsOpDto dto, int currUserId)
  155. {
  156. var info = new Pm_GoodsInfo()
  157. {
  158. Id = dto.Id,
  159. Name = dto.Name,
  160. Type = dto.Type,
  161. SQ_Total = 0,
  162. OQ_Total = 0,
  163. PriceTotal = 0,
  164. StockQuantity = 0,
  165. Remark = dto.Remark,
  166. LastUpdateUserId = currUserId,
  167. LastUpdateTime = DateTime.Now,
  168. CreateUserId = currUserId
  169. };
  170. if (dto.Id > 0) //Edit
  171. {
  172. var upd = await _sqlSugar.Updateable(info)
  173. .UpdateColumns(x => new
  174. {
  175. x.Name,
  176. x.Type,
  177. x.Remark,
  178. x.LastUpdateUserId,
  179. x.LastUpdateTime,
  180. })
  181. .ExecuteCommandAsync();
  182. if (upd > 0)
  183. {
  184. _jv.Msg = $"修改成功!";
  185. _jv.Code = StatusCodes.Status200OK;
  186. return _jv;
  187. }
  188. }
  189. else if (dto.Id < 1) //添加
  190. {
  191. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().FirstAsync(x => x.Name.Equals(info.Name));
  192. if (selectInfo != null)
  193. {
  194. _jv.Msg = $"“{info.Name}”该物品已存在,请勿重新添加!";
  195. return _jv;
  196. }
  197. var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  198. if (add > 0)
  199. {
  200. _jv.Msg = $"添加成功!";
  201. _jv.Code = StatusCodes.Status200OK;
  202. return _jv;
  203. }
  204. }
  205. return _jv;
  206. }
  207. /// <summary>
  208. /// 物品 Del
  209. /// </summary>
  210. /// <param name="id"></param>
  211. /// <param name="currUserId"></param>
  212. /// <returns></returns>
  213. public async Task<JsonView> GoodsDel(int id, int currUserId)
  214. {
  215. _sqlSugar.BeginTran();
  216. var goods = await _sqlSugar.Updateable<Pm_GoodsInfo>()
  217. .SetColumns(x => new Pm_GoodsInfo()
  218. {
  219. IsDel = 1,
  220. DeleteUserId = currUserId,
  221. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  222. })
  223. .Where(x => x.Id == id)
  224. .ExecuteCommandAsync();
  225. if (goods < 1)
  226. {
  227. _sqlSugar.RollbackTran();
  228. _jv.Msg = $"操作失败";
  229. return _jv;
  230. }
  231. var goodsStorage = await _sqlSugar.Updateable<Pm_GoodsStorage>()
  232. .SetColumns(x => new Pm_GoodsStorage()
  233. {
  234. IsDel = 1,
  235. DeleteUserId = currUserId,
  236. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  237. })
  238. .Where(x => x.Id == id)
  239. .ExecuteCommandAsync();
  240. var goodsReceive = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  241. .SetColumns(x => new Pm_GoodsReceive()
  242. {
  243. IsDel = 1,
  244. DeleteUserId = currUserId,
  245. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  246. })
  247. .Where(x => x.Id == id)
  248. .ExecuteCommandAsync();
  249. _sqlSugar.CommitTran();
  250. _jv.Code = StatusCodes.Status200OK;
  251. _jv.Msg = $"操作成功!";
  252. return _jv;
  253. }
  254. /// <summary>
  255. /// 物品入库列表
  256. /// </summary>
  257. /// <param name="dto"></param>
  258. /// <returns></returns>
  259. public async Task<JsonView> GoodsStorageList(GoodsStorageListDto dto)
  260. {
  261. RefAsync<int> total = 0;
  262. var data = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  263. .LeftJoin<Pm_GoodsInfo>((gs, gi) => gs.GoodsId == gi.Id)
  264. .LeftJoin<Sys_Users>((gs, gi, u) => gs.CreateUserId == u.Id)
  265. .LeftJoin<Sys_Users>((gs, gi, u, u1) => gs.StorageUserId == u1.Id)
  266. .Where((gs, gi, u, u1) => gs.IsDel == 0)
  267. .WhereIF(dto.GoodsId > 0, (gs, gi, u, u1) => gs.GoodsId == dto.GoodsId)
  268. .WhereIF(!string.IsNullOrEmpty(dto.BatchNo), (gs, gi, u, u1) => gs.BatchNo.Contains(dto.BatchNo))
  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. //参数处理
  482. int[] typeLabel = Array.Empty<int>(),
  483. userLabel = Array.Empty<int>(),
  484. auditLabel = Array.Empty<int>(),
  485. groupLabel = Array.Empty<int>();
  486. if (!string.IsNullOrEmpty(dto.TypeLabel))
  487. {
  488. typeLabel = dto.TypeLabel
  489. .Split(',')
  490. .Select(x =>
  491. {
  492. if (int.TryParse(x, out var id)) return id;
  493. return id;
  494. })
  495. .ToArray();
  496. }
  497. if (!string.IsNullOrEmpty(dto.UserLabel))
  498. {
  499. userLabel = dto.UserLabel
  500. .Split(',')
  501. .Select(x =>
  502. {
  503. if (int.TryParse(x, out var id)) return id;
  504. return id;
  505. })
  506. .ToArray();
  507. }
  508. if (!string.IsNullOrEmpty(dto.AuditLabel))
  509. {
  510. auditLabel = dto.AuditLabel
  511. .Split(',')
  512. .Select(x =>
  513. {
  514. if (int.TryParse(x, out var id)) return id;
  515. return id;
  516. })
  517. .ToArray();
  518. }
  519. if (!string.IsNullOrEmpty(dto.GroupLabel))
  520. {
  521. groupLabel = dto.GroupLabel
  522. .Split(',')
  523. .Select(x =>
  524. {
  525. if (int.TryParse(x, out var id)) return id;
  526. return id;
  527. })
  528. .ToArray();
  529. }
  530. //物品ID和物品名称只能传一个
  531. if (dto.GoodsId > 0) dto.GoodsName = string.Empty;
  532. if (!string.IsNullOrEmpty(dto.GoodsName)) dto.GoodsId = 0;
  533. var beginBool = DateTime.TryParse(!string.IsNullOrEmpty(dto.BeginDt) ? $"{dto.BeginDt} 00:00:00" : string.Empty, out var begin);
  534. var endBool = DateTime.TryParse(!string.IsNullOrEmpty(dto.EndDt) ? $"{dto.EndDt} 00:00:00" : string.Empty, out var end);
  535. RefAsync<int> total = 0;
  536. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  537. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  538. .LeftJoin<Sys_SetData>((gr, gi,sd) => gi.Type == sd.Id)
  539. .LeftJoin<Sys_Users>((gr, gi,sd,u1) => gr.AuditUserId == u1.Id)
  540. .LeftJoin<Sys_Users>((gr, gi,sd, u1, u2) => gr.CreateUserId == u2.Id)
  541. .Where((gr, gi, sd, u1, u2) => gr.IsDel == 0)
  542. .WhereIF(dto.GoodsId > 0, (gr, gi, sd, u1, u2) => gr.GoodsId == dto.GoodsId)
  543. .WhereIF(!string.IsNullOrEmpty(dto.GoodsName), (gr, gi, sd, u1, u2) => gi.Name.Contains(dto.GoodsName))
  544. .WhereIF(auditLabel.Length > 0, (gr, gi, sd, u1, u2) => auditLabel.Contains((int)gr.AuditStatus))
  545. .WhereIF(typeLabel.Length > 0, (gr, gi, sd, u1, u2) => typeLabel.Contains(gi.Type))
  546. .WhereIF(userLabel.Length > 0, (gr, gi, sd, u1, u2) => userLabel.Contains(gr.CreateUserId))
  547. .WhereIF(groupLabel.Length > 0, (gr, gi, sd, u1, u2) => groupLabel.Contains(gr.GroupId))
  548. .WhereIF(beginBool && endBool, (gr, gi, sd, u1, u2) => gr.CreateTime >= begin && gr.CreateTime <= end)
  549. .Select((gr, gi, sd, u1, u2) => new GoodsReceiveListView
  550. {
  551. Id = gr.Id,
  552. GroupId = gr.GroupId,
  553. GoodsId = gr.GoodsId,
  554. GoodsName = gi.Name,
  555. GoodsType = sd.Name,
  556. Quantity = gr.Quantity,
  557. Reason = gr.Reason,
  558. Remark = gr.Remark,
  559. AuditStatus = gr.AuditStatus,
  560. //AuditStatusText = gr.AuditStatus.GetEnumDescription(),
  561. AuditUserId = gr.AuditUserId,
  562. AuditUserName = u1.CnName,
  563. AuditTime = gr.AuditTime,
  564. CreateUserName = u2.CnName,
  565. CreateTime = gr.CreateTime
  566. })
  567. .OrderByDescending(gr => gr.CreateTime)
  568. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  569. _jv.Code = StatusCodes.Status200OK;
  570. _jv.Data = data;
  571. _jv.Count = total;
  572. _jv.Msg = $"操作成功";
  573. return _jv;
  574. }
  575. /// <summary>
  576. /// 物品领用详情
  577. /// </summary>
  578. /// <param name="portType"></param>
  579. /// <param name="id"></param>
  580. /// <returns></returns>
  581. public async Task<JsonView> GoodsReceiveInfo(int portType, int id)
  582. {
  583. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  584. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  585. .LeftJoin<Sys_Users>((gr, gi, u1) => gr.AuditUserId == u1.Id)
  586. .LeftJoin<Sys_Users>((gr, gi, u1, u2) => gr.CreateUserId == u2.Id)
  587. .Where((gr, gi, u1, u2) => gr.IsDel == 0)
  588. .WhereIF(id > 0, (gr, gi, u1, u2) => gr.Id == id)
  589. .Select((gr, gi, u1, u2) => new GoodsReceiveInfoView
  590. {
  591. Id = gr.Id,
  592. GroupId = gr.GroupId,
  593. GoodsId = gr.GoodsId,
  594. GoodsName = gi.Name,
  595. Quantity = gr.Quantity,
  596. Reason = gr.Reason,
  597. Remark = gr.Remark,
  598. GoodsStorageInfo = gr.GoodsStorageInfo,
  599. AuditStatus = gr.AuditStatus,
  600. AuditUserId = gr.AuditUserId,
  601. AuditUserName = u1.CnName,
  602. AuditTime = gr.AuditTime,
  603. CreateUserName = u2.CnName,
  604. CreateTime = gr.CreateTime
  605. })
  606. .FirstAsync();
  607. if (!string.IsNullOrEmpty(data.GoodsStorageInfo))
  608. {
  609. var subData = new List<dynamic>();
  610. try
  611. {
  612. var subData1 = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(data.GoodsStorageInfo);
  613. if (subData1.Count > 0)
  614. {
  615. string goodsStorageInfoStr = string.Empty;
  616. var storageIds = subData1.Select(x => x.StorageId).ToList();
  617. var storages = await _sqlSugar.Queryable<Pm_GoodsStorage>().Where(x => x.IsDel == 0 && storageIds.Contains(x.Id)).ToListAsync();
  618. foreach (var item in subData1)
  619. {
  620. var storageInfo = storages.Find(x => x.Id == item.StorageId);
  621. if (storageInfo != null)
  622. {
  623. subData.Add(new
  624. {
  625. StorageId = item.StorageId,
  626. BatchNo = storageInfo.BatchNo,
  627. RecsiveQuantity = item.Quantity
  628. });
  629. goodsStorageInfoStr += $"物品名称:{data.GoodsName} 批次号:{storageInfo.BatchNo} 领用数量:{item.Quantity} \r\n";
  630. }
  631. }
  632. data.QuantityInfos = subData;
  633. data.GoodsStorageInfoStr = goodsStorageInfoStr;
  634. }
  635. }
  636. catch (Exception e)
  637. {
  638. Console.WriteLine(e);
  639. }
  640. }
  641. _jv.Code = StatusCodes.Status200OK;
  642. _jv.Data = data;
  643. _jv.Msg = $"操作成功";
  644. return _jv;
  645. }
  646. /// <summary>
  647. /// 物品领用 OP(Add Or Edit)
  648. /// </summary>
  649. /// <param name="dto"></param>
  650. /// <param name="currUserId"></param>
  651. /// <returns></returns>
  652. public async Task<JsonView> GoodsReceiveOp(GoodsReceiveOpDto dto, int currUserId)
  653. {
  654. var info = _mapper.Map<Pm_GoodsReceive>(dto);
  655. info.CreateUserId = currUserId;
  656. _sqlSugar.BeginTran();
  657. //物品现有库存
  658. var stockQuantity = _sqlSugar.Queryable<Pm_GoodsInfo>()
  659. .First(x => x.Id == info.GoodsId)
  660. ?.StockQuantity;
  661. //待审核 该物品数量
  662. var waitAuditQuantity = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  663. .Where(x => x.IsDel == 0 &&
  664. x.GoodsId == dto.GoodsId &&
  665. x.AuditStatus == GoodsAuditEnum.Pending
  666. )
  667. .SumAsync(x => x.Quantity);
  668. if (info.Id > 0) //修改
  669. {
  670. //审核验证
  671. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>().FirstAsync(x => x.Id == info.Id);
  672. if (selectInfo.AuditStatus == GoodsAuditEnum.Approved)
  673. {
  674. _sqlSugar.RollbackTran();
  675. _jv.Msg = $"该条数据已通过审核,不可更改!";
  676. return _jv;
  677. }
  678. //物品数量验证
  679. var editAfterQuantity = waitAuditQuantity - selectInfo.Quantity + info.Quantity;
  680. if (editAfterQuantity > stockQuantity)
  681. {
  682. _sqlSugar.RollbackTran();
  683. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  684. return _jv;
  685. }
  686. var edit = await _sqlSugar.Updateable(info)
  687. .UpdateColumns(x => new
  688. {
  689. x.GroupId,
  690. x.Quantity,
  691. x.Reason,
  692. x.Remark,
  693. })
  694. .Where(x => x.Id == info.Id)
  695. .ExecuteCommandAsync();
  696. if (edit > 0)
  697. {
  698. _sqlSugar.CommitTran();
  699. _jv.Msg = $"操作成功!";
  700. _jv.Code = StatusCodes.Status200OK;
  701. return _jv;
  702. }
  703. }
  704. else if (info.Id < 1) //添加
  705. {
  706. //物品数量验证
  707. decimal addAgoQuantity = waitAuditQuantity + info.Quantity;
  708. if (addAgoQuantity > stockQuantity)
  709. {
  710. _sqlSugar.RollbackTran();
  711. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  712. return _jv;
  713. }
  714. var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  715. if (add > 0)
  716. {
  717. _sqlSugar.CommitTran();
  718. _jv.Msg = $"操作成功!";
  719. _jv.Code = StatusCodes.Status200OK;
  720. return _jv;
  721. }
  722. }
  723. _sqlSugar.RollbackTran();
  724. return _jv;
  725. }
  726. /// <summary>
  727. /// 物品领用 Audit
  728. /// </summary>
  729. /// <param name="idArray"></param>
  730. /// <param name="userId"></param>
  731. /// <param name="auditEnum"></param>
  732. /// <returns></returns>
  733. public async Task<JsonView> GoodsReceiveAudit(int[] idArray, int userId, GoodsAuditEnum auditEnum)
  734. {
  735. if (idArray.Length < 1) return _jv;
  736. //TODO: 审核权限验证
  737. _sqlSugar.BeginTran();
  738. var receiveInfos = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  739. .Where(x => x.IsDel == 0 && idArray.Contains(x.Id))
  740. .ToListAsync();
  741. var status = true;
  742. foreach (var id in idArray)
  743. {
  744. //1.更改审核状态
  745. var currInfo = receiveInfos.Find(x => x.Id == id);
  746. if (currInfo == null) continue;
  747. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  748. .SetColumns(x => new Pm_GoodsReceive()
  749. {
  750. AuditStatus = auditEnum,
  751. AuditUserId = userId,
  752. AuditTime = DateTime.Now,
  753. })
  754. .Where(x => x.Id == id)
  755. .ExecuteCommandAsync();
  756. if (edit < 1) status = false;
  757. //if (auditEnum != GoodsAuditEnum.Approved) continue;
  758. //2.更改库存
  759. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().Where(x => x.Id == currInfo.GoodsId).FirstAsync();
  760. if (auditEnum == GoodsAuditEnum.Pending)
  761. {
  762. goodsInfo.StockQuantity += currInfo.Quantity;
  763. goodsInfo.OQ_Total -= currInfo.Quantity;
  764. }
  765. else if (auditEnum == GoodsAuditEnum.Approved)
  766. {
  767. goodsInfo.StockQuantity -= currInfo.Quantity;
  768. goodsInfo.OQ_Total += currInfo.Quantity;
  769. }else if(auditEnum == GoodsAuditEnum.UnApproved) continue;
  770. goodsInfo.LastUpdateTime = DateTime.Now;
  771. goodsInfo.LastUpdateUserId = userId;
  772. var editGoods = await _sqlSugar.Updateable<Pm_GoodsInfo>(goodsInfo)
  773. .UpdateColumns(x => new
  774. {
  775. x.StockQuantity,
  776. x.OQ_Total,
  777. x.LastUpdateUserId,
  778. x.LastUpdateTime,
  779. })
  780. .Where(x => x.Id == currInfo.GoodsId)
  781. .ExecuteCommandAsync();
  782. if (editGoods < 1) status = false;
  783. //3.入库批次关联领用人 更改批次库存
  784. var goodsStorages = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  785. .Where(x => x.IsDel == 0 &&
  786. x.GoodsId == currInfo.GoodsId &&
  787. (x.Quantity - x.ReceiveQuantity) > 0
  788. )
  789. .OrderBy(x => x.CreateTime)
  790. .ToListAsync();
  791. var goodsReceiveInfos = new List<GoodsReceiveLinkStorageView>();
  792. var batchStorageInfos = new List<Pm_GoodsStorage>();
  793. var receiveQuantity = 0.00M; //领用总数量
  794. if (auditEnum == GoodsAuditEnum.Approved)
  795. {
  796. foreach (var storage in goodsStorages)
  797. {
  798. if (currInfo.Quantity == receiveQuantity) break;
  799. var thisBatchSurplusQuantity = storage.Quantity - storage.ReceiveQuantity;
  800. if (thisBatchSurplusQuantity <= 0.00M) continue;
  801. var thisBatchReceiveQuantity = 0.00M; //此批次领用数量
  802. const decimal unit = 0.50M;
  803. while (receiveQuantity < currInfo.Quantity)
  804. {
  805. if (thisBatchSurplusQuantity == thisBatchReceiveQuantity) break;
  806. thisBatchReceiveQuantity += unit;
  807. receiveQuantity += unit;
  808. }
  809. goodsReceiveInfos.Add(new GoodsReceiveLinkStorageView
  810. {
  811. StorageId = storage.Id,
  812. Quantity = thisBatchReceiveQuantity
  813. });
  814. storage.ReceiveQuantity += thisBatchReceiveQuantity;
  815. var storageUpd = storage;
  816. //storageUpd.ReceiveQuantity += thisBatchReceiveQuantity;
  817. batchStorageInfos.Add(storageUpd);
  818. }
  819. //3.1 更改批次库存
  820. if (goodsReceiveInfos.Count > 0)
  821. {
  822. var edit1 = await _sqlSugar.Updateable(batchStorageInfos)
  823. .UpdateColumns(x => x.ReceiveQuantity)
  824. .WhereColumns(x => x.Id)
  825. .ExecuteCommandAsync();
  826. if (edit1 < 1) status = false;
  827. }
  828. //3.2 添加入库批次关联领用人
  829. if (goodsReceiveInfos.Count > 0)
  830. {
  831. var edit1 = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  832. .SetColumns(x => new Pm_GoodsReceive()
  833. {
  834. GoodsStorageInfo = JsonConvert.SerializeObject(goodsReceiveInfos)
  835. })
  836. .Where(x => x.Id == id)
  837. .ExecuteCommandAsync();
  838. if (edit1 < 1) status = false;
  839. }
  840. }
  841. else if (auditEnum == GoodsAuditEnum.Pending)
  842. {
  843. var goodsStorageInfo = currInfo.GoodsStorageInfo;
  844. if (!string.IsNullOrEmpty(goodsStorageInfo))
  845. {
  846. var goodsStorageInfos = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(goodsStorageInfo);
  847. if (goodsStorageInfos.Count > 0)
  848. {
  849. foreach (var item in goodsStorageInfos)
  850. {
  851. var newStorageInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  852. .Where(x => x.IsDel == 0 && x.Id == item.StorageId)
  853. .FirstAsync();
  854. if (newStorageInfo != null)
  855. {
  856. var newEdit = await _sqlSugar.Updateable(newStorageInfo)
  857. .ReSetValue(x => x.ReceiveQuantity = x.ReceiveQuantity - item.Quantity)
  858. .ExecuteCommandAsync();
  859. if (newEdit < 1) status = false;
  860. }
  861. }
  862. }
  863. }
  864. }
  865. }
  866. if (status)
  867. {
  868. _sqlSugar.CommitTran();
  869. _jv.Msg = $"操作成功!";
  870. _jv.Code = StatusCodes.Status200OK;
  871. return _jv;
  872. }
  873. _sqlSugar.RollbackTran();
  874. return _jv;
  875. }
  876. /// <summary>
  877. /// 物品领用 Del
  878. /// </summary>
  879. /// <param name="id"></param>
  880. /// <param name="currUserId"></param>
  881. /// <returns></returns>
  882. public async Task<JsonView> GoodsReceiveDel(int id, int currUserId)
  883. {
  884. var receiveInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  885. .Where(x => x.IsDel == 0 && x.Id == id)
  886. .FirstAsync();
  887. if (receiveInfo.AuditStatus == GoodsAuditEnum.Approved)
  888. {
  889. _jv.Msg = $"该条数据已通过审核,不可删除!";
  890. return _jv;
  891. }
  892. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  893. .SetColumns(x => new Pm_GoodsReceive()
  894. {
  895. IsDel = 1,
  896. DeleteUserId = currUserId,
  897. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  898. })
  899. .Where(x => x.Id == id)
  900. .ExecuteCommandAsync();
  901. if (edit > 0)
  902. {
  903. _jv.Msg = $"操作成功!";
  904. _jv.Code = StatusCodes.Status200OK;
  905. return _jv;
  906. }
  907. return _jv;
  908. }
  909. }
  910. }