货位库存管理页面

这篇具有很好参考价值的文章主要介绍了货位库存管理页面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

货位库存管理页面

目的: 练习分页查询结构,了解tab分页显示方式,了解数据修改操作功能说明: 编写货位库存管理页面,支持货位间库存调整功能要求:

  • 编写货位库存管理界面,基于货位库存的维度展示数据
  • 页面存在tab分页,能够显示货品信息,显示该货品在指定仓库的所有其他货位信息
  • 搜索条件包括仓库,货品,单品,货位,库存量相关的常用搜索条件双击货位库存时打开货品属性页面
  • 右键功能移动货品,将选中货位库存,移动录入数量到指定的货位,并在仓库货品日志表中记录日志。非系统货位不允许负库存(不用考虑创建移位单,只需要修改货位库存即可)

c#代码

	[Window(View="stock/stock_query/stock_position_query.html", Title="货位库存管理", Style=Style.WS_VISIBLE|Style.WS_CLIPCHILDREN|Style.WS_CHILD, Width=1024, Height=768)]
	class StockPositionQueryWindow : BaseWindow<object>
	{
		protected override void OnLoad()
		{

			this.BindAttach(new Dictionary<string, string>
				{
					{"#stock_spec_list", "wms.StockSpec.queryStockPosition"},
					{"#goods_info", "goods.ApiGoods.getBySpecId"},
					{"#goods_other_position_info_list", "wms.StockSpec.getPositionInfoByGoodsNo"},
					{"#stock_spec_log_list", "wms.StockSpec.getLogAdapter"},

				});
		}
			
		[Click("#btn_search")]
		void OnClickSearch()
		{
			Alert(Q("#warehouse_list").GetHtml());
			var queryParams = this.ToQueryParam(".flat_bar");
			Q("#stock_spec_list").DbPageBind("wms.StockSpec.queryStockPosition", queryParams);
		}

		// 双击查看货品属性信息
		[DblClickTR("#stock_spec_list")]
		void OnClickGoodsDetail()
		{
			var tr = Q("#stock_spec_list > tr:checked");

			if(tr == null)
			{
				return ;
			}

			var goodsID = tr.GetData("goods_id");
			DoModal(default(GoodsEditWindow), new GoodsEditParams{goodsId=goodsID, view=true});
		}

		// 货位库存列表中的一列被单击时的回调函数
		// 单击展示对应货位的tab分页
		[ClickTR("#stock_spec_list")]
		void OnClickGoodsList()
		{
			var tr = Q("#stock_spec_list>tr:checked");

			if (tr == null)
			{
				return ;
			}

			var stockSpecPoId = tr.RecId();
			var goodsId = tr.GetData("goods_id");
			var positionId = tr.GetData("position_id");
			var warehouseId = Q("[qp=warehouse_id]").IntegerValue;

			// 展示对应货位的tab分页
			this.BindTab("#bottom_tabs", (Action<string,Element, long, int, int, int>)OnBindTab, stockSpecPoId, goodsId, warehouseId, positionId);
		}


		//点击tab
		[Expanded("#bottom_tabs")]
		void OnBottomTabsSwitch()
		{
			OnClickGoodsList();
		}

		void OnBindTab(string name, Element el, long stockSpecPoId, int goodsId, int warehouseId, int positionId)
		{
			switch(name)
			{
				case "goods_info":
					{
						el.Q("#goods_info").DbBind("wms.StockSpec.getGoodsInfoByGoodsId", goodsId);
						break;
					}
				case "goods_other_position_info":
					{
						el.Q("#goods_other_position_info_list").DbPageBind("wms.StockSpec.getPositionInfoByGoodsNo", goodsId, warehouseId, positionId);
						break;
					}
				case "stock_spec_log":
					{
						el.Q("#stock_spec_log_list").DbPageBind("wms.StockSpec.getLog",stockSpecPoId);
						break;
					}
			}
		}

		[Command("#menu_stock_move")]
		void onClickStockBatchMove() {

			// 获取仓库ID
			int warehouseId = Q("#warehouse_list").IntegerValue;

			var tr = Q("#stock_spec_list > tr:checked");

			if(tr == null)
			{
				Alert("请选择货位");
				return ;
			}

			if(tr.GetData("position_id") < 0)
			{
				Alert("系统货位禁止移位");
				return ;
			}

			var arg = new PositionSelectParams{
				WarehouseId=warehouseId,
				SpecId = tr.GetData("spec_id"),
				Defect = tr.GetData("defect"),
				ZoneType = tr.GetData("zone_type"),
				ZoneId = tr.GetData("zone_id"),
				stockSpecPoId = tr.RecId(),
				PositionNO = tr.Field("position_no").StringValue,
				PositionId = tr.GetData("position_id"),
			};
			DoModal(default(PositionSelectWindow), arg);
		}
	}

}

