using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using Kingdee.K3.BD.NewCode.Core.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace GZ.LJY000.Biori.STK_MisDelivery { [HotUpdate, Description("其他出库单服务操作插件#")] public class OperationEventPlugInEx : AbstractOperationServicePlugIn { public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); #region base e.FieldKeys.Add("FStockDirect"); #endregion #region item e.FieldKeys.Add("FSeq"); e.FieldKeys.Add("FPackBillNo"); //e.FieldKeys.Add("FPackBillSeq"); //e.FieldKeys.Add("FPackBillEntryId"); e.FieldKeys.Add("FPackBarCode"); //套件码 e.FieldKeys.Add("FQty"); e.FieldKeys.Add("F_QJCG_Assistant1"); //检料类型 //e.FieldKeys.Add("FRowType"); #endregion } 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);//添加校验器 } } public override void EndOperationTransaction(EndOperationTransactionArgs 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); } base.EndOperationTransaction(e); } /// /// /// /// /// private void DoComputePackgeQty(DynamicObject[] dataEntitys, bool isInStock) { var dataEntityList = new List(); var sqlL = new List(); //# ! 装管公式(毫升):管数 = 数量 / 装管量(ml) / 1.05 //# ! 装管公式(微升):管数 = 数量 / 装管量(ml) / 1000 / 1.05 foreach (var data in dataEntitys) { var stockDirect = data["StockDirect"].ToString(); foreach (var item in data["BillEntry"] as DynamicObjectCollection) { var packBillNo = item["FPackBillNo"].ToString(); //var packBillEntryId = item["FPackBillEntryId"].ToString(); var materialId = item["MaterialId_Id"].Long2Int(); if (!packBillNo.IsNullOrEmpty()) { var fylck = item["F_QJCG_Assistant1_Id"].ToString().Equals("63876e213ea87e"); var minus = stockDirect == "RETNRU" ? -1 : 1; minus = minus * (isInStock ? -1 : 1); sqlL.Add($" SELECT '{packBillNo}' AS FBILLNO,{materialId} FMATERIALID, {item["Qty"]} * {minus} AS QTY ,{(fylck ? 1 : 0)} FYLCK"); } } } if (isInStock) DoComputePackgeInStockQty(sqlL); else DoComputePackgeOutStockQty(sqlL); } /// /// 入库操作 /// /// private void DoComputePackgeInStockQty(List sqlL) { if (sqlL.Any()) { var updHeadSql = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) , #关联数据 AS ( SELECT t0.FBILLNO,t0e.FEntryID,t0e.FID ,t0.FQTY AS 'PQty' ,(t0e.FQTY - t0e.FFYLQTY)/ t2e.FNUMERATOR * t2e.FDENOMINATOR AS '父项数量' ,(t6.QTY)/ t2e.FNUMERATOR * t2e.FDENOMINATOR * t5.F_UNITIDHS AS '实际出库父项数量' ,(t0e.FFYLQTY) /t2e.FNUMERATOR * t2e.FDENOMINATOR AS '富余量' ,t0.FOUTSTOCKQTY ,t0e.FQTY ,t0e.FZGSQTY,t0e.FGZLQty ,t0e.FFYLQTY ,t2e.FNUMERATOR,t2e.FDENOMINATOR ,t5.F_UNITIDHS ,t6.FYLCK ,ROW_NUMBER() OVER (PARTITION BY t0.FID ORDER BY t0e.FENTRYID) RN FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN T_ENG_BOM t2 on t2.FID = t0.FBOMID INNER JOIN T_ENG_BOMCHILD t2e on t2e.FID = t2.FID AND t2e.FMATERIALID = t0e.FMATERIALID INNER JOIN T_BD_MATERIAL t5 on t5.FMATERIALID = t0e.FMATERIALID INNER JOIN #基础数据 t6 on t6.FENTRYID = t0e.FEntryID WHERE 1 = 1 ) UPDATE t1 SET t1.FQTY = t1.FQTY + t0.实际出库父项数量 ,t1.FOUTSTOCKQTY = t1.FOUTSTOCKQTY - t0.实际出库父项数量 FROM #关联数据 t0 INNER JOIN T_PRD_PACKAGEINSTOCK t1 on t1.FID = t0.FID CROSS APPLY ( SELECT COUNT(1) bQty FROM #关联数据 t2 WHERE t2.FID = t0.FID GROUP BY t2.FID HAVING AVG(t2.实际出库父项数量) = t0.实际出库父项数量 ) t2 CROSS APPLY ( SELECT COUNT(1) AS dQty FROM T_PRD_PACKAGEINSTOCKENTRY t4e WHERE t4e.FID = t0.FID GROUP BY t4e.FID ) t4 WHERE t2.bQty = t4.dQty AND t0.FYLCK = 0 AND t0.RN = 1 "; //var res = DBUtils.Execute(this.Context, updHeadSql); var updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) , #汇总数据 AS ( SELECT t0.BillNo,t0.FMATERIALID,SUM(t0.Qty) Qty FROM #基础数据 t0 GROUP BY t0.BillNo,t0.FMATERIALID ) --SELECT t0.FBILLNO,t1.FMATERIALID,t1.Qty * t0e.FQTY / t2.总数量,t3.F_UNITIDHS UPDATE t0e SET t0e.FQTY = t0e.FQTY + (t1.Qty * t0e.FQTY / t2.总数量 * t3.F_UNITIDHS) FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on t0e.FID = t0.FID INNER JOIN #汇总数据 t1 on t1.BillNo = t0.FBILLNO AND t0e.FMATERIALID = t1.FMATERIALID CROSS APPLY ( SELECT SUM(t2e.FQTY) AS '总数量' FROM T_PRD_PACKAGEINSTOCKENTRY t2e WHERE t2e.FID = t0e.FID AND t2e.FMATERIALID = t0e.FMATERIALID ) t2 INNER JOIN T_BD_MATERIAL t3 on t3.FMATERIALID = t0e.FMATERIALID "; //更新组装单信 //var resData = DBUtils.Execute(this.Context, updSqlL); return; } } /// /// 出库操作 /// /// private void DoComputePackgeOutStockQty(List sqlL) { if (sqlL.Any()) { var updHeadSql = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) , #关联数据 AS ( SELECT t0.FBILLNO,t0e.FEntryID,t0e.FID ,t0.FQTY AS 'PQty' ,(t0e.FQTY - t0e.FFYLQTY)/ t2e.FNUMERATOR * t2e.FDENOMINATOR AS '父项数量' ,(t6.QTY)/ t2e.FNUMERATOR * t2e.FDENOMINATOR * t5.F_UNITIDHS AS '实际出库父项数量' ,(t0e.FFYLQTY) /t2e.FNUMERATOR * t2e.FDENOMINATOR AS '富余量' ,t0.FOUTSTOCKQTY ,t0e.FQTY ,t0e.FZGSQTY,t0e.FGZLQty ,t0e.FFYLQTY ,t2e.FNUMERATOR,t2e.FDENOMINATOR ,t5.F_UNITIDHS ,t6.FYLCK ,ROW_NUMBER() OVER (PARTITION BY t0.FID ORDER BY t0e.FENTRYID) RN FROM T_PRD_PACKAGEINSTOCK t0 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN T_ENG_BOM t2 on t2.FID = t0.FBOMID INNER JOIN T_ENG_BOMCHILD t2e on t2e.FID = t2.FID AND t2e.FMATERIALID = t0e.FMATERIALID INNER JOIN T_BD_MATERIAL t5 on t5.FMATERIALID = t0e.FMATERIALID INNER JOIN #基础数据 t6 on t6.FENTRYID = t0e.FEntryID WHERE 1 = 1 ) UPDATE t1 SET t1.FQTY = t1.FQTY - t0.实际出库父项数量 ,t1.FOUTSTOCKQTY = t1.FOUTSTOCKQTY + t0.实际出库父项数量 FROM #关联数据 t0 INNER JOIN T_PRD_PACKAGEINSTOCK t1 on t1.FID = t0.FID CROSS APPLY ( SELECT COUNT(1) bQty FROM #关联数据 t2 WHERE t2.FID = t0.FID GROUP BY t2.FID HAVING AVG(t2.实际出库父项数量) = t0.实际出库父项数量 ) t2 CROSS APPLY ( SELECT COUNT(1) AS dQty FROM T_PRD_PACKAGEINSTOCKENTRY t4e WHERE t4e.FID = t0.FID GROUP BY t4e.FID ) t4 WHERE t2.bQty = t4.dQty AND t0.FYLCK = 0 AND t0.RN = 1 "; //var res = DBUtils.Execute(this.Context, updHeadSql); var updSqlL = $@"/*dialect*/ WITH #基础数据 AS ( {string.Join(" UNION ALL ", sqlL)} ) UPDATE t0e SET t0e.FQTY = t0e.FQTY - (tt.QTY * t1.F_UNITIDHS) FROM #基础数据 tt INNER JOIN T_PRD_PACKAGEINSTOCK t0 on t0.FBILLNO = tt.BillNo INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t0e on tt.FENTRYID = t0e.FEntryID INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0e.FMATERIALID WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' "; //更新组装单信 //var resData = DBUtils.Execute(this.Context, updSqlL); return; } } } }