Compare commits

...

8 Commits

Author SHA1 Message Date
Administrator
cbe7000a86 0 2025-12-19 17:38:55 +08:00
86b19c4662 x 2025-12-19 17:15:52 +08:00
8e3b06f929 0 2025-12-19 17:05:11 +08:00
Administrator
a97b7737e0 0 2025-12-19 17:00:44 +08:00
Administrator
0faeab0321 0 2025-12-15 17:57:32 +08:00
cd1c87bf8e 1 2025-12-15 17:21:23 +08:00
00f11185ba 新增批号 2025-12-15 17:01:01 +08:00
0210aeacb9 新增条码记录删除接口 2025-12-15 10:30:33 +08:00
10 changed files with 244 additions and 109 deletions

View File

@@ -37,7 +37,8 @@
<Reference Include="Kingdee.BOS.App">
<HintPath>..\Library\Kingdee.BOS.App.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.Contracts">
<Reference Include="Kingdee.BOS.Contracts, Version=7.2.877.3, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Library\Kingdee.BOS.Contracts.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.Core">
@@ -70,6 +71,10 @@
<Reference Include="Kingdee.K3.Core">
<HintPath>..\Library\Kingdee.K3.Core.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Library\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />

View File

@@ -1,18 +1,20 @@
using Gatedge.NewOrientLandMark.BOS.Services;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Gatedge.NewOrientLandMark.BOS.Services;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Newtonsoft.Json;
namespace Gatedge.NewOrientLandMark.BOS.PlugIn.PUR_PurchaseOrder.ConvertPlugIn
{
@@ -20,31 +22,28 @@ namespace Gatedge.NewOrientLandMark.BOS.PlugIn.PUR_PurchaseOrder.ConvertPlugIn
public class ToStkInStock : AbstractConvertPlugIn
{
private bool IsConvertByScanCode = false;
private readonly Dictionary<string, object> CustomParams = new Dictionary<string, object>();
private string FBarRecordNo = string.Empty;
private Dictionary<string, PushCustomParam> PushCustomParams;
class PushCustomParam
{
public decimal InStockQty { get; set; }
public string InStockId { get; set; }
public DateTime FStockDate { get; set; }
public DateTime FExpirationDate { get; set; }
public int FLot_Id { get; set; }
public string FLot_Text { get; set; }
}
public override void OnInitVariable(InitVariableEventArgs e)
{
base.OnInitVariable(e);
this.Option.TryGetVariableValue<bool>("IsConvertByScanCode", out IsConvertByScanCode);
if (IsConvertByScanCode)
{
string InStockId;
this.Option.TryGetVariableValue<string>("InStockId", out InStockId);
CustomParams.Add("InStockId", InStockId);
object InStockQty;
this.Option.TryGetVariableValue("InStockQty", out InStockQty);
CustomParams.Add("InStockQty", InStockQty);
string FStockDate;
this.Option.TryGetVariableValue("FStockDate", out FStockDate);
CustomParams.Add("FStockDate", FStockDate);
string FExpirationDate;
this.Option.TryGetVariableValue("FExpirationDate", out FExpirationDate);
CustomParams.Add("FExpirationDate", FExpirationDate);
string FLot_Id;
this.Option.TryGetVariableValue("FLot_Id", out FLot_Id);
CustomParams.Add("FLot_Id", FLot_Id);
string FLot_Text;
this.Option.TryGetVariableValue("FLot_Text", out FLot_Text);
CustomParams.Add("FLot_Text", FLot_Text);
var pushCustomParamsString = string.Empty;
this.Option.TryGetVariableValue<string>("PushCustomParams", out pushCustomParamsString);
PushCustomParams = JsonConvert.DeserializeObject<Dictionary<string, PushCustomParam>>(pushCustomParamsString);
this.Option.TryGetVariableValue<string>("FBarRecordNo", out FBarRecordNo);
}
}
public override void AfterConvert(AfterConvertEventArgs e)
@@ -60,21 +59,28 @@ namespace Gatedge.NewOrientLandMark.BOS.PlugIn.PUR_PurchaseOrder.ConvertPlugIn
foreach (var bill in billList)
{
var billObj = bill.DataEntity;
billObj["FBarRecordNo"] = FBarRecordNo;
billObj["FCreateByCode"] = IsConvertByScanCode;
var entryList = billObj["InStockEntry"] as DynamicObjectCollection;
BaseDataField StockField =
e.TargetBusinessInfo.GetField("FStockId") as BaseDataField;
BaseDataField StockStatusField =
e.TargetBusinessInfo.GetField("FStockStatusId") as BaseDataField;
BaseDataField LotField =
e.TargetBusinessInfo.GetField("FLot") as BaseDataField;
IViewService service = ServiceHelper.GetService<IViewService>();
//根据内码获取物料基础资料对象
var org = bill.DataEntity["StockOrgId"] as DynamicObject; // 调出组织
var orgId = org["Id"].ToString();
foreach (var item in entryList)
{
var linkList = item["FInStockEntry_Link"] as DynamicObjectCollection;
var link = linkList.First();
var sid = link["SId"].ToString();
var param = PushCustomParams[sid];
DynamicObject Stock = service.LoadSingle(
this.Context,
CustomParams["InStockId"],
param.InStockId,
StockField.RefFormDynamicObjectType
);
DynamicObject StockStatus = service.LoadSingle(
@@ -91,25 +97,47 @@ namespace Gatedge.NewOrientLandMark.BOS.PlugIn.PUR_PurchaseOrder.ConvertPlugIn
var unitId = Convert.ToInt64(item["UnitId_Id"]); // 主单位
var priceUnitId = Convert.ToInt64(item["PriceUnitID_Id"]); // 计价单位
var remainInStockUnitId = Convert.ToInt64(item["RemainInStockUnitId_Id"]); // 采购单位
var baseUnitId = Convert.ToInt64(item["BaseUnitID_Id"]); // 基础单位
//var snUnitId = Convert.ToInt64(item["SNUnitID_Id"]); // 序列号单位
var qty = Convert.ToDecimal(CustomParams["InStockQty"]);
var qty = Convert.ToDecimal(param.InStockQty);
item["RealQty"] = qty; // 填写实收数
if (priceUnitId != 0) // 计价数量
// 计价数量
if (priceUnitId != 0)
{
var BaseRealQty = unitService.GetQtyByUtilConverRate(materialId, unitId, priceUnitId, qty);
item["PriceUnitQty"] = BaseRealQty;
item["PriceUnitQty"] = BaseRealQty;
}
if (remainInStockUnitId != 0) // 采购数量
// 采购数量
if (remainInStockUnitId != 0)
{
var SecRealQty = unitService.GetQtyByUtilConverRate(materialId, unitId, remainInStockUnitId, qty);
item["RemainInStockQty"] = SecRealQty;
}
//if (snUnitId != 0)
//{
// var snQty = unitService.GetQtyByUtilConverRate(materialId, unitId, snUnitId, qty);
// item["SNQty"] = snQty;
//}
// 采购基本数量
if (baseUnitId != 0)
{
var BaseRealQty = unitService.GetQtyByUtilConverRate(materialId, unitId, baseUnitId, qty);
item["RemainInStockBaseQty"] = BaseRealQty;
item["BaseUnitQty"] = BaseRealQty;
}
var lotId = param.FLot_Id.ToString();
var lotText = param.FLot_Text.Trim();
// 如果批号不为空,则赋值
if (!lotText.IsNullOrEmpty())
{
// 如果批号Id不为空赋值批号
if (!lotId.IsNullOrEmpty() && lotId != "0")
{
var lot = service.LoadSingle(this.Context, lotId, LotField.RefFormDynamicObjectType);
item["Lot_Id"] = lot["Id"];
item["Lot"] = lot;
}
else
{
item["Lot_Text"] = lotText;
}
}
}
}
}

View File

@@ -151,5 +151,25 @@ namespace Gatedge.ScanCode.Controllers
service.PrintResultBillNo(barRecord);
return AjaxResult.Success("扫描记录更新成功.");
}
/// <summary>
/// 批量下推采购入库单
/// </summary>
/// <param name="barRecord"></param>
/// <returns></returns>
[HttpPost("Delete")]
public AjaxResult Delete([FromBody] BarRecord barRecord)
{
var loginInfo = User.GetLoginInfoByClaimsPrincipal();
_utils.InitCloudApi(loginInfo);
IBarRecordService service = new BarRecordService(_utils);
var result = service.Delete(barRecord);
if (result.IsSuccess)
{
return AjaxResult.Success("删除成功.", result);
}
return AjaxResult.Error("删除失败.", result);
}
}
}