总体来说:
1、这段代码实现了一个图形用户界面(GUI)窗口,与后端数据进行交互,包括搜索、双击查看货品详情、选项卡切换和执行库存移动等功能
2、具体的一些细节逻辑包括将后端查询到数据绑定到页面元素展示给用户、页面之间的参数传递。

java代码页面查询

stockSpecService.queryPosition

public Response queryPosition(Session session, Map<String, Object> params, List<String> noList, Pager pager)
			throws SQLException, AppException
	{
		// 检查仓库权限
		short warehouseId = MapUtils.getShort(params, "warehouse_id", Const.SHORT_ZERO);
		WmsUtils.assertWarehouseRight(session, warehouseId);

		DbSession db = session.db(false);

		int zoneID = MapUtils.getInt(params, "zone_id", -1);
		BigDecimal lowNum = MapUtils.getDec(params, "low_num", BigDecimal.ZERO);
		boolean isDefault = MapUtils.getBool(params, "is_default", false);

		// 排序方式
		int sortPattern = MapUtils.getInt(params, "sort_pattern", 0);

		// 货位
		String positionNo = MapUtils.getString(params, "position_no", null);

		// 货品分类
		String classId = ConvertUtils.toString(params.get("class_id"));
		String classPath;
		if (classId != null)
			classPath = db.get("SELECT path FROM goods_class where class_id=?", classId);
		else
			classPath = "";
		Where where = new Where(params, session)
		{
			{
				equalValue("ssp.warehouse_id", warehouseId);
				equalOrLike("goods_spec_no_likeq", "spec_no", "gs.spec_no");
				equalOrLike("goods_goods_no_likeq", "goods_no", "gg.goods_no");
				likeAnyDisOrder("goods_name", "gg.goods_name");
				equal("defect", "ssp.defect");
				equal("spec_name", "gs.spec_name");
				equal("barcode", "gb.barcode");
				in("brand_id", "gg.brand_id");
				likeValue("gc.path", classPath);

				if (zoneID > 0)
					equal("zone_id", "cwz.zone_id");

				//特殊货位
				if (zoneID == 0)
					condition("cwp.rec_id<0");

				if (StringUtils.isNotEmpty(positionNo) && !"全部".equals(positionNo))
				{
					if ("非特殊货位".equals(positionNo))
						this.condition("cwp.rec_id>0");
					else
						equal("position_no", "cwp.position_no");
				}

				if (isDefault)
				{
					this.condition("sgdp.rec_id>0");
				}

				switch (this.param("stock_num_type", -1))
				{
				case 0:
					lessValue("stock_num", lowNum);
					break;
				case 1:
					equalValue("stock_num", lowNum);
					break;
				case 2:
					greatValue("stock_num", lowNum);
					break;
				default:
					break;
				}

				if (noList != null && noList.size() > 0)
					inValues("gs.spec_no", noList);
			}
		}.orderBy("gs.goods_id,gs.spec_no ASC,ssp.rec_id DESC");

		switch (sortPattern)
		{
		case 0:
			where.orderBy("gs.goods_id,gs.spec_id,ssp.rec_id DESC");
			break;
		case 1:
			where.orderBy("gs.goods_id,gs.spec_no ASC,ssp.rec_id DESC");
			break;
		case 2:
			where.orderBy("gs.goods_id,gs.spec_no DESC,ssp.rec_id DESC");
			break;
		default:
			where.orderBy("gs.goods_id,gs.spec_id,ssp.rec_id DESC ");
		}

		String on = "ssp.warehouse_id = ssd.warehouse_id and ssp.position_id = ssd.position_id and ssp.spec_id = ssd.spec_id";

		Table table = new Table("stock_spec_position ssp", "ssp.rec_id", where)
		{
			{
				leftJoin("goods_spec gs", "gs.spec_id = ssp.spec_id", "gs.,gg.");
				leftJoin("goods_goods gg", "gg.goods_id = gs.goods_id", "gg.,gc.");
				innerJoin("goods_class gc", "gc.class_id=gg.class_id", "gc.");
				leftJoin("cfg_warehouse_position cwp", "cwp.rec_id=ssp.position_id", "cwp.,cwz.");
				leftJoin("cfg_warehouse_zone cwz", "cwz.zone_id=cwp.zone_id", "cwz.");
				leftJoin("stock_goods_default_position sgdp",
						"ssp.warehouse_id=sgdp.warehouse_id AND ssp.position_id=sgdp.position_id AND sgdp.type=" + GoodsMerchantNo.TYPE_GOODS_SPEC + " AND sgdp.target_id=ssp.spec_id AND ssp.defect = sgdp.defect",
						"sgdp.");
				leftJoin("goods_barcode gb",
						"gb.type=" + GoodsMerchantNo.TYPE_GOODS_SPEC + " AND gb.target_id= ssp.spec_id", "gb.");
			}
		}.extraJoin("goods_spec gs", "gs.spec_id = ssp.spec_id")
				.extraJoin("goods_goods gg", "gg.goods_id = gs.goods_id")
				.extraJoin("cfg_warehouse_position cwp", "cwp.rec_id=ssp.position_id")
				.extraJoin("stock_goods_default_position sgdp",
						"ssp.warehouse_id = sgdp.warehouse_id AND ssp.position_id=sgdp.position_id AND sgdp.type=" + GoodsMerchantNo.TYPE_GOODS_SPEC + " AND sgdp.target_id=ssp.spec_id AND ssp.defect = sgdp.defect")
				.extraJoin("stock_spec_detail ssd", on);

		//String fields = "ssp.rec_id,ssp.spec_id,ssp.defect,ssp.stock_num,IFNULL(sgdp.to_move_num,0) AS to_move_num,gs.spec_no,gs.spec_code,gs.spec_name," + "gg.goods_no,gg.goods_name,gg.short_name,cwp.position_no,IF(sgdp.rec_id>0,1,0) is_default,cwp.zone_id,gg.brand_id";
		String fields = "ssp.rec_id,ssp.spec_id,ssp.defect,ssp.warehouse_id, ssp.position_id,ssp.stock_num,"
				+ "ssd.zone_type, ssd.zone_id, ssd.expire_date, ssd.reserve_num, ssd.remark, ssd.last_pd_time, ssd.last_inout_time," + "gs.goods_id,gs.spec_no,gs.spec_code,gs.spec_name," + "cwp.position_no," + "gg.goods_no,gg.goods_name,gg.short_name,gg.brand_id," + "IFNULL(sgdp.to_move_num,0) AS to_move_num,IF(sgdp.rec_id>0,1,0) is_default";
		table.setOutputFields(fields);

		return SqlUtils.pageQuery(db, pager, table, where);
	}

