2025-12-11 17:49:54 +08:00
|
|
|
|
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";
|
2025-12-12 10:13:22 +08:00
|
|
|
|
private readonly string _ConvertRuleId = "c423ca95-0184-4e10-9176-86f9a544b931";
|
2025-12-11 17:49:54 +08:00
|
|
|
|
|
|
|
|
|
|
/// <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); // 是否由条码下推
|
2025-12-12 10:13:22 +08:00
|
|
|
|
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()); // 有效期至
|
2025-12-11 17:49:54 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
2025-12-12 10:13:22 +08:00
|
|
|
|
}
|
2025-12-11 17:49:54 +08:00
|
|
|
|
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);
|
2025-12-12 10:13:22 +08:00
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
}));
|
2025-12-11 17:49:54 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-12-12 10:13:22 +08:00
|
|
|
|
|
2025-12-11 17:49:54 +08:00
|
|
|
|
|
2025-12-12 10:13:22 +08:00
|
|
|
|
//return result;
|
2025-12-11 17:49:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|