using System.Linq; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Interfaces; using Microsoft.AspNetCore.Mvc; using SqlSugar; using Tnb.EquipMgr.Entities; using Tnb.EquipMgr.Interfaces; namespace Tnb.EquipMgr { /// /// 备品备件领用服务 /// [ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 700)] [Route("api/[area]/[controller]/[action]")] [OverideVisualDev(ModuleId)] public class EqpSparePartsRequisitionHService : IEqpSparePartsRequisitionHService, IOverideVisualDevService, IDynamicApiController, ITransient { private const string ModuleId = "27338205223957"; private readonly ISqlSugarRepository _repository; private readonly IVisualDevService _visualDevService; private readonly IRunService _runService; private readonly IUserManager _userManager; private readonly IBillRullService _billRuleService; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); public EqpSparePartsRequisitionHService(ISqlSugarRepository repository, IRunService runService, IVisualDevService visualDevService, IBillRullService billRuleService, IUserManager userManager) { _repository = repository; _visualDevService = visualDevService; _runService = runService; _userManager = userManager; _billRuleService = billRuleService; OverideFuncs.CreateAsync = Create; } private async Task Create(VisualDevModelDataCrInput input) { ISqlSugarClient db = _repository.AsSugarClient(); DbResult result = await db.Ado.UseTranAsync(async () => { // VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true); // await _runService.Create(templateEntity, input); string code = await _billRuleService.GetBillNumber(Tnb.BasicData.CodeTemplateConst.SPAREPARTSREQUISITION_CODE); EqpSparePartsRequisitionH eqpSparePartsRequisitionH = new() { code = code, equip_id = input.data.ContainsKey("equip_id") ? input.data["equip_id"].ToString() : "", department = input.data.ContainsKey("department") ? input.data["department"].ToString() : "", recipient_id = input.data.ContainsKey("recipient_id") ? input.data["recipient_id"].ToString() : "", requisition_purpose = input.data.ContainsKey("requisition_purpose") ? input.data["requisition_purpose"].ToString() : "", create_id = _userManager.UserId, create_time = DateTime.Now, org_id = _userManager.GetUserInfo().Result.organizeId, }; _ = await db.Insertable(eqpSparePartsRequisitionH).ExecuteCommandAsync(); if (input.data.TryGetValue("tablefield120", out object? value)) { List> details = value.ToObject>>(); List eqpSparePartsList = new(); List eqpSparePartsRequisitionDs = new() { }; foreach (Dictionary detail in details) { string instockDetailId = detail.ContainsKey("instock_detail_id") ? detail["instock_detail_id"] : ""; string sparePartsId = detail.ContainsKey("spare_parts_id") ? detail["spare_parts_id"] : ""; int quantity = Convert.ToInt32(detail.ContainsKey("quantity") ? detail["quantity"] : ""); eqpSparePartsRequisitionDs.Add(new EqpSparePartsRequisitionD { instock_detail_id = instockDetailId, spare_parts_id = sparePartsId, quantity = quantity, equip_id = eqpSparePartsRequisitionH.equip_id, spare_parts_requisition_id = eqpSparePartsRequisitionH.id, }); if (await db.Queryable() .AnyAsync(x => x.id == instockDetailId && (x.quantity - x.use_quantity - quantity) >= 0)) { eqpSparePartsList.Add(new EqpEquipSpareParts { equip_id = input.data["equip_id"]?.ToString() ?? "", spare_parts_id = sparePartsId, create_id = _userManager.UserId, create_time = DateTime.Now, org_id = _userManager.GetUserInfo().Result.organizeId }); _ = await db.Updateable() .SetColumns(x => x.use_quantity == x.use_quantity + quantity) .Where(x => x.id == instockDetailId).ExecuteCommandAsync(); } else { throw new Exception("库存不够"); } } if (eqpSparePartsRequisitionDs.Count > 0) { _ = await db.Insertable(eqpSparePartsRequisitionDs).ExecuteCommandAsync(); } if (eqpSparePartsList.Count > 0) { var datas= await db.Queryable().ToListAsync(); foreach (var item in eqpSparePartsList) { if (!datas.Where(p => p.equip_id == item.equip_id && p.spare_parts_id == item.spare_parts_id).Any()) _ = await db.Insertable(eqpSparePartsList).ExecuteCommandAsync(); } } } }); return !result.IsSuccess ? throw Oops.Bah(result.ErrorMessage) : (dynamic)(result.IsSuccess ? "保存成功" : result.ErrorMessage); } } }