金蝶云星空解锁时同时解锁序列号

金蝶云星空解锁时同时解锁序列号

业务背景

公司业务要求,如果检查发现序列号有问题,先锁库不允许出库。前置任务
如果已经锁库,此时序列号允许出库,则可以解锁。

系统现状

即时库存锁库,锁定的是数量,库存-锁库数=可用数,当可用量小于等于0就不可以再出库了。
如果想要控制锁到序列号,系统就不支持了。

方案设计

锁库时同时锁定库存和根据输入的序列号锁定序列号,解锁的时候,同时解锁库存和根据输入的序列号进行解锁。

详细设计

解锁操作-扩展

添加页签控件,将原来的解锁信息放到第一个页签,第二个页签添加一个单据体,单据体增加一个基础资料,绑定序列号主档。

在这里插入图片描述

在这里插入图片描述
菜单项,添加按钮,按序列号解锁
在这里插入图片描述

创建表单插件实现解锁逻辑

找到表单插件,新建插件,继承它。在这里插入图片描述

创建类UnLockOperateBySerialExtend,继承UnLockStockOperate。
实现:
解锁数量不能大于锁库数;
解锁数=序列号个数;
序列号必须在当前即时库存里且在序列号主档标记锁定;
释放库存和清空锁定标记必须一起成功。


using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Resource;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.SCM.STK;
using Kingdee.K3.SCM.ServiceHelper;
using Kingdee.K3.SCM.Stock.Business.PlugIn;
using Krystal.K3Cloud.Core.Const;
using Krystal.K3Cloud.Core.Model.STK;
using Krystal.K3Cloud.Core.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace Krystal.K3.SCM.Business.PlugIn.STK.DynamicForm
{
   
	/// <summary>
	/// 功能描述    :UnLockOperateBySerialExtend  
	/// 创 建 者    :Administrator
	/// 创建日期    :2024/8/14 15:46:46 
	/// 最后修改者  :Krystal
	/// 最后修改日期:2024/8/14 15:46:46 
	/// </summary>
	[Description("即时库存解锁操作插件--二开继承"), HotUpdate]
	public class UnLockOperateBySerialExtend: UnLockStockOperate
    {
   
		#region <常量>
		/// <summary>
		/// 操作类型:StockLock-库存锁库,Inv-即时库存,SaleOrder-销售订单 StockLockLog-库存日志解锁
		/// </summary>
		private string opType = "Inv";
		#endregion <常量>

		#region <变量>
		/// <summary>
		/// 标示是否关闭界面
		/// </summary>
		private bool IsClose;
		#endregion <变量>



		#region <方法>
		/// <summary>
		/// 获得动态对象的值,优先返回MasterId
		/// </summary>
		/// <param name="obj"></param>
		/// <returns></returns>
		private long GetDynamicValue(DynamicObject obj)
		{
   
			if (obj == null)
			{
   
				return 0L;
			}
			if (obj.DynamicObjectType.Properties.ContainsKey(FormConst.MASTER_ID))
			{
   
				return Convert.ToInt64(obj[FormConst.MASTER_ID]);
			}
			if (obj.DynamicObjectType.Properties.ContainsKey("Id"))
			{
   
				return Convert.ToInt64(obj["Id"]);
			}
			return 0L;
		}
		/// <summary>
		/// 校验序列号是否在库,且未锁定
		/// </summary>
		/// <param name="objList"></param>
		/// <param name="invId"></param>
		/// <returns></returns>
		private bool CheckSerial(List<DynamicObject> objList, string invId, out string serialMsg)
		{
   
			bool isSucceed = true;
			serialMsg = string.Empty;
			//序列号物料编码,在库状态
			List<SqlParam> para = new List<SqlParam>()
			{
   
                //new SqlParam("@STOCKID", KDDbType.Int32,493513),
                new SqlParam("@InvId", KDDbType.String,invId),
				new SqlParam("@IsLock", KDDbType.Int32,1),
                //new SqlParam("@ENDTIME",KDDbType.String,_filterArgs.EndTime.ToString("yyyy-MM-dd")),
                //new SqlParam("@t",KDDbType.String,temp_detail)
            };
			//执行sql语句并将结果集填充至DataSet  XXXX_PR_STK_SerialInfoByInvId未使用
			DataSet getSerial = DBUtils.ExecuteDataSet(this.Context, System.Data.CommandType.StoredProcedure
				, string.Format(@"{0}XXXX_PR_STK_SerialInfoByInvId", OtherConst.DIALECT), para);



			//调用上面的将DataSet转换为List<Menu>实体集合
			List<SerialMainFile> serialListInStock = (List<SerialMainFile>)KrystalCommonUtil
				.DataSetToList<SerialMainFile>(getSerial, 0);
			if (serialListInStock == null || serialListInStock.Count <= 0)
			{
   
				isSucceed = false;
			}
			//LINQ两个集合关联,左集合在右边找不到,则为空,找出为空的数据提示出来
			//使用查询语句
			var list = from left in objList
					   join right in serialListInStock on left["F_XXXX_SerialId_Id"] + "" equals right.FSERIALID + "" into temp
					   select new
					   {
   
						   serialId = left["F_XXXX_SerialId_Id"] + "",
						   serialNumber = (left["F_XXXX_SerialId"] as DynamicObject)["Number"] + "",
						   serialNo = temp.Select(t => t.FSERIALNO).FirstOrDefault()
					   };

			var isEmpty = list.Where(s => s.serialNo.IsNullOrEmptyOrWhiteSpace()).ToList(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值