Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs
2024-09-14 18:50:52 +08:00

472 lines
25 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NPOI.Util;
using SqlSugar;
using Tnb.BasicData;
using Tnb.BasicData.Entities;
using Tnb.ProductionMgr.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Attributes;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Interfaces;
using Tnb.ProductionMgr.Entities.Entity;
using System.Threading;
namespace Tnb.WarehouseMgr
{
[OverideVisualDev(ModuleConsts.MODULE_WMSPRDINSTOCK_ID)]
[ServiceModule(BizTypeId)]
public class WmsPrdInstockHService : BaseWareHouseService
{
private const string BizTypeId = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
private readonly ISqlSugarClient _db;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWareHouseService _wareHouseService;
private readonly IBillRullService _billRullService;
public WmsPrdInstockHService(ISqlSugarRepository<WmsCarryH> repository, IRunService runService,
IVisualDevService visualDevService, IWareHouseService wareHouseService, IBillRullService billRullService)
{
_db = repository.AsSugarClient();
_runService = runService;
_visualDevService = visualDevService;
_wareHouseService = wareHouseService;
_billRullService = billRullService;
}
/// <summary>
/// 工单提报 第一次主表所有参数全传后续主表只需要传工单号prd_bill_code和更新后的合格数pqty、不合格数rqty
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<Entities.Dto.Outputs.Result> PrdInstock(WmsPrdInstockInput input, ISqlSugarClient dbConn = null)
{
Logger.LogInformation($"【PrdInstock】传入参数 {JsonConvert.SerializeObject(input)}");
var db = _db;
if (dbConn != null)
db = dbConn;
string type = "";
SemaphoreSlim semaphoreSlim = null;
try
{
await db.Ado.BeginTranAsync();
WmsPrdInstockH prdInstockH = db.Queryable<WmsPrdInstockH>().Where(r => r.prd_bill_code == input.prd_bill_code).First();
string prd_instock_code_id = "";
// 新建主表
if (prdInstockH == null)
{
string bill_code = await _billRullService.GetBillNumber(CodeTemplateConst.PRDOUTSTOCK_CODE);
WmsPrdInstockH wmsPrdInstockH = new ();
wmsPrdInstockH.create_id = "";
wmsPrdInstockH.create_time = DateTime.Now;
wmsPrdInstockH.prd_bill_code = input.prd_bill_code;
wmsPrdInstockH.bill_code = bill_code;
wmsPrdInstockH.prd_report_id = input.prd_report_id;
wmsPrdInstockH.material_id = input.material_id;
wmsPrdInstockH.material_code = input.material_code;
wmsPrdInstockH.material_name = input.material_name;
wmsPrdInstockH.material_spec = input.material_spec;
wmsPrdInstockH.planqty = input.planqty;
wmsPrdInstockH.pqty = input.pqty;
wmsPrdInstockH.rqty = input.rqty;
wmsPrdInstockH.type = input.type;
//wmsPrdInstockH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
await db.Insertable(wmsPrdInstockH).ExecuteCommandAsync();
prd_instock_code_id = wmsPrdInstockH.id;
type = input.type;
}
else
{
prd_instock_code_id = prdInstockH.id;
await db.Updateable<WmsPrdInstockH>(r => new WmsPrdInstockH
{
pqty = input.pqty,
rqty = input.rqty
}).Where(r => r.id == prd_instock_code_id).ExecuteCommandAsync();
type = prdInstockH.type;
}
List<WmsPrdInstockD> WmsPrdInstockDs = new List<WmsPrdInstockD>();
#region bip仓库
string scwarehouse_id = "";
string rkwarehouse_id = "";
if (type == DictConst.PrdMoTypeZS)
{
scwarehouse_id = WmsWareHouseConst.bipwarehouseid_zs;
rkwarehouse_id = WmsWareHouseConst.bipwarehouseid_zs;
}
else if (type == DictConst.PrdMoTypeJC)
{
scwarehouse_id = WmsWareHouseConst.bipwarehouseid_jc;
rkwarehouse_id = WmsWareHouseConst.bipwarehouseid_jc;
}
else if (type == DictConst.PrdMoTypeZZ)
{
scwarehouse_id = WmsWareHouseConst.bipwarehouseid_bz;
rkwarehouse_id = WmsWareHouseConst.bipwarehouseid_bz;
}
else if (type == DictConst.PrdMoTypeBZ)
{
scwarehouse_id = WmsWareHouseConst.bipwarehouseid_bz;
rkwarehouse_id = WmsWareHouseConst.bipwarehouseid_bz;
}
#endregion
List<WmsPrdInstockCode> WmsPrdInstockCodes = new List<WmsPrdInstockCode>();
WmsPrdInstockDInput prdInstockDInput = input.prdInstockD;
WmsPrdInstockD wmsPrdInstockD = new WmsPrdInstockD()
{
task_bill_code = prdInstockDInput.task_bill_code,
warehouse_id = prdInstockDInput.warehouse_id,
startlocation_id = prdInstockDInput.startlocation_id,
carry_id = prdInstockDInput.carry_id,
create_id = input.create_id,
create_time = DateTime.Now,
prd_instock_id = prd_instock_code_id,
status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID,
scwarehouse_id = scwarehouse_id,
rkwarehouse_id = rkwarehouse_id
};
WmsPrdInstockDs.Add(wmsPrdInstockD);
foreach (WmsPrdInstockCodeInput prdInstockCodeInput in input.prdInstockCodes)
{
WmsPrdInstockCodes.Add(new WmsPrdInstockCode()
{
planqty = prdInstockCodeInput.planqty,
pqty = prdInstockCodeInput.pqty,
code_batch = prdInstockCodeInput.code_batch,
code = prdInstockCodeInput.code,
unit_id = prdInstockCodeInput.unit_id,
carry_id = prdInstockCodeInput.carry_id,
prd_instock_id = prd_instock_code_id,
prd_instockD_id = wmsPrdInstockD.id
});
}
await db.Insertable(wmsPrdInstockD).ExecuteCommandAsync();
await db.Insertable(WmsPrdInstockCodes).ExecuteCommandAsync();
if (type == DictConst.PrdMoTypeZS)
{
semaphoreSlim = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_ZC_ID);
}
else if (type == DictConst.PrdMoTypeJC)
{
semaphoreSlim = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_HCC_ID);
}
else if (type == DictConst.PrdMoTypeBZ)
{
semaphoreSlim = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_DMJC_ID);
}
await semaphoreSlim.WaitAsync();
//入库取终点
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = wmsPrdInstockD.warehouse_id, Size = 1 };
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations?.Count == 0)
{
throw new AppFriendlyException("没有可用的库位", 500);
}
BasLocation endLocation = endLocations[0];
BasLocation startLocation = db.Queryable<BasLocation>().Where(r => r.id == wmsPrdInstockD.startlocation_id).First();
if (startLocation == null)
{
throw new AppFriendlyException("系统中找不到起点ID的库位信息", 500);
}
BasLocation endlocation_ssx = null;
string startlocation_id_ssx = null;
if (type == DictConst.PrdMoTypeZS)
{
Logger.LogInformation($"【PrdInstock】注塑车间生产提报");
// 注塑线边库到24输送线
// 根据ZSSSXCTU01 ZSSSXCTU02任务数平均分配任务
endlocation_ssx = await db.Queryable<BasLocation>().Where(r => new string[2] { "32624148726549", "32624157608981" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
await db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync();
// ZSSSXCTU01 对应 SSX-011-002
if (endlocation_ssx.location_code == "ZSSSXCTU01")
{
startlocation_id_ssx = "32609073591317";
}
// ZSSSXCTU02 对应 SSX-011-004
else if (endlocation_ssx.location_code == "ZSSSXCTU02")
{
startlocation_id_ssx = "32609093546005";
}
WmsCarryH wmsCarryH = await db.Queryable<WmsCarryH>().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync();
// 生成到输送线任务
CommonCreatePretaskInput commonCreatePretaskInput1 = new CommonCreatePretaskInput();
commonCreatePretaskInput1.startlocation_id = startLocation.id;
commonCreatePretaskInput1.endlocation_id = endlocation_ssx.id;
commonCreatePretaskInput1.carry_id = wmsCarryH.id;
commonCreatePretaskInput1.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput1.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput1.biz_type = "";
commonCreatePretaskInput1.require_id = wmsPrdInstockD.id;
commonCreatePretaskInput1.isExcuteMission = false;
Entities.Dto.Outputs.Result res1 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput1, db);
if (res1.code != HttpStatusCode.OK)
{
throw new Exception($"注塑车间生成到输送线的任务失败 {res1.msg}");
}
// 生成到中储仓任务
CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput();
commonCreatePretaskInput2.startlocation_id = startlocation_id_ssx;
commonCreatePretaskInput2.endlocation_id = endLocation.id;
commonCreatePretaskInput2.carry_id = wmsCarryH.id;
commonCreatePretaskInput2.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
commonCreatePretaskInput2.require_id = wmsPrdInstockD.id;
commonCreatePretaskInput2.isChangeCarryLoc2StartLoc = false;
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
if (res2.code != HttpStatusCode.OK)
{
throw new Exception($"注塑车间生成到中储仓的任务失败 {res2.msg}");
}
}
else if (type == DictConst.PrdMoTypeJC)
{
Logger.LogInformation($"【PrdInstock】挤出车间生产提报");
WmsCarryH wmsCarryH = await db.Queryable<WmsCarryH>().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync();
// 生成到中储仓任务
CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput();
commonCreatePretaskInput2.startlocation_id = startLocation.id;
commonCreatePretaskInput2.endlocation_id = endLocation.id;
commonCreatePretaskInput2.carry_id = wmsCarryH.id;
commonCreatePretaskInput2.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
commonCreatePretaskInput2.require_id = wmsPrdInstockD.id;
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
if (res2.code != HttpStatusCode.OK)
{
throw new Exception($"挤出车间生成到中储仓的任务失败 {res2.msg}");
}
}
else if (type == DictConst.PrdMoTypeBZ)
{
Logger.LogInformation($"【PrdInstock】包装车间生产提报");
WmsCarryH wmsCarryH = await db.Queryable<WmsCarryH>().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync();
// 生成任务
CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput();
commonCreatePretaskInput2.startlocation_id = startLocation.id;
commonCreatePretaskInput2.endlocation_id = endLocation.id;
commonCreatePretaskInput2.carry_id = wmsCarryH.id;
commonCreatePretaskInput2.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
commonCreatePretaskInput2.require_id = wmsPrdInstockD.id;
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
if (res2.code != HttpStatusCode.OK)
{
throw new Exception($"包装车间生成任务失败 {res2.msg}");
}
}
await db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
Logger.Error(ex.Message);
Logger.Error(ex.StackTrace);
await db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
semaphoreSlim.Release();
_wareHouseService.GenTaskExecute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
public override async Task ModifyAsync(WareHouseUpInput input)
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
bool isOk = true;
// 如果生产入库 输送线到仓库这条任务完成,反写单据数据
if (input.bizTypeId == WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID)
{
isOk = await _db.Updateable<WmsPrdInstockD>()
.SetColumns(it => new WmsPrdInstockD { status = WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID })
.Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
WmsPrdInstockD wmsPrdInstockD = await _db.Queryable<WmsPrdInstockD>().SingleAsync(x=>x.id==input.requireId);
WmsPrdInstockH instock = await _db.Queryable<WmsPrdInstockH>().SingleAsync(x=>x.id==wmsPrdInstockD.prd_instock_id);
// BasWarehouse scWarehouse = await _db.Queryable<BasWarehouse>().SingleAsync(x=>x.id==wmsPrdInstockD.scwarehouse_id);
// BasWarehouse kcWarehouse = await _db.Queryable<BasWarehouse>().SingleAsync(x=>x.id==wmsPrdInstockD.warehouse_id);
PrdReport prdReport = await _db.Queryable<PrdReport>().SingleAsync(x => x.id == instock.prd_report_id);
if (prdReport == null) return;
PrdMoTask prdMoTask = await _db.Queryable<PrdMoTask>().SingleAsync(x => x.id == prdReport.mo_task_id);
PrdMo prdMo = await _db.Queryable<PrdMo>().SingleAsync(x => x.id == prdMoTask.mo_id);
//来源erp才产成品入库
if (prdMo.mo_source != "1")
{
return;
}
List<WmsPrdInstockCode> allInstockDetails = await _db.Queryable<WmsPrdInstockCode>().Where(it => it.prd_instockD_id == wmsPrdInstockD.id).ToListAsync();
List<String> materialIds = Arrays.AsList(instock.material_id);
List<String> unitIds = allInstockDetails.Select(x => x.unit_id).Distinct().ToList();
List<String> unitCodes = allInstockDetails.Select(x => x.unit_id).Distinct().ToList();
List<DictionaryDataEntity> unitDatas = await _db.Queryable<DictionaryTypeEntity>()
.LeftJoin<DictionaryDataEntity>((x, y) => x.Id == y.DictionaryTypeId)
.Where((x, y) => x.EnCode == DictConst.MeasurementUnit && unitCodes.Contains(y.EnCode))
.Select((x, y) => y)
.ToListAsync();
List<WmsErpWarehouserelaH> erpWarehouserelaHs = await _db.Queryable<WmsErpWarehouserelaH>().Where(x=>x.id!=null).ToListAsync();
string userId = prdReport?.create_id ?? WmsWareHouseConst.AdministratorUserId;
string supplierId = WmsWareHouseConst.TIANYIGONGYINGSHANG_ID;
List<string> tableIds = new List<string>();
tableIds.Add(userId);
tableIds.Add(WmsWareHouseConst.AdministratorOrgId);
tableIds.AddRange(materialIds);
tableIds.Add(supplierId);
tableIds.AddRange(unitDatas.Select(x => x.Id).ToList());
// tableIds.AddRange(unitIds);
List<ErpExtendField> erpExtendFields = await _db.Queryable<ErpExtendField>().Where(x => tableIds.Contains(x.table_id)).ToListAsync();
string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? "";
ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId));
string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
List<Dictionary<string, object>> requestData = new List<Dictionary<string, object>>();
Dictionary<string, object> erpRequestData = new Dictionary<string, object>();
erpRequestData.Add("billmaker", erpCreateId);
erpRequestData.Add("corpoid", erpOrg.corpoid);
erpRequestData.Add("corpvid", erpOrg.corpvid);
erpRequestData.Add("cprocalbodyoid", erpOrg.pk_org);
erpRequestData.Add("cprocalbodyvid", erpOrg.pk_org_v);
erpRequestData.Add("creationtime", nowStr);
erpRequestData.Add("creator", erpCreateId);
erpRequestData.Add("ctrantypeid", "0001H11000000000D30X");//先写死
// erpRequestData.Add("cprowarehouseid", wmsPrdInstockD.scwarehouse_id);
erpRequestData.Add("cprowarehouseid", wmsPrdInstockD.scwarehouse_id); // 出库仓库
erpRequestData.Add("cwarehouseid", wmsPrdInstockD.rkwarehouse_id);//todo 现在是我们的仓库id 要改 // 库存仓库
erpRequestData.Add("cwhsmanagerid", null);
erpRequestData.Add("dbilldate", nowStr);
erpRequestData.Add("dmakedate", nowStr);
erpRequestData.Add("fbillflag", 2);
erpRequestData.Add("ntotalnum", allInstockDetails!=null ? allInstockDetails.Sum(x=>x.pqty) : 0);
erpRequestData.Add("pk_org", erpOrg.pk_org);
erpRequestData.Add("pk_org_v", erpOrg.pk_org_v);
erpRequestData.Add("pk_group", erpOrg.pk_group);
erpRequestData.Add("vbillcode", instock.bill_code);
erpRequestData.Add("vtrantypecode", "46-01");
erpRequestData.Add("csourcebillhid", prdReport?.erp_pk_wr ?? "");//todo 后面填
List<Dictionary<string, object>> erpRequestDataDetails = new List<Dictionary<string, object>>();
foreach (WmsPrdInstockCode item in allInstockDetails)
{
erpRequestDataDetails.Add(new Dictionary<string, object>()
{
["cbodytranstypecode"] = "46-01",
["cbodywarehouseid"] = wmsPrdInstockD.rkwarehouse_id, // 库存仓库
["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == instock.material_id)?.cmaterialoid ?? "",
["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == instock.material_id)?.cmaterialvid ?? "",
["corpoid"] = erpOrg.corpoid,
["corpvid"] = erpOrg.corpvid,
["cproductid"] = erpExtendFields.Find(x => x.table_id == instock.material_id)?.cmaterialoid ?? "",
["fproductclass"] = 1,
["crowno"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10,
["csourcebillhid"] = prdReport?.erp_pk_wr ?? "",
["csourcebillbid"] = prdReport?.erp_pk_wr_product ?? "",
["cunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x=>x.EnCode==item.unit_id)?.Id ?? ""))?.cunitid ?? "",
["cvendorid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "",
["cvendorvid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? "",
["dbizdate"] = instock.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
["dplanarrivedate"] = instock.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
["dplanoutdate"] = instock.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"),
["nnum"] = item.pqty,
["nshouldnum"] = item.pqty,
["pk_group"] = erpOrg.pk_group,
["pk_org"] = erpOrg.pk_org,
["pk_org_v"] = erpOrg.pk_org_v,
["vbatchcode"] = item.code_batch,
});
}
erpRequestData.Add("dtls", erpRequestDataDetails);
requestData.Add(erpRequestData);
BasFactoryConfig config = await _db.Queryable<BasFactoryConfig>().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL);
ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord();
thirdWebapiRecord.id = SnowflakeIdHelper.NextId();
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
thirdWebapiRecord.name = "产成品入库";
thirdWebapiRecord.method = "POST";
// thirdWebapiRecord.url = config.value + "uapws/rest/productin/save";
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
thirdWebapiRecord.create_time = DateTime.Now;
thirdWebapiRecord.remark = $"载具编号:{prdReport?.material_box_code ?? ""}";
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
}
if (!isOk)
{
throw Oops.Oh(ErrorCode.COM1001);
}
}
}
}