Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs

374 lines
22 KiB
C#
Raw Permalink 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.Collections;
using JNPF.Common.Core.Manager;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.EventBus;
using JNPF.Logging;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Interfaces;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using SqlSugar;
using Tnb.WarehouseMgr.Entities;
using Tnb.ProductionMgr;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.BasicData.Entities;
using Tnb.BasicData;
using Tnb.ProductionMgr.Entities.Entity;
using ModuleConst = Tnb.ProductionMgr.ModuleConst;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Extension;
using JNPF.FriendlyException;
using JNPF.VisualDev.Entitys;
using Tnb.BasicData.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 采购收货子表
/// </summary>
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)]
[Route("api/[area]/[controller]/[action]")]
[OverideVisualDev(ModelId)]
// [OverideVisualDev(ModuleId)]
public class WmsPurchaseDService : IOverideVisualDevService, IDynamicApiController, ITransient
{
public const string ModelId = "35017584657685";
private readonly ISqlSugarRepository<WmsPurchaseD> _repository;
private readonly DataBaseManager _dbManager;
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IDictionaryDataService _dictionaryDataService;
private readonly IThirdApiRecordService _thirdApiRecordService;
public static SemaphoreSlim s_SaveCheckResult = new(1);
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
public WmsPurchaseDService(
ISqlSugarRepository<WmsPurchaseD> repository,
DataBaseManager dbManager,
IUserManager userManager,
IThirdApiRecordService thirdApiRecordService,
IDictionaryDataService dictionaryDataService)
{
_repository = repository;
_db = repository.AsSugarClient();
_dbManager = dbManager;
_userManager = userManager;
_thirdApiRecordService = thirdApiRecordService;
_dictionaryDataService = dictionaryDataService;
}
public async Task<String> SaveCheckResult(Dictionary<string, string> dic)
{
try
{
await s_SaveCheckResult.WaitAsync();
string id = dic["id"];
string qcRes = dic["qc_res"];
WmsPurchaseD wmsPurchaseD = await _db.Queryable<WmsPurchaseD>().SingleAsync(x => x.id == id);
string purchaseHId = wmsPurchaseD?.bill_id ?? "";
WmsPurchaseH wmsPurchaseH = await _db.Queryable<WmsPurchaseH>().SingleAsync(x => x.id == purchaseHId);
#region
if (!string.IsNullOrEmpty(wmsPurchaseD.qc_res) && wmsPurchaseD.qc_res != "await")
{
throw Oops.Bah("当前收货明细行已操作过质检");
}
// 待检
if (string.IsNullOrEmpty(qcRes) || qcRes == "await")
{
return "保存成功";
}
string? create_id = _userManager.User.Id;
if (qcRes != (wmsPurchaseD.qc_res ?? ""))
{
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().Where(r => r.id == wmsPurchaseD.material_id).FirstAsync();
WmsPurchaseQcrecord wmsPurchaseQcrecord = new WmsPurchaseQcrecord();
wmsPurchaseQcrecord.create_id = create_id;
wmsPurchaseQcrecord.create_time = DateTime.Now;
wmsPurchaseQcrecord.type = "采购收货";
wmsPurchaseQcrecord.ori_bill_code = wmsPurchaseH.bill_code;
wmsPurchaseQcrecord.ori_detail_id = wmsPurchaseD.id;
wmsPurchaseQcrecord.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
wmsPurchaseQcrecord.material_id = basMaterial.id;
wmsPurchaseQcrecord.material_code = basMaterial.code;
wmsPurchaseQcrecord.material_name = basMaterial.name;
wmsPurchaseQcrecord.material_spec = basMaterial.material_specification;
wmsPurchaseQcrecord.unit_id = wmsPurchaseD.unit_id;
wmsPurchaseQcrecord.batchno = wmsPurchaseD.code_batch;
wmsPurchaseQcrecord.purchase_qty = wmsPurchaseD.purchase_qty;
wmsPurchaseQcrecord.purchase_prqty = wmsPurchaseD.purchase_prqty;
wmsPurchaseQcrecord.purchase_arriveqty = wmsPurchaseD.purchase_arriveqty;
wmsPurchaseQcrecord.result = qcRes;
wmsPurchaseQcrecord.checker = create_id;
wmsPurchaseQcrecord.check_time = DateTime.Now;
await _db.Insertable(wmsPurchaseQcrecord).ExecuteCommandAsync();
List<WmsCarryCode> wmscarrycodes = await _db.Queryable<WmsCarryCode>()
.InnerJoin<WmsTempCode>((a, b) => a.barcode == b.barcode)
.InnerJoin<WmsPurchaseD>((a, b, c) => c.id == b.require_id)
.Where((a, b, c) => c.id == wmsPurchaseD.id).ToListAsync();
foreach (var item in wmscarrycodes)
item.qc_res = qcRes;
await _db.Updateable(wmscarrycodes).UpdateColumns(r => r.qc_res).ExecuteCommandAsync();
}
#endregion
//自制的采购入库 不在质检保存里调用erp接口
if (string.IsNullOrEmpty(wmsPurchaseH.erp_bill_code))
{
await _db.Updateable<WmsPurchaseD>()
.SetColumns(x => x.qc_res == qcRes)
.Where(x => x.id == id)
.ExecuteCommandAsync();
return "保存成功";
}
// 托盘对应入库单
List<WmsInstockH> instock_mains = await _db.Queryable<WmsInstockH>().Where(x => x.source_id == wmsPurchaseD.bill_id).ToListAsync();
if (instock_mains.Count == 0)
{
throw Oops.Bah($"采购收货单{wmsPurchaseH.bill_code}不存在此明细的入库记录!可能是入库任务还未执行完成或者物料是由人工入库");
}
List<WmsInstockD> allInstockDetails = await _db.Queryable<WmsInstockD>().Where(it => instock_mains.Select(r => r.id).Contains(it.bill_id)
&& it.material_id == wmsPurchaseD.material_id && it.code_batch == wmsPurchaseD.code_batch
&& (string.IsNullOrEmpty(it.source_detail_id) || (!string.IsNullOrEmpty(it.source_detail_id) && it.source_detail_id == wmsPurchaseD.id))).OrderBy(x => x.id).ToListAsync();
List<Dictionary<string, object>> requestData = new List<Dictionary<string, object>>();
List<string> carryIds = instock_mains.Select(x => x.carry_id).ToList();
string wmsPurchaseOrderHId = wmsPurchaseH?.erp_bill_code ?? "";
WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable<WmsPurchaseOrderH>().SingleAsync(x => x.id == wmsPurchaseOrderHId);
WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable<WmsPurchaseOrderD>().FirstAsync(x => x.fk_wms_purchase_order_id == wmsPurchaseOrderHId);
{
List<String> materialIds = allInstockDetails.Select(x => x.material_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();
DictionaryDataEntity tranType = await _db.Queryable<DictionaryDataEntity>().Where(x=>x.DictionaryTypeId=="25043925951909" && x.EnCode==wmsPurchaseH.transaction_type).FirstAsync();
string tranTypeId = tranType?.Id ?? "";
string supplierId = wmsPurchaseOrderH?.supplier_id ?? "";
List<string> tableIds = new List<string>();
// tableIds.Add(_userManager.UserId);
// tableIds.Add(wmsPurchaseH.create_id);
tableIds.Add(WmsWareHouseConst.AdministratorOrgId);
tableIds.Add(instock_mains[0].warehouse_id);// 1001A11000000002OOGU
tableIds.AddRange(materialIds);
tableIds.Add(supplierId);
tableIds.Add(tranTypeId);
tableIds.AddRange(unitDatas.Select(x => x.Id).ToList());
string userId = wmsPurchaseH.create_id ?? WmsWareHouseConst.AdministratorUserId;
tableIds.Add(userId);
List<ErpExtendField> erpExtendFields = await _db.Queryable<ErpExtendField>().Where(x => tableIds.Contains(x.table_id)).ToListAsync();
// 暂时传 1001A110000000003NBJ 陈书会
//string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? "";
//string erpCreateId = "1001A110000000003NBJ";
//string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? WmsWareHouseConst.ERPUSERID;
string erpCreateId = WmsWareHouseConst.ERPUSERID;
ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId));
string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Dictionary<string, object> erpRequestData = new Dictionary<string, object>();
erpRequestData.Add("approver", erpCreateId);
erpRequestData.Add("billmaker", erpCreateId);
erpRequestData.Add("cbiztype", wmsPurchaseH?.transaction_type ?? "");
erpRequestData.Add("bitinbill", false);
erpRequestData.Add("cgeneralhid", null);
erpRequestData.Add("corpoid", erpOrg.corpoid);
erpRequestData.Add("corpvid", erpOrg.corpvid);
erpRequestData.Add("creationtime", nowStr);
erpRequestData.Add("creator", erpCreateId);
erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "");
erpRequestData.Add("cvendorid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "");
erpRequestData.Add("cvendorvid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? "");
// erpRequestData.Add("cwarehouseid", erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "");//类型视图里取
// erpWarehouserelaHs.Find(x => x.erp_warehousecode == wmsPurchaseD.erp_wh_type)?.erp_warehouseid ?? ""
// erpRequestData.Add("cwarehouseid", "1001A11000000002OOGU");
erpRequestData.Add("cwarehouseid", wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU");
erpRequestData.Add("dbilldate", nowStr);
erpRequestData.Add("dmakedate", nowStr);
erpRequestData.Add("fbillflag", 2);
erpRequestData.Add("fbuysellflag", 2);
erpRequestData.Add("ntotalnum", allInstockDetails.Sum(x => x.qty));
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", wmsPurchaseH.erp_bill_code);
erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? "");
erpRequestData.Add("csourcebillhid", wmsPurchaseH?.erp_arriveorder_pk ?? "");
erpRequestData.Add("vdef3", wmsPurchaseH?.service_num ?? "");
List<Dictionary<string, object>> erpRequestDataDetails = new List<Dictionary<string, object>>();
#region
//foreach (WmsInstockD item in allInstockDetails)
//{
// erpRequestDataDetails.Add(new Dictionary<string, object>()
// {
// ["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id)?.Id ?? ""))?.cunitid ?? "",
// ["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "",
// // ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
// //["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "",
// // ["cbodywarehouseid"] = "1001A11000000002OOGU",
// ["cbodywarehouseid"] = wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU",
// ["cgeneralbid"] = null,
// ["cgeneralhid"] = null,
// ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "",
// ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? "",
// ["corpoid"] = erpOrg.corpoid,
// ["corpvid"] = erpOrg.corpvid,
// ["crowno"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10,
// ["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"] = wmsPurchaseH.create_time.ToString("yyyy-MM-dd HH:mm:ss"),
// ["nnum"] = item.qty,
// ["nshouldnum"] = item.pr_qty,
// // ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
// // ["pk_creqwareid"] = "1001A11000000002OOGU",
// ["pk_creqwareid"] = wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU",
// ["pk_group"] = erpOrg.pk_group,
// ["pk_org"] = erpOrg.pk_org,
// ["pk_org_v"] = erpOrg.pk_org_v,
// ["pseudocolumn"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10,
// ["vbatchcode"] = item.code_batch,
// ["csourcebillhid"] = wmsPurchaseH?.erp_arriveorder_pk ?? "",
// ["csourcebillbid"] = wmsPurchaseD?.erp_arriveorder_b_pk ?? "",
// ["vsourcebillcode"] = wmsPurchaseH?.bill_code ?? "",
// ["lineno"] = wmsPurchaseOrderDs?.lineno ?? "",
// ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "",
// ["flargess"] = wmsPurchaseD.gift==1,
// ["ntaxprice"] = wmsPurchaseD.price,
// });
//}
#endregion
#region
erpRequestDataDetails.Add(new Dictionary<string, object>()
{
["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == allInstockDetails.First().unit_id)?.Id ?? ""))?.cunitid ?? "",
["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "",
// ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
//["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "",
// ["cbodywarehouseid"] = "1001A11000000002OOGU",
["cbodywarehouseid"] = wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU",
["cgeneralbid"] = null,
["cgeneralhid"] = null,
["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == allInstockDetails.First().material_id)?.cmaterialoid ?? "",
["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == allInstockDetails.First().material_id)?.cmaterialvid ?? "",
["corpoid"] = erpOrg.corpoid,
["corpvid"] = erpOrg.corpvid,
["crowno"] = 10,
["cunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == allInstockDetails.First().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"] = wmsPurchaseH.create_time.ToString("yyyy-MM-dd HH:mm:ss"),
["nnum"] = allInstockDetails.Sum(r => r.qty),
["nshouldnum"] = allInstockDetails.Sum(r => r.pr_qty),
// ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
// ["pk_creqwareid"] = "1001A11000000002OOGU",
["pk_creqwareid"] = wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU",
["pk_group"] = erpOrg.pk_group,
["pk_org"] = erpOrg.pk_org,
["pk_org_v"] = erpOrg.pk_org_v,
["pseudocolumn"] = 10,
["vbatchcode"] = allInstockDetails.First().code_batch,
["csourcebillhid"] = wmsPurchaseH?.erp_arriveorder_pk ?? "",
["csourcebillbid"] = wmsPurchaseD?.erp_arriveorder_b_pk ?? "",
["vsourcebillcode"] = wmsPurchaseH?.bill_code ?? "",
["lineno"] = wmsPurchaseOrderDs?.lineno ?? "",
["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "",
["flargess"] = wmsPurchaseD.gift == 1,
["ntaxprice"] = wmsPurchaseD.price,
});
#endregion
erpRequestData.Add("dtls", erpRequestDataDetails);
requestData.Add(erpRequestData);
}
await _db.Ado.BeginTranAsync();
await _db.Updateable<WmsPurchaseD>()
.SetColumns(x => x.qc_res == qcRes)
.Where(x => x.id == id)
.ExecuteCommandAsync();
Dictionary<string, int> dic2 = new()
{
{ "ok", 1 },
{ "no", 2 },
{ "barelyOk", 4 },
{ "await", 8 },
{ "temporarily", 16 },
{ "checking", 32 },
};
string isCheck = dic2[qcRes].ToString();
//await _db.Updateable<WmsCarryH>()
// .SetColumns(x => x.is_check == isCheck)
// .Where(x => carryIds.Contains(x.id))
// .ExecuteCommandAsync();
if (requestData.IsEmpty())
{
throw Oops.Bah("没有请求数据");
}
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/purchaseIn/save";
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/purchaseIn/save";
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
thirdWebapiRecord.create_time = DateTime.Now;
thirdWebapiRecord.remark = "【WmsPurchaseDService SaveCheckResult】采购收货单号:" + (wmsPurchaseH?.bill_code ?? "")+ ",erp采购订单号:"+(wmsPurchaseOrderH?.erp_bill_code ?? "");
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
BasFactoryConfig callErp = await _db.Queryable<BasFactoryConfig>().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.CALLERP);
if(callErp.value=="1"){
await _thirdApiRecordService.Send(new List<ThirdWebapiRecord> { thirdWebapiRecord }, "自动", _db);
}
await _db.Ado.CommitTranAsync();
}
catch (Exception e)
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message,e);
throw Oops.Bah(e.Message);
}
finally
{
s_SaveCheckResult.Release();
}
return "保存成功";
}
}
}