From 0aaffcfa7077065bc29f543b80662824d8733e7d Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 18 十二月 2025 16:15:13 +0800
Subject: [PATCH] #库存预留

---
 src/main/java/com/zy/asrs/mapper/InventoryReserveLogMapper.java            |   12 
 src/main/java/com/zy/asrs/controller/InventoryReserveController.java       |  135 +++++
 src/main/java/com/zy/asrs/task/InventoryReserveScheduler.java              |   36 +
 src/main/java/com/zy/asrs/entity/InventoryReserve.java                     |  162 ++++++
 src/main/java/com/zy/asrs/controller/InventoryReserveLogController.java    |  125 +++++
 src/main/java/com/zy/asrs/mapper/InventoryReserveMapper.java               |   12 
 src/main/resources/mapper/InventoryReserveLogMapper.xml                    |   22 
 src/main/java/com/zy/common/CodeBuilder.java                               |    4 
 src/main/java/com/zy/asrs/service/InventoryReserveService.java             |    8 
 src/main/webapp/views/inventoryReserve/inventoryReserve.html               |  143 +++++
 src/main/java/com/zy/asrs/service/InventoryReserveLogService.java          |    8 
 src/main/java/com/zy/asrs/task/handler/InventoryReserveExpireHandler.java  |   78 +++
 src/main/java/com/zy/asrs/service/impl/InventoryReserveServiceImpl.java    |   12 
 src/main/webapp/static/js/inventoryReserveLog/inventoryReserveLog.js       |   87 +++
 src/main/webapp/views/inventoryReserveLog/inventoryReserveLog.html         |   71 ++
 src/main/java/inventoryReserve.sql                                         |   18 
 src/main/webapp/static/js/inventoryReserve/inventoryReserve.js             |  257 ++++++++++
 src/main/resources/mapper/InventoryReserveMapper.xml                       |   22 
 src/main/java/com/zy/asrs/service/impl/InventoryReserveLogServiceImpl.java |   12 
 src/main/java/com/zy/asrs/entity/InventoryReserveLog.java                  |  162 ++++++
 src/main/java/inventoryReserveLog.sql                                      |   18 
 21 files changed, 1,403 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/InventoryReserveController.java b/src/main/java/com/zy/asrs/controller/InventoryReserveController.java
