货位库存管理页面

2023-11-02 09:01
文章标签 页面 管理 库存 货位

本文主要是介绍货位库存管理页面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

货位库存管理页面

目的: 练习分页查询结构,了解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() {// 获取仓库IDint 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);elseclassPath = "";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");elseequal("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");// 仓库idint warehouseId = MapUtils.getInt(params, "warehouse_id");// 原货位idint oldPositionId = MapUtils.getInt(params, "old_position_id");// 目标货位idint newPositionId = MapUtils.getInt(params, "new_position_id");// 原货位编码String oldPositionNo = MapUtils.getString(params, "old_position_no");// 目标货位编码String newPositionNo = MapUtils.getString(params, "new_position_no");// 单品idint 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、原货位减库存、 目标货位加库存、日志内容拼接、在仓库货品日志表中记录日志

这篇关于货位库存管理页面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329552

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

PMBOK® 第六版 规划进度管理

目录 读后感—PMBOK第六版 目录 规划进度管理主要关注为整个项目期间的进度管理提供指南和方向。以下是两个案例,展示了进度管理中的复杂性和潜在的冲突: 案例一:近期,一个长期合作的客户因政策要求,急需我们为多家医院升级一个小功能。在这个过程中出现了三个主要问题: 在双方确认接口协议后,客户私自修改接口并未通知我们,直到催进度时才发现这个问题关于UI设计的部分,后台开发人员未将其传递给

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统