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

393 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.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 WmsOutsourceDService : IOverideVisualDevService, IDynamicApiController, ITransient
{
public const string ModelId = ModuleConsts.MODULE_WMSOUTSOURCED_ID;
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 WmsOutsourceDService(
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"];
WmsOutsourceD wmsOutsourceD = await _db.Queryable<WmsOutsourceD>().SingleAsync(x => x.id == id);
string outsourceHId = wmsOutsourceD?.fk_wms_outsource_order_id ?? "";
WmsOutsourceH wmsOutsourceH = await _db.Queryable<WmsOutsourceH>().SingleAsync(x => x.id == outsourceHId);
#region
if (!string.IsNullOrEmpty(wmsOutsourceD.qc_res) && wmsOutsourceD.qc_res != "await")
{
throw Oops.Bah("当前收货明细行已操作过质检");
}
// 待检
if (string.IsNullOrEmpty(qcRes) || qcRes == "await")
{
return "保存成功";
}
string? create_id = _userManager.User.Id;
if (qcRes != (wmsOutsourceD.qc_res ?? ""))
{
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().Where(r => r.code == wmsOutsourceD.matcode).FirstAsync();
WmsPurchaseQcrecord wmsPurchaseQcrecord = new WmsPurchaseQcrecord();
wmsPurchaseQcrecord.create_id = create_id;
wmsPurchaseQcrecord.create_time = DateTime.Now;
wmsPurchaseQcrecord.type = "委外收货";
wmsPurchaseQcrecord.ori_bill_code = wmsOutsourceH.outsource_order;
wmsPurchaseQcrecord.ori_detail_id = wmsOutsourceD.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 = wmsOutsourceD.unit;
wmsPurchaseQcrecord.batchno = wmsOutsourceD.code_batch;
wmsPurchaseQcrecord.purchase_qty = wmsOutsourceD.outsource_quantity;
wmsPurchaseQcrecord.purchase_prqty = wmsOutsourceD.actual_quantity;
wmsPurchaseQcrecord.purchase_arriveqty = wmsOutsourceD.actual_quantity;
wmsPurchaseQcrecord.result = qcRes;
wmsPurchaseQcrecord.checker = create_id;
wmsPurchaseQcrecord.check_time = DateTime.Now;
await _db.Insertable(wmsPurchaseQcrecord).ExecuteCommandAsync();
}
#endregion
//自制的采购入库 不在质检保存里调用erp接口
if (string.IsNullOrEmpty(wmsOutsourceH.erp_bill_code))
{
return "保存成功";
}
// 托盘对应入库单
List<WmsInstockH> instock_mains = await _db.Queryable<WmsInstockH>().Where(x => x.source_id == wmsOutsourceD.fk_wms_outsource_order_id).ToListAsync();
if (instock_mains.Count == 0)
{
throw Oops.Bah($"委外收货单{wmsOutsourceH.bill_code}不存在此明细的入库记录!可能是入库任务还未执行完成或者物料是由人工入库");
}
List<WmsInstockD> allInstockDetails = await _db.Queryable<WmsInstockD>().Where(it => instock_mains.Select(r => r.id).Contains(it.bill_id) && it.material_code == wmsOutsourceD.matcode && it.code_batch == wmsOutsourceD.code_batch).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 = wmsOutsourceH?.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== wmsOutsourceH.transaction_type).FirstAsync();
string tranTypeId = tranType?.Id ?? "";
//string supplierId = wmsPurchaseOrderH?.supplier_id ?? "";
string supplierId = wmsOutsourceH?.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 = wmsOutsourceH.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>();
#region
//erpRequestData.Add("approver", erpCreateId);
//erpRequestData.Add("billmaker", erpCreateId);
//erpRequestData.Add("cbiztype", wmsOutsourceH?.transaction_type ?? null);
//erpRequestData.Add("bitinbill", false);
//erpRequestData.Add("cgeneralhid", null);
//erpRequestData.Add("corpoid", erpOrg?.corpoid ?? null);
//erpRequestData.Add("corpvid", erpOrg?.corpvid ?? null);
//erpRequestData.Add("creationtime", nowStr);
//erpRequestData.Add("creator", erpCreateId);
//erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null);
//erpRequestData.Add("cvendorid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null);
//erpRequestData.Add("cvendorvid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null);
//// 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", wmsOutsourceD?.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 ?? null);
//erpRequestData.Add("pk_org_v", erpOrg?.pk_org_v ?? null);
//erpRequestData.Add("pk_group", erpOrg?.pk_group ?? null);
//erpRequestData.Add("vbillcode", wmsOutsourceH?.outsource_order ?? null);
//erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? null);
//erpRequestData.Add("csourcebillhid", wmsOutsourceH?.erp_arriveorder_pk ?? null);
//erpRequestData.Add("vdef3", wmsOutsourceH?.service_num ?? null);
//List<Dictionary<string, object>> erpRequestDataDetails = new List<Dictionary<string, object>>();
//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 ?? null,
// ["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null,
// // ["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"] = wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU",
// ["cgeneralbid"] = null,
// ["cgeneralhid"] = null,
// ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? null,
// ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? null,
// ["corpoid"] = erpOrg?.corpoid ?? null,
// ["corpvid"] = erpOrg?.corpvid ?? null,
// ["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 ?? null,
// ["cvendorid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null,
// ["cvendorvid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null,
// ["dbizdate"] = wmsOutsourceH.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"] = wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU",
// ["pk_group"] = erpOrg?.pk_group ?? null,
// ["pk_org"] = erpOrg?.pk_org ?? null,
// ["pk_org_v"] = erpOrg?.pk_org_v ?? null,
// ["pseudocolumn"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10,
// ["vbatchcode"] = item.code_batch,
// ["csourcebillhid"] = wmsOutsourceH?.erp_arriveorder_pk ?? null,
// ["csourcebillbid"] = wmsOutsourceD?.erp_arriveorder_b_pk ?? null,
// ["vsourcebillcode"] = wmsOutsourceH?.outsource_order ?? null,
// ["lineno"] = wmsPurchaseOrderDs?.lineno ?? null,
// ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null,
// //["flargess"] = wmsOutsourceD.gift==1,
// ["ntaxprice"] = wmsOutsourceD.price ?? null,
// });
//}
#endregion
#region
#region
erpRequestData.Add("billmaker", erpCreateId);//制单人
erpRequestData.Add("cbizid", erpOrg?.person_id ?? null);//业务员
erpRequestData.Add("cbiztype", null);//业务流程
erpRequestData.Add("cdptid", erpOrg != null ? (string.IsNullOrEmpty(erpOrg.cdptid) ? null : erpOrg.cdptid) : null);//部门id
erpRequestData.Add("cdptvid", erpOrg != null ? (string.IsNullOrEmpty(erpOrg.cdptvid) ? null : erpOrg.cdptvid) : null);//部门vid
erpRequestData.Add("corpoid", erpOrg?.corpoid ?? null);//公司id
erpRequestData.Add("corpvid", erpOrg?.corpvid ?? null);//公司vid
erpRequestData.Add("creationtime", nowStr);//创建时间
erpRequestData.Add("creator", erpCreateId);//创建人
erpRequestData.Add("cscwarehouseid", null);//委外仓
erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null);//出入库类型
erpRequestData.Add("cvendorid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null);//供应商
erpRequestData.Add("cvendorvid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null);//供应商vid
erpRequestData.Add("cwarehouseid", wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU");//仓库id
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_group", erpOrg?.pk_group ?? null);//集体
erpRequestData.Add("pk_org", erpOrg?.pk_org ?? null);//组织
erpRequestData.Add("pk_org_v", erpOrg?.pk_org_v ?? null);//组织vid
erpRequestData.Add("vbillcode", wmsOutsourceH?.outsource_order ?? null);//单据号
erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? null);//出入库类型编码
erpRequestData.Add("csourcebillhid", wmsOutsourceH?.erp_arriveorder_pk ?? null);//来源单据主表id
#endregion
List<Dictionary<string, object>> erpRequestDataDetails = new List<Dictionary<string, object>>();
foreach (WmsInstockD item in allInstockDetails)
{
erpRequestDataDetails.Add(new Dictionary<string, object>()
{
["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null, //出入库类型
["cbodywarehouseid"] = wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU", //库存仓库
["ccurrencyid"] = null, //本位币
["cmainmaterialoid"] = null, //主产品id
["cmainvendorid"] = null, //主产品供应商id
["cmainvendorvid"] = null, //主产品供应商vid
["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? null, //物料
["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? null, //物料vid
["corigcurrencyid"] = null, //币种
["corpoid"] = erpOrg?.corpoid ?? null, //公司
["corpvid"] = erpOrg?.corpvid ?? null, //公司vid
["cqtunitid"] = null, //报价单位
["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 ?? null, //主单位
["cvendorid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null, //供应商
["cvendorvid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null, //供应商vid
["dbizdate"] = wmsOutsourceH.create_time.ToString("yyyy-MM-dd HH:mm:ss"), //入库日期
["csourcebillhid"] = wmsOutsourceH?.erp_arriveorder_pk ?? null, //来源单主表id
["csourcebillbid"] = wmsOutsourceD?.erp_arriveorder_b_pk ?? null, //来源单子表id
["csourcetype"] = item.source_type ?? null, //来源单据类型
["csourcetranstype"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null, //来源单据交易类型
["vsourcebillcode"] = wmsOutsourceH?.outsource_order ?? null, //来源单据号
["vsourcerowno"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10, //来源单据行号
["nnum"] = item.qty, //实收主数量
["nshouldnum"] = item.pr_qty, //应收主数量
["pk_batchcode"] = null, //批次主键
["pk_group"] = erpOrg?.pk_group ?? null, //集团
["pk_org"] = erpOrg?.pk_org ?? null, //组织
["pk_org_v"] = erpOrg?.pk_org_v ?? null, //组织vid
["vbatchcode"] = item.code_batch, //批次号
["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null, //自由辅助属性1
["foutputtype"]=1,//产品类型1主产品2联产品3副产品默认传1
});
}
#endregion
erpRequestData.Add("dtls", erpRequestDataDetails);
requestData.Add(erpRequestData);
}
await _db.Ado.BeginTranAsync();
await _db.Updateable<WmsOutsourceD>()
.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/subcontIn/save";
//thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/subcontIn/save";
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
thirdWebapiRecord.create_time = DateTime.Now;
thirdWebapiRecord.remark = "【WmsOutsourceDService SaveCheckResult】委外收货单号:" + (wmsOutsourceH?.outsource_order ?? "")+ ",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 "保存成功";
}
}
}