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

440 lines
24 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.Text;
using System.Text.RegularExpressions;
using JNPF.Common.Contracts;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.Logging;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using SqlSugar;
using Tnb.BasicData;
using Tnb.BasicData.Entities;
using Tnb.BasicData.Interfaces;
using Tnb.Common.Utils;
using Tnb.ProductionMgr.Entities.Entity;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Dto.Outputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 委外收货订单
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSOUTSOURCE_ID)]
public class WmsOutsourceService : BaseWareHouseService
{
private const string ModuleId = ModuleConsts.MODULE_WMSOUTSOURCE_ID;
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWareHouseService _wareHouseService;
private readonly IThirdApiRecordService _thirdApiRecordService;
public WmsOutsourceService(
ISqlSugarRepository<WmsOutsourceH> repository,
IUserManager userManager,
IBillRullService billRullService,
IRunService runService,
IThirdApiRecordService thirdApiRecordService,
IVisualDevService visualDevService, IWareHouseService wareHouseService)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_billRullService = billRullService;
_runService = runService;
_visualDevService = visualDevService;
_wareHouseService = wareHouseService;
_thirdApiRecordService = thirdApiRecordService;
}
public override async Task ModifyAsync(WareHouseUpInput input)
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
//if (!isOk)
//{
// throw Oops.Oh(ErrorCode.COM1001);
//}
}
[HttpPost]
public async Task BarCodePrint(BarCodeInput input)
{
if (input == null)
{
throw new AppFriendlyException(nameof(input), 500);
}
List<string> barcodes = new();
try
{
await _db.Ado.BeginTranAsync();
//if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
//{
// throw new AppFriendlyException("条码已生成", 500);
//};
WmsOutsourceD WmsOutsourceD = await _db.Queryable<WmsOutsourceD>().Where(it => input.BillId == it.id).FirstAsync();
WmsOutsourceH WmsOutsourceH = await _db.Queryable<WmsOutsourceH>().Where(it => WmsOutsourceD.fk_wms_outsource_order_id == it.id).FirstAsync();
if (WmsOutsourceD.actual_quantity == 0)
{
throw new AppFriendlyException("到货数量为0没有物料可以打印", 500);
};
List<WmsTempCode> wmsTempCodes = new();
decimal? minPacking = (await _db.Queryable<BasMaterial>().FirstAsync(it => it.id == WmsOutsourceD.matcode_id))?.minpacking;
if (!minPacking.HasValue || minPacking.Value <= 0)
{
throw new AppFriendlyException($"物料{WmsOutsourceD.matcode} {WmsOutsourceD.matcode_id} 包装数量为空或者等于0无法打印", 500);
};
int codeNum = 0;
if (minPacking.HasValue && minPacking.Value > 0)
{
codeNum = input.barcode_qty;
decimal qty = (int)(codeNum * minPacking);
decimal mod = 0;
decimal extra = (qty - WmsOutsourceD.actual_quantity).Value;
if (extra > 0 && extra < minPacking)
{
mod = minPacking.Value - extra;
}
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().Where(r => r.id == WmsOutsourceD.matcode_id).FirstAsync();
for (int j = 0; j < codeNum; j++)
{
int index = j + 1;
//string code = $"{WmsPurchaseD.material_code}-{WmsPurchaseD.code_batch}-{index.ToString().PadLeft(4, '0')}";
// 变更加流水号
//string watercode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_OUTSOURCE_MAT_ENCODE);
//string code = $"WWSH{watercode}";
string code_batch = string.IsNullOrEmpty(WmsOutsourceD.code_batch) ? "" : WmsOutsourceD.code_batch;
string watercode = await _wareHouseService.CreateCodeRules("", WmsOutsourceD.matcode + code_batch, 4);
string code = $"{WmsOutsourceD.matcode}-{WmsOutsourceD.code_batch}-{watercode}";
WmsTempCode barCode = new()
{
material_id = WmsOutsourceD.matcode_id,
material_code = WmsOutsourceD.matcode,
barcode = code,
code_batch = WmsOutsourceD.code_batch,
material_specification = basMaterial.material_specification,
codeqty = minPacking,
unit_id = WmsOutsourceD.unit,
is_lock = 0,
is_end = 0,
require_id = WmsOutsourceD.id,
require_code = WmsOutsourceH.outsource_order,
create_id = _userManager.UserId,
create_time = DateTime.Now,
required_type = WmsWareHouseConst.BILLTYPE_OUTSOURCE_ID,
material_name = basMaterial.name
};
if (index == codeNum)
barCode.codeqty = mod == 0 ? minPacking : mod;
wmsTempCodes.Add(barCode);
}
await _db.Insertable(wmsTempCodes).ExecuteCommandAsync();
}
await _db.Ado.CommitTranAsync();
barcodes.AddRange(wmsTempCodes.Select(p => p.barcode).ToList());
//if (barcodes?.Count > 0)
//{
// var ip = _db.Queryable<BasFactoryConfig>().Where(p => p.key == "printerip").FirstAsync().Result.value;
// base.BarCodePrint(barcodes, 1, ip);
//}
}
catch (Exception ex)
{
Logger.LogError($"【BarCodePrint】" + ex.Message);
Logger.LogError($"【BarCodePrint】" + ex.StackTrace);
await _db.Ado.RollbackTranAsync();
throw;
}
}
/// <summary>
/// 采购收货
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> Purchase(OutsourceEditInput input)
{
var blFlag = true;
try
{
WmsOutsourceH wmsOutsourceH = await _db.Queryable<WmsOutsourceH>().Where(r => r.bill_code == input.bill_code).FirstAsync();
if (wmsOutsourceH.make_method == "自制")
{
throw Oops.Bah("自制委外收货单不能操作此按钮");
}
await _db.Ado.BeginTranAsync();
WmsInstockH? instock = null;
var purchaseDs = input.details;
// foreach (var item in input.details)
// {
// await _db.Updateable<WmsOutsourceOrderD>()
// .SetColumns(x => x.actual_quantity == x.actual_quantity + item.bind_qty)
// .Where(x => x.id == item.outsource_order_d_id)
// .ExecuteCommandAsync();
// }
List<WmsInstockD> instockDs = new();
if (purchaseDs?.Count > 0)
{
instock = input.Adapt<WmsInstockH>();
instock.id = SnowflakeIdHelper.NextId();
instock.bill_code = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_INSTOCK_ENCODE);
instock.create_id = _userManager.UserId;
instock.create_time = DateTime.Now;
instock.org_id = _userManager.User.OrganizeId;
if (instock.source_code != null)
{
instock.sync_status = WmsWareHouseConst.SYNC_STATUS__NOTSYNC;
}
else
{
instock.sync_status = WmsWareHouseConst.SYNC_STATUS_NONEEDSYNC;
}
instock.audit_status = 0;
instock.print_status = "0";
instock.is_check = 0;
await _db.Insertable(instock).ExecuteCommandAsync();
foreach (var item in purchaseDs)
{
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().Where(x=>x.code==item.matcode).FirstAsync();
item.matcode_id = basMaterial?.id ?? item.matcode_id;
WmsInstockD instockD = new WmsInstockD();
instockD.id = SnowflakeIdHelper.NextId();
instockD.bill_id = instock.id;
instockD.line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
instockD.material_id = item.matcode_id;
instockD.material_code = item.matcode;
instockD.material_specification = item.matspecification;
instockD.unit_id = item.unit;
instockD.pr_qty = item.outsource_quantity;
instockD.qty = item.outsource_arriveqty.Value;
instockD.code_batch = item.code_batch;
instockD.create_id = _userManager.UserId;
instockD.create_time = DateTime.Now;
instockD.org_id = _userManager.User.OrganizeId;
instockDs.Add(instockD);
}
await _db.Insertable(instockDs).ExecuteCommandAsync();
List<WmsOutsourceD> dList = await _db.Queryable<WmsOutsourceD>().Where(x => x.fk_wms_outsource_order_id == wmsOutsourceH.id).OrderBy(x => x.id).ToListAsync();
List<WmsOutsourceOrderD> wmsOutsourceOrderDs = await _db.Queryable<WmsOutsourceOrderD>().Where(r => dList.Select(x => x.erp_outsource_order_d_pk).Contains(r.erp_line_pk)).OrderBy(x => x.id).ToListAsync();
foreach (var item in dList)
{
decimal? outsource_arriveqty = input.details.Where(r => r.id == item.id).ToList()[0].outsource_arriveqty;
item.actual_quantity += outsource_arriveqty;
if (item.actual_quantity > item.outsource_quantity)
{
throw Oops.Bah($"委外收货单明细行物料{item.matcode} 批次{item.code_batch} 到货数量不能超过采购数量!");
}
WmsOutsourceOrderD wmsOutsourceOrderD = wmsOutsourceOrderDs.Where(r => r.erp_line_pk == item.erp_outsource_order_d_pk).First();
wmsOutsourceOrderD.actual_quantity += outsource_arriveqty;
if (wmsOutsourceOrderD.actual_quantity > wmsOutsourceOrderD.outsource_quantity)
{
throw Oops.Bah($"采购订单明细行物料{wmsOutsourceOrderD.matcode} 批次{wmsOutsourceOrderD.code_batch} 到货数量不能超过采购数量!");
}
}
await _db.Updateable(dList).UpdateColumns(r => r.actual_quantity).ExecuteCommandAsync();
await _db.Updateable(wmsOutsourceOrderDs).UpdateColumns(r => r.actual_quantity).ExecuteCommandAsync();
List<String> materialIds = purchaseDs.Select(x => x.matcode_id).Distinct().ToList();
List<String> unitCodes = purchaseDs.Select(x => x.unit).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) || unitCodes.Contains(y.Id)))
.Select((x, y) => y)
.ToListAsync();
DictionaryDataEntity tranData = await _db.Queryable<DictionaryDataEntity>().Where(x=>x.DictionaryTypeId=="25043925951909" && x.EnCode==wmsOutsourceH.vtrantypecode).FirstAsync();
List<WmsErpWarehouserelaH> erpWarehouserelaHs = await _db.Queryable<WmsErpWarehouserelaH>().Where(x => x.id != null).ToListAsync();
WmsOutsourceOrderH wmsOutsourceOrderH = await _db.Queryable<WmsOutsourceOrderH>().SingleAsync(x => x.id == wmsOutsourceH.erp_bill_code);
//自制的不调erp接口
if (wmsOutsourceOrderH!=null && !string.IsNullOrEmpty(wmsOutsourceOrderH.erp_bill_code))
{
List<string> ids = new List<string>();
ids.Add(_userManager.UserId);
// ids.Add(WmsWareHouseConst.AdministratorUserId);
ids.Add(WmsWareHouseConst.AdministratorOrgId);
ids.AddRange(materialIds);
ids.Add(wmsOutsourceOrderH.supplier_id);
ids.Add(tranData.Id);
ids.AddRange(unitDatas.Select(x => x.Id).ToList());
string userId = _userManager.UserId ?? WmsWareHouseConst.AdministratorUserId;
ids.Add(userId);
List<ErpExtendField> erpExtendFields = await _db.Queryable<ErpExtendField>().Where(x => ids.Contains(x.table_id)).ToListAsync();
// 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");
List<Dictionary<string, object>> requestData = new List<Dictionary<string, object>>();
Dictionary<string, object> erpRequestData = new Dictionary<string, object>();
erpRequestData.Add("approver", erpCreateId);
erpRequestData.Add("billmaker", erpCreateId);
erpRequestData.Add("creationtime", nowStr);
erpRequestData.Add("creator", erpCreateId);
erpRequestData.Add("dbilldate", wmsOutsourceH.create_time.ToString("yyyy-MM-dd HH:mm:ss"));
erpRequestData.Add("dmakedate", nowStr);
erpRequestData.Add("ntotalastnum", purchaseDs.Sum(x => x.outsource_arriveqty));
erpRequestData.Add("pk_arriveorder", null);
// erpRequestData.Add("pk_dept","1001A1100000001JFOPQ");
// erpRequestData.Add("pk_dept_v","0001A1100000000AOMIQ");
erpRequestData.Add("Pk_receivepsndoc", erpCreateId);
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("pk_pupsndoc", null);
erpRequestData.Add("csourceid", wmsOutsourceOrderH?.erp_pk);
erpRequestData.Add("pk_purchaseorg", erpOrg.pk_org);
erpRequestData.Add("pk_purchaseorg_v", erpOrg.pk_org_v);
erpRequestData.Add("pk_supplier", erpExtendFields.Find(x => x.table_id == wmsOutsourceH.supplier_id)?.supplier_id);//先写死
erpRequestData.Add("pk_supplier_v", erpExtendFields.Find(x => x.table_id == wmsOutsourceH.supplier_id)?.supplier_vid);//先写死
erpRequestData.Add("vbillcode", wmsOutsourceH.bill_code);
erpRequestData.Add("vmemo", wmsOutsourceH.remark);
erpRequestData.Add("vtrantypecode", wmsOutsourceH.vtrantypecode);
erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x=>x.table_id==tranData.Id)?.transaction_type_id);
erpRequestData.Add("isType", 1);
List<Dictionary<string, object>> erpRequestDataDetails = new List<Dictionary<string, object>>();
foreach (WmsOutsourceD item in dList)
{
erpRequestDataDetails.Add(new Dictionary<string, object>()
{
["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id || x.Id == item.unit_id)?.Id ?? ""))?.cunitid,
["cfirstbid"] = wmsOutsourceOrderH?.erp_pk,
["cfirstid"] = item.erp_outsource_order_d_pk,
["cfirsttypecode"] = null,
["crececountryid"] = "0001Z010000000079UJJ",
["crowno"] = item.erp_outsource_order_d_lineno,
["csendcountryid"] = "0001Z010000000079UJJ",
["csourcetypecode"] = null,
["ctaxcountryid"] = "0001Z010000000079UJJ",
["cunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id || x.Id == item.unit_id)?.Id ?? ""))?.cunitid,
["dbilldate"] = wmsOutsourceH.create_time.ToString("yyyy-MM-dd HH:mm:ss"),
["dplanreceivedate"] = wmsOutsourceH.create_time.ToString("yyyy-MM-dd HH:mm:ss"),
["dproducedate"] = wmsOutsourceH.create_time.ToString("yyyy-MM-dd HH:mm:ss"),
// ["fbuysellflag"] = 2,
["fproductclass"] = 1,
// ["naccumchecknum"] = 0,
// ["nastnum"] = item.purchase_arriveqty,
["nnum"] = item.outsource_arriveqty,
// ["nplanastnum"] = 0,
["nplannum"] = item.outsource_quantity,
["pk_apfinanceorg"] = erpOrg.corpoid,
["pk_apfinanceorg_v"] = erpOrg.corpvid,
["pk_arriveorder"] = null,
["pk_arriveorder_b"] = null,
["pk_group"] = erpOrg.pk_group,
["pk_material"] = erpExtendFields.Find(x => x.table_id == item.matcode_id)?.cmaterialoid,
["pk_order"] = wmsOutsourceOrderH?.erp_pk,
["pk_order_b"] = item.erp_outsource_order_d_pk,
["pk_org"] = erpOrg.pk_org,
["pk_org_v"] = erpOrg.pk_org_v,
["pk_psfinanceorg"] = erpOrg.corpoid,
["pk_psfinanceorg_v"] = erpOrg.corpvid,
// ["pk_receivestore"] = erpExtendFields.Find(x=>x.table_id==purchase.warehouse_id)?.cotherwhid ?? "",
// ["pk_receivestore"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == item.erp_wh_type)?.erp_warehouseid ?? "",
["pk_receivestore"] = item.erp_wh_type,
["pk_reqstoorg"] = erpOrg.pk_org,
["pk_reqstoorg_v"] = erpOrg.pk_org_v,
["pk_srcmaterial"] = erpExtendFields.Find(x => x.table_id == item.matcode_id)?.cmaterialoid,
["vbatchcode"] = item.code_batch,
["Vfree1"] = item.code_batch,
["mes_detail_id"] = item.id,
// ["bpresent"] = item.gift == 1,
["csourceid"] = wmsOutsourceOrderH?.erp_pk,
["vsourcecode"] = wmsOutsourceOrderH.erp_bill_code,
["csourcebid"] = item.erp_outsource_order_d_pk,
["isType"] = 1,
["csourcetypecode"] = null,
["vsourcerowno"] = null,
["vsourcetrantype"] = null,
["cproductorid"] = item.production_unit,
});
}
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/purarrvial/save";
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/purarrvial/save";
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData);
thirdWebapiRecord.create_time = DateTime.Now;
thirdWebapiRecord.remark = $"【WmsOutsourceService Purchase】erp委外订单:{wmsOutsourceOrderH.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);
}
}
}
//通知Mes接口
//_ = SyncMesData(instock.id, instockDs.Select(x => x.material_id).ToList(), EnumTriggerEvent.入厂检按物料编号);
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
blFlag = false;
await _db.Ado.RollbackTranAsync();
Log.Error("委外收货失败", ex);
throw;
}
return await Task.FromResult(blFlag);
}
}
}