new file mode 100644
index 0000000..eebe4f9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/InventoryReserveController.java
@@ -0,0 +1,135 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.asrs.entity.InventoryReserve;
+import com.zy.asrs.service.InventoryReserveService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class InventoryReserveController extends BaseController {
+
+    @Autowired
+    private InventoryReserveService inventoryReserveService;
+
+    @RequestMapping(value = "/inventoryReserve/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(inventoryReserveService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/inventoryReserve/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<InventoryReserve> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(InventoryReserve.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(inventoryReserveService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/inventoryReserve/add/auth")
+    @ManagerAuth
+    public R add(InventoryReserve inventoryReserve) {
+
+        Date date = new Date();
+        inventoryReserve.setId(null);
+        inventoryReserve.setCreateTime(date);
+        inventoryReserve.setCreateBy(getUserId());
+        inventoryReserve.setUpdateTime(date);
+        inventoryReserve.setUpdateBy(getUserId());
+        inventoryReserveService.insert(inventoryReserve);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/inventoryReserve/update/auth")
+	@ManagerAuth
+    public R update(InventoryReserve inventoryReserve){
+        if (Cools.isEmpty(inventoryReserve) || null==inventoryReserve.getId()){
+            return R.error();
+        }
+        Date date = new Date();
+        inventoryReserve.setUpdateTime(date);
+        inventoryReserve.setUpdateBy(getUserId());
+        inventoryReserveService.updateById(inventoryReserve);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/inventoryReserve/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            inventoryReserveService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/inventoryReserve/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<InventoryReserve> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("inventoryReserve"));
+        convert(map, wrapper);
+        List<InventoryReserve> list = inventoryReserveService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/inventoryReserveQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<InventoryReserve> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<InventoryReserve> page = inventoryReserveService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (InventoryReserve inventoryReserve : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", inventoryReserve.getId());
+            map.put("value", inventoryReserve.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/inventoryReserve/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<InventoryReserve> wrapper = new EntityWrapper<InventoryReserve>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != inventoryReserveService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(InventoryReserve.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/InventoryReserveLogController.java b/src/main/java/com/zy/asrs/controller/InventoryReserveLogController.java
new file mode 100644
index 0000000..b68c6d8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/InventoryReserveLogController.java
@@ -0,0 +1,125 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.asrs.entity.InventoryReserveLog;
+import com.zy.asrs.service.InventoryReserveLogService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class InventoryReserveLogController extends BaseController {
+
+    @Autowired
+    private InventoryReserveLogService inventoryReserveLogService;
+
+    @RequestMapping(value = "/inventoryReserveLog/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(inventoryReserveLogService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/inventoryReserveLog/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<InventoryReserveLog> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(InventoryReserveLog.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(inventoryReserveLogService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/inventoryReserveLog/add/auth")
+    @ManagerAuth
+    public R add(InventoryReserveLog inventoryReserveLog) {
+        inventoryReserveLogService.insert(inventoryReserveLog);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/inventoryReserveLog/update/auth")
+	@ManagerAuth
+    public R update(InventoryReserveLog inventoryReserveLog){
+        if (Cools.isEmpty(inventoryReserveLog) || null==inventoryReserveLog.getId()){
+            return R.error();
+        }
+        inventoryReserveLogService.updateById(inventoryReserveLog);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/inventoryReserveLog/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            inventoryReserveLogService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/inventoryReserveLog/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<InventoryReserveLog> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("inventoryReserveLog"));
+        convert(map, wrapper);
+        List<InventoryReserveLog> list = inventoryReserveLogService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/inventoryReserveLogQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<InventoryReserveLog> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<InventoryReserveLog> page = inventoryReserveLogService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (InventoryReserveLog inventoryReserveLog : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", inventoryReserveLog.getId());
+            map.put("value", inventoryReserveLog.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/inventoryReserveLog/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<InventoryReserveLog> wrapper = new EntityWrapper<InventoryReserveLog>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != inventoryReserveLogService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(InventoryReserveLog.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/InventoryReserve.java b/src/main/java/com/zy/asrs/entity/InventoryReserve.java
new file mode 100644
index 0000000..1fe0007
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/InventoryReserve.java
@@ -0,0 +1,162 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("man_inventory_reserve")
+public class InventoryReserve implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    @ApiModelProperty(value= "鐗╂枡缂栫爜")
+    private String matnr;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     */
+    @ApiModelProperty(value= "鐗╂枡鍚嶇О")
+    private String maktx;
+
+    /**
+     * 璁㈠崟鍙�
+     */
+    @ApiModelProperty(value= "璁㈠崟鍙�")
+    @TableField("order_no")
+    private String orderNo;
+
+    /**
+     * 鎵规
+     */
+    @ApiModelProperty(value= "鎵规")
+    private String batch;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private BigDecimal quantity;
+
+    /**
+     * 杩囨湡鏃堕棿
+     */
+    @ApiModelProperty(value= "杩囨湡鏃堕棿")
+    @TableField("expice_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date expiceTime;
+
+    /**
+     * 閮ㄩ棬ID
+     */
+    @ApiModelProperty(value= "閮ㄩ棬ID")
+    @TableField("dept_id")
+    private Long deptId;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 鍒涘缓浜哄憳
+     */
+    @ApiModelProperty(value= "鍒涘缓浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value= "鏇存柊鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 鏇存柊浜哄憳
+     */
+    @ApiModelProperty(value= "鏇存柊浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    public InventoryReserve() {}
+
+    public InventoryReserve(String matnr,String maktx,String orderNo,String batch,BigDecimal quantity,Date expiceTime,Long deptId,Date createTime,Long createBy,Date updateTime,Long updateBy) {
+        this.matnr = matnr;
+        this.maktx = maktx;
+        this.orderNo = orderNo;
+        this.batch = batch;
+        this.quantity = quantity;
+        this.expiceTime = expiceTime;
+        this.deptId = deptId;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+    }
+
+//    InventoryReserve inventoryReserve = new InventoryReserve(
+//            null,    // 鐗╂枡缂栫爜
+//            null,    // 鐗╂枡鍚嶇О
+//            null,    // 璁㈠崟鍙�
+//            null,    // 鎵规
+//            null,    // 鏁伴噺
+//            null,    // 杩囨湡鏃堕棿
+//            null,    // 閮ㄩ棬ID
+//            null,    // 鍒涘缓鏃堕棿
+//            null,    // 鍒涘缓浜哄憳
+//            null,    // 鏇存柊鏃堕棿
+//            null    // 鏇存柊浜哄憳
+//    );
+
+    public String getExpiceTime$(){
+        if (Cools.isEmpty(this.expiceTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.expiceTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/InventoryReserveLog.java b/src/main/java/com/zy/asrs/entity/InventoryReserveLog.java
new file mode 100644
index 0000000..9957dc1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/InventoryReserveLog.java
@@ -0,0 +1,162 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("man_inventory_reserve_log")
+public class InventoryReserveLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    @ApiModelProperty(value= "鐗╂枡缂栫爜")
+    private String matnr;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     */
+    @ApiModelProperty(value= "鐗╂枡鍚嶇О")
+    private String maktx;
+
+    /**
+     * 璁㈠崟鍙�
+     */
+    @ApiModelProperty(value= "璁㈠崟鍙�")
+    @TableField("order_no")
+    private String orderNo;
+
+    /**
+     * 鎵规
+     */
+    @ApiModelProperty(value= "鎵规")
+    private String batch;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private BigDecimal quantity;
+
+    /**
+     * 杩囨湡鏃堕棿
+     */
+    @ApiModelProperty(value= "杩囨湡鏃堕棿")
+    @TableField("expice_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date expiceTime;
+
+    /**
+     * 閮ㄩ棬ID
+     */
+    @ApiModelProperty(value= "閮ㄩ棬ID")
+    @TableField("dept_id")
+    private Long deptId;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 鍒涘缓浜哄憳
+     */
+    @ApiModelProperty(value= "鍒涘缓浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value= "鏇存柊鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 鏇存柊浜哄憳
+     */
+    @ApiModelProperty(value= "鏇存柊浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    public InventoryReserveLog() {}
+
+    public InventoryReserveLog(String matnr,String maktx,String orderNo,String batch,BigDecimal quantity,Date expiceTime,Long deptId,Date createTime,Long createBy,Date updateTime,Long updateBy) {
+        this.matnr = matnr;
+        this.maktx = maktx;
+        this.orderNo = orderNo;
+        this.batch = batch;
+        this.quantity = quantity;
+        this.expiceTime = expiceTime;
+        this.deptId = deptId;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+    }
+
+//    InventoryReserveLog inventoryReserveLog = new InventoryReserveLog(
+//            null,    // 鐗╂枡缂栫爜
+//            null,    // 鐗╂枡鍚嶇О
+//            null,    // 璁㈠崟鍙�
+//            null,    // 鎵规
+//            null,    // 鏁伴噺
+//            null,    // 杩囨湡鏃堕棿
+//            null,    // 閮ㄩ棬ID
+//            null,    // 鍒涘缓鏃堕棿
+//            null,    // 鍒涘缓浜哄憳
+//            null,    // 鏇存柊鏃堕棿
+//            null    // 鏇存柊浜哄憳
+//    );
+
+    public String getExpiceTime$(){
+        if (Cools.isEmpty(this.expiceTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.expiceTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/InventoryReserveLogMapper.java b/src/main/java/com/zy/asrs/mapper/InventoryReserveLogMapper.java
new file mode 100644
index 0000000..c910d8f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/InventoryReserveLogMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.InventoryReserveLog;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface InventoryReserveLogMapper extends BaseMapper<InventoryReserveLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/InventoryReserveMapper.java b/src/main/java/com/zy/asrs/mapper/InventoryReserveMapper.java
new file mode 100644
index 0000000..22a80ca
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/InventoryReserveMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.InventoryReserve;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface InventoryReserveMapper extends BaseMapper<InventoryReserve> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/InventoryReserveLogService.java b/src/main/java/com/zy/asrs/service/InventoryReserveLogService.java
new file mode 100644
index 0000000..36e6199
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/InventoryReserveLogService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.InventoryReserveLog;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface InventoryReserveLogService extends IService<InventoryReserveLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/InventoryReserveService.java b/src/main/java/com/zy/asrs/service/InventoryReserveService.java
new file mode 100644
index 0000000..3141389
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/InventoryReserveService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.InventoryReserve;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface InventoryReserveService extends IService<InventoryReserve> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/InventoryReserveLogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/InventoryReserveLogServiceImpl.java
new file mode 100644
index 0000000..e057aa8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/InventoryReserveLogServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.InventoryReserveLogMapper;
+import com.zy.asrs.entity.InventoryReserveLog;
+import com.zy.asrs.service.InventoryReserveLogService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("inventoryReserveLogService")
+public class InventoryReserveLogServiceImpl extends ServiceImpl<InventoryReserveLogMapper, InventoryReserveLog> implements InventoryReserveLogService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/InventoryReserveServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/InventoryReserveServiceImpl.java
new file mode 100644
index 0000000..8ff9587
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/InventoryReserveServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.InventoryReserveMapper;
+import com.zy.asrs.entity.InventoryReserve;
+import com.zy.asrs.service.InventoryReserveService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("inventoryReserveService")
+public class InventoryReserveServiceImpl extends ServiceImpl<InventoryReserveMapper, InventoryReserve> implements InventoryReserveService {
+
+}
diff --git a/src/main/java/com/zy/asrs/task/InventoryReserveScheduler.java b/src/main/java/com/zy/asrs/task/InventoryReserveScheduler.java
new file mode 100644
index 0000000..450a78d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/InventoryReserveScheduler.java
@@ -0,0 +1,36 @@
+package com.zy.asrs.task;
+
+import com.zy.asrs.task.core.ReturnT;
+import com.zy.asrs.task.handler.InventoryReserveExpireHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 棰勭暀搴撳瓨杩囨湡瀹氭椂浠诲姟璋冨害鍣�
+ * 瀹氭湡妫�鏌ュ苟澶勭悊杩囨湡鐨勯鐣欏簱瀛�
+ */
+@Slf4j
+@Component
+public class InventoryReserveScheduler {
+
+    @Autowired
+    private InventoryReserveExpireHandler inventoryReserveExpireHandler;
+
+    /**
+     * 姣忓垎閽熸墽琛屼竴娆★紝妫�鏌ヨ繃鏈熺殑棰勭暀搴撳瓨
+     */
+    @Scheduled(cron = "0 * * * * ?")
+    public void checkExpiredReserve() {
+        try {
+            ReturnT<String> result = inventoryReserveExpireHandler.start();
+            if (!result.isSuccess()) {
+                log.error("棰勭暀搴撳瓨杩囨湡澶勭悊澶辫触: {}", result.getMsg());
+            }
+        } catch (Exception e) {
+            log.error("棰勭暀搴撳瓨杩囨湡瀹氭椂浠诲姟寮傚父", e);
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/task/handler/InventoryReserveExpireHandler.java b/src/main/java/com/zy/asrs/task/handler/InventoryReserveExpireHandler.java
new file mode 100644
index 0000000..5e462a1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/handler/InventoryReserveExpireHandler.java
@@ -0,0 +1,78 @@
+package com.zy.asrs.task.handler;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.zy.asrs.entity.InventoryReserve;
+import com.zy.asrs.entity.InventoryReserveLog;
+import com.zy.asrs.service.InventoryReserveLogService;
+import com.zy.asrs.service.InventoryReserveService;
+import com.zy.asrs.task.AbstractHandler;
+import com.zy.asrs.task.core.ReturnT;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 棰勭暀搴撳瓨杩囨湡澶勭悊鍣�
+ * 灏嗚繃鏈熺殑棰勭暀搴撳瓨杞Щ鍒版棩蹇楄〃
+ */
+@Slf4j
+@Service
+public class InventoryReserveExpireHandler extends AbstractHandler<String> {
+
+    @Autowired
+    private InventoryReserveService inventoryReserveService;
+
+    @Autowired
+    private InventoryReserveLogService inventoryReserveLogService;
+
+    @Transactional(rollbackFor = Exception.class)
+    public ReturnT<String> start() {
+        // 鏌ヨ杩囨湡鐨勯鐣欏簱瀛橈紙杩囨湡鏃堕棿涓嶄负绌轰笖灏忎簬褰撳墠鏃堕棿锛�
+        Date now = new Date();
+        List<InventoryReserve> expiredList = inventoryReserveService.selectList(
+                new EntityWrapper<InventoryReserve>()
+                        .isNotNull("expice_time")
+                        .lt("expice_time", now));
+
+        if (expiredList.isEmpty()) {
+            return SUCCESS;
+        }
+
+        log.info("鍙戠幇 {} 鏉¤繃鏈熺殑棰勭暀搴撳瓨璁板綍", expiredList.size());
+
+        for (InventoryReserve reserve : expiredList) {
+            try {
+                // 杞Щ鍒版棩蹇楄〃
+                InventoryReserveLog logRecord = new InventoryReserveLog();
+                logRecord.setMatnr(reserve.getMatnr());
+                logRecord.setMaktx(reserve.getMaktx());
+                logRecord.setOrderNo(reserve.getOrderNo());
+                logRecord.setBatch(reserve.getBatch());
+                logRecord.setQuantity(reserve.getQuantity());
+                logRecord.setExpiceTime(reserve.getExpiceTime());
+                logRecord.setDeptId(reserve.getDeptId());
+                logRecord.setCreateTime(reserve.getCreateTime());
+                logRecord.setCreateBy(reserve.getCreateBy());
+                logRecord.setUpdateTime(new Date());
+
+                inventoryReserveLogService.insert(logRecord);
+
+                // 鍒犻櫎鍘熻褰�
+                inventoryReserveService.deleteById(reserve.getId());
+
+                log.info("棰勭暀搴撳瓨杩囨湡澶勭悊瀹屾垚: id={}, matnr={}, batch={}",
+                        reserve.getId(), reserve.getMatnr(), reserve.getBatch());
+
+            } catch (Exception e) {
+                log.error("棰勭暀搴撳瓨杩囨湡澶勭悊澶辫触: id={}, error={}", reserve.getId(), e.getMessage());
+            }
+        }
+
+        return SUCCESS;
+    }
+
+}
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index bb4bc3f..93c55e3 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -20,8 +20,10 @@
         generator.url = "192.168.4.15:1433;databasename=yhfzasrs";
         generator.username = "sa";
         generator.password = "sa@123";
-        generator.table = "asr_department";
+        generator.table = "man_inventory_reserve_log";
         generator.packagePath = "com.zy.asrs";
+        generator.html = false;
+        generator.js = false;
         generator.build();
     }
 
diff --git a/src/main/java/inventoryReserve.sql b/src/main/java/inventoryReserve.sql
new file mode 100644
index 0000000..a70d5b5
--- /dev/null
+++ b/src/main/java/inventoryReserve.sql
@@ -0,0 +1,18 @@
+-- save inventoryReserve record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserve/inventoryReserve.html', 'inventoryReserve绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserve#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserve#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserve#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserve#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserve#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserve/inventoryReserve.html', N'inventoryReserve绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserve#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserve#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserve#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserve#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserve#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/src/main/java/inventoryReserveLog.sql b/src/main/java/inventoryReserveLog.sql
new file mode 100644
index 0000000..2396379
--- /dev/null
+++ b/src/main/java/inventoryReserveLog.sql
@@ -0,0 +1,18 @@
+-- save inventoryReserveLog record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserveLog/inventoryReserveLog.html', 'inventoryReserveLog绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserveLog#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserveLog#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserveLog#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserveLog#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'inventoryReserveLog#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserveLog/inventoryReserveLog.html', N'inventoryReserveLog绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserveLog#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserveLog#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserveLog#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserveLog#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'inventoryReserveLog#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/src/main/resources/mapper/InventoryReserveLogMapper.xml b/src/main/resources/mapper/InventoryReserveLogMapper.xml
new file mode 100644
index 0000000..9e01e89
--- /dev/null
+++ b/src/main/resources/mapper/InventoryReserveLogMapper.xml
@@ -0,0 +1,22 @@
+<?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.zy.asrs.mapper.InventoryReserveLogMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.InventoryReserveLog">
+        <id column="id" property="id" />
+        <result column="matnr" property="matnr" />
+        <result column="maktx" property="maktx" />
+        <result column="order_no" property="orderNo" />
+        <result column="batch" property="batch" />
+        <result column="quantity" property="quantity" />
+        <result column="expice_time" property="expiceTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/InventoryReserveMapper.xml b/src/main/resources/mapper/InventoryReserveMapper.xml
new file mode 100644
index 0000000..0e375d2
--- /dev/null
+++ b/src/main/resources/mapper/InventoryReserveMapper.xml
@@ -0,0 +1,22 @@
+<?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.zy.asrs.mapper.InventoryReserveMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.InventoryReserve">
+        <id column="id" property="id" />
+        <result column="matnr" property="matnr" />
+        <result column="maktx" property="maktx" />
+        <result column="order_no" property="orderNo" />
+        <result column="batch" property="batch" />
+        <result column="quantity" property="quantity" />
+        <result column="expice_time" property="expiceTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/js/inventoryReserve/inventoryReserve.js b/src/main/webapp/static/js/inventoryReserve/inventoryReserve.js
new file mode 100644
index 0000000..9ddcf97
--- /dev/null
+++ b/src/main/webapp/static/js/inventoryReserve/inventoryReserve.js
@@ -0,0 +1,257 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table', 'laydate', 'form', 'admin', 'xmSelect'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+    var xmSelect = layui.xmSelect;
+
+    // 鏁版嵁娓叉煋
+    var tableIns = table.render({
+        elem: '#inventoryReserve',
+        headers: { token: localStorage.getItem('token') },
+        url: baseUrl + '/inventoryReserve/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-150',
+        cols: [[
+            { type: 'checkbox' },
+            { type: 'numbers', title: '#' },
+            { field: 'matnr', align: 'center', title: '鐗╂枡缂栫爜',  },
+            { field: 'maktx', align: 'center', title: '鐗╂枡鍚嶇О',  },
+            { field: 'orderNo', align: 'center', title: '璁㈠崟鍙�', width: 150 },
+            { field: 'batch', align: 'center', title: '鎵规', width: 120 },
+            { field: 'quantity', align: 'center', title: '鏁伴噺', width: 100 },
+            { field: 'expiceTime$', align: 'center', title: '杩囨湡鏃堕棿', width: 180 },
+            { field: 'createTime$', align: 'center', title: '鍒涘缓鏃堕棿', width: 180 },
+            { fixed: 'right', title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 150 }
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl + "/";
+            }
+            pageCurr = curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(inventoryReserve)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch (obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+                if (checkStatus.length === 0) {
+                    layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', { icon: 2 });
+                    return;
+                }
+                del(checkStatus.map(function (d) {
+                    return d.id;
+                }));
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(inventoryReserve)', function (obj) {
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case 'del':
+                del([data.id]);
+                break;
+        }
+    });
+
+    // 娣诲姞鎸夐挳鐐瑰嚮
+    $('#addBtn').click(function () {
+        showEditModel();
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '500px',
+            title: (mData ? '淇敼' : '娣诲姞') + '棰勭暀搴撳瓨',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                // 鍥炴樉琛ㄥ崟鏁版嵁
+                form.val('detail', mData);
+
+                // 娓叉煋鏃ユ湡閫夋嫨鍣�
+                layDate.render({
+                    elem: '#expiceTime',
+                    type: 'datetime',
+                    format: 'yyyy-MM-dd HH:mm:ss'
+                });
+
+                // 鐗╂枡閫夋嫨鍣�
+                var matXmSelect = xmSelect.render({
+                    el: '#matSelect',
+                    style: { width: '100%' },
+                    radio: true,
+                    clickClose: true,
+                    filterable: true,
+                    remoteSearch: true,
+                    remoteMethod: function (val, cb, show) {
+                        $.ajax({
+                            url: baseUrl + "/mat/all/get/kv",
+                            headers: { 'token': localStorage.getItem('token') },
+                            data: { condition: val },
+                            method: 'POST',
+                            success: function (res) {
+                                if (res.code === 200) {
+                                    cb(res.data);
+                                } else {
+                                    cb([]);
+                                    layer.msg(res.msg, { icon: 2 });
+                                }
+                            }
+                        });
+                    },
+                    on: function (data) {
+                        if (data.arr.length > 0) {
+                            var selected = data.arr[0];
+                            $('input[name="matnr"]').val(selected.value);
+                            $('input[name="maktx"]').val(selected.name);
+                        } else {
+                            $('input[name="matnr"]').val('');
+                            $('input[name="maktx"]').val('');
+                        }
+                    }
+                });
+
+                // 缂栬緫鏃跺洖鏄剧墿鏂�
+                if (mData && mData.matnr) {
+                    matXmSelect.setValue([{
+                        name: mData.maktx || mData.matnr,
+                        value: mData.matnr
+                    }]);
+                }
+
+                // 琛ㄥ崟鎻愪氦浜嬩欢
+                form.on('submit(editSubmit)', function (data) {
+                    // 楠岃瘉鐗╂枡
+                    if (!data.field.matnr) {
+                        layer.msg('璇烽�夋嫨鐗╂枡', { icon: 2 });
+                        return false;
+                    }
+
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl + "/inventoryReserve/" + (mData ? 'update' : 'add') + "/auth",
+                        headers: { 'token': localStorage.getItem('token') },
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200) {
+                                layer.close(dIndex);
+                                layer.msg(res.msg, { icon: 1 });
+                                tableReload();
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl + "/";
+                            } else {
+                                layer.msg(res.msg, { icon: 2 });
+                            }
+                        }
+                    });
+                    return false;
+                });
+
+                // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl + "/inventoryReserve/delete/auth",
+                headers: { 'token': localStorage.getItem('token') },
+                data: { 'ids[]': ids },
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200) {
+                        layer.msg(res.msg, { icon: 1 });
+                        tableReload();
+                    } else if (res.code === 403) {
+                        top.location.href = baseUrl + "/";
+                    } else {
+                        layer.msg(res.msg, { icon: 2 });
+                    }
+                }
+            });
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload();
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload();
+    });
+
+    // 琛ㄦ牸閲嶈浇
+    function tableReload() {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function () {
+            searchData[this.name] = this.value;
+        });
+        tableIns.reload({
+            where: searchData,
+            page: { curr: pageCurr }
+        });
+    }
+
+    // 娓呯┖琛ㄥ崟
+    function clearFormVal(el) {
+        $(':input', el)
+            .val('')
+            .removeAttr('checked')
+            .removeAttr('selected');
+    }
+
+});
diff --git a/src/main/webapp/static/js/inventoryReserveLog/inventoryReserveLog.js b/src/main/webapp/static/js/inventoryReserveLog/inventoryReserveLog.js
new file mode 100644
index 0000000..041b05c
--- /dev/null
+++ b/src/main/webapp/static/js/inventoryReserveLog/inventoryReserveLog.js
@@ -0,0 +1,87 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table', 'laydate', 'form'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var form = layui.form;
+
+    // 鏁版嵁娓叉煋锛堝彧璇绘ā寮忥紝鏃犲鍒犳敼鎿嶄綔锛�
+    var tableIns = table.render({
+        elem: '#inventoryReserveLog',
+        headers: { token: localStorage.getItem('token') },
+        url: baseUrl + '/inventoryReserveLog/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200],
+        cellMinWidth: 50,
+        height: 'full-150',
+        cols: [[
+            { type: 'numbers', title: '#' },
+            { field: 'matnr', align: 'center', title: '鐗╂枡缂栫爜' },
+            { field: 'maktx', align: 'center', title: '鐗╂枡鍚嶇О' },
+            { field: 'orderNo', align: 'center', title: '璁㈠崟鍙�', width: 150 },
+            { field: 'batch', align: 'center', title: '鎵规', width: 120 },
+            { field: 'quantity', align: 'center', title: '鏁伴噺', width: 100 },
+            { field: 'expiceTime$', align: 'center', title: '杩囨湡鏃堕棿', width: 180 },
+            { field: 'createTime$', align: 'center', title: '鍘熷垱寤烘椂闂�', width: 180 },
+            { field: 'updateTime$', align: 'center', title: '杞Щ鏃堕棿', width: 180 }
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl + "/";
+            }
+            pageCurr = curr;
+        }
+    });
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload();
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload();
+    });
+
+    // 琛ㄦ牸閲嶈浇
+    function tableReload() {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function () {
+            searchData[this.name] = this.value;
+        });
+        tableIns.reload({
+            where: searchData,
+            page: { curr: pageCurr }
+        });
+    }
+
+    // 娓呯┖琛ㄥ崟
+    function clearFormVal(el) {
+        $(':input', el)
+            .val('')
+            .removeAttr('checked')
+            .removeAttr('selected');
+    }
+
+});
diff --git a/src/main/webapp/views/inventoryReserve/inventoryReserve.html b/src/main/webapp/views/inventoryReserve/inventoryReserve.html
new file mode 100644
index 0000000..5a6bd1e
--- /dev/null
+++ b/src/main/webapp/views/inventoryReserve/inventoryReserve.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <title>棰勭暀搴撳瓨绠$悊</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <style>
+        .btn-add {
+            display: none;
+        }
+
+        .btn-edit {
+            display: none;
+        }
+
+        .btn-delete {
+            display: none;
+        }
+    </style>
+</head>
+
+<body>
+
+    <!-- 姝f枃寮�濮� -->
+    <div class="layui-fluid">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <!-- 琛ㄦ牸椤堕儴宸ュ叿鏍� -->
+                <div id="search-box" class="layui-form toolbar">
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px;">鐗╂枡缂栫爜:</label>
+                            <div class="layui-input-inline">
+                                <input name="matnr" class="layui-input" type="text" placeholder="杈撳叆鐗╂枡缂栫爜" />
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px;">璁㈠崟鍙�:</label>
+                            <div class="layui-input-inline">
+                                <input name="order_no" class="layui-input" type="text" placeholder="杈撳叆璁㈠崟鍙�" />
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px;">鎵规:</label>
+                            <div class="layui-input-inline">
+                                <input name="batch" class="layui-input" type="text" placeholder="杈撳叆鎵规" />
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                                <i class="layui-icon">&#xe615;</i>鎼滅储
+                            </button>
+                            <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                                <i class="layui-icon">&#xe666;</i>閲嶇疆
+                            </button>
+<!--                            <button id="addBtn" class="layui-btn icon-btn btn-add"><i-->
+<!--                                    class="layui-icon">&#xe654;</i>娣诲姞</button>-->
+                        </div>
+                    </div>
+                </div>
+                <table id="inventoryReserve" lay-filter="inventoryReserve"></table>
+            </div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-body">
+                棰勭暀搴撳瓨绠$悊锛氱敤浜庨鐣欏叆搴撶墿鏂欑殑搴撳瓨鏁伴噺锛岀‘淇濆叧閿鍗曠殑鐗╂枡渚涘簲銆�
+            </div>
+        </div>
+    </div>
+
+    <!-- 琛ㄦ牸鎿嶄綔鍒� -->
+    <script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-normal btn-add" lay-event="addData"><i class="layui-icon">&#xe654;</i>娣诲姞</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger btn-delete" lay-event="deleteData"><i class="layui-icon">&#xe640;</i>鍒犻櫎</button>
+    </div>
+</script>
+
+    <!-- 琛ㄦ牸鎿嶄綔鍒� -->
+    <script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">鍒犻櫎</a>
+</script>
+
+    <!-- 琛ㄥ崟寮圭獥 -->
+    <script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form" style="padding: 25px 30px 0 0;">
+        <input name="id" type="hidden">
+        <div class="layui-form-item">
+            <label class="layui-form-label layui-form-required">鐗╂枡</label>
+            <div class="layui-input-block">
+                <div id="matSelect"></div>
+                <input name="matnr" type="hidden">
+                <input name="maktx" type="hidden">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">璁㈠崟鍙�</label>
+            <div class="layui-input-block">
+                <input name="orderNo" placeholder="杈撳叆璁㈠崟鍙凤紙鍙�夛級" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label layui-form-required">鎵规</label>
+            <div class="layui-input-block">
+                <input name="batch" placeholder="杈撳叆鎵规" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label layui-form-required">鏁伴噺</label>
+            <div class="layui-input-block">
+                <input name="quantity" placeholder="杈撳叆鏁伴噺" class="layui-input" lay-vertype="tips" lay-verify="required|number" required="">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">杩囨湡鏃堕棿</label>
+            <div class="layui-input-block">
+                <input id="expiceTime" name="expiceTime" placeholder="閫夋嫨杩囨湡鏃堕棿锛堝彲閫夛級" class="layui-input" autocomplete="off">
+            </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+
+    <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+    <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+    <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+    <script type="text/javascript" src="../../static/js/inventoryReserve/inventoryReserve.js" charset="utf-8"></script>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/inventoryReserveLog/inventoryReserveLog.html b/src/main/webapp/views/inventoryReserveLog/inventoryReserveLog.html
new file mode 100644
index 0000000..a57822f
--- /dev/null
+++ b/src/main/webapp/views/inventoryReserveLog/inventoryReserveLog.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <title>棰勭暀搴撳瓨鏃ュ織</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+</head>
+
+<body>
+
+    <!-- 姝f枃寮�濮� -->
+    <div class="layui-fluid">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <!-- 琛ㄦ牸椤堕儴宸ュ叿鏍� -->
+                <div id="search-box" class="layui-form toolbar">
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px;">鐗╂枡缂栫爜:</label>
+                            <div class="layui-input-inline">
+                                <input name="matnr" class="layui-input" type="text" placeholder="杈撳叆鐗╂枡缂栫爜" />
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px;">璁㈠崟鍙�:</label>
+                            <div class="layui-input-inline">
+                                <input name="order_no" class="layui-input" type="text" placeholder="杈撳叆璁㈠崟鍙�" />
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px;">鎵规:</label>
+                            <div class="layui-input-inline">
+                                <input name="batch" class="layui-input" type="text" placeholder="杈撳叆鎵规" />
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                                <i class="layui-icon">&#xe615;</i>鎼滅储
+                            </button>
+                            <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                                <i class="layui-icon">&#xe666;</i>閲嶇疆
+                            </button>
+                        </div>
+                    </div>
+                </div>
+                <table id="inventoryReserveLog" lay-filter="inventoryReserveLog"></table>
+            </div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-body">
+                棰勭暀搴撳瓨鏃ュ織锛氳褰曞凡杩囨湡鐨勯鐣欏簱瀛樺巻鍙叉暟鎹��
+            </div>
+        </div>
+    </div>
+
+    <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+    <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+    <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+    <script type="text/javascript" src="../../static/js/inventoryReserveLog/inventoryReserveLog.js"
+        charset="utf-8"></script>
+
+</body>
+
+</html>
\ No newline at end of file

--
Gitblit v1.9.1