总的来说是,是根据搜索条件包括仓库,货品,单品,货位,库存量相关的常用搜索条件,对库存的分页查询,并返回到客户端

java代码货品信息的分页功能

public Response getGoodsInfoByGoodsId(Session session, int goodsId) throws SQLException
	{
		DbSession db = session.db(false);

		String querySql = "select * from goods_goods where goods_id = ?";

		return db.query(querySql, goodsId);
	}

java代码查询同仓库不同货位的信息分页

public Response getPositionInfoByGoodsNo(Session session, int goodsId, short warehouseId, int positionId,
			Pager pager) throws SQLException
	{
		DbSession db = session.db(false);

		Where where = new Where(null, session)
		{
			{
				equalValue("ssp.warehouse_id", warehouseId);
				notEqualValue("ssp.position_id", positionId);
				equalValue("gs.goods_id", goodsId);
			}
		}.orderBy("ssp.rec_id desc");

		String on = "ssp.warehouse_id = ssd.warehouse_id and ssp.position_id = ssd.position_id and ssp.spec_id = ssd.spec_id";

		Table table = new Table("stock_spec_position ssp", "ssp.rec_id", where)
		{
			{
				innerJoin("goods_spec gs", "gs.spec_id = ssp.spec_id", true);
			}
		}.extraJoin("cfg_warehouse_position cwp", "cwp.rec_id=ssp.position_id").extraJoin("stock_spec_detail ssd", on);

		String fields = "ssp.rec_id, ssp.spec_id, ssp.defect, ssp.position_id, ssp.warehouse_id, " + "ssd.zone_type, ssd.zone_id, ssd.expire_date, ssd.reserve_num, ssd.stock_num, ssd.remark, ssd.last_pd_time, ssd.last_inout_time," + "cwp.position_no";
		table.setOutputFields(fields);

		return SqlUtils.pageQuery(db, pager, table, where);
	}

