自动化立体仓库 - WMS系统
#
LSH
2023-10-25 b69791c7b86d65728a074bd79932bfa9a017f081
#
16个文件已修改
11个文件已添加
1057 ■■■■■ 已修改文件
src/main/java/autoMove.sql 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AutoMoveController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/AutoMove.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Order.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AutoMoveMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AutoMoveService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AutoMoveServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoLocMoveHandler.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/properties/SlaveWmsParameterProperties.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/AutoMoveMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/autoMove/autoMove.js 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/autoMove/autoMove.html 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/autoMove.sql
New file
@@ -0,0 +1,18 @@
-- save autoMove record
-- mysql
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'autoMove/autoMove.html', 'autoMove管理', null , '2', null , '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'autoMove#view', '查询', '', '3', '0', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'autoMove#btn-add', '新增', '', '3', '1', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'autoMove#btn-edit', '编辑', '', '3', '2', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'autoMove#btn-delete', '删除', '', '3', '3', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'autoMove#btn-export', '导出', '', '3', '4', '1');
-- sqlserver
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'autoMove/autoMove.html', N'autoMove管理', null, '2', null, '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'autoMove#view', N'查询', '', '3', '0', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'autoMove#btn-add', N'新增', '', '3', '1', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'autoMove#btn-edit', N'编辑', '', '3', '2', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'autoMove#btn-delete', N'删除', '', '3', '3', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'autoMove#btn-export', N'导出', '', '3', '4', '1');
src/main/java/com/zy/asrs/controller/AutoMoveController.java
New file
@@ -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.AutoMove;
import com.zy.asrs.service.AutoMoveService;
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 AutoMoveController extends BaseController {
    @Autowired
    private AutoMoveService autoMoveService;
    @RequestMapping(value = "/autoMove/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(autoMoveService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/autoMove/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<AutoMove> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        allLike(AutoMove.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(autoMoveService.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 = "/autoMove/add/auth")
    @ManagerAuth
    public R add(AutoMove autoMove) {
        autoMoveService.insert(autoMove);
        return R.ok();
    }
    @RequestMapping(value = "/autoMove/update/auth")
    @ManagerAuth
    public R update(AutoMove autoMove){
        if (Cools.isEmpty(autoMove) || null==autoMove.getId()){
            return R.error();
        }
        autoMoveService.updateById(autoMove);
        return R.ok();
    }
    @RequestMapping(value = "/autoMove/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            autoMoveService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/autoMove/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<AutoMove> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("autoMove"));
        convert(map, wrapper);
        List<AutoMove> list = autoMoveService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/autoMoveQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<AutoMove> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<AutoMove> page = autoMoveService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (AutoMove autoMove : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", autoMove.getId());
            map.put("value", autoMove.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/autoMove/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<AutoMove> wrapper = new EntityWrapper<AutoMove>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != autoMoveService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(AutoMove.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/AutoMove.java
New file
@@ -0,0 +1,116 @@
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.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
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_auto_move")
public class AutoMove implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 编号
     */
    @ApiModelProperty(value= "编号")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    private Short status;
    @ApiModelProperty(value= "")
    @TableField("line_number")
    private Integer lineNumber;
    @ApiModelProperty(value= "")
    @TableField("loc_no")
    private String locNo;
    @ApiModelProperty(value= "")
    @TableField("row_priority")
    private Integer rowPriority;
    @ApiModelProperty(value= "")
    @TableField("order_no")
    private String orderNo;
    @ApiModelProperty(value= "")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value= "")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty(value= "")
    private Integer uuid;
    public AutoMove() {}
    public AutoMove(Short status,Integer lineNumber,String locNo,Integer rowPriority,String orderNo,Date createTime,Date updateTime,Integer uuid) {
        this.status = status;
        this.lineNumber = lineNumber;
        this.locNo = locNo;
        this.rowPriority = rowPriority;
        this.orderNo = orderNo;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.uuid = uuid;
    }
//    AutoMove autoMove = new AutoMove(
//            null,    // 状态
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null    //
//    );
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            case 0:
                return "禁用";
            default:
                return String.valueOf(this.status);
        }
    }
    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);
    }
}
src/main/java/com/zy/asrs/entity/Order.java
@@ -261,6 +261,13 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 状态 1: 进行中  0: 初始  2:已完成
     */
    @ApiModelProperty(value= "状态  2:已完成 1: 进行中 0: 初始  ")
    @TableField("move_status")
    private Integer moveStatus;
    public Order() {}
    public Order(String uuid,String orderNo,String orderTime,Long docType,Long itemId,String itemName,Long allotItemId,String defNumber,String number,Long cstmr,String cstmrName,String tel,String operMemb,Double totalFee,Double discount,Double discountFee,Double otherFee,Double actFee,Integer payType,String salesman,Integer accountDay,Integer postFeeType,Double postFee,Date payTime,Date sendTime,String shipName,String shipCode,Long settle,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
@@ -405,6 +412,20 @@
        }
    }
    public String getMoveStatus$(){
        if (null == this.moveStatus){ return null; }
        switch (this.moveStatus){
            case 2:
                return "已备货";
            case 1:
                return "备货中";
            case 0:
                return "未初始";
            default:
                return String.valueOf(this.moveStatus);
        }
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.createBy);
src/main/java/com/zy/asrs/mapper/AutoMoveMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.AutoMove;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface AutoMoveMapper extends BaseMapper<AutoMove> {
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -71,4 +71,11 @@
    void updateMatTurn(@Param("matnrOld")String matnrOld,@Param("matnr")String matnr);
    List<Map<String,Object>> selectLocDetlUnilateralMoveShuttleMapY(Integer crnNo);
    List<Map<String,Object>> selectLocDetlUnilateralMoveShuttleMapN(Integer crnNo);
    List<LocDetl> selectLocDetlUnilateralMoveShuttleY(@Param("matnr")String matnr,@Param("batch")String batch,@Param("grade")String grade);
    List<LocDetl> selectLocDetlUnilateralMoveShuttleN(@Param("matnr")String matnr,@Param("batch")String batch,@Param("grade")String grade);
}
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -22,4 +22,7 @@
    Integer selectEmptyLocCount(@Param("locType1") Short locType1, @Param("crnNo") Integer crnNo);
    List<LocMast> queryShallowLocFMast(@Param("crnNo") Integer crnNo);
    List<LocMast> selectLocShuttleMoveUnilateralY(@Param("bay")Integer bay,@Param("lev")Integer lev);
    List<LocMast> selectLocShuttleMoveUnilateralN(@Param("bay")Integer bay,@Param("lev")Integer lev);
}
src/main/java/com/zy/asrs/mapper/OrderMapper.java
@@ -20,4 +20,7 @@
    int addToLogTable(Order order);
    List<Order> selectorderNoL(@Param("orderNo")String orderNo);
    Order selectOrderMoveStatus();
    Order selectOrderMoveStatusInitial();
}
src/main/java/com/zy/asrs/service/AutoMoveService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.AutoMove;
import com.baomidou.mybatisplus.service.IService;
public interface AutoMoveService extends IService<AutoMove> {
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -65,4 +65,8 @@
    Double getLocDetlSumQty(String locNo);
    void updateMatTurn(String matnrOld,String matnr);
    List<Map<String, Object>> selectLocDetlUnilateralMoveShuttleMap(Integer crnNo);
    List<LocDetl> selectLocDetlUnilateralMoveShuttle(String matnr,String batch,String grade,Integer crnNo);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -37,4 +38,6 @@
     * @return
     */
    List<LocMast> queryShallowLocFMast(Integer crnNo);
    List<LocMast> selectLocMastShuttleMoveUnilateral(Integer bay,Integer lev,Integer crnNo);
}
src/main/java/com/zy/asrs/service/OrderService.java
@@ -29,4 +29,7 @@
    List<Order> selectorderNoL(String orderNo);
    Order selectOrderMoveStatus();
    Order selectOrderMoveStatusInitial();
}
src/main/java/com/zy/asrs/service/impl/AutoMoveServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.AutoMoveMapper;
import com.zy.asrs.entity.AutoMove;
import com.zy.asrs.service.AutoMoveService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("autoMoveService")
public class AutoMoveServiceImpl extends ServiceImpl<AutoMoveMapper, AutoMove> implements AutoMoveService {
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -9,6 +9,7 @@
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service("locDetlService")
@@ -126,4 +127,20 @@
    public void updateMatTurn(String matnrOld,String matnr){
        this.baseMapper.updateMatTurn(matnrOld,matnr);
    }
    @Override
    public List<Map<String, Object>> selectLocDetlUnilateralMoveShuttleMap(Integer crnNo) {
        if (crnNo==1){
            return this.baseMapper.selectLocDetlUnilateralMoveShuttleMapY(crnNo);
        }
        return this.baseMapper.selectLocDetlUnilateralMoveShuttleMapN(crnNo);
    }
    @Override
    public List<LocDetl> selectLocDetlUnilateralMoveShuttle(String matnr,String batch,String grade,Integer crnNo) {
        if (crnNo==1){
            return this.baseMapper.selectLocDetlUnilateralMoveShuttleY(matnr,batch,grade);
        }
        return this.baseMapper.selectLocDetlUnilateralMoveShuttleN(matnr,batch,grade);
    }
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -52,4 +52,12 @@
    public List<LocMast> queryShallowLocFMast(Integer crnNo) {
        return this.baseMapper.queryShallowLocFMast(crnNo);
    }
    @Override
    public List<LocMast> selectLocMastShuttleMoveUnilateral(Integer bay,Integer lev,Integer crnNo) {
        if (crnNo==1){
            return this.baseMapper.selectLocShuttleMoveUnilateralY(bay,lev);
        }
        return this.baseMapper.selectLocShuttleMoveUnilateralN(bay,lev);
    }
}
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -180,4 +180,13 @@
        return this.baseMapper.selectorderNoL(orderNo);
    }
    @Override
    public Order selectOrderMoveStatus() {
        return this.baseMapper.selectOrderMoveStatus();
    }
    @Override
    public Order selectOrderMoveStatusInitial() {
        return this.baseMapper.selectOrderMoveStatusInitial();
    }
}
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java
New file
@@ -0,0 +1,103 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.asrs.task.handler.AutoLocMoveHandler;
import com.zy.common.properties.SlaveWmsParameterProperties;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
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 AutoLocMoveScheduler {
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WorkService workService;
    @Autowired
    private AutoLocMoveHandler autoLocMoveHandler;
    @Autowired
    private BasCrnpService basCrnpService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private SlaveWmsParameterProperties slaveWmsParameterProperties;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private AutoMoveService autoMoveService;
    //定时出库   经典双伸
    @Scheduled(cron = "0/3 * * * * ? ")
    public void locToLocAutoLocMove(){
        if (slaveWmsParameterProperties.isAutoLocMoveBoolean()){
            Config config = configService.selectById("AutoLocMove");
            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
                return;
            }
            Order order = orderService.selectOrderMoveStatus();
            if (!Cools.isEmpty(order)){
//                autoMoveService.selectList()
            }else {
                order = orderService.selectOrderMoveStatusInitial();
                if (Cools.isEmpty(order)){
                    return;
                }
                order.setMoveStatus(2);
                orderService.updateById(order);
            }
        }
    }
    //定时出库
    @Scheduled(cron = "0/3 * * * * ? ")
    public void locToLoc11(){
        if (slaveWmsParameterProperties.isAutoLocMoveUnilateralBoolean()){
            Config config = configService.selectById("AutoLocMoveUnilateral");
            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
                return;
            }
            int crnCount = basCrnpService.selectCount(new EntityWrapper<>());
            for (int crnNo = 1;crnNo < crnCount;crnNo++){
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 11).eq("crn_no", crnNo));
                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 111).eq("crn_no", crnNo));
                if (Cools.isEmpty(wrkMast) && Cools.isEmpty(wrkMast1)){
                    autoLocMoveHandler.start(crnNo,11);
                }
            }
        }
    }
    //定时入库
    @Scheduled(cron = "0/3 * * * * ? ")
    public void locToLoc111() {
        if (slaveWmsParameterProperties.isAutoLocMoveUnilateralBoolean()){
            Config config = configService.selectById("AutoLocMoveUnilateral");
            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
                return;
            }
            int crnCount = basCrnpService.selectCount(new EntityWrapper<>());
            for (int crnNo = 1;crnNo < crnCount;crnNo++){
                BasCrnp basCrnp = basCrnpService.selectById(crnNo);
                if (basCrnp == null) {
                    continue;
                }
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 111).eq("crn_no", crnNo));
                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 11).eq("crn_no", crnNo));
                if (Cools.isEmpty(wrkMast)  && Cools.isEmpty(wrkMast1)){
                    autoLocMoveHandler.start(crnNo,111);
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/AutoLocMoveHandler.java
New file
@@ -0,0 +1,82 @@
package com.zy.asrs.task.handler;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WorkService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * Created by vincent on 2023/7/7
 */
@Slf4j
@Service
public class AutoLocMoveHandler extends AbstractHandler<String> {
    @Autowired
    private CommonService commonService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private WorkService workService;
    @Transactional(isolation = Isolation.REPEATABLE_READ)
    public ReturnT<String> start(Integer crnNo, Integer ioType) {
        try {
            //11  穿梭移单边
            if (ioType==11){
                for (int bay = 1;bay < 27;bay++){
                    for (int lev = 1 ; lev <6 ; lev++){
                        List<LocMast> locMasts = locMastService.selectLocMastShuttleMoveUnilateral(bay,lev,crnNo);
                        if (!Cools.isEmpty(locMasts) && locMasts.size()<4){
                            for (LocMast locMast:locMasts){
                                LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
                                StartupDto startupDto = commonService.getLocNo(crnNo == 1 ? 6 : 5, ioType, crnNo == 1 ? 917 : 918, locDetl.getMatnr(), locDetl.getBatch(),locDetl.getBrand(),0, null, 0);
                                workService.locMove(locMast.getLocNo(), startupDto.getLocNo(),9527L);
                            }
                            return SUCCESS;
                        }
                    }
                }
            }else {//11  单边移穿梭
                List<Map<String, Object>> list = locDetlService.selectLocDetlUnilateralMoveShuttleMap(crnNo);//111   单边移穿梭
                for (Map<String, Object> map : list) {
                    String matnr = map.getOrDefault("matnr","").toString();//物料号
                    String batch = map.getOrDefault("batch","").toString();//批号
                    String grade = map.getOrDefault("brand","").toString();//等级
                    int count = Integer.parseInt(map.get("count").toString());//单边库数量
                    if (count < 4) {
                        continue;
                    }
                    List<LocDetl> locDetlList = locDetlService.selectLocDetlUnilateralMoveShuttle(matnr, batch, grade, crnNo);
                    for (LocDetl locDetl : locDetlList) {
                        StartupDto startupDto = commonService.getLocNo(crnNo == 1 ? 4 : 3, ioType, crnNo == 1 ? 901 : 932, locDetl.getMatnr(), locDetl.getBatch(), locDetl.getBrand(),0, null, 0);
                        workService.locMove(locDetl.getLocNo(), startupDto.getLocNo(), 9527L);
                    }
                }
                return SUCCESS;
            }
        }catch (Exception e){
            log.error("自动移库出错,堆垛机号{},工作类型{}",crnNo,ioType);
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/common/CodeBuilder.java
@@ -17,10 +17,10 @@
//        generator.table="sys_host";
        // sqlserver
        generator.sqlOsType = SqlOsType.SQL_SERVER;
        generator.url="192.168.4.15:1433;databasename=hylyasrs";
        generator.url="192.168.4.15:1433;databasename=gdykasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="man_loc_check";
        generator.table="man_auto_move";
        generator.packagePath="com.zy.asrs";
        generator.build();
    }
src/main/java/com/zy/common/properties/SlaveWmsParameterProperties.java
@@ -17,6 +17,10 @@
    // 自动补空板功能开关
    private boolean automaticFillingBoardStaNosBoolean;
    // 自动移库功能开关
    private boolean autoLocMoveBoolean;
    // 自动移库功能开关 111
    private boolean autoLocMoveUnilateralBoolean;
    // 自动补空板站点
    private List<Integer> automaticFillingBoardStaNos = new ArrayList<>();
src/main/resources/application.yml
@@ -63,6 +63,10 @@
  automaticFillingBoardStaNosBoolean: true
  # 自动补空板站点
  automaticFillingBoardStaNos: 112,101
  # 自动移库功能开关
  autoLocMoveBoolean: true
  # 自动移库功能开关 穿梭
  autoLocMoveUnilateralBoolean: false
comb:
  limit: 5000
src/main/resources/mapper/AutoMoveMapper.xml
New file
@@ -0,0 +1,19 @@
<?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.AutoMoveMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.AutoMove">
        <id column="id" property="id" />
        <result column="status" property="status" />
        <result column="line_number" property="lineNumber" />
        <result column="loc_no" property="locNo" />
        <result column="row_priority" property="rowPriority" />
        <result column="order_no" property="orderNo" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="uuid" property="uuid" />
    </resultMap>
</mapper>
src/main/resources/mapper/LocDetlMapper.xml
@@ -356,4 +356,50 @@
        ORDER BY ld.appe_time ASC
    </select>
    <select id="selectLocDetlUnilateralMoveShuttleMapY" resultType="java.util.Map">
        select ld.matnr,ld.batch,ld.brand,count(*) count from asr_loc_mast lm
        left join asr_loc_detl ld
        on lm.loc_no = ld.loc_no
        where lm.row1 in (1)
        and loc_sts = 'F'
        and loc_type3 = 0
        group by ld.matnr,ld.batch,ld.brand
    </select>
    <select id="selectLocDetlUnilateralMoveShuttleMapN" resultType="java.util.Map">
        select ld.matnr,ld.batch,ld.brand,count(*) count from asr_loc_mast lm
        left join asr_loc_detl ld
        on lm.loc_no = ld.loc_no
        where lm.row1 in (31,32)
        and loc_sts = 'F'
        and loc_type3 = 0
        group by ld.matnr,ld.batch,ld.brand
    </select>
    <select id="selectLocDetlUnilateralMoveShuttleY" resultMap="BaseResultMap">
        select ld.* from asr_loc_mast lm
        left join asr_loc_detl ld
        on lm.loc_no = ld.loc_no
        where loc_sts = 'F'
        and ld.matnr = #{matnr}
        and ld.batch = #{batch}
        and ld.brand = #{grade}
        and lm.loc_type3 = 0
        and lm.row1 in (1)
        order by row1
    </select>
    <select id="selectLocDetlUnilateralMoveShuttleN" resultMap="BaseResultMap">
        select ld.* from asr_loc_mast lm
        left join asr_loc_detl ld
        on lm.loc_no = ld.loc_no
        where loc_sts = 'F'
        and ld.matnr = #{matnr}
        and ld.batch = #{batch}
        and ld.brand = #{grade}
        and lm.loc_type3 = 0
        and lm.row1 in (31,32)
        order by row1
    </select>
</mapper>
src/main/resources/mapper/LocMastMapper.xml
@@ -75,4 +75,13 @@
        )
        and (loc_sts = 'F' or loc_sts = 'D') and crn_no = #{crnNo}
    </select>
    <select id="selectLocShuttleMoveUnilateralY" resultMap="BaseResultMap">
        select * from [dbo].[asr_loc_mast] where row1>1 and row1 &lt; 18 and bay1 = #{bay} and lev1 = #{lev} and loc_sts='F' order by row1
    </select>
    <select id="selectLocShuttleMoveUnilateralN" resultMap="BaseResultMap">
        select * from [dbo].[asr_loc_mast] where row1>17 and row1 &lt; 31 and bay1 = #{bay} and lev1 = #{lev} and loc_sts='F' order by row1 desc
    </select>
</mapper>
src/main/resources/mapper/OrderMapper.xml
@@ -39,6 +39,7 @@
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="memo" property="memo" />
        <result column="move_status" property="moveStatus" />
    </resultMap>
@@ -84,4 +85,19 @@
        </if>
    </select>
    <select id="selectOrderMoveStatus" resultMap="BaseResultMap">
        select top 1 *
        from man_order
        where 1=1
        and move_status = 2
    </select>
    <select id="selectOrderMoveStatusInitial" resultMap="BaseResultMap">
        select top 1 *
        from man_order
        where 1=1
        and move_status = 1
        order by update_time
    </select>
</mapper>
src/main/webapp/static/js/autoMove/autoMove.js
New file
@@ -0,0 +1,263 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
        elem: '#autoMove',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/autoMove/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: '编号'}
            ,{field: 'status$', align: 'center',title: '状态'}
            ,{field: 'lineNumber', align: 'center',title: ''}
            ,{field: 'locNo', align: 'center',title: ''}
            ,{field: 'rowPriority', align: 'center',title: ''}
            ,{field: 'orderNo', align: 'center',title: ''}
            ,{field: 'createTime$', align: 'center',title: ''}
            ,{field: 'updateTime$', align: 'center',title: ''}
            ,{field: 'uuid', align: 'center',title: ''}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        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('sort(autoMove)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(autoMove)', 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;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'autoMove': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/autoMove/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(autoMove)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* 弹窗 - 新增、修改 */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/autoMove/"+(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+"/autoMove/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(false);
    });
    // 重置
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 时间选择器
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
            layDate.render({
                elem: '#createTime\\$',
                type: 'datetime',
                value: data!==undefined?data['createTime\\$']:null
            });
            layDate.render({
                elem: '#updateTime\\$',
                type: 'datetime',
                value: data!==undefined?data['updateTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/views/autoMove/autoMove.html
New file
@@ -0,0 +1,138 @@
<!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>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <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 class="layui-hide" id="autoMove" lay-filter="autoMove"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</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-edit" lay-event="del">删除</a>
</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/autoMove/autoMove.js" charset="utf-8"></script>
</body>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">状态: </label>
                    <div class="layui-input-block">
                        <select name="status">
                            <option value="">请选择状态</option>
                            <option value="1">正常</option>
                            <option value="0">禁用</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="lineNumber" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="locNo" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="rowPriority" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="orderNo" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="createTime" id="createTime$" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="uuid" placeholder="请输入">
                    </div>
                </div>
             </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>
</html>