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 { /// /// 采购订单服务 /// 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"; /// /// 金蝶云星空工具类 /// private readonly K3CloudApiUtils _utils; /// /// 构造方法 /// public PurchaseOrderService(K3CloudApiUtils utils) { _utils = utils; } /// /// 下推采购入库单 /// /// 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 billPusheList = new List(); foreach (var item in barEntityList) { Push billPush = new Push(); billPush.EntryIds = item.FSrcEntryId; billPush.CustomParams = new Dictionary(); 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(); // TODO 遍历下推 foreach (var item in billPusheList) { var pushResp = _utils.Push(_FormId, item); // 如果失败,将所有生成的单据删除,并保存错误信息到扫描记录 if (pushResp?.IsSuccess != true) { // 从下推成功的记录里获取Id,并且删除 var deletePrdInStockIdList = new List(); 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(); 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; } /// /// 撤销并删除所有下推数据 /// /// private void CancelAssignDeletePrdInStock(List 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); } /// /// 撤销栈板单据提交 /// /// private void CancelAssignBarRecord(int barRecordId) { IBarRecordService barRecordService = new BarRecordService(_utils); CancelAssign cancelAssignBarRecord = new CancelAssign() { Ids = barRecordId.ToString() }; // 撤销 var cancelAssignBarRecordResult = barRecordService.CancelAssign(cancelAssignBarRecord); } } }