SSM智能制造之操作日志管理
- 货物信息管理:对货物的详细信息进行录入、编辑和查询,包括货物的名称、规格、型号、品牌、价格等信息。系统支持对货物进行分类管理,如将货物分为原材料、半成品、成品等不同类别,方便货物的存储和管理。此外,还能对货物的存储位置、库存数量、状态等信息进行实时更新和监控。
- 人员信息管理:涵盖仓库人员、供应商、客户等相关人员的信息管理。记录仓库人员的基本信息、工作职责、权限等,便于人员的调度和管理;对供应商的信息进行维护,包括供应商名称、联系方式、供应货物等信息,方便采购管理;同时,管理客户的信息,如客户名称、地址、订单信息等,为销售管理提供支持。
(二)出入库管理
- 入库管理:自动化处理货物的入库流程,支持多种入库方式,如采购入库、生产入库等。根据供应商和商品信息,在相应的仓库中执行入库操作,系统会自动更新货物的库存信息。如果货物在相应的仓库中已经有库存,会进行提示并可选择更换仓库或修改库存。同时,系统可以对入库记录进行详细的统计和分析,生成入库报表,方便管理人员进行查询和决策。
- 出库管理:执行商品的出库管理,根据客户和商品信息,在指定的仓库中执行出库操作。系统会自动减少相应货物的库存数量,并生成出库记录,记录出库的时间、数量、客户等信息。支持根据订单或出库需求,自动生成出库计划,优化出库流程,提高出库效率。此外,还能对出库记录进行跟踪和查询,确保货物的安全出库。
- 转库管理:自动化处理仓库内的货物转移流程,当货物需要在不同仓库之间进行转移时,系统可以快速处理转移申请,更新相关仓库的库存信息。同时,记录转库的时间、货物信息、转移前后的仓库等信息,方便对转库操作进行管理和追溯。
(三)库存管理
- 库存查询:提供强大的库存查询功能,用户可以根据货物名称、规格、仓库等条件进行查询,快速获取货物的库存信息,包括库存数量、位置、状态等。支持对库存信息进行多维度的统计和分析,如按时间段统计库存的出入库数量、按货物类别统计库存的占用情况等,为库存管理提供数据支持。
- 库存预警:系统会对库存货物的数量进行实时监控,当库存数量低于或高于设定的安全库存阈值时,自动发出库存预警信息,提醒采购人员进行补货或销售人员进行促销。预警方式可以包括系统内提示、短信通知、邮件通知等多种形式,确保管理人员能够及时获取库存异常信息。
- 库存盘点:支持定期或不定期的库存盘点工作,系统可以生成盘点计划,操作人员可以根据盘点计划对仓库的实际库存进行盘点。盘点过程中,系统会自动比对实际库存与系统库存的差异,并生成盘点报告,记录盘点结果和差异原因。对于盘点中发现的问题,系统可以进行标记和处理,确保库存数据的准确性和一致性。
(四)订单管理
- 订单创建:根据客户的需求创建订单,订单信息包括订单编号、客户信息、货物信息、订单数量、订单金额、交货日期等。系统会自动生成唯一的订单编号,方便订单的跟踪和管理。同时,订单创建过程中可以关联相应的仓库和货物信息,确保订单的可执行性。
- 订单查询:提供订单的查询功能,用户可以根据订单编号、客户名称、订单状态等条件进行查询,快速获取订单的详细信息。系统可以跟踪订单的状态,如已创建、已发货、已收货等,方便管理人员对订单进行全程监控和管理。
- 订单修改和删除:在订单未执行或部分执行的情况下,支持对订单的信息进行修改,如修改订单数量、交货日期等。如果订单不再需要执行,系统可以对订单进行删除操作,并更新相关的库存信息和订单状态。
(五)数据对接与统计分析
- 数据对接:与工厂的EBS(企业资源计划系统)、MES(制造执行系统)等系统进行数据对接,实现数据的高效流通和共享。通过数据对接,仓库模块可以获取生产计划、销售订单等信息,为仓库的出入库管理提供依据;同时,将仓库的库存信息、出入库记录等数据反馈给其他系统,实现企业各部门之间的协同工作。
- 统计报表:提供详细的统计报表,包括入库报表、出库报表、转库报表、库存明细、订单报表、销售额统计等。报表以直观的表格和图表形式展示,方便管理人员进行数据分析和决策。系统还支持对报表进行自定义设置,如选择报表的时间范围、统计维度等,满足不同用户的需求。
Record.java
public class Record implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "货品id")
private Integer goods;
@ApiModelProperty(value = "取货人/补货人")
@TableField("userId")
private Integer userid;
@ApiModelProperty(value = "操作人id")
private Integer adminId;
@ApiModelProperty(value = "数量")
private Integer count;
@ApiModelProperty(value = "操作时间")
private LocalDateTime createtime;
@ApiModelProperty(value = "备注")
private String remark;
@TableField(exist = false)
private String action;
}
RecordRes.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RecordRes extends Record{
private String username;
private String adminname;
private String goodsname;
private String storagename;
private String goodstypename;
}
RecordController.java
package com.yunhe.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rabbiter.common.QueryPageParam;
import com.rabbiter.common.Result;
import com.rabbiter.entity.Goods;
import com.rabbiter.entity.Record;
import com.rabbiter.service.GoodsService;
import com.rabbiter.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.HashMap;
@RestController
@RequestMapping("/record")
public class RecordController {
@Autowired
private RecordService recordService;
@Autowired
private GoodsService goodsService;
@PostMapping("/listPage")
public Result listPage(@RequestBody QueryPageParam query){
HashMap param = query.getParam();
String name = (String)param.get("name");
String goodstype = (String)param.get("goodstype");
String storage = (String)param.get("storage");
String roleId = (String)param.get("roleId");
String userId = (String)param.get("userId");
Page page = new Page();
page.setCurrent(query.getPageNum());
page.setSize(query.getPageSize());
QueryWrapper<Record> queryWrapper = new QueryWrapper();
queryWrapper.apply("a.goods=b.id and b.storage=c.id and b.goodsType=d.id ");
if("2".equals(roleId)){
// queryWrapper.eq(Record::getUserid,userId);
queryWrapper.apply(" a.userId= "+userId);
}
if(StringUtils.isNotBlank(name) && !"null".equals(name)){
queryWrapper.like("b.name",name);
}
if(StringUtils.isNotBlank(goodstype) && !"null".equals(goodstype)){
queryWrapper.eq("d.id",goodstype);
}
if(StringUtils.isNotBlank(storage) && !"null".equals(storage)){
queryWrapper.eq("c.id",storage);
}
IPage result = recordService.pageCC(page,queryWrapper);
return Result.success(result.getRecords(),result.getTotal());
}
@PostMapping("/save")
public Result save(@RequestBody Record record){
Goods goods = goodsService.getById(record.getGoods());
int n = record.getCount();
// 出库
if("2".equals(record.getAction())){
n = -n;
record.setCount(n);
}
int num = goods.getCount()+n;
if(num < 0) {
return Result.fail();
}
goods.setCount(num);
goodsService.updateById(goods);
record.setCreatetime(LocalDateTime.now());
return recordService.save(record)?Result.success():Result.fail();
}
}
RecordMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rabbiter.mapper.RecordMapper">
<select id="pageCC" resultType="com.rabbiter.entity.RecordRes">
select a.*,b.name goodsname,c.name storagename,d.name goodstypename,
(select u.name from user u where u.id=a.userid)username,
(select u.name from user u where u.id=a.admin_id)adminname
from record a ,goods b,storage c,goodstype d
${ew.customSqlSegment}
</select>
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.rabbiter.entity.Record">
<id column="id" property="id" />
<result column="goods" property="goods" />
<result column="userId" property="userid" />
<result column="admin_id" property="adminId" />
<result column="count" property="count" />
<result column="createtime" property="createtime" />
<result column="remark" property="remark" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, goods, userId, admin_id, count, createtime, remark
</sql>
</mapper>
项目打包
pom.xml文件加如下配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version><!-- 自己的SpingBoot版本 -->
<configuration>
<!-- 自己的启动类地址 -->
<mainClass>com.yunhe.WarehouseSystemApp</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用mvn package或install都可以打包
target目录下执行
java -jar wmspro-1.0-SNAPSHOT.jar
尝试,部署该jar包到linux服务器,mysql安装到linux服务器,测试。
将来上线的操作。
展望
数据打通与集成
与工厂的EBS、MES等系统无缝对接,实现数据的实时共享和交互。仓库模块可以从其他系统获取相关数据,如生产计划、销售订单等,为仓库的管理提供准确的依据;同时,将仓库的库存信息、出入库记录等数据反馈给其他系统,使企业各部门之间的信息能够及时同步,提高企业的整体运营效率。例如,当生产部门下达生产计划时,仓库模块可以根据生产计划自动调整库存,确保原材料的及时供应;当销售部门接到订单时,仓库模块可以根据订单信息快速安排出库,提高订单的响应速度。
(三)可视化管理
提供仓库的三维建模和货位的可视化管理功能,操作人员可以通过系统直观地查看仓库的布局和货物的存储位置。在三维模型中,可以实时显示仓库的库存情况、货物的出入库动态等信息,方便操作人员快速定位和管理货物。同时,系统还可以提供货位的可视化导航功能,引导操作人员快速找到所需货物的位置,提高工作效率。
(四)统计分析功能强大
系统提供丰富的统计分析功能,能够对仓库的各类数据进行深入挖掘和分析。通过统计报表和图表,管理人员可以及时了解仓库的运营情况,如库存周转率、订单完成率、销售额等关键指标。同时,系统还可以对数据进行趋势分析和预测,为企业的决策提供科学依据。例如,通过对历史销售数据的分析,预测未来一段时间的销售趋势,以便企业提前做好库存准备;通过对库存周转率的分析,优化仓库的存储策略,提高库存的利用率。
(五)安全性高
采用Spring Security等安全框架进行用户认证和授权,保障系统的安全性。只有经过授权的用户才能访问系统的相关功能和数据,不同用户具有不同的操作权限,如管理员可以进行系统的配置和管理,仓库操作人员只能进行出入库操作等。同时,系统还具备完善的日志记录和审计功能,记录用户的操作行为和系统的运行状态,方便进行安全审计和问题排查。
- 点赞
- 收藏
- 关注作者
评论(0)