View File

@@ -0,0 +1,8 @@
namespace Gatedge.ScanCode.Models.K3Request.BaseData
{
public class Lot
{
public int? FLotId { get; set; }
public string? FNumber { get; set; }
}
}

View File

@@ -110,6 +110,10 @@ namespace Gatedge.ScanCode.Models.K3Request.SaveModel
/// 源单分录Id
/// </summary>
public string FSrcEntryId { get; set; }
/// <summary>
/// 批号
/// </summary>
public Lot? FLot { get; set; }
}
/// <summary>

View File

@@ -60,6 +60,19 @@ namespace Gatedge.ScanCode.Services
return _utils.CancelAssign(this._FormId, cancelAssignBarRecord);
}
/// <summary>
/// 删除条码扫描记录
/// </summary>
/// <param name="barRecord"></param>
/// <exception cref="NotImplementedException"></exception>
public K3CloudResponseStatus Delete(BarRecord barRecord)
{
return _utils.Delete(this._FormId, new Delete()
{
Ids = barRecord.BarRecordId.ToString()
});
}
/// <summary>
/// 根据条码查找条码扫描记录
/// </summary>
@@ -143,7 +156,12 @@ namespace Gatedge.ScanCode.Services
FBarQty = n.FBarQty,
FSrcBillId = n.FSrcBillId,
FSrcEntryId = n.FSrcEntryId,
FBarAuxPropId = n.FBarAuxpropId == 0 ? null : n.FBarAuxpropId
FBarAuxPropId = n.FBarAuxpropId == 0 ? null : n.FBarAuxpropId,
FLot = new Lot()
{
FLotId = n.FLot_Id == 0 ? null : n.FLot_Id,
FNumber = n.FLot_Text,
}
}),
};