java获取当前货位的日志信息

	public Response getLog(Session session, int stockSpecPoId, Pager pager) throws SQLException
	{
		DbSession db = session.db(false);

		Where where = new Where(null, session)
		{
			{
				equalValue("sspl.ssp_id", stockSpecPoId);
			}
		}.orderBy("sspl.rec_id desc");

		Table table = new Table("stock_spec_position_log sspl", "sspl.rec_id", where);

		String fields = "sspl.*";
		table.setOutputFields(fields);

		return SqlUtils.pageQuery(db, pager, table, where);
	}

java移动货位操作

ublic void movePosition(Session session, Map<String, Object> params) throws SQLException, AppException
	{
		DbSession db = session.db(false);

		// 移位的数量
		BigDecimal stockNum = MapUtils.getDec(params, "stock_num");
		// 仓库id
		int warehouseId = MapUtils.getInt(params, "warehouse_id");
		// 原货位id
		int oldPositionId = MapUtils.getInt(params, "old_position_id");
		// 目标货位id
		int newPositionId = MapUtils.getInt(params, "new_position_id");
		// 原货位编码
		String oldPositionNo = MapUtils.getString(params, "old_position_no");
		// 目标货位编码
		String newPositionNo = MapUtils.getString(params, "new_position_no");

		// 单品id
		int specId = MapUtils.getInt(params, "spec_id");
		// stock_spec_position 主键,用于在仓库货品日志表中记录日志
		int stockSpecPoId = MapUtils.getInt(params, "stock_spec_po_id");

		int defeat = MapUtils.getInt(params, "defeat");

		// 开启一个新的事务
		db.startTx();

		String where = "where warehouse_id = ? and position_id = ? and spec_id = ? and defect = ?";

		// 货位不允许负库存
		StockSpecPosition stockSpecPosition = db.query("select * from stock_spec_position" + where + "  FOR UPDATE",
				StockSpecPosition.class, warehouseId, oldPositionId, specId);
		if (stockSpecPosition == null)
		{
			throw new AppException("货位不存在");
		}
		if (oldPositionId < 0 && stockSpecPosition.getStockNum().compareTo(stockNum) < 0)
		{
			throw new AppException("货位不允许负库存");
		}

		// 原货位减库存
		db.update("update stock_spec_position set stock_num = stock_num - ?" + where, stockNum, warehouseId,
				oldPositionId, specId, defeat);

		// 目标货位加库存
		db.update("update stock_spec_position set stock_num = stock_num + ?" + where, stockNum, warehouseId,
				newPositionId, specId, defeat);

		// 日志内容
		String remark = oldPositionNo + "--->" + newPositionNo + ",数量为" + stockNum;

		// 在仓库货品日志表中记录日志
		db.insert("INSERT INTO stock_spec_position_log(ssp_id,remark,operator_id)" + " VALUES(?,?,?)", stockSpecPoId,
				remark, session.getUserId());

		// 提交事务
		db.commit();
	}

