using Aop.Api.Domain; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Filter; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SQLitePCL; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.BasicData.Entities.Dto; using Tnb.BasicData.Interfaces; using Tnb.ProductionMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Consts; namespace Tnb.BasicData { /// /// 物料档案 /// [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)] [Route("api/[area]/[controller]/[action]")] public class BasMaterialService : IBasMaterialService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _repository; private readonly DataBaseManager _dbManager; private readonly IDictionaryDataService _dictionaryDataService; public BasMaterialService( ISqlSugarRepository repository, DataBaseManager dbManager, IDictionaryDataService dictionaryDataService) { _repository = repository; _dbManager = dbManager; _dictionaryDataService = dictionaryDataService; } /// /// 复制物料 /// /// 物料id id [HttpPost] public async Task Copy(Dictionary parameters) { string id = parameters["id"]; BasMaterial basMaterial = await _repository.GetByIdAsync(id); List materialUnits = await _repository.AsSugarClient().Queryable().Where(x => x.material_id == id).ToListAsync(); List materialIntoFactorySpecifications = await _repository.AsSugarClient().Queryable().Where(x => x.material_id == id).ToListAsync(); string newId = SnowflakeIdHelper.NextId(); basMaterial.id = newId; basMaterial.code += "_复制的请修改"; basMaterial.name += "_复制的请修改"; DbResult result = await _repository.AsSugarClient().Ado.UseTranAsync(async () => { _ = await _repository.InsertAsync(basMaterial); foreach (BasMaterialUnit basMaterialUnit in materialUnits) { basMaterialUnit.id = SnowflakeIdHelper.NextId(); basMaterialUnit.material_id = newId; } foreach (BasMaterialIntoFactorySpecifications basMaterialIntoFactorySpecification in materialIntoFactorySpecifications) { basMaterialIntoFactorySpecification.id = SnowflakeIdHelper.NextId(); basMaterialIntoFactorySpecification.material_id = newId; } _ = await _repository.AsSugarClient().Insertable(materialUnits).ExecuteCommandAsync(); _ = await _repository.AsSugarClient().Insertable(materialIntoFactorySpecifications).ExecuteCommandAsync(); }); return !result.IsSuccess ? throw Oops.Oh(ErrorCode.COM1008) : result.IsSuccess ? "复制成功" : result.ErrorMessage; } /// /// 获取本物料清单及其所有子集物料信息 /// /// /// [HttpPost] public async Task GetMaterialSelectInfo(MaterialSelectQueryInput queryInput) { ISqlSugarClient db = _repository.AsSugarClient(); if (!string.IsNullOrEmpty(queryInput.ebom_id)) { List ids = await GetAllChildrenMaterialId(queryInput.ebom_id, 0); BasEbomH ebom = await db.Queryable().Where(x => x.id == queryInput.ebom_id).SingleAsync(); if (ebom != null && !string.IsNullOrEmpty(ebom.material_id)) { ids.Add(ebom.material_id); } SqlSugarPagedList result = await db.Queryable() .LeftJoin((a, b) => b.EnCode == DictConst.MeasurementUnit && b.DeleteMark == null) .LeftJoin((a, b, c) => c.DictionaryTypeId == b.Id && a.unit_id == c.EnCode) .WhereIF(!string.IsNullOrEmpty(queryInput.material_info), (a, b, c) => a.code.Contains(queryInput.material_info) || a.name.Contains(queryInput.material_info)) .WhereIF(!string.IsNullOrEmpty(queryInput.ebom_id), (a, b, c) => ids.Contains(a.id)) .Select((a, b, c) => new MaterialSelectOutput() { id = a.id, code = a.code, name = a.name, descrip = a.descrip, unit_id = a.unit_id, unit_name = c.FullName, }).ToPagedListAsync(queryInput.currentPage, queryInput.pageSize); return PageResult.SqlSugarPageResult(result); } else { SqlSugarPagedList result = await db.Queryable() .LeftJoin((a, b) => b.EnCode == DictConst.MeasurementUnit && b.DeleteMark == null) .LeftJoin((a, b, c) => c.DictionaryTypeId == b.Id && a.unit_id == c.EnCode) .WhereIF(!string.IsNullOrEmpty(queryInput.material_info), (a, b, c) => a.code.Contains(queryInput.material_info) || a.name.Contains(queryInput.material_info)) .Select((a, b, c) => new MaterialSelectOutput() { id = a.id, code = a.code, name = a.name, descrip = a.descrip, unit_id = a.unit_id, unit_name = c.FullName, }).ToPagedListAsync(queryInput.currentPage, queryInput.pageSize); return PageResult.SqlSugarPageResult(result); } } [HttpPost] public async Task GetCanCreateSubWorkOrderMaterial(MaterialSelectQueryInput queryInput) { ISqlSugarClient db = _repository.AsSugarClient(); if (!string.IsNullOrEmpty(queryInput.ebom_id)) { List ids = await GetAllChildrenMaterialId(queryInput.ebom_id, 0); SqlSugarPagedList result = await db.Queryable() .LeftJoin((a, b) => b.EnCode == DictConst.MeasurementUnit && b.DeleteMark == null) .LeftJoin((a, b, c) => c.DictionaryTypeId == b.Id && a.unit_id == c.EnCode) .WhereIF(!string.IsNullOrEmpty(queryInput.material_info), (a, b, c) => a.code.Contains(queryInput.material_info) || a.name.Contains(queryInput.material_info)) .WhereIF(!string.IsNullOrEmpty(queryInput.ebom_id), (a, b, c) => ids.Contains(a.id)) .Where((a, b, c) => a.is_create_sub_work_order == "1") .Select((a, b, c) => new MaterialSelectOutput() { id = a.id, code = a.code, name = a.name, descrip = a.descrip, unit_id = a.unit_id, unit_name = c.FullName, }).ToPagedListAsync(queryInput.currentPage, queryInput.pageSize); return PageResult.SqlSugarPageResult(result); } else { return PageResult.SqlSugarPageResult(new SqlSugarPagedList()); } } [HttpPost] public async Task GetMaterialByType(Dictionary dic) { string types = dic["types"]; int currentPage = int.Parse(dic["currentPage"].ToString()); int pagesize = int.Parse(dic["pageSize"].ToString()); string queryJson = dic["queryJson"]; string[] typeArr = types.Split(","); List list = await _repository.AsSugarClient().Queryable().Where(x => x.state == "1").ToListAsync(); List ids = new(); foreach (string type in typeArr) { ids.AddRange(list.Where(x => x.category_id.Contains(type)).Select(p => p.id)); } SqlSugarPagedList result = await _repository.AsSugarClient().Queryable() .WhereIF(ids.Count > 0, a => ids.Contains(a.id)) .WhereIF(!string.IsNullOrEmpty(queryJson), a => a.name.Contains(queryJson) || a.code.Contains(queryJson)) .Select(a => a).ToPagedListAsync(currentPage, pagesize); return PageResult.SqlSugarPageResult(result); } [HttpPost] public async Task GetMaterialByQueryJson(MaterialQueryInput input) { ISqlSugarClient db = _repository.AsSugarClient(); Dictionary? queryJson = new(); if (input != null && !string.IsNullOrEmpty(input.queryJson)) { queryJson = JsonConvert.DeserializeObject>(input?.queryJson ?? ""); } List typeList = new(); if (!string.IsNullOrEmpty(input!.types)) { typeList = JsonConvert.DeserializeObject>(input?.types ?? "") ?? new List(); } ISugarQueryable query = db.Queryable() .Where(x => x.state == "1") .WhereIF(queryJson != null && queryJson.ContainsKey("name"), x => x.name.Contains(queryJson!["name"])) .WhereIF(queryJson != null && queryJson.ContainsKey("code"), x => x.code.Contains(queryJson!["code"])) .WhereIF(queryJson != null && queryJson.ContainsKey("material_specification"), x => x.material_specification!.Contains(queryJson!["material_specification"])) .Select(x => x); List> list = new(); foreach (string type in typeList) { list.Add(query.Clone().Where(x => x.category_id.Contains(type))); } if (list.Count <= 0) { SqlSugarPagedList result = await query.ToPagedListAsync(input?.currentPage ?? 1, input?.pageSize ?? 50); return PageResult.SqlSugarPageResult(result); } else { SqlSugarPagedList result = await db.UnionAll(list).Select().ToPagedListAsync(input?.currentPage ?? 1, input?.pageSize ?? 50); return PageResult.SqlSugarPageResult(result); } } [HttpPost] public async Task GetInboundWarehouseById(Dictionary dic) { string id = dic.ContainsKey("id") ? dic["id"] : ""; return await _repository.AsSugarClient().Queryable() .LeftJoin((a, b) => a.wh_id == b.id) .Where((a, b) => a.material_id == id) .Select((a, b) => new { warehouse_id = a.wh_id, warehouse_code = b.whcode, warehouse_name = b.whname }).ToListAsync(); } /// /// 获取物料清单下所子集物料id /// /// private async Task> GetAllChildrenMaterialId(string ebomId, int index) { if (string.IsNullOrEmpty(ebomId)) { return new List(); } List ids = new(); if (index++ > 10) { return ids; } List list = await _repository.AsSugarClient().Queryable().Where(x => x.ebom_id == ebomId) .Select(x => x.material_id).ToListAsync(); if (list != null && list.Count > 0) { foreach (string id in list) { //获取最新创建的物料清单 BasEbomH ebom = await _repository.AsSugarClient().Queryable().Where(x => x.material_id == id).OrderByDescending(x => x.create_time).FirstAsync(); ids.AddRange(await GetAllChildrenMaterialId(ebom?.id ?? "", index)); } ids.AddRange(list); } return ids; } /// /// 物料新增修改接口 /// /// /// [HttpPost] public async Task CreateCreateOrUpdateMaterial(ErpBasMaterialInput input) { var db = _repository.AsSugarClient(); if (input == null) { throw Oops.Bah("参数为空"); } if (input.bas_material == null) { throw Oops.Bah("物料信息为空"); } if (!string.IsNullOrEmpty(input.bas_material.code)) { throw Oops.Bah("物料编号为空"); } if (!string.IsNullOrEmpty(input.bas_material.name)) { throw Oops.Bah("物料名称为空"); } DbResult result = await db.Ado.UseTranAsync(async () => { BasMaterial basMaterial = input.bas_material.Adapt(); if (!await db.Queryable().AnyAsync(x => x.code == input.bas_material.code)) { basMaterial.id = SnowflakeIdHelper.NextId(); } if (!string.IsNullOrEmpty(input.bas_material.create_count)) { UserEntity userEntity = await db.Queryable().FirstAsync(x=>x.Account==input.bas_material.create_count); if (userEntity == null) { throw Oops.Bah($"未找到用户{input.bas_material.create_count}"); } basMaterial.create_id = userEntity?.Id; } if (!string.IsNullOrEmpty(input.bas_material.modify_count)) { UserEntity userEntity = await db.Queryable().FirstAsync(x=>x.Account==input.bas_material.modify_count); if (userEntity == null) { throw Oops.Bah($"未找到用户{input.bas_material.modify_count}"); } basMaterial.modify_id = userEntity?.Id; } List basMaterialUnits = new List(); // List basMaterialIntoFactorySpecificationsList = new List(); // List basSubstitutionMaterials = new List(); // List basMaterialSendWarehouses = new List(); // List basMaterialInboundWhs = new List(); if (input.bas_material_units != null && input.bas_material_units.Count > 0) { foreach(var item in input.bas_material_units) { BasMaterialUnit basMaterialUnit = item.Adapt(); basMaterialUnit.id = SnowflakeIdHelper.NextId(); basMaterialUnit.material_id = basMaterial.id; basMaterialUnits.Add(basMaterialUnit); } } // if (input.bas_material_into_factory_specificationses != null && input.bas_material_into_factory_specificationses.Count > 0) // { // foreach(var item in input.bas_material_into_factory_specificationses) // { // BasMaterialIntoFactorySpecifications basMaterialIntoFactorySpecifications = item.Adapt(); // basMaterialIntoFactorySpecifications.id = SnowflakeIdHelper.NextId(); // basMaterialIntoFactorySpecifications.material_id = basMaterial.id; // basMaterialIntoFactorySpecificationsList.Add(basMaterialIntoFactorySpecifications); // } // } // // if (input.bas_substitution_materials != null && input.bas_substitution_materials.Count > 0) // { // foreach(var item in input.bas_substitution_materials) // { // BasSubstitutionMaterial basSubstitutionMaterial = item.Adapt(); // basSubstitutionMaterial.id = SnowflakeIdHelper.NextId(); // basSubstitutionMaterial.material_id = basMaterial.id; // BasMaterial subBasMaterial = await db.Queryable().FirstAsync(x=>x.code==item.sub_material_code); // if (subBasMaterial == null) // { // throw Oops.Bah($"未找到替代物料{item.sub_material_code}"); // } // basSubstitutionMaterial.sub_material_id = subBasMaterial?.id ?? item.sub_material_code; // basSubstitutionMaterials.Add(basSubstitutionMaterial); // } // } // // if (input.bas_material_send_warehouses != null && input.bas_material_send_warehouses.Count > 0) // { // foreach(var item in input.bas_material_send_warehouses) // { // BasMaterialSendWarehouse basMaterialSendWarehouse = item.Adapt(); // basMaterialSendWarehouse.id = SnowflakeIdHelper.NextId(); // basMaterialSendWarehouse.material_id = basMaterial.id; // BasWarehouse basWarehouse = await db.Queryable().FirstAsync(x=>x.whcode==item.wh_code); // if (basWarehouse == null) // { // throw Oops.Bah($"发料仓库未找到仓库{item.wh_code}"); // } // basMaterialSendWarehouse.wh_id = basWarehouse?.id ?? item.wh_code; // basMaterialSendWarehouses.Add(basMaterialSendWarehouse); // } // } // // if (input.bas_material_inbound_whs != null && input.bas_material_inbound_whs.Count > 0) // { // foreach(var item in input.bas_material_inbound_whs) // { // BasMaterialInboundWh basMaterialInboundWh = item.Adapt(); // basMaterialInboundWh.id = SnowflakeIdHelper.NextId(); // basMaterialInboundWh.material_id = basMaterial.id; // BasWarehouse basWarehouse = await db.Queryable().FirstAsync(x=>x.whcode==item.wh_code); // if (basWarehouse == null) // { // throw Oops.Bah($"入库仓库未找到仓库{item.wh_code}"); // } // basMaterialInboundWh.wh_id = basWarehouse?.id ?? item.wh_code; // basMaterialInboundWhs.Add(basMaterialInboundWh); // } // } if (!await db.Queryable().AnyAsync(x => x.code == input.bas_material.code)) { await db.Insertable(basMaterial).ExecuteCommandAsync(); } else { await db.Updateable(basMaterial).ExecuteCommandAsync(); } // var x= await db.Storageable(basMaterial).ToStorageAsync(); // await x.AsInsertable.ExecuteCommandAsync();//不存在插入 // await x.AsUpdateable.ExecuteCommandAsync();//存在更新 if (basMaterialUnits.Count > 0) { await db.Deleteable().Where(x=>x.material_id==basMaterial.id).ExecuteCommandAsync(); await db.Insertable(basMaterialUnits).ExecuteCommandAsync(); } // if (basMaterialIntoFactorySpecificationsList.Count > 0) // { // await db.Deleteable().Where(x=>x.material_id==basMaterial.id).ExecuteCommandAsync(); // await db.Insertable(basMaterialIntoFactorySpecificationsList).ExecuteCommandAsync(); // } // // if (basSubstitutionMaterials.Count > 0) // { // await db.Deleteable().Where(x=>x.material_id==basMaterial.id).ExecuteCommandAsync(); // await db.Insertable(basSubstitutionMaterials).ExecuteCommandAsync(); // } // // if (basMaterialSendWarehouses.Count > 0) // { // await db.Deleteable().Where(x=>x.material_id==basMaterial.id).ExecuteCommandAsync(); // await db.Insertable(basMaterialSendWarehouses).ExecuteCommandAsync(); // } // // if (basMaterialInboundWhs.Count > 0) // { // await db.Deleteable().Where(x=>x.material_id==basMaterial.id).ExecuteCommandAsync(); // await db.Insertable(basMaterialInboundWhs).ExecuteCommandAsync(); // } }); return !result.IsSuccess ? throw Oops.Oh(result.ErrorMessage) : "保存成功"; } [AllowAnonymous] [HttpPost] public TranUnitOutput TranUnit(TranUnitInput input) { var db = _repository.AsSugarClient(); BasMaterial basMaterial = db.Queryable().Single(x => x.id == input.material_id); DictionaryDataEntity unit = db.Queryable().Where(x=>x.DictionaryTypeId==WmsWareHouseConst.UNITTYPEID && x.EnCode==basMaterial.unit_id).First(); if (basMaterial.unit_id == input.unit_id || (unit!=null && unit.Id==input.unit_id)) { string wmsUnitId = db.Queryable() .InnerJoin((a,b)=>b.DictionaryTypeId==WmsWareHouseConst.UNITTYPEID && a.unit_id==b.EnCode) .InnerJoin((a,b,c)=>b.Id==c.table_id) .Select((a,b,c)=>c.cunitid) .First(); return new TranUnitOutput { erp_unit_id = wmsUnitId, tran_qty1 = input.tran_qty1, tran_qty2 = input.tran_qty2, tran_qty3 = input.tran_qty3, tran_qty4 = input.tran_qty4, }; } else { BasMaterialUnit basMaterialUnit = db.Queryable() .InnerJoin((a,b)=>b.DictionaryTypeId==WmsWareHouseConst.UNITTYPEID && a.auxiliary_unit_id==b.EnCode) .InnerJoin((a,b,c)=>b.Id==c.table_id) .Where((a,b)=>(a.auxiliary_unit_id==input.unit_id || b.Id==input.unit_id) && a.material_id==input.material_id) .Select((a,b,c)=>new BasMaterialUnit { id = a.id, number_of_auxiliary_unit = a.number_of_auxiliary_unit, number_of_primary_unit = a.number_of_primary_unit, auxiliary_unit_id = a.auxiliary_unit_id, auxiliary_unit_id_id = b.Id, material_id = a.material_id, erp_unit_id = c.cunitid }) .First(); if (basMaterialUnit == null) { throw Oops.Bah($"系统未找到单位:{input.unit_id}"); } TranUnitOutput tranUnitOutput = new TranUnitOutput(); tranUnitOutput.erp_unit_id = basMaterialUnit.erp_unit_id; if(input.tran_qty1>0) tranUnitOutput.tran_qty1 = input.tran_qty1 * decimal.Parse(basMaterialUnit.number_of_primary_unit) / decimal.Parse(basMaterialUnit.number_of_auxiliary_unit); if(input.tran_qty2>0) tranUnitOutput.tran_qty2 = input.tran_qty2 * decimal.Parse(basMaterialUnit.number_of_primary_unit) / decimal.Parse(basMaterialUnit.number_of_auxiliary_unit); if(input.tran_qty3>0) tranUnitOutput.tran_qty3 = input.tran_qty3 * decimal.Parse(basMaterialUnit.number_of_primary_unit) / decimal.Parse(basMaterialUnit.number_of_auxiliary_unit); if(input.tran_qty4>0) tranUnitOutput.tran_qty4 = input.tran_qty4 * decimal.Parse(basMaterialUnit.number_of_primary_unit) / decimal.Parse(basMaterialUnit.number_of_auxiliary_unit); return tranUnitOutput; } } } }