diff --git a/ARW.Model/Dto/Business/ProductsInvolveds/ProductsInvolvedDto.cs b/ARW.Model/Dto/Business/ProductsInvolveds/ProductsInvolvedDto.cs new file mode 100644 index 0000000..ba55bc7 --- /dev/null +++ b/ARW.Model/Dto/Business/ProductsInvolveds/ProductsInvolvedDto.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using ARW.Model.Models.Business.ProductsInvolveds; + +namespace ARW.Model.Dto.Business.ProductsInvolveds +{ + /// + /// 涉及产品输入对象 + /// + /// @author lwh + /// @date 2023-11-22 + /// + public class ProductsInvolvedDto + { + + public int ProductsInvolvedId { get; set; } + + public long ProductsInvolvedGuid { get; set; } + + [Required(ErrorMessage = "名称不能为空")] + public string ProductsInvolvedName { get; set; } + + [Required(ErrorMessage = "排序不能为空")] + public int ProductsInvolvedSort { get; set; } + + + + + + } + + + /// + /// 涉及产品查询对象 + /// + /// @author lwh + /// @date 2023-11-22 + /// + public class ProductsInvolvedQueryDto : PagerInfo + { + + public string ProductsInvolvedName { get; set; } + + public string ids { get; set; } + } + + + + +} diff --git a/ARW.Model/Models/Business/ProductsInvolveds/ProductsInvolved.cs b/ARW.Model/Models/Business/ProductsInvolveds/ProductsInvolved.cs new file mode 100644 index 0000000..318c54a --- /dev/null +++ b/ARW.Model/Models/Business/ProductsInvolveds/ProductsInvolved.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using SqlSugar; +using OfficeOpenXml.Attributes; +using Newtonsoft.Json; + +namespace ARW.Model.Models.Business.ProductsInvolveds +{ + /// + /// 涉及产品,数据实体对象 + /// + /// @author lwh + /// @date 2023-11-22 + /// + [SugarTable("tb_products_involved")] + public class ProductsInvolved : BusinessBase + { + + /// + /// 描述 : + /// 空值 : false + /// + [EpplusTableColumn(Header = "ProductsInvolvedId")] + [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "products_involved_id")] + public int ProductsInvolvedId { get; set; } + + + /// + /// 描述 : + /// 空值 : false + /// + [EpplusTableColumn(Header = "ProductsInvolvedGuid")] + [JsonConverter(typeof(ValueToStringConverter))] + [SugarColumn(IsPrimaryKey = true, IsIdentity = false, ColumnName = "products_involved_guid")] + public long ProductsInvolvedGuid { get; set; } + + + /// + /// 描述 :名称 + /// 空值 : false + /// + [EpplusTableColumn(Header = "名称")] + [SugarColumn(ColumnName = "products_involved_name")] + public string ProductsInvolvedName { get; set; } + + + /// + /// 描述 :排序 + /// 空值 : false + /// + [EpplusTableColumn(Header = "排序")] + [SugarColumn(ColumnName = "products_involved_sort")] + public int ProductsInvolvedSort { get; set; } + + + + + + + } +} \ No newline at end of file diff --git a/ARW.Model/Vo/Business/ProductsInvolveds/ProductsInvolvedVo.cs b/ARW.Model/Vo/Business/ProductsInvolveds/ProductsInvolvedVo.cs new file mode 100644 index 0000000..fb46905 --- /dev/null +++ b/ARW.Model/Vo/Business/ProductsInvolveds/ProductsInvolvedVo.cs @@ -0,0 +1,47 @@ +using Newtonsoft.Json; +using OfficeOpenXml.Attributes; +using SqlSugar; +using System; + +namespace ARW.Model.Vo.Business.ProductsInvolveds +{ + /// + /// 涉及产品展示对象 + /// + /// @author lwh + /// @date 2023-11-22 + /// + public class ProductsInvolvedVo + { + + + /// + /// 描述 : + /// + [EpplusIgnore] + public int ProductsInvolvedId { get; set; } + + + /// + /// 描述 : + /// + [JsonConverter(typeof(ValueToStringConverter))] + [EpplusIgnore] + public long ProductsInvolvedGuid { get; set; } + + + /// + /// 描述 :名称 + /// + [EpplusTableColumn(Header = "涉及产品名称")] + public string ProductsInvolvedName { get; set; } + + + /// + /// 描述 :排序 + /// + [EpplusTableColumn(Header = "排序")] + public int ProductsInvolvedSort { get; set; } + + } +} diff --git a/ARW.Repository/Business/ProductsInvolveds/ProductsInvolvedRepository.cs b/ARW.Repository/Business/ProductsInvolveds/ProductsInvolvedRepository.cs new file mode 100644 index 0000000..ca9c7ac --- /dev/null +++ b/ARW.Repository/Business/ProductsInvolveds/ProductsInvolvedRepository.cs @@ -0,0 +1,20 @@ +using System; +using Infrastructure.Attribute; +using ARW.Repository.System; +using ARW.Model.Models.Business.ProductsInvolveds; + +namespace ARW.Repository.Business.ProductsInvolveds +{ + /// + /// 涉及产品仓储 + /// + /// @author lwh + /// @date 2023-11-22 + /// + [AppService(ServiceLifetime = LifeTime.Transient)] + public class ProductsInvolvedRepository : BaseRepository + { + #region 业务逻辑代码 + #endregion + } +} \ No newline at end of file diff --git a/ARW.Service/Business/BusinessService/ProductsInvolveds/ProductsInvolvedService.cs b/ARW.Service/Business/BusinessService/ProductsInvolveds/ProductsInvolvedService.cs new file mode 100644 index 0000000..2d1f7ba --- /dev/null +++ b/ARW.Service/Business/BusinessService/ProductsInvolveds/ProductsInvolvedService.cs @@ -0,0 +1,170 @@ +using Infrastructure.Attribute; +using Microsoft.AspNetCore.Http; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Infrastructure; +using ARW.Model; +using ARW.Repository; +using ARW.Repository.Business.ProductsInvolveds; +using ARW.Service.Business.IBusinessService.ProductsInvolveds; +using ARW.Model.Dto.Business.ProductsInvolveds; +using ARW.Model.Models.Business.ProductsInvolveds; +using ARW.Model.Vo.Business.ProductsInvolveds; + +namespace ARW.Service.Business.BusinessService.ProductsInvolveds +{ + /// + /// 涉及产品接口实现类 + /// + /// @author lwh + /// @date 2023-11-22 + /// + [AppService(ServiceType = typeof(IProductsInvolvedService), ServiceLifetime = LifeTime.Transient)] + public class ProductsInvolvedServiceImpl : BaseService, IProductsInvolvedService + { + private readonly ProductsInvolvedRepository _ProductsInvolvedRepository; + + public ProductsInvolvedServiceImpl(ProductsInvolvedRepository ProductsInvolvedRepository) + { + this._ProductsInvolvedRepository = ProductsInvolvedRepository; + } + + #region 业务逻辑代码 + + + /// + /// 查询涉及产品分页列表 + /// + public async Task> GetProductsInvolvedList(ProductsInvolvedQueryDto parm) + { + //开始拼装查询条件d + var predicate = Expressionable.Create(); + + predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.ProductsInvolvedName), s => s.ProductsInvolvedName.Contains(parm.ProductsInvolvedName)); + var query = _ProductsInvolvedRepository + .Queryable() + .Where(predicate.ToExpression()) + .OrderBy(s => s.ProductsInvolvedSort,OrderByType.Asc) + .Select(s => new ProductsInvolvedVo + { + ProductsInvolvedId = s.ProductsInvolvedId, + ProductsInvolvedGuid = s.ProductsInvolvedGuid, + ProductsInvolvedName = s.ProductsInvolvedName, + ProductsInvolvedSort = s.ProductsInvolvedSort, + }); + + + return await query.ToPageAsync(parm); + } + + /// + /// 添加或修改涉及产品 + /// + public async Task AddOrUpdateProductsInvolved(ProductsInvolved model) + { + if (model.ProductsInvolvedId != 0) + { + var response = await _ProductsInvolvedRepository.UpdateAsync(model); + return "修改成功!"; + } + else + { + + var response = await _ProductsInvolvedRepository.InsertReturnSnowflakeIdAsync(model); + return "添加成功!"; + } + } + + #region Excel处理 + /// + /// 数据导入处理 + /// + public async Task HandleImportData(ProductsInvolvedVo ProductsInvolved) + { + return ProductsInvolved; + } + + + /// + /// Excel导入 + /// + public async Task ImportExcel(ProductsInvolved ProductsInvolved,int index,bool isUpdateSupport,string user) + { + try + { + // 空值判断 + // if (ProductsInvolved.ProductsInvolvedId == null) throw new CustomException("涉及产品不能为空"); + + if (isUpdateSupport) + { + // 判断唯一值 + var model = await GetFirstAsync(s => s.ProductsInvolvedId == ProductsInvolved.ProductsInvolvedId); + + // 如果为空就新增数据 + if (model == null) + { + // 开启事务 + var res = await UseTranAsync(async () => + { + var addRes = await AddOrUpdateProductsInvolved(ProductsInvolved); + }); + var addStr = $"第 {index} 行 => 涉及产品:【{ProductsInvolved.ProductsInvolvedId}】新增成功!
"; + return addStr; + } + else + { + // 如果有数据就进行修改 + // 开启事务 + await UseTranAsync(async () => + { + ProductsInvolved.ProductsInvolvedId = model.ProductsInvolvedId; + ProductsInvolved.ProductsInvolvedGuid = model.ProductsInvolvedGuid; + ProductsInvolved.Update_by = user; + ProductsInvolved.Update_time = DateTime.Now; + var editRes = await AddOrUpdateProductsInvolved(ProductsInvolved); + }); + var editStr = $"第 {index} 行 => 涉及产品:【{ProductsInvolved.ProductsInvolvedId}】更新成功!
"; + return editStr; + } + } + else{ + // 开启事务 + var res = await UseTranAsync(async () => + { + var addRes = await AddOrUpdateProductsInvolved(ProductsInvolved); + }); + //Console.WriteLine(res.IsSuccess); + var addStr = $"第 {index} 行 => 涉及产品:【{ProductsInvolved.ProductsInvolvedId}】新增成功!
"; + return addStr; + } + } + catch (Exception ex) + { + var errorRes = $"第 {index} 行 => 涉及产品:【{ProductsInvolved.ProductsInvolvedId}】导入失败!{ex.Message}
"; + return errorRes; + throw; + } + } + + + + /// + /// Excel数据导出处理 + /// + public async Task> HandleExportData(List data) + { + return data; + } + + #endregion + + + +#endregion + + } +} diff --git a/ARW.Service/Business/IBusinessService/ProductsInvolveds/IProductsInvolvedService.cs b/ARW.Service/Business/IBusinessService/ProductsInvolveds/IProductsInvolvedService.cs new file mode 100644 index 0000000..fb1daf7 --- /dev/null +++ b/ARW.Service/Business/IBusinessService/ProductsInvolveds/IProductsInvolvedService.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ARW.Model; +using ARW.Model.Dto.Business.ProductsInvolveds; +using ARW.Model.Models.Business.ProductsInvolveds; +using ARW.Model.Vo.Business.ProductsInvolveds; + +namespace ARW.Service.Business.IBusinessService.ProductsInvolveds +{ + /// + /// 涉及产品接口类 + /// + /// @author lwh + /// @date 2023-11-22 + /// + public interface IProductsInvolvedService : IBaseService + { + /// + /// 获取涉及产品分页列表 + /// + /// + /// + Task> GetProductsInvolvedList(ProductsInvolvedQueryDto parm); + + + /// + /// 添加或修改涉及产品 + /// + /// + /// + Task AddOrUpdateProductsInvolved(ProductsInvolved parm); + + + /// + /// 数据导入处理 + /// + /// + /// + Task HandleImportData(ProductsInvolvedVo ProductsInvolvedVo); + + + /// + /// Excel导入 + /// + /// + /// + Task ImportExcel(ProductsInvolved ProductsInvolved,int index,bool isUpdateSupport,string user); + + /// + /// Excel导出 + /// + Task> HandleExportData(List data); + + + } +} diff --git a/ARW.WebApi/Controllers/Business/ProductsInvolveds/ProductsInvolvedController.cs b/ARW.WebApi/Controllers/Business/ProductsInvolveds/ProductsInvolvedController.cs new file mode 100644 index 0000000..7c18325 --- /dev/null +++ b/ARW.WebApi/Controllers/Business/ProductsInvolveds/ProductsInvolvedController.cs @@ -0,0 +1,180 @@ +using Infrastructure; +using Infrastructure.Attribute; +using Infrastructure.Enums; +using Infrastructure.Model; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using ARW.Admin.WebApi.Extensions; +using ARW.Admin.WebApi.Filters; +using ARW.Common; +using ARW.Model.Dto.Business.ProductsInvolveds; +using ARW.Service.Business.IBusinessService.ProductsInvolveds; +using ARW.Admin.WebApi.Controllers; +using ARW.Model.Models.Business.ProductsInvolveds; +using ARW.Model.Vo.Business.ProductsInvolveds; +using Microsoft.AspNetCore.Authorization; +using ARW.Admin.WebApi.Framework; + + +namespace ARW.WebApi.Controllers.Business.ProductsInvolveds +{ + /// + /// 涉及产品控制器 + /// + /// @author lwh + /// @date 2023-11-22 + /// + [Verify] + [Route("business/[controller]")] + public class ProductsInvolvedController : BaseController + { + private readonly IProductsInvolvedService _ProductsInvolvedService; + + /// + /// 依赖注入 + /// + /// 涉及产品服务 + public ProductsInvolvedController(IProductsInvolvedService ProductsInvolvedService) + { + _ProductsInvolvedService = ProductsInvolvedService; + } + + + /// + /// 获取涉及产品列表 + /// + /// 查询参数 + /// + [HttpGet("getProductsInvolvedList")] + [ActionPermissionFilter(Permission = "business:productsinvolved:list")] + public async Task GetProductsInvolvedList([FromQuery] ProductsInvolvedQueryDto parm) + { + var res = await _ProductsInvolvedService.GetProductsInvolvedList(parm); + return SUCCESS(res); + } + + /// + /// 添加或修改涉及产品 + /// + /// + /// + [HttpPost("addOrUpdateProductsInvolved")] + [ActionPermissionFilter(Permission = "business:productsinvolved:addOrUpdate")] + [Log(Title = "添加或修改涉及产品", BusinessType = BusinessType.ADDORUPDATE)] + public async Task AddOrUpdateProductsInvolved([FromBody] ProductsInvolvedDto parm) + { + if (parm == null) { throw new CustomException("请求参数错误"); } + + var modal = new ProductsInvolved(); + if (parm.ProductsInvolvedId != 0) modal = parm.Adapt().ToUpdate(HttpContext); + else modal = parm.Adapt().ToCreate(HttpContext); + + var res = await _ProductsInvolvedService.AddOrUpdateProductsInvolved(modal); + return SUCCESS(res); + } + + /// + /// 删除涉及产品 + /// + /// + [HttpDelete("{ids}")] + [ActionPermissionFilter(Permission = "business:productsinvolved:delete")] + [Log(Title = "涉及产品删除", BusinessType = BusinessType.DELETE)] + public IActionResult Delete(string ids) + { + long[] idsArr = Tools.SpitLongArrary(ids); + if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } + var response = _ProductsInvolvedService.Delete(idsArr); + return SUCCESS("删除成功!"); + } + + /// + /// 导入涉及产品 + /// + /// 使用IFromFile必须使用name属性否则获取不到文件 + /// 是否需要更新 + /// + [HttpPost("importData")] + [Log(Title = "涉及产品导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false, IsSaveResponseData = false)] + [ActionPermissionFilter(Permission = "business:productsinvolved:import")] + public async Task ImportExcel([FromForm(Name = "file")] IFormFile formFile,bool updateSupport) + { + var isUpdateSupport = updateSupport; + IEnumerable parm = ExcelHelper.ImportData(formFile.OpenReadStream()); + + var i = 0; + var msgList = new List(); + foreach (ProductsInvolvedVo item in parm) + { + i++; + var ProductsInvolved = await _ProductsInvolvedService.HandleImportData(item); + var modal = ProductsInvolved.Adapt().ToCreate(HttpContext); + var user = JwtUtil.GetLoginUser(App.HttpContext).UserName; + var msg = await _ProductsInvolvedService.ImportExcel(modal,i,isUpdateSupport,user); + msgList.Add(msg); + } + + return SUCCESS(msgList.ToArray()); + } + + + /// + /// 涉及产品导入模板下载 + /// + /// + [HttpGet("importTemplate")] + [Log(Title = "涉及产品模板", BusinessType = BusinessType.EXPORT, IsSaveRequestData = false, IsSaveResponseData = false)] + [AllowAnonymous] + public IActionResult ImportTemplateExcel() + { + List ProductsInvolved = new List(); + MemoryStream stream = new MemoryStream(); + + // 示例数据 + var values = new List() { "人工智能", "100" }; + string sFileName = DownloadImportTemplate(ProductsInvolved, stream, "涉及产品导入模板", values); + + return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"{sFileName}"); + } + + /// + /// 导出涉及产品 + /// + /// + [Log(Title = "涉及产品导出", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)] + [HttpGet("exportProductsInvolved")] + [ActionPermissionFilter(Permission = "business:productsinvolved:export")] + public async Task ExportExcel([FromQuery] ProductsInvolvedQueryDto parm) + { + parm.PageSize = 10000; + var list = await _ProductsInvolvedService.GetProductsInvolvedList(parm); + var data = list.Result; + + // 选中数据 + if (!string.IsNullOrEmpty(parm.ids)) + { + int[] idsArr = Tools.SpitIntArrary(parm.ids); + var selectDataList = new List(); + foreach (var item in idsArr) + { + var select_data = data.Where(s => s.ProductsInvolvedId == item).First(); + selectDataList.Add(select_data); + } + data = selectDataList; + } + + + + // 导出数据处理 + var handleData = await _ProductsInvolvedService.HandleExportData(data); + + string sFileName = ExportExcel(handleData, "ProductsInvolved", "涉及产品列表"); + return SUCCESS(new { path = "/export/" + sFileName, fileName = sFileName }); + } + + + + + } +}