View File

@@ -56,7 +56,7 @@ namespace Gatedge.ScanCode.Services.IServices
public K3CloudResponseStatus SaveErrorInfo(int barRecordId, string ErrorInfo);
/// <summary>
/// 保存错误信息
/// 保存成功信息
/// </summary>
/// <param name="barRecordId"></param>
/// <param name="resultEntityList"></param>
@@ -89,5 +89,11 @@ namespace Gatedge.ScanCode.Services.IServices
/// <param name="auditParam"></param>
/// <returns></returns>
public K3CloudResponseStatus Audit(Audit auditParam);
/// <summary>
/// 删除接口
/// </summary>
/// <param name="barRecord"></param>
public K3CloudResponseStatus Delete(BarRecord barRecord);
}
}

View File

@@ -13,6 +13,12 @@ namespace Gatedge.ScanCode.Services.IServices
/// </summary>
/// <param name="cancelAssign"></param>
void CancelAssign(CancelAssign cancelAssign);
/// <summary>
/// 删除入库单
/// </summary>
/// <param name="stkInStockDeleteParam"></param>
void Delete(Delete stkInStockDeleteParam);
/// <summary>
@@ -21,5 +27,12 @@ namespace Gatedge.ScanCode.Services.IServices
/// <param name="stkInStockSubmitParam"></param>
/// <returns></returns>
K3CloudResponseStatus Submit(Submit stkInStockSubmitParam);
/// <summary>
/// 审核
/// </summary>
/// <param name="auditParam"></param>
/// <returns></returns>
K3CloudResponseStatus Audit(Audit auditParam);
}
}

View File

