diff --git a/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs b/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs
index a62d9c12..96890e79 100644
--- a/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs
+++ b/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs
@@ -19,5 +19,10 @@ namespace Tnb.BasicData
/// 生产任务单号单据模板编码
///
public const string PRDMOTASK_CODE = "ProductionPlanAndSchedule";
+
+ ///
+ /// 备件领用
+ ///
+ public const string SPAREPARTSREQUISITION_CODE = "SparePartsRequisition";
}
}
\ No newline at end of file
diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsInstockD.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsInstockD.cs
new file mode 100644
index 00000000..9797a1a9
--- /dev/null
+++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsInstockD.cs
@@ -0,0 +1,52 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.EquipMgr.Entities;
+
+///
+/// 备件入库子表
+///
+[SugarTable("eqp_spare_parts_instock_d")]
+public partial class EqpSparePartsInstockD : BaseEntity
+{
+ public EqpSparePartsInstockD()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 备件入库单id
+ ///
+ public string? instock_id { get; set; }
+
+ ///
+ /// 备件id
+ ///
+ public string? spare_parts_id { get; set; }
+
+ ///
+ /// 入库数量
+ ///
+ public int quantity { get; set; }
+
+ ///
+ /// 库位id
+ ///
+ public string? location_id { get; set; }
+
+ ///
+ /// 质保开始时间
+ ///
+ public DateTime? warranty_start_time { get; set; }
+
+ ///
+ /// 质保结束时间
+ ///
+ public DateTime? warranty_end_time { get; set; }
+
+ ///
+ /// 已领数量
+ ///
+ public int use_quantity { get; set; }
+
+}
\ No newline at end of file
diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsInstockH.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsInstockH.cs
new file mode 100644
index 00000000..46754943
--- /dev/null
+++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsInstockH.cs
@@ -0,0 +1,82 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.EquipMgr.Entities;
+
+///
+/// 备件入库
+///
+[SugarTable("eqp_spare_parts_instock_h")]
+public partial class EqpSparePartsInstockH : BaseEntity
+{
+ public EqpSparePartsInstockH()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 入库单编号
+ ///
+ public string? code { get; set; }
+
+ ///
+ /// 入库时间
+ ///
+ public string? instock_time { get; set; }
+
+ ///
+ /// 入库人员
+ ///
+ public string? instock_id { get; set; }
+
+ ///
+ /// 库位号
+ ///
+ public string? location_id { get; set; }
+
+ ///
+ /// 备件id
+ ///
+ public string? spare_parts_id { get; set; }
+
+ ///
+ /// 描述
+ ///
+ public string? descrip { get; set; }
+
+ ///
+ /// 创建用户
+ ///
+ public string? create_id { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? create_time { get; set; }
+
+ ///
+ /// 修改用户
+ ///
+ public string? modify_id { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? modify_time { get; set; }
+
+ ///
+ /// 所属组织
+ ///
+ public string? org_id { get; set; }
+
+ ///
+ /// 流程任务Id
+ ///
+ public string? f_flowtaskid { get; set; }
+
+ ///
+ /// 流程引擎Id
+ ///
+ public string? f_flowid { get; set; }
+
+}
\ No newline at end of file
diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsRequisitionD.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsRequisitionD.cs
new file mode 100644
index 00000000..e3fef537
--- /dev/null
+++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsRequisitionD.cs
@@ -0,0 +1,47 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.EquipMgr.Entities;
+
+///
+/// 备件领用子表
+///
+[SugarTable("eqp_spare_parts_requisition_d")]
+public partial class EqpSparePartsRequisitionD : BaseEntity
+{
+ public EqpSparePartsRequisitionD()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 备件id
+ ///
+ public string spare_parts_id { get; set; } = string.Empty;
+
+ ///
+ /// 批号
+ ///
+ public string? batch { get; set; }
+
+ ///
+ /// 数量
+ ///
+ public int quantity { get; set; }
+
+ ///
+ /// 备件领用主表id
+ ///
+ public string spare_parts_requisition_id { get; set; } = string.Empty;
+
+ ///
+ /// 设备id
+ ///
+ public string? equip_id { get; set; }
+
+ ///
+ /// 备件入库id
+ ///
+ public string? instock_detail_id { get; set; }
+
+}
\ No newline at end of file
diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsRequisitionH.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsRequisitionH.cs
new file mode 100644
index 00000000..2eac0c08
--- /dev/null
+++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSparePartsRequisitionH.cs
@@ -0,0 +1,87 @@
+using JNPF.Common.Contracts;
+using JNPF.Common.Security;
+using SqlSugar;
+
+namespace Tnb.EquipMgr.Entities;
+
+///
+/// 备件领用主表
+///
+[SugarTable("eqp_spare_parts_requisition_h")]
+public partial class EqpSparePartsRequisitionH : BaseEntity
+{
+ public EqpSparePartsRequisitionH()
+ {
+ id = SnowflakeIdHelper.NextId();
+ }
+ ///
+ /// 领用单编号
+ ///
+ public string? code { get; set; }
+
+ ///
+ /// 作用设备id
+ ///
+ public string? equip_id { get; set; }
+
+ ///
+ /// 使用部门
+ ///
+ public string? department { get; set; }
+
+ ///
+ /// 领用目的
+ ///
+ public string? requisition_purpose { get; set; }
+
+ ///
+ /// 库位号
+ ///
+ public string? location_id { get; set; }
+
+ ///
+ /// 备件id
+ ///
+ public string? spare_parts_id { get; set; }
+
+ ///
+ /// 领用人
+ ///
+ public string? recipient_id { get; set; }
+
+ ///
+ /// 创建用户
+ ///
+ public string? create_id { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime? create_time { get; set; }
+
+ ///
+ /// 修改用户
+ ///
+ public string? modify_id { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? modify_time { get; set; }
+
+ ///
+ /// 所属组织
+ ///
+ public string? org_id { get; set; }
+
+ ///
+ /// 流程任务Id
+ ///
+ public string? f_flowtaskid { get; set; }
+
+ ///
+ /// 流程引擎Id
+ ///
+ public string? f_flowid { get; set; }
+
+}
\ No newline at end of file
diff --git a/EquipMgr/Tnb.EquipMgr.Interfaces/IEqpSparePartsRequisitionHService.cs b/EquipMgr/Tnb.EquipMgr.Interfaces/IEqpSparePartsRequisitionHService.cs
new file mode 100644
index 00000000..85b1bb7a
--- /dev/null
+++ b/EquipMgr/Tnb.EquipMgr.Interfaces/IEqpSparePartsRequisitionHService.cs
@@ -0,0 +1,10 @@
+namespace Tnb.EquipMgr.Interfaces
+{
+ ///
+ /// 备品备件领用服务
+ ///
+ public interface IEqpSparePartsRequisitionHService
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs b/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs
new file mode 100644
index 00000000..66a40260
--- /dev/null
+++ b/EquipMgr/Tnb.EquipMgr/EqpSparePartsRequisitionHService.cs
@@ -0,0 +1,134 @@
+using JNPF.Common.Core.Manager;
+using JNPF.Common.Dtos.VisualDev;
+using JNPF.Common.Enums;
+using JNPF.Common.Security;
+using JNPF.DependencyInjection;
+using JNPF.DynamicApiController;
+using JNPF.FriendlyException;
+using JNPF.Systems.Interfaces.System;
+using JNPF.VisualDev;
+using JNPF.VisualDev.Entitys;
+using JNPF.VisualDev.Interfaces;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.ClearScript.Util.Web;
+using SqlSugar;
+using Tnb.EquipMgr.Entities;
+using Tnb.EquipMgr.Entities.Dto;
+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)
+ {
+ var db = _repository.AsSugarClient();
+ DbResult result = await db.Ado.UseTranAsync(async () =>
+ {
+ // VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true);
+ // await _runService.Create(templateEntity, input);
+ var code = await _billRuleService.GetBillNumber(Tnb.BasicData.CodeTemplateConst.SPAREPARTSREQUISITION_CODE);
+ EqpSparePartsRequisitionH eqpSparePartsRequisitionH = new EqpSparePartsRequisitionH()
+ {
+ 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 var value))
+ {
+ var details = value.ToObject>>();
+ List eqpSparePartsList = new List();
+ List eqpSparePartsRequisitionDs = new List(){};
+ foreach (var 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)
+ {
+ await db.Insertable(eqpSparePartsList).ExecuteCommandAsync();
+ }
+ }
+
+ });
+
+ if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
+ return result.IsSuccess ? "保存成功" : result.ErrorMessage;
+ }
+ }
+}
\ No newline at end of file