Files
tnb.server/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs
2023-07-26 09:33:44 +08:00

353 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using JNPF;
using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.Extras.CollectiveOAuth.Models;
using JNPF.Extras.CollectiveOAuth.Utils;
using JNPF.FriendlyException;
using JNPF.Logging;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev.Entitys;
using Microsoft.AspNetCore.Mvc;
using Microsoft.ClearScript.Util.Web;
using Newtonsoft.Json;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.ProductionMgr.Entities;
using Tnb.ProductionMgr.Entities.Dto;
using Tnb.ProductionMgr.Interfaces;
using Tnb.ProductionMgr.Entities.Consts;
using Tnb.WarehouseMgr;
using Tnb.WarehouseMgr.Entities;
using Tnb.BasicData;
namespace Tnb.ProductionMgr
{
/// <summary>
/// 业务实现:物料投料
/// </summary>
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)]
[Route("api/[area]/[controller]/[action]")]
public class PrdFeedingService : IPrdFeedingService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository<PrdFeedingH> _repository;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
// private readonly WmsSignForDeliveryService _wmsSignForDeliveryService;
public PrdFeedingService(
ISqlSugarRepository<PrdFeedingH> repository,
IBillRullService billRullService,
// WmsSignForDeliveryService wmsSignForDeliveryService,
IUserManager userManager
)
{
_repository = repository;
_userManager = userManager;
// _wmsSignForDeliveryService = _wmsSignForDeliveryService;
_billRullService = billRullService;
}
[HttpPost]
public async Task<dynamic> SaveData(MaterialReceiptInput input)
{
var db = _repository.AsSugarClient();
DbResult<bool> result = await db.Ado.UseTranAsync(async () =>
{
var moTask = await db.Queryable<PrdMoTask>().FirstAsync(x => x.id == input.mo_task_id);
var inputMaterials = await db.Queryable<BasMbomInput>()
.Where(x => x.mbom_id == moTask.bom_id && x.mbom_process_id == input.mbom_process_id)
.Select(x=>x.material_id)
.ToListAsync();
string code = await _billRullService.GetBillNumber(Tnb.BasicData.CodeTemplateConst.FEEDING_CODE);
PrdFeedingH prdFeedingH = new PrdFeedingH()
{
code = code,
station_id = input.station_id,
mo_task_id = input.mo_task_id,
process_id = input.process_id,
equip_id = input.equip_id,
workshop_id = input.workshop_id,
carry_id = input.carry_id,
workline_id = input.workline_id,
carry_code = input.carry_code,
remark = input.remark,
mbom_process_id = input.mbom_process_id,
create_id = _userManager.UserId,
create_time = DateTime.Now,
org_id = _userManager.GetUserInfo().Result.organizeId
};
List<PrdFeedingD> list = new List<PrdFeedingD>();
if (input.details != null && input.details.Count > 0)
{
foreach (var item in input.details)
{
if(!inputMaterials.Contains(item["material_id"]))
throw new Exception("该物料不是生产bom投入物料不能签收");
var detail = await db.Queryable<PrdMaterialReceiptD>()
.Where(x => x.carry_id == input.carry_id && x.is_all_feeding == 0).FirstAsync();
decimal num = Convert.ToDecimal(item["num"]);
list.Add(new PrdFeedingD
{
feeding_id = prdFeedingH.id,
material_receipt_detail_id = detail?.id,
material_id = item["material_id"],
num = num,
batch = item["batch"],
unit_id = item["unit_id"],
carry_id = input.carry_id,
status = "0",
use_num = 0,
});
if (detail != null)
{
if(detail.feeding_num + num > detail.num)
{
throw new Exception("投料数量不能大于签收数量");
}else if (detail.feeding_num + num == detail.num)
{
await db.Updateable<PrdMaterialReceiptD>()
.SetColumns(x => x.feeding_num == x.feeding_num + num)
.SetColumns(x => x.is_all_feeding == 1)
.Where(x => x.id == detail.id)
.ExecuteCommandAsync();
}
else
{
await db.Updateable<PrdMaterialReceiptD>()
.SetColumns(x => x.feeding_num == x.feeding_num + num)
.Where(x => x.id == detail.id)
.ExecuteCommandAsync();
}
}
else
{
throw new Exception("没有签收单,无法投料");
}
}
}
else
{
throw new Exception("没有签收物料");
}
await db.Insertable<PrdFeedingH>(prdFeedingH).ExecuteCommandAsync();
await db.Insertable<PrdFeedingD>(list).ExecuteCommandAsync();
});
if (result.IsSuccess)
{
//签收后调用载具签收接口
// await _wmsSignForDeliveryService.MESCarrySign(new MESCarrySignInput()
// {
// org_id = _userManager.GetUserInfo().Result.organizeId,
// create_id = _userManager.UserId,
// carry_code = input.carry_code ?? "",
// });
}
if(!result.IsSuccess) throw Oops.Oh(result.ErrorMessage);
return result.IsSuccess ? "投料成功" : result.ErrorMessage;
}
[HttpPost]
public async Task<dynamic> SaveDataNew(MaterialReceiptNewInput input)
{
var db = _repository.AsSugarClient();
PrdFeedingH prdFeedingH = null;
List<PrdFeedingD> list = new List<PrdFeedingD>();
DbResult<bool> result2 = new DbResult<bool>();
DbResult<bool> result = await db.Ado.UseTranAsync(async () =>
{
var moTask = await db.Queryable<PrdMoTask>().FirstAsync(x => x.id == input.mo_task_id);
var parentMoTask = await db.Queryable<PrdMoTask>().FirstAsync(x => x.id == moTask.parent_id);
var carry = await db.Queryable<WmsCarryH>().SingleAsync(x => x.carry_code == input.carry_code);
var workline = await db.Queryable<OrganizeEntity>().SingleAsync(x => x.Id == parentMoTask.workline_id);
var workshop = await db.Queryable<OrganizeEntity>().SingleAsync(x=>x.Id==workline.ParentId);
var inputMaterials = await db.Queryable<BasMbomInput>()
.Where(x => x.mbom_id == moTask.bom_id && x.mbom_process_id == moTask.mbom_process_id)
.Select(x=>x.material_id)
.ToListAsync();
string code = await _billRullService.GetBillNumber(Tnb.BasicData.CodeTemplateConst.FEEDING_CODE);
prdFeedingH = new PrdFeedingH()
{
code = code,
station_id = input.station_id,
mo_task_id = input.mo_task_id,
process_id = moTask.process_id,
equip_id = input.equip_id,
workshop_id = workshop?.Id,
carry_id = carry.id,
workline_id = moTask.workline_id,
carry_code = input.carry_code,
// remark = input.remark,
mbom_process_id = moTask.mbom_process_id,
create_id = _userManager.UserId,
create_time = DateTime.Now,
org_id = _userManager.GetUserInfo().Result.organizeId
};
if (input.details != null && input.details.Count > 0)
{
foreach (var item in input.details)
{
if(!inputMaterials.Contains(item["material_id"]))
throw new Exception("该物料不是生产bom投入物料不能签收");
var detail = await db.Queryable<PrdMaterialReceiptD>()
.Where(x => x.carry_id == carry.id && x.is_all_feeding == 0).FirstAsync();
decimal num = Convert.ToDecimal(item["num"]);
list.Add(new PrdFeedingD
{
feeding_id = prdFeedingH.id,
material_receipt_detail_id = detail?.id,
material_id = item["material_id"],
num = num,
batch = item["batch"],
unit_id = item["unit_id"],
carry_id = carry.id,
status = "0",
use_num = 0,
});
if (detail != null)
{
if(detail.feeding_num + num > detail.num)
{
throw new Exception("投料数量不能大于签收数量");
}else if (detail.feeding_num + num == detail.num)
{
await db.Updateable<PrdMaterialReceiptD>()
.SetColumns(x => x.feeding_num == x.feeding_num + num)
.SetColumns(x => x.is_all_feeding == 1)
.Where(x => x.id == detail.id)
.ExecuteCommandAsync();
}
else
{
await db.Updateable<PrdMaterialReceiptD>()
.SetColumns(x => x.feeding_num == x.feeding_num + num)
.Where(x => x.id == detail.id)
.ExecuteCommandAsync();
}
}
else
{
throw new Exception("没有签收单,无法投料");
}
}
}
else
{
throw new Exception("没有签收物料");
}
// await db.Insertable<PrdFeedingH>(prdFeedingH).ExecuteCommandAsync();
// await db.Insertable<PrdFeedingD>(list).ExecuteCommandAsync();
});
if (result.IsSuccess)
{
//签收后调用载具签收接口
// await _wmsSignForDeliveryService.MESCarrySign(new MESCarrySignInput()
// {
// org_id = _userManager.GetUserInfo().Result.organizeId,
// create_id = _userManager.UserId,
// carry_code = input.carry_code ?? "",
// });
// var mesCarrySignInput = new MESCarrySignInput()
// {
// org_id = _userManager.GetUserInfo().Result.organizeId,
// create_id = _userManager.UserId,
// carry_code = input.carry_code ?? "",
// };
//
// string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host;
// Dictionary<string, object> header = new Dictionary<string, object>()
// {
// ["Authorization"] = App.HttpContext.Request.Headers["Authorization"]
// };
// var sendResult = HttpUtils.RequestPost(domain + WebApiConst.MES_CARRY_SIGN,JsonConvert.SerializeObject(mesCarrySignInput),header);
// Log.Information(sendResult);
// AuthResponse authResponse = JsonConvert.DeserializeObject<AuthResponse>(sendResult);
// if (authResponse.code != 200)
// {
// throw Oops.Bah(authResponse.msg);
// }
// else
// {
// result2 = await db.Ado.UseTranAsync(async () =>
// {
// await db.Insertable<PrdFeedingH>(prdFeedingH).ExecuteCommandAsync();
// await db.Insertable<PrdFeedingD>(list).ExecuteCommandAsync();
// });
//
// }
}
if(!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
return result.IsSuccess ? "签收成功" : result.ErrorMessage;
}
[HttpPost]
public async Task<dynamic> GetFeedingRecordTree()
{
var db = _repository.AsSugarClient();
var result = await db.Queryable<PrdMoTask>()
.Where(a => a.schedule_type == 2 && a.parent_id!=null)
.Select(a => new FeedingRecordTreeOutput()
{
mo_task_code = a.mo_task_code,
children = SqlFunc.Subqueryable<PrdFeedingH>().Where(b=>a.id==b.mo_task_id).ToList(b=>new FeedingRecordChildren()
{
id = b.id,
code = b.code,
// children = SqlFunc.Subqueryable<PrdFeedingD>().LeftJoin<BasMaterial>((c,d)=>c.material_id==d.id)
// .Where((c,d)=>SqlFunc.IIF(b==null,"0",b.id)==c.feeding_id).ToList((c,d)=>new FeedingRecordMaterialChildren()
// {
// // material_code = d.code,
// // material_name = d.name,
// })
// children = new List<FeedingRecordMaterialChildren>(),
// children = b!=null ? SqlFunc.Subqueryable<PrdFeedingD>()
// .Where((c)=>"26897270557717"=="26897270557717").ToList((c)=>new FeedingRecordMaterialChildren()
// {
// // material_code = d.code,
// // material_name = d.name,
// }) : new List<FeedingRecordMaterialChildren>()
})
}).Mapper(x =>
{
foreach (var item in x.children)
{
item.children = db.Queryable<PrdFeedingD>()
.LeftJoin<BasMaterial>((c, d) => c.material_id == d.id)
.Where((c, d) => item.id == c.feeding_id).Select((c,d) => new FeedingRecordMaterialChildren()
{
material_code = d.code,
material_name = d.name,
}).ToList();
}
})
.ToListAsync();
return result;
}
}
}