GoodsRepository.cs 45 KB

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