@@ -1,9 +1,12 @@
using Gatedge.K3Cloud.Utils;
using Gatedge.K3Cloud.Utils.Exceptions;
using Gatedge.K3Cloud.Utils.Model.K3Request;
using Gatedge.K3Cloud.Utils.Model.K3Result.Model;
using Gatedge.ScanCode.Models.K3Request.SaveModel;
using Gatedge.ScanCode.Models.Vo;
using Gatedge.ScanCode.Services.IServices;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
namespace Gatedge.ScanCode.Services
{
@@ -30,6 +33,16 @@ namespace Gatedge.ScanCode.Services
{
_utils = utils;
}
class PushCustomParam
{
public decimal InStockQty { get; set; }
public string InStockId { get; set; }
public DateTime FStockDate { get; set; }
public DateTime FExpirationDate { get; set; }
public int FLot_Id { get; set; }
public string FLot_Text { get; set; }
}
/// <summary>
/// 下推采购入库单
/// </summary>
@@ -65,89 +78,98 @@ namespace Gatedge.ScanCode.Services
throw new Exception("该扫描结果已经被提交,不允许重复提交");
}
// 如果提交成功,开始下推生产入库单
var barEntityList = barRecord.FBarEntity;
// 构造下推参数
List<Push> billPusheList = new List<Push>();
Push billPush = new Push();
billPush.EntryIds = string.Join(",", barEntityList.Select(n => n.FSrcEntryId));
billPush.CustomParams = new Dictionary<string, object>();
billPush.CustomParams.Add("IsConvertByScanCode", true); // 是否由条码下推
billPush.CustomParams.Add("FBarRecordNo", barRecord.BillNo); // 是否由条码下推
billPush.RuleId = _ConvertRuleId; // 注塑/装配车间排产计划专用转换规则
billPush.TargetFormId = _TargetFormId; // 目标单据类型:采购入库单
billPush.IsEnableDefaultRule = false; // 不启用默认规则
billPush.IsDraftWhenSaveFail = false; // 保存失败,不自动暂存
var paramList = new Dictionary<string, PushCustomParam>();
foreach (var item in barEntityList)
{
Push billPush = new Push();
billPush.EntryIds = item.FSrcEntryId;
billPush.CustomParams = new Dictionary<string, object>();
billPush.CustomParams.Add("IsConvertByScanCode", true); // 是否由条码下推
billPush.CustomParams.Add("InStockQty", item.FBarQty.ToString()); // 下推数量
billPush.CustomParams.Add("InStockId", item.FBarStockId_Id.ToString()); // 入库仓库
billPush.CustomParams.Add("FStockDate", item.FStockDate.ToString()); // 入库日期
billPush.CustomParams.Add("FExpirationDate", item.FExpirationDate.ToString()); // 有效期至
billPush.CustomParams.Add("FLot_Id", item.FLot_Id.ToString()); // 有效期至
billPush.CustomParams.Add("FLot_Text", item.FLot_Text.ToString()); // 有效期至
billPush.RuleId = _ConvertRuleId; // 注塑/装配车间排产计划专用转换规则
billPush.TargetFormId = _TargetFormId; // 目标单据类型:采购入库单
billPush.IsEnableDefaultRule = false; // 不启用默认规则
billPush.IsDraftWhenSaveFail = false; // 保存失败,不自动暂存
billPusheList.Add(billPush);
}
// 成功列表
var successList = new List<K3CloudResponseStatus>();
// TODO 遍历下推
foreach (var item in billPusheList)
{
var pushResp = _utils.Push(_FormId, item);
// 如果失败,将所有生成的单据删除,并保存错误信息到扫描记录
if (pushResp?.IsSuccess != true)
var pushCustomParams = new PushCustomParam()
{
// 下推成功的记录里获取Id并且删除
var deletePrdInStockIdList = new List<string>();
successList.ForEach(n => n.SuccessEntitys?.ForEach(m => deletePrdInStockIdList.Add(m.Id.ToString())));
var errorInfo = string.Join("\r\n", pushResp.Errors.Select(n => n.Message));
// 如果有成功的下推单,则删除生成的入库单,回写错误信息。
if (deletePrdInStockIdList.Count > 0)
{
// 撤销并删除生产入库单
CancelAssignDeletePrdInStock(deletePrdInStockIdList);
}
barRecordService.SaveErrorInfo(barRecordId, errorInfo);
// 撤销提交的栈板单据
CancelAssignBarRecord(barRecordId);
return pushResp;
}
successList.Add(pushResp);
InStockQty = item.FBarQty ?? 0, // 下推数量
InStockId = item.FBarStockId_Id?.ToString() ?? string.Empty, // 入库仓库
FStockDate = item.FStockDate ?? DateTime.MinValue, // 入库日期
FExpirationDate = item.FExpirationDate ?? DateTime.MinValue, // 有效期至
FLot_Id = item.FLot_Id ?? 0, // 批号Id
FLot_Text = item.FLot_Text ?? string.Empty // 批号文本
};
paramList.Add(item.FSrcEntryId ?? "0", pushCustomParams);
}
billPush.CustomParams.Add("PushCustomParams", JsonConvert.SerializeObject(paramList));
// 执行下推
var pushResp = _utils.Push(_FormId, billPush);
// 如果失败,保存错误信息到扫描记录
if (pushResp?.IsSuccess != true)
{
var errorInfo = string.Join("\r\n", pushResp.Errors.Select(n => n.Message));
barRecordService.SaveErrorInfo(barRecordId, errorInfo);
// 撤销提交的栈板单据
CancelAssignBarRecord(barRecordId);
return pushResp;
}
//如果都成功,将入库单提交
var prdInStockIds = new List<string>();
successList.ForEach(n => n.SuccessEntitys?.ForEach(m => prdInStockIds.Add(m.Id.ToString())));
if (pushResp?.SuccessEntitys.Count == 0)
{
throw new Exception("下推出现异常");
}
var inStockBillIds = pushResp?.SuccessEntitys?.Select(n => n.Id.ToString()).ToList();
Submit stkInStockSubmitParam = new Submit()
{
Ids = string.Join(',', prdInStockIds)
Ids = string.Join(',', inStockBillIds)
};
var submitResult = stkInStockService.Submit(stkInStockSubmitParam);
var result = barRecordService.SubmitSuccess(barRecordId, successList.Select(n => new BarRecordSave.ResultEntry
// 如果提交不成功,删除本次入库的单据,并返回结果
if (!submitResult.IsSuccess)
{
FResultBillNo = n.SuccessEntitys.First().Number,
FResultId = n.SuccessEntitys.First().Id.ToString(),
var errorInfo = string.Join("\r\n", submitResult.Errors.Select(n => n.Message));
barRecordService.SaveErrorInfo(barRecordId, errorInfo);
// 撤销提交的栈板单据
CancelAssignBarRecord(barRecordId);
// 撤销并删除所有下推数据
CancelAssignDeletePrdInStock(inStockBillIds);
return submitResult;
}
// 如果提交成功,审核入库单
Audit stkInStockAuditParam = new Audit()
{
Ids = string.Join(',', inStockBillIds)
};
var auditResult = stkInStockService.Audit(stkInStockAuditParam);
// 如果审核不成功,删除本次入库的单据,并返回结果
if (!auditResult.IsSuccess)
{
var errorInfo = string.Join("\r\n", auditResult.Errors.Select(n => n.Message));
barRecordService.SaveErrorInfo(barRecordId, errorInfo);
// 撤销提交的栈板单据
CancelAssignBarRecord(barRecordId);
// 撤销并删除所有下推数据
CancelAssignDeletePrdInStock(inStockBillIds);
return auditResult;
}
// 如果审核成功,更新栈板单据的结果信息
var result = barRecordService.SubmitSuccess(barRecordId, auditResult.SuccessEntitys.Select(n => new BarRecordSave.ResultEntry
{
FResultBillNo = n.Number,
FResultId = n.Id.ToString(),
FResultBillId = new Models.K3Request.BaseData.FormType()
{
FID = _TargetFormId
}
}));
return submitResult;
// 如果提交不成功
if (!submitResult.IsSuccess)
{
var errorInfo = string.Join("\r\n", submitResult.Errors.Select(n => n.Message));
// 撤销并删除入库单
CancelAssignDeletePrdInStock(prdInStockIds);
// 撤销提交的栈板单据
CancelAssignBarRecord(barRecordId);
// 回写错误信息
barRecordService.SaveErrorInfo(barRecordId, errorInfo);
return submitResult;
}
//return result;
return auditResult;
}
/// <summary>

View File

@@ -26,6 +26,17 @@ namespace Gatedge.ScanCode.Services
_utils = utils;
}
/// <summary>
/// 审核
/// </summary>
/// <param name="auditParam"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public K3CloudResponseStatus Audit(Audit auditParam)
{
return _utils.Audit(_FormId, auditParam);
}
/// <summary>
/// 撤销
/// </summary>