GoodsRepository.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968
  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 = new int[] { },
  483. userLabel = new int[] { },
  484. auditLabel = new int[] { };
  485. if (!string.IsNullOrEmpty(dto.TypeLabel))
  486. {
  487. typeLabel = dto.TypeLabel
  488. .Split(',')
  489. .Select(x =>
  490. {
  491. if (int.TryParse(x, out var id)) return id;
  492. return id;
  493. })
  494. .ToArray();
  495. }
  496. if (!string.IsNullOrEmpty(dto.UserLabel))
  497. {
  498. userLabel = dto.UserLabel
  499. .Split(',')
  500. .Select(x =>
  501. {
  502. if (int.TryParse(x, out var id)) return id;
  503. return id;
  504. })
  505. .ToArray();
  506. }
  507. if (!string.IsNullOrEmpty(dto.AuditLabel))
  508. {
  509. auditLabel = dto.AuditLabel
  510. .Split(',')
  511. .Select(x =>
  512. {
  513. if (int.TryParse(x, out var id)) return id;
  514. return id;
  515. })
  516. .ToArray();
  517. }
  518. //物品ID和物品名称只能传一个
  519. if (dto.GoodsId > 0) dto.GoodsName = string.Empty;
  520. if (!string.IsNullOrEmpty(dto.GoodsName)) dto.GoodsId = 0;
  521. var beginBool = DateTime.TryParse(!string.IsNullOrEmpty(dto.BeginDt) ? $"{dto.BeginDt} 00:00:00" : string.Empty, out var begin);
  522. var endBool = DateTime.TryParse(!string.IsNullOrEmpty(dto.EndDt) ? $"{dto.EndDt} 00:00:00" : string.Empty, out var end);
  523. RefAsync<int> total = 0;
  524. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  525. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  526. .LeftJoin<Sys_SetData>((gr, gi,sd) => gi.Type == sd.Id)
  527. .LeftJoin<Sys_Users>((gr, gi,sd,u1) => gr.AuditUserId == u1.Id)
  528. .LeftJoin<Sys_Users>((gr, gi,sd, u1, u2) => gr.CreateUserId == u2.Id)
  529. .Where((gr, gi, sd, u1, u2) => gr.IsDel == 0)
  530. .WhereIF(dto.GoodsId > 0, (gr, gi, sd, u1, u2) => gr.GoodsId == dto.GoodsId)
  531. .WhereIF(!string.IsNullOrEmpty(dto.GoodsName), (gr, gi, sd, u1, u2) => gi.Name.Contains(dto.GoodsName))
  532. .WhereIF(auditLabel.Length > 0, (gr, gi, sd, u1, u2) => auditLabel.Contains((int)gr.AuditStatus))
  533. .WhereIF(typeLabel.Length > 0, (gr, gi, sd, u1, u2) => typeLabel.Contains(gi.Type))
  534. .WhereIF(userLabel.Length > 0, (gr, gi, sd, u1, u2) => userLabel.Contains(gr.CreateUserId))
  535. .WhereIF(beginBool && endBool, (gr, gi, sd, u1, u2) => gr.CreateTime >= begin && gr.CreateTime <= end)
  536. .Select((gr, gi, sd, u1, u2) => new GoodsReceiveListView
  537. {
  538. Id = gr.Id,
  539. GroupId = gr.GroupId,
  540. GoodsId = gr.GoodsId,
  541. GoodsName = gi.Name,
  542. GoodsType = sd.Name,
  543. Quantity = gr.Quantity,
  544. Reason = gr.Reason,
  545. Remark = gr.Remark,
  546. AuditStatus = gr.AuditStatus,
  547. //AuditStatusText = gr.AuditStatus.GetEnumDescription(),
  548. AuditUserId = gr.AuditUserId,
  549. AuditUserName = u1.CnName,
  550. AuditTime = gr.AuditTime,
  551. CreateUserName = u2.CnName,
  552. CreateTime = gr.CreateTime
  553. })
  554. .OrderByDescending(gr => gr.CreateTime)
  555. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  556. _jv.Code = StatusCodes.Status200OK;
  557. _jv.Data = data;
  558. _jv.Count = total;
  559. _jv.Msg = $"操作成功";
  560. return _jv;
  561. }
  562. /// <summary>
  563. /// 物品领用详情
  564. /// </summary>
  565. /// <param name="portType"></param>
  566. /// <param name="id"></param>
  567. /// <returns></returns>
  568. public async Task<JsonView> GoodsReceiveInfo(int portType, int id)
  569. {
  570. var data = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  571. .LeftJoin<Pm_GoodsInfo>((gr, gi) => gr.GoodsId == gi.Id)
  572. .LeftJoin<Sys_Users>((gr, gi, u1) => gr.AuditUserId == u1.Id)
  573. .LeftJoin<Sys_Users>((gr, gi, u1, u2) => gr.CreateUserId == u2.Id)
  574. .Where((gr, gi, u1, u2) => gr.IsDel == 0)
  575. .WhereIF(id > 0, (gr, gi, u1, u2) => gr.Id == id)
  576. .Select((gr, gi, u1, u2) => new GoodsReceiveInfoView
  577. {
  578. Id = gr.Id,
  579. GroupId = gr.GroupId,
  580. GoodsId = gr.GoodsId,
  581. GoodsName = gi.Name,
  582. Quantity = gr.Quantity,
  583. Reason = gr.Reason,
  584. Remark = gr.Remark,
  585. GoodsStorageInfo = gr.GoodsStorageInfo,
  586. AuditStatus = gr.AuditStatus,
  587. AuditUserId = gr.AuditUserId,
  588. AuditUserName = u1.CnName,
  589. AuditTime = gr.AuditTime,
  590. CreateUserName = u2.CnName,
  591. CreateTime = gr.CreateTime
  592. })
  593. .FirstAsync();
  594. if (!string.IsNullOrEmpty(data.GoodsStorageInfo))
  595. {
  596. var subData = new List<dynamic>();
  597. try
  598. {
  599. var subData1 = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(data.GoodsStorageInfo);
  600. if (subData1.Count > 0)
  601. {
  602. string goodsStorageInfoStr = string.Empty;
  603. var storageIds = subData1.Select(x => x.StorageId).ToList();
  604. var storages = await _sqlSugar.Queryable<Pm_GoodsStorage>().Where(x => x.IsDel == 0 && storageIds.Contains(x.Id)).ToListAsync();
  605. foreach (var item in subData1)
  606. {
  607. var storageInfo = storages.Find(x => x.Id == item.StorageId);
  608. if (storageInfo != null)
  609. {
  610. subData.Add(new
  611. {
  612. StorageId = item.StorageId,
  613. BatchNo = storageInfo.BatchNo,
  614. RecsiveQuantity = item.Quantity
  615. });
  616. goodsStorageInfoStr += $"物品名称:{data.GoodsName} 批次号:{storageInfo.BatchNo} 领用数量:{item.Quantity} \r\n";
  617. }
  618. }
  619. data.QuantityInfos = subData;
  620. data.GoodsStorageInfoStr = goodsStorageInfoStr;
  621. }
  622. }
  623. catch (Exception e)
  624. {
  625. Console.WriteLine(e);
  626. }
  627. }
  628. _jv.Code = StatusCodes.Status200OK;
  629. _jv.Data = data;
  630. _jv.Msg = $"操作成功";
  631. return _jv;
  632. }
  633. /// <summary>
  634. /// 物品领用 OP(Add Or Edit)
  635. /// </summary>
  636. /// <param name="dto"></param>
  637. /// <param name="currUserId"></param>
  638. /// <returns></returns>
  639. public async Task<JsonView> GoodsReceiveOp(GoodsReceiveOpDto dto, int currUserId)
  640. {
  641. var info = _mapper.Map<Pm_GoodsReceive>(dto);
  642. info.CreateUserId = currUserId;
  643. _sqlSugar.BeginTran();
  644. //物品现有库存
  645. var stockQuantity = _sqlSugar.Queryable<Pm_GoodsInfo>()
  646. .First(x => x.Id == info.GoodsId)
  647. ?.StockQuantity;
  648. //待审核 该物品数量
  649. var waitAuditQuantity = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  650. .Where(x => x.IsDel == 0 &&
  651. x.GoodsId == dto.GoodsId &&
  652. x.AuditStatus == GoodsAuditEnum.Pending
  653. )
  654. .SumAsync(x => x.Quantity);
  655. if (info.Id > 0) //修改
  656. {
  657. //审核验证
  658. var selectInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>().FirstAsync(x => x.Id == info.Id);
  659. if (selectInfo.AuditStatus == GoodsAuditEnum.Approved)
  660. {
  661. _sqlSugar.RollbackTran();
  662. _jv.Msg = $"该条数据已通过审核,不可更改!";
  663. return _jv;
  664. }
  665. //物品数量验证
  666. var editAfterQuantity = waitAuditQuantity - selectInfo.Quantity + info.Quantity;
  667. if (editAfterQuantity > stockQuantity)
  668. {
  669. _sqlSugar.RollbackTran();
  670. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  671. return _jv;
  672. }
  673. var edit = await _sqlSugar.Updateable(info)
  674. .UpdateColumns(x => new
  675. {
  676. x.GroupId,
  677. x.Quantity,
  678. x.Reason,
  679. x.Remark,
  680. })
  681. .Where(x => x.Id == info.Id)
  682. .ExecuteCommandAsync();
  683. if (edit > 0)
  684. {
  685. _sqlSugar.CommitTran();
  686. _jv.Msg = $"操作成功!";
  687. _jv.Code = StatusCodes.Status200OK;
  688. return _jv;
  689. }
  690. }
  691. else if (info.Id < 1) //添加
  692. {
  693. //物品数量验证
  694. decimal addAgoQuantity = waitAuditQuantity + info.Quantity;
  695. if (addAgoQuantity > stockQuantity)
  696. {
  697. _sqlSugar.RollbackTran();
  698. _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!";
  699. return _jv;
  700. }
  701. var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
  702. if (add > 0)
  703. {
  704. _sqlSugar.CommitTran();
  705. _jv.Msg = $"操作成功!";
  706. _jv.Code = StatusCodes.Status200OK;
  707. return _jv;
  708. }
  709. }
  710. _sqlSugar.RollbackTran();
  711. return _jv;
  712. }
  713. /// <summary>
  714. /// 物品领用 Audit
  715. /// </summary>
  716. /// <param name="idArray"></param>
  717. /// <param name="userId"></param>
  718. /// <param name="auditEnum"></param>
  719. /// <returns></returns>
  720. public async Task<JsonView> GoodsReceiveAudit(int[] idArray, int userId, GoodsAuditEnum auditEnum)
  721. {
  722. if (idArray.Length < 1) return _jv;
  723. //TODO: 审核权限验证
  724. _sqlSugar.BeginTran();
  725. var receiveInfos = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  726. .Where(x => x.IsDel == 0 && idArray.Contains(x.Id))
  727. .ToListAsync();
  728. var status = true;
  729. foreach (var id in idArray)
  730. {
  731. //1.更改审核状态
  732. var currInfo = receiveInfos.Find(x => x.Id == id);
  733. if (currInfo == null) continue;
  734. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  735. .SetColumns(x => new Pm_GoodsReceive()
  736. {
  737. AuditStatus = auditEnum,
  738. AuditUserId = userId,
  739. AuditTime = DateTime.Now,
  740. })
  741. .Where(x => x.Id == id)
  742. .ExecuteCommandAsync();
  743. if (edit < 1) status = false;
  744. //if (auditEnum != GoodsAuditEnum.Approved) continue;
  745. //2.更改库存
  746. var goodsInfo = await _sqlSugar.Queryable<Pm_GoodsInfo>().Where(x => x.Id == currInfo.GoodsId).FirstAsync();
  747. if (auditEnum == GoodsAuditEnum.Pending)
  748. {
  749. goodsInfo.StockQuantity += currInfo.Quantity;
  750. goodsInfo.OQ_Total -= currInfo.Quantity;
  751. }
  752. else if (auditEnum == GoodsAuditEnum.Approved)
  753. {
  754. goodsInfo.StockQuantity -= currInfo.Quantity;
  755. goodsInfo.OQ_Total += currInfo.Quantity;
  756. }else if(auditEnum == GoodsAuditEnum.UnApproved) continue;
  757. goodsInfo.LastUpdateTime = DateTime.Now;
  758. goodsInfo.LastUpdateUserId = userId;
  759. var editGoods = await _sqlSugar.Updateable<Pm_GoodsInfo>(goodsInfo)
  760. .UpdateColumns(x => new
  761. {
  762. x.StockQuantity,
  763. x.OQ_Total,
  764. x.LastUpdateUserId,
  765. x.LastUpdateTime,
  766. })
  767. .Where(x => x.Id == currInfo.GoodsId)
  768. .ExecuteCommandAsync();
  769. if (editGoods < 1) status = false;
  770. //3.入库批次关联领用人 更改批次库存
  771. var goodsStorages = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  772. .Where(x => x.IsDel == 0 &&
  773. x.GoodsId == currInfo.GoodsId &&
  774. (x.Quantity - x.ReceiveQuantity) > 0
  775. )
  776. .OrderBy(x => x.CreateTime)
  777. .ToListAsync();
  778. var goodsReceiveInfos = new List<GoodsReceiveLinkStorageView>();
  779. var batchStorageInfos = new List<Pm_GoodsStorage>();
  780. var receiveQuantity = 0.00M; //领用总数量
  781. if (auditEnum == GoodsAuditEnum.Approved)
  782. {
  783. foreach (var storage in goodsStorages)
  784. {
  785. if (currInfo.Quantity == receiveQuantity) break;
  786. var thisBatchSurplusQuantity = storage.Quantity - storage.ReceiveQuantity;
  787. if (thisBatchSurplusQuantity <= 0.00M) continue;
  788. var thisBatchReceiveQuantity = 0.00M; //此批次领用数量
  789. const decimal unit = 0.50M;
  790. while (receiveQuantity < currInfo.Quantity)
  791. {
  792. if (thisBatchSurplusQuantity == thisBatchReceiveQuantity) break;
  793. thisBatchReceiveQuantity += unit;
  794. receiveQuantity += unit;
  795. }
  796. goodsReceiveInfos.Add(new GoodsReceiveLinkStorageView
  797. {
  798. StorageId = storage.Id,
  799. Quantity = thisBatchReceiveQuantity
  800. });
  801. storage.ReceiveQuantity += thisBatchReceiveQuantity;
  802. var storageUpd = storage;
  803. //storageUpd.ReceiveQuantity += thisBatchReceiveQuantity;
  804. batchStorageInfos.Add(storageUpd);
  805. }
  806. //3.1 更改批次库存
  807. if (goodsReceiveInfos.Count > 0)
  808. {
  809. var edit1 = await _sqlSugar.Updateable(batchStorageInfos)
  810. .UpdateColumns(x => x.ReceiveQuantity)
  811. .WhereColumns(x => x.Id)
  812. .ExecuteCommandAsync();
  813. if (edit1 < 1) status = false;
  814. }
  815. //3.2 添加入库批次关联领用人
  816. if (goodsReceiveInfos.Count > 0)
  817. {
  818. var edit1 = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  819. .SetColumns(x => new Pm_GoodsReceive()
  820. {
  821. GoodsStorageInfo = JsonConvert.SerializeObject(goodsReceiveInfos)
  822. })
  823. .Where(x => x.Id == id)
  824. .ExecuteCommandAsync();
  825. if (edit1 < 1) status = false;
  826. }
  827. }
  828. else if (auditEnum == GoodsAuditEnum.Pending)
  829. {
  830. var goodsStorageInfo = currInfo.GoodsStorageInfo;
  831. if (!string.IsNullOrEmpty(goodsStorageInfo))
  832. {
  833. var goodsStorageInfos = JsonConvert.DeserializeObject<List<GoodsReceiveLinkStorageView>>(goodsStorageInfo);
  834. if (goodsStorageInfos.Count > 0)
  835. {
  836. foreach (var item in goodsStorageInfos)
  837. {
  838. var newStorageInfo = await _sqlSugar.Queryable<Pm_GoodsStorage>()
  839. .Where(x => x.IsDel == 0 && x.Id == item.StorageId)
  840. .FirstAsync();
  841. if (newStorageInfo != null)
  842. {
  843. var newEdit = await _sqlSugar.Updateable(newStorageInfo)
  844. .ReSetValue(x => x.ReceiveQuantity = x.ReceiveQuantity - item.Quantity)
  845. .ExecuteCommandAsync();
  846. if (newEdit < 1) status = false;
  847. }
  848. }
  849. }
  850. }
  851. }
  852. }
  853. if (status)
  854. {
  855. _sqlSugar.CommitTran();
  856. _jv.Msg = $"操作成功!";
  857. _jv.Code = StatusCodes.Status200OK;
  858. return _jv;
  859. }
  860. _sqlSugar.RollbackTran();
  861. return _jv;
  862. }
  863. /// <summary>
  864. /// 物品领用 Del
  865. /// </summary>
  866. /// <param name="id"></param>
  867. /// <param name="currUserId"></param>
  868. /// <returns></returns>
  869. public async Task<JsonView> GoodsReceiveDel(int id, int currUserId)
  870. {
  871. var receiveInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>()
  872. .Where(x => x.IsDel == 0 && x.Id == id)
  873. .FirstAsync();
  874. if (receiveInfo.AuditStatus == GoodsAuditEnum.Approved)
  875. {
  876. _jv.Msg = $"该条数据已通过审核,不可删除!";
  877. return _jv;
  878. }
  879. var edit = await _sqlSugar.Updateable<Pm_GoodsReceive>()
  880. .SetColumns(x => new Pm_GoodsReceive()
  881. {
  882. IsDel = 1,
  883. DeleteUserId = currUserId,
  884. DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  885. })
  886. .Where(x => x.Id == id)
  887. .ExecuteCommandAsync();
  888. if (edit > 0)
  889. {
  890. _jv.Msg = $"操作成功!";
  891. _jv.Code = StatusCodes.Status200OK;
  892. return _jv;
  893. }
  894. return _jv;
  895. }
  896. }
  897. }