Files
Gatedge.NewOrientLandMark.BOS/Gatedge.ScanCode/Services/PurchaseOrderService.cs
斌 朱 a22bf3ac79 修改下推接口
修改条码记录添加接口
2025-12-12 10:13:22 +08:00

189 lines
8.0 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 Gatedge.K3Cloud.Utils;
using Gatedge.K3Cloud.Utils.Model.K3Request;
using Gatedge.K3Cloud.Utils.Model.K3Result.Model;
using Gatedge.ScanCode.Models.K3Request.SaveModel;
using Gatedge.ScanCode.Services.IServices;
using Microsoft.IdentityModel.Tokens;
namespace Gatedge.ScanCode.Services
{
/// <summary>
/// 采购订单服务
/// </summary>
public class PurchaseOrderService : IPurchaseOrderService
{
private readonly string _FormName = "采购订单";
private readonly string _FormId = "PUR_PurchaseOrder";
private readonly string _TargetFormId = "STK_InStock";
private readonly string _ConvertRuleId = "c423ca95-0184-4e10-9176-86f9a544b931";
/// <summary>
/// 金蝶云星空工具类
/// </summary>
private readonly K3CloudApiUtils _utils;
/// <summary>
/// 构造方法
/// </summary>
public PurchaseOrderService(K3CloudApiUtils utils)
{
_utils = utils;
}
/// <summary>
/// 下推采购入库单
/// </summary>
/// <returns></returns>
public K3CloudResponseStatus PushPurInStock(int barRecordId)
{
IBarRecordService barRecordService = new BarRecordService(_utils);
IStkInStockService stkInStockService = new StkInStockService(_utils);
var barRecordViewParam = new View()
{
Id = barRecordId.ToString(),
};
var barRecord = barRecordService.View(barRecordViewParam);
// 单据状态检查
if (barRecord.DocumentStatus == "B")
{
throw new Exception("该扫描结果已经被提交,不允许重复提交");
}
if (barRecord.DocumentStatus == "C")
{
throw new Exception("该扫描结果已经被提交,不允许重复提交");
}
// 提交单据,不允许重复提交,相当于上锁
var submitBarRecor = new Submit()
{
Ids = barRecordId.ToString(),
};
var submitBarRecorResult = barRecordService.Submit(submitBarRecor);
// 如果提交不成功
if (!submitBarRecorResult.IsSuccess)
{
throw new Exception("该扫描结果已经被提交,不允许重复提交");
}
// 如果提交成功,开始下推生产入库单
var barEntityList = barRecord.FBarEntity;
// 构造下推参数
List<Push> billPusheList = new List<Push>();
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)
{
// 从下推成功的记录里获取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);
}
//如果都成功,将入库单提交
var prdInStockIds = new List<string>();
successList.ForEach(n => n.SuccessEntitys?.ForEach(m => prdInStockIds.Add(m.Id.ToString())));
Submit stkInStockSubmitParam = new Submit()
{
Ids = string.Join(',', prdInStockIds)
};
var submitResult = stkInStockService.Submit(stkInStockSubmitParam);
var result = barRecordService.SubmitSuccess(barRecordId, successList.Select(n => new BarRecordSave.ResultEntry
{
FResultBillNo = n.SuccessEntitys.First().Number,
FResultId = n.SuccessEntitys.First().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;
}
/// <summary>
/// 撤销并删除所有下推数据
/// </summary>
/// <param name="deleteIds"></param>
private void CancelAssignDeletePrdInStock(List<string> deleteIds)
{
IStkInStockService stkInStockService = new StkInStockService(_utils);
CancelAssign cancelAssign = new CancelAssign()
{
Ids = string.Join(',', deleteIds.Select(n => n.ToString()))
};
stkInStockService.CancelAssign(cancelAssign);
Delete stkInStockDeleteParam = new Delete()
{
Ids = string.Join(',', deleteIds.Select(n => n.ToString()))
};
stkInStockService.Delete(stkInStockDeleteParam);
}
/// <summary>
/// 撤销栈板单据提交
/// </summary>
/// <param name="barRecordId"></param>
private void CancelAssignBarRecord(int barRecordId)
{
IBarRecordService barRecordService = new BarRecordService(_utils);
CancelAssign cancelAssignBarRecord = new CancelAssign()
{
Ids = barRecordId.ToString()
};
// 撤销
var cancelAssignBarRecordResult = barRecordService.CancelAssign(cancelAssignBarRecord);
}
}
}