解释:
1、开启事务:
2、获取原货位信息,判断是否存在、不存在抛出异常。
3、判断原货位数量是否满足操作数量,不满足报错
4、原货位减库存、 目标货位加库存、日志内容拼接、在仓库货品日志表中记录日志文章来源地址https://www.toymoban.com/news/detail-741186.html

到了这里,关于货位库存管理页面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于JavaSE的手机库存管理系统

    基于JavaSE完成如下需求: 功能需求: 1、查询库存量 2、可以修改库存中不同品牌手机的个数 3、退出系统 实现步骤: 1、把List当做库房 2、把手机存放在库房中 3、使用封装的方法区操作仓库中的手机 面向对象 集合 循环 流程控制语句 方法

    2024年02月15日
    浏览(47)
  • 开源库存管理系统InvenTree的安装

    本文是应网友 shijie880500 要求折腾的; 什么是 InvenTree ? InvenTree 是一个开源的库存管理系统,提供强大的低级别库存控制和零件跟踪。 InvenTree 系统的核心是 Python/Django 数据库后端,它提供了一个管理界面(基于 web )和一个 REST API ,用于与外部接口和应用程序交互。强大的

    2024年02月06日
    浏览(60)
  • 制造企业选择库存管理条码工具需要关注哪些点?

    Dynamsoft Barcode Reader SDK  一款多功能的条码读取控件,只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK,你可以创建强大且实用的条

    2024年02月03日
    浏览(36)
  • 基于springboot的企业进销存管理系统/进销存管理系统/库存管理系统

      摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括 企业进销存管理系统 的网络应用,在外国 企业进销存管理 已经是很普遍的方式,不过 国内的 企业进销存管理 可能 还处于起步阶段 。 企业进销存管理系统 具有 产品入库、产品出库

    2024年02月12日
    浏览(50)
  • 拼多多API如何助力商家优化库存管理和物流策略

    实时库存查询:拼多多API可以提供实时库存查询功能,商家可以随时获取自己店铺的商品库存情况。通过这个功能,商家可以及时了解库存情况,避免缺货或积压现象,提高库存周转率。 物流信息查询:拼多多API可以提供物流信息查询功能,商家可以实时跟踪商品的物流状态

    2024年01月23日
    浏览(45)
  • leetcode:LCR 159. 库存管理 III(python3解法)

    仓库管理员以数组  stock  形式记录商品库存表,其中  stock[i]  表示对应商品库存余量。请返回库存余量最少的  cnt  个商品余量,返回  顺序不限 。 示例 1: 示例 2: 提示: 0 = cnt = stock.length = 10000 0 = stock[i] = 10000

    2024年02月02日
    浏览(40)
  • 【开源】SpringBoot框架开发服装店库存管理系统

    基于JAVA+Vue+SpringBoot+MySQL的服装店库存管理系统,包含了服装档案模块、服装入库模块、服装出库模块,可以自由的运营服装库存数据,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,服装店库存管理

    2024年02月19日
    浏览(43)
  • 7个最佳开源免费库存/仓库管理系统(WMS)

    库存/仓库管理软件是一种用于帮助企业管理库存、仓储位置和交付过程的软件系统。这种类型的软件对于拥有大量库存和多个仓库的企业非常有用。 库存/仓库管理软件的作用包括以下几个方面: (1)减少库存节约成本 通过跟踪库存水平和存储位置,避免库存过多,更有效

    2024年02月05日
    浏览(58)
  • 如何利用产品状态维度优化库存管理和采购策略?【ODOO15/16】

           ODOO产品属性有个分类维度值,很多人不明白具体该怎么用?其实用处很大,我们首先要确立一个观点:没有分类就没有管理!公司里那么多产品,都有不同的特性、用途、价值,我们只有进行准确分类,才能针对性的管理。       ODOO的分类设置界面:      以下我

    2024年02月07日
    浏览(32)
  • 软件测试案例 | 气象探测库存管理系统的集成测试计划

    将经过单元测试的模块按照设计要求连接起来,组成规定的软件系统的过程被称为“集成”。集成测试也被称为组装测试、联合测试、子系统测试或部件测试等,其主要用于检查各个软件单元之间的接口是否正确。集成测试同时也是单元测试的逻辑扩展,即在单元测试基础之

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包