using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace GZ.LJY000.Biori.SAL_OUTSTOCK { [HotUpdate, Description("销售出库单审核/反审核操作")] public class OperationEventPlugInEx : AbstractOperationServicePlugIn { public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); e.FieldKeys.Add("FRowType"); e.FieldKeys.Add("FPackBillNo"); //e.FieldKeys.Add("FPackBillSeq"); //e.FieldKeys.Add("FPackBillEntryId"); e.FieldKeys.Add("FRealQty"); e.FieldKeys.Add("FPackBarCode"); } public override void OnAddValidators(AddValidatorsEventArgs e) { base.OnAddValidators(e); //添加检查校验器: if (this.FormOperation.OperationId == 1) { //var validator = new VaildatorEventPlugInEx();//新增的校验器 //validator.EntityKey = "FEntity"; //e.Validators.Add(validator);//添加校验器 } } /// /// /// /// /// private DynamicObjectCollection DoGetPackInfo(List sqlL) { var sqlUnion = string.Join(" UNION ALL ", sqlL); var sql = $@"/*dialect*/ WITH #基础数据 AS ( {sqlUnion} ) SELECT tt.*,t0.FBARCODE,t0.FBILLNO,t0.FBILLID,t0.FBILLENTRYID,t0.FBILLSEQ,t0.FBILLFORMID ,t1.*,t2.FNUMERATOR,t2.FDENOMINATOR FROM #基础数据 tt INNER JOIN T_UNW_WMS_BARCODE t0 on t0.FBARCODE = tt.PackBarCode CROSS APPLY ( SELECT t1.FBILLNO,t1e.FEntryID,t1e.FSeq,t1e.FQTY,t1e.FGZLQTY,t1e.FZGSQTY,t1e.FUNITID,t1e.FFYLQTY,t1.FBOMID,t1e.FMATERIALID ,t1.FQTY AS 'MainQty' FROM T_PRD_PACKAGEINSTOCK t1 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t1e on t1.FID = t1e.FID WHERE t1.FSRCBILLENTRYID = t0.FBILLENTRYID AND t1e.FMATERIALID = tt.MaterialId AND tt.FRowType = t1e.FPRODUCTTYPE UNION ALL SELECT t1.FBILLNO,0 FEntryID,0,t1.FQTY,0,0,0,t1.FFYLQTY,t1.FBOMID,t1.FMATERIALID ,t1.FQTY AS 'MainQty' FROM T_PRD_PACKAGEINSTOCK t1 WHERE t1.FSRCBILLENTRYID = t0.FBILLENTRYID AND t1.FMATERIALID = tt.MaterialId AND tt.FRowType = t1.FPRODUCTTYPE ) t1 LEFT JOIN T_ENG_BOMCHILD t2 on t2.FID = t1.FBOMID AND t1.FMATERIALID = t2.FMATERIALID ORDER BY tt.EntrySeq "; var res = DBUtils.ExecuteDynamicObject(this.Context, sql); if (res != null && res.Count > 0) return res; return null; } public override void EndOperationTransaction(EndOperationTransactionArgs e) { base.EndOperationTransaction(e); //保存8 提交9 审核1 反审核26 删除3 if (this.FormOperation.OperationId == 1) { DoComputePackgeQty(e.DataEntitys, false); } else if (this.FormOperation.OperationId == 26) { DoComputePackgeQty(e.DataEntitys, true); } } /// /// /// /// /// private void DoComputePackgeQty(DynamicObject[] dataEntitys, bool isInStock) { var dataEntityList = new List(); var sqlL = new List(); foreach (var data in dataEntitys) { foreach (var item in data["SAL_OUTSTOCKENTRY"] as DynamicObjectCollection) { var packBillNo = item["FPackBillNo"]; var rowType = item["RowType"].ToString(); if (!packBillNo.IsNullOrEmpty() && rowType.Equals("Parent")) { sqlL.Add($" SELECT '{packBillNo}' AS FBILLNO , {item["RealQty"]} AS QTY "); } } } //if (isInStock) // DoComputePackgeInStockQty(sqlL); //else // DoComputePackgeOutStockQty(sqlL); DoComputePackgeQty(sqlL, !isInStock); } /// /// 入库操作 /// /// private void DoComputePackgeQty(List sqlL, bool isOutStock) { if (sqlL.Any()) { var minus = isOutStock ? -1 : 1; var updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0 SET t0.FQTY = t0.FQTY + (t1.QTY * {minus}) ,t0.FOUTSTOCKQTY = t0.FOUTSTOCKQTY - (t1.QTY * {minus}) FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN #基础数据 t1 on t1.FBILLNO = t0.FBILLNO WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' "; //更新组装单信 var resData = DBUtils.Execute(this.Context, updSqlL); if (resData > 0) { updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0e SET t0e.FQTY = t0e.FQTY + (t0e.FQTY / t3.FQTY * (t1.QTY * {minus} / t2.FDENOMINATOR * t2.FNUMERATOR)) FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN #基础数据 t1 on t1.FBILLNO = t0.FBILLNO INNER JOIN T_ENG_BOMCHILD t2 on t2.FID = t0.FBOMID AND t2.FMATERIALID = t0e.FMATERIALID CROSS APPLY ( SELECT SUM(t3e.FQTY) FQTY FROM T_PRD_PACKAGEINSTOCKENTRY t3e WHERE t3e.FID = t0e.FID AND t3e.FMATERIALID = t0e.FMATERIALID GROUP BY t3e.FID,t3e.FMATERIALID ) t3 WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' "; var res = DBUtils.Execute(this.Context, updSqlL); } return; } } /// /// 入库操作 /// /// private void DoComputePackgeInStockQty(List sqlL) { if (sqlL.Any()) { var updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0 SET t0.FQTY = t0.FQTY + t1.QTY ,t0.FOUTSTOCKQTY = t0.FOUTSTOCKQTY - t1.QTY FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN #基础数据 t1 on t1.FBILLNO = t0.FBILLNO WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' "; //更新组装单信 var resData = DBUtils.Execute(this.Context, updSqlL); if (resData > 0) { updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0e SET t0e.FQTY = t0e.FQTY + (t1.QTY / t2.FDENOMINATOR * t2.FNUMERATOR) FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN #基础数据 t1 on t1.FBILLNO = t0.FBILLNO INNER JOIN T_ENG_BOMCHILD t2 on t2.FID = t0.FBOMID AND t2.FMATERIALID = t0e.FMATERIALID WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' "; var res = DBUtils.Execute(this.Context, updSqlL); } return; } } /// /// 出库操作 /// /// private void DoComputePackgeOutStockQty(List sqlL) { if (sqlL.Any()) { var updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0 SET t0.FQTY = t0.FQTY - t1.QTY ,t0.FOUTSTOCKQTY = t0.FOUTSTOCKQTY + t1.QTY FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN #基础数据 t1 on t1.FBILLNO = t0.FBILLNO WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' AND (t0.FQTY - t1.QTY) >= 0 "; //更新组装单信 var resData = DBUtils.Execute(this.Context, updSqlL); if (resData > 0) { updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0e SET t0e.FQTY = t0e.FQTY - (t1.QTY / t2.FDENOMINATOR * t2.FNUMERATOR) FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN #基础数据 t1 on t1.FBILLNO = t0.FBILLNO INNER JOIN T_ENG_BOMCHILD t2 on t2.FID = t0.FBOMID AND t2.FMATERIALID = t0e.FMATERIALID WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' "; var res = DBUtils.Execute(this.Context, updSqlL); } return; } } } }