#
Junjie
2025-01-12 c34747e73010e893dfd04344fcbc8848c13eb717
#
11个文件已修改
7个文件已添加
1个文件已删除
1150 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WrkMastController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/CancelTaskParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/CompleteTaskParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastLog.java 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastLogMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastLogService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastLogServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/DevpReadScheduler.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WrkMastScheduler.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/BaseController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastLogMapper.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/task.html 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,12 +1,15 @@
package com.zy.asrs.controller;
import com.core.common.R;
import com.zy.asrs.domain.param.CancelTaskParam;
import com.zy.asrs.domain.param.CompleteTaskParam;
import com.zy.asrs.domain.param.CreateMoveTaskParam;
import com.zy.common.service.CommonService;
import com.zy.core.dispatcher.ShuttleDispatchUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -21,15 +24,39 @@
    private ShuttleDispatchUtils shuttleDispatchUtils;
    @PostMapping("/createMoveTask")
    public R createMoveTask(CreateMoveTaskParam param) {
    public R createMoveTask(@RequestBody CreateMoveTaskParam param) {
        if (param == null) {
            return R.error("参数不能为空");
        }
        boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(99), param.getLocNo(), param.getShuttleNo());
        boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(null, param.getLocNo(), param.getShuttleNo());
        if (dispatchShuttle) {
            return R.ok();
        }
        return R.error();
        return R.error("生成失败");
    }
    @PostMapping("/completeTask")
    public R completeTask(@RequestBody CompleteTaskParam param) {
        if (param == null) {
            return R.error("参数不能为空");
        }
        boolean completeTask = commonService.completeTask(param);
        if (completeTask) {
            return R.ok();
        }
        return R.error("任务完成失败");
    }
    @PostMapping("/cancelTask")
    public R cancelTask(@RequestBody CancelTaskParam param) {
        if (param == null) {
            return R.error("参数不能为空");
        }
        boolean completeTask = commonService.cancelTask(param);
        if (completeTask) {
            return R.ok();
        }
        return R.error("任务取消失败");
    }
}
src/main/java/com/zy/asrs/controller/WrkMastController.java
New file
@@ -0,0 +1,63 @@
package com.zy.asrs.controller;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@Slf4j
@RestController
public class WrkMastController extends BaseController {
    @Autowired
    private WrkMastService wrkMastService;
    @RequestMapping(value = "/wrkMast/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){
        excludeTrash(param);
        EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
        convert(param, wrapper);
        allLike(WrkMast.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){
            if (orderByField.endsWith("$")){
                orderByField = orderByField.substring(0, orderByField.length()-1);
            }
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        }else {
            wrapper.orderBy("io_time", false);
        }
        return R.ok(wrkMastService.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);
            }
        }
    }
}
src/main/java/com/zy/asrs/domain/param/CancelTaskParam.java
New file
@@ -0,0 +1,10 @@
package com.zy.asrs.domain.param;
import lombok.Data;
@Data
public class CancelTaskParam {
    private Integer wrkNo;
}
src/main/java/com/zy/asrs/domain/param/CompleteTaskParam.java
New file
@@ -0,0 +1,10 @@
package com.zy.asrs.domain.param;
import lombok.Data;
@Data
public class CompleteTaskParam {
    private Integer wrkNo;
}
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -57,10 +57,6 @@
    @TableField("io_pri")
    private Double ioPri;
    @ApiModelProperty(value= "")
    @TableField("wrk_date")
    private Date wrkDate;
    /**
     * 目标库位
     */
@@ -158,6 +154,12 @@
    @TableField(value = "lift_no",strategy = FieldStrategy.IGNORED)
    private Integer liftNo;
    /**
     * WMS任务号
     */
    @ApiModelProperty(value= "WMS任务号")
    private String wmsWrkNo;
    public String getWrkSts$(){
        BasWrkStatusMapper mapper = SpringUtils.getBean(BasWrkStatusMapper.class);
        BasWrkStatus entity = mapper.selectById(this.wrkSts);
@@ -174,13 +176,6 @@
            return entity.getIoDesc();
        }
        return null;
    }
    public String getWrkDate$(){
        if (Cools.isEmpty(this.wrkDate)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.wrkDate);
    }
    public String getLocNo$(){
src/main/java/com/zy/asrs/entity/WrkMastLog.java
@@ -9,6 +9,7 @@
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.utils.Synchro;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
@@ -39,18 +40,7 @@
    private Integer wrkNo;
    @ApiModelProperty(value= "")
    @TableField("inv_wh")
    private String invWh;
    @ApiModelProperty(value= "")
    private Date ymd;
    @ApiModelProperty(value= "")
    private String mk;
    @ApiModelProperty(value= "")
    @TableField("whs_type")
    private Integer whsType;
    /**
     * 工作状态
@@ -67,40 +57,11 @@
    private Integer ioType;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableField("crn_no")
    private Integer crnNo;
    /**
     * 穿梭车
     */
    @ApiModelProperty(value= "穿梭车")
    @TableField("ste_no")
    private Integer steNo;
    /**
     * 边缘库位
     */
    @ApiModelProperty(value= "边缘库位")
    @TableField("out_most")
    private Integer outMost;
    @ApiModelProperty(value= "")
    @TableField("sheet_no")
    private String sheetNo;
    /**
     * 优先级
     */
    @ApiModelProperty(value= "优先级")
    @TableField("io_pri")
    private Double ioPri;
    @ApiModelProperty(value= "")
    @TableField("wrk_date")
    private Date wrkDate;
    /**
     * 目标库位
@@ -130,112 +91,12 @@
    @TableField("source_loc_no")
    private String sourceLocNo;
    @ApiModelProperty(value= "")
    @TableField("loc_sts")
    private String locSts;
    /**
     * 拣料
     */
    @ApiModelProperty(value= "拣料")
    private String picking;
    @ApiModelProperty(value= "")
    @TableField("link_mis")
    private String linkMis;
    @ApiModelProperty(value= "")
    @TableField("online_yn")
    private String onlineYn;
    @ApiModelProperty(value= "")
    @TableField("upd_mk")
    private String updMk;
    /**
     * 退出
     */
    @ApiModelProperty(value= "退出")
    @TableField("exit_mk")
    private String exitMk;
    @ApiModelProperty(value= "")
    @TableField("plt_type")
    private Integer pltType;
    /**
     * 空板
     */
    @ApiModelProperty(value= "空板")
    @TableField("empty_mk")
    private String emptyMk;
    /**
     * 工作时间
     */
    @ApiModelProperty(value= "工作时间")
    @TableField("io_time")
    private Date ioTime;
    @ApiModelProperty(value= "")
    @TableField("ctn_type")
    private Integer ctnType;
    @ApiModelProperty(value= "")
    private String packed;
    @ApiModelProperty(value= "")
    @TableField("ove_mk")
    private String oveMk;
    @ApiModelProperty(value= "")
    @TableField("mtn_type")
    private Double mtnType;
    @ApiModelProperty(value= "")
    @TableField("user_no")
    private String userNo;
    /**
     * 堆垛机启动时间
     */
    @ApiModelProperty(value= "堆垛机启动时间")
    @TableField("crn_str_time")
    private Date crnStrTime;
    /**
     * 堆垛机停止时间
     */
    @ApiModelProperty(value= "堆垛机停止时间")
    @TableField("crn_end_time")
    private Date crnEndTime;
    /**
     * 拣料时间
     */
    @ApiModelProperty(value= "拣料时间")
    @TableField("plc_str_time")
    private Date plcStrTime;
    @ApiModelProperty(value= "")
    @TableField("crn_pos_time")
    private Date crnPosTime;
    @ApiModelProperty(value= "")
    @TableField("load_time")
    private Double loadTime;
    @ApiModelProperty(value= "")
    @TableField("exp_time")
    private Double expTime;
    @ApiModelProperty(value= "")
    @TableField("ref_wrkno")
    private Double refWrkno;
    @ApiModelProperty(value= "")
    @TableField("ref_iotime")
    private Date refIotime;
    /**
     * 修改人员
@@ -266,10 +127,6 @@
    private Date appeTime;
    @ApiModelProperty(value= "")
    @TableField("pause_mk")
    private String pauseMk;
    @ApiModelProperty(value= "")
    @TableField("error_time")
    private Date errorTime;
@@ -278,32 +135,8 @@
    private String errorMemo;
    @ApiModelProperty(value= "")
    @TableField("ctn_kind")
    private Integer ctnKind;
    @ApiModelProperty(value= "")
    @TableField("manu_type")
    private String manuType;
    @ApiModelProperty(value= "")
    @TableField("memo_m")
    private String memoM;
    @ApiModelProperty(value= "")
    @TableField("sc_weight")
    private Double scWeight;
    @ApiModelProperty(value= "")
    @TableField("log_mk")
    private String logMk;
    @ApiModelProperty(value= "")
    @TableField("log_err_time")
    private Date logErrTime;
    @ApiModelProperty(value= "")
    @TableField("log_err_memo")
    private String logErrMemo;
    /**
     * 条码
@@ -311,34 +144,25 @@
    @ApiModelProperty(value= "条码")
    private String barcode;
    @ApiModelProperty(value= "")
    @TableField("Pdc_type")
    private String PdcType;
    @ApiModelProperty(value= "")
    @TableField("ctn_no")
    private String ctnNo;
    /**
     * 四向穿梭车号
     */
    @ApiModelProperty(value= "四向穿梭车号")
    @TableField(value = "shuttle_no")
    private Integer shuttleNo;
    /**
     * 满板
     * 提升机号
     */
    @ApiModelProperty(value= "满板")
    @TableField("full_plt")
    private String fullPlt;
    @ApiModelProperty(value= "提升机号")
    @TableField(value = "lift_no")
    private Integer liftNo;
    /**
     * 先入品 / 双重入库
     * WMS任务号
     */
    @ApiModelProperty(value= "先入品")
    @TableField("pre_have")
    private String preHave;
    /**
     * 空操作 / 取货无箱
     */
    @ApiModelProperty(value= "空操作")
    @TableField("take_none")
    private String takeNone;
    @ApiModelProperty(value= "WMS任务号")
    private String wmsWrkNo;
    public WrkMastLog() {}
@@ -349,20 +173,6 @@
            return String.valueOf(wrkMast.getWrkNo());
        }
        return null;
    }
    public String getYmd$(){
        if (Cools.isEmpty(this.ymd)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ymd);
    }
    public String getWrkDate$(){
        if (Cools.isEmpty(this.wrkDate)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.wrkDate);
    }
    public String getLocNo$(){
@@ -408,42 +218,6 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime);
    }
    public String getCrnStrTime$(){
        if (Cools.isEmpty(this.crnStrTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnStrTime);
    }
    public String getCrnEndTime$(){
        if (Cools.isEmpty(this.crnEndTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnEndTime);
    }
    public String getPlcStrTime$(){
        if (Cools.isEmpty(this.plcStrTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.plcStrTime);
    }
    public String getCrnPosTime$(){
        if (Cools.isEmpty(this.crnPosTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnPosTime);
    }
    public String getRefIotime$(){
        if (Cools.isEmpty(this.refIotime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.refIotime);
    }
    public String getModiUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.modiUser);
@@ -483,12 +257,8 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.errorTime);
    }
    public String getLogErrTime$(){
        if (Cools.isEmpty(this.logErrTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.logErrTime);
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
}
src/main/java/com/zy/asrs/mapper/WrkMastLogMapper.java
@@ -2,17 +2,11 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.WrkMastLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface WrkMastLogMapper extends BaseMapper<WrkMastLog> {
    @Insert("insert into asr_wrk_mast_log select * from asr_wrk_mast where wrk_no=#{workNo}")
    int save(Integer workNo);
    WrkMastLog selectLatestByWorkNo(Integer workNo);
}
src/main/java/com/zy/asrs/service/WrkMastLogService.java
New file
@@ -0,0 +1,10 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.WrkMastLog;
public interface WrkMastLogService extends IService<WrkMastLog> {
    boolean save(Integer wrkNo);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -867,17 +867,6 @@
                        }
                        if (wrkMastService.updateById(wrkMast)) {
                            if (wrkMast.getWrkSts() == 111) {
                                // 保存工作主档历史档
                                if (wrkMastLogMapper.save(wrkMast.getWrkNo()) <= 0) {
                                    log.info("保存工作历史档[workNo={0}]失败", wrkMast.getWrkNo());
                                }
                                // 删除工作主档
                                if (!wrkMastService.deleteById(wrkMast)) {
                                    log.info("删除工作主档[workNo={0}]失败", wrkMast.getWrkNo());
                                }
                            }
                            //设置四向穿梭车为空闲状态
                            shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                            News.info("四向穿梭车已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo());
@@ -2283,17 +2272,6 @@
                wrkMast.setLiftNo(null);//释放提升机
                wrkMast.setModiTime(now);
                wrkMastService.updateById(wrkMast);
                if (wrkMast.getWrkSts() == WrkStsType.COMPLETE_MOVE.sts) {
                    // 保存工作主档历史档
                    if (wrkMastLogMapper.save(wrkMast.getWrkNo()) <= 0) {
                        log.info("保存工作历史档[workNo={}]失败", wrkMast.getWrkNo());
                    }
                    // 删除工作主档
                    if (!wrkMastService.deleteById(wrkMast)) {
                        log.info("删除工作主档[workNo={}]失败", wrkMast.getWrkNo());
                    }
                }
                return false;
            }
src/main/java/com/zy/asrs/service/impl/WrkMastLogServiceImpl.java
New file
@@ -0,0 +1,30 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.WrkMastLog;
import com.zy.asrs.mapper.WrkMastLogMapper;
import com.zy.asrs.service.WrkMastLogService;
import com.zy.asrs.service.WrkMastService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("wrkMastLogService")
public class WrkMastLogServiceImpl extends ServiceImpl<WrkMastLogMapper, WrkMastLog> implements WrkMastLogService {
    @Autowired
    private WrkMastService wrkMastService;
    @Override
    public boolean save(Integer wrkNo) {
        WrkMast wrkMast = wrkMastService.selectByWorkNo(wrkNo);
        if (wrkMast == null) {
            return false;
        }
        WrkMastLog wrkMastLog = new WrkMastLog();
        wrkMastLog.sync(wrkMast);
        return this.baseMapper.insert(wrkMastLog) > 0;
    }
}
src/main/java/com/zy/asrs/task/DevpReadScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/WrkMastScheduler.java
New file
@@ -0,0 +1,44 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastLogService;
import com.zy.asrs.service.WrkMastService;
import com.zy.core.enums.WrkStsType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
public class WrkMastScheduler {
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Scheduled(cron = "0/1 * * * * ? ")
    private void executeMove(){
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_MOVE.sts));
        if (wrkMasts.isEmpty()) {
            return;
        }
        for (WrkMast wrkMast : wrkMasts) {
            // 保存工作主档历史档
            if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
                log.info("保存工作历史档[workNo={}]失败", wrkMast.getWrkNo());
            }
            // 删除工作主档
            if (!wrkMastService.deleteById(wrkMast)) {
                log.info("删除工作主档[workNo={}]失败", wrkMast.getWrkNo());
            }
        }
    }
}
src/main/java/com/zy/common/service/CommonService.java
@@ -2,11 +2,17 @@
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.domain.param.CancelTaskParam;
import com.zy.asrs.domain.param.CompleteTaskParam;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.core.enums.WrkIoType;
import com.zy.core.enums.WrkStsType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@Slf4j
@Service
@@ -14,6 +20,8 @@
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Autowired
    private WrkLastnoService wrkLastnoService;
@@ -69,4 +77,38 @@
        }
    }
    public boolean completeTask(CompleteTaskParam param) {
        Integer wrkNo = param.getWrkNo();
        WrkMast wrkMast = wrkMastService.selectByWorkNo(wrkNo);
        if (null == wrkMast) {
            throw new CoolException("任务不存在");
        }
        if (wrkMast.getIoType() == WrkIoType.IN.id) {
            wrkMast.setWrkSts(WrkStsType.COMPLETE_INBOUND.sts);
        }else if (wrkMast.getIoType() == WrkIoType.OUT.id) {
            wrkMast.setWrkSts(WrkStsType.COMPLETE_OUTBOUND.sts);
        } else if (wrkMast.getIoType() == WrkIoType.SHUTTLE_MOVE.id) {
            wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);
        } else if (wrkMast.getIoType() == WrkIoType.SHUTTLE_CHARGE.id) {
            wrkMast.setWrkSts(WrkStsType.COMPLETE_CHARGE.sts);
        }
        wrkMast.setModiTime(new Date());
        wrkMastService.updateById(wrkMast);
        return true;
    }
    public boolean cancelTask(CancelTaskParam param) {
        Integer wrkNo = param.getWrkNo();
        WrkMast wrkMast = wrkMastService.selectByWorkNo(wrkNo);
        if (null == wrkMast) {
            throw new CoolException("任务不存在");
        }
        wrkMastLogService.save(wrkNo);
        wrkMastService.deleteById(wrkNo);
        return true;
    }
}
src/main/java/com/zy/common/web/BaseController.java
@@ -1,5 +1,7 @@
package com.zy.common.web;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.controller.AbstractBaseController;
@@ -11,11 +13,17 @@
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
 * Created by vincent on 2019-09-09
 */
public class BaseController extends AbstractBaseController {
    protected static final String RANGE_TIME_LINK = " - ";
    @Autowired
    protected HttpServletRequest request;
@@ -43,4 +51,45 @@
        }
        return "";
    }
    /**
     * 全字段模糊搜索
     * @param cls 模型类
     * @param set 排除字段集合
     * @param condition 搜索内容
     */
    protected <T> void allLike(Class<T> cls, Set<String> set, EntityWrapper<T> wrapper, String condition){
        if (Cools.isEmpty(condition)) {
            return;
        }
        List<String> columns = new ArrayList<>();
        for (Field field :Cools.getAllFields(cls)){
            if (Modifier.isFinal(field.getModifiers())
                    || Modifier.isStatic(field.getModifiers())
                    || Modifier.isTransient(field.getModifiers())){
                continue;
            }
            String column = null;
            if (field.isAnnotationPresent(TableField.class)) {
                column = field.getAnnotation(TableField.class).value();
            }
            if (Cools.isEmpty(column)) {
                column = field.getName();
            }
            if (!set.contains(column)) {
                columns.add(column);
            }
        }
        if (columns.isEmpty()) {
            return;
        }
        for (int i=0;i<columns.size();i++){
            if (i==0){
                wrapper.andNew();
            } else {
                wrapper.or();
            }
            wrapper.like(columns.get(i), condition);
        }
    }
}
src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
@@ -249,7 +249,7 @@
        }
        // 获取工作号
        int workNo = commonService.getWorkNo(0);
        int workNo = commonService.getWorkNo(WrkIoType.SHUTTLE_MOVE.id);
        // 保存工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
src/main/resources/mapper/WrkMastLogMapper.xml
@@ -6,73 +6,26 @@
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastLog">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="inv_wh" property="invWh" />
        <result column="ymd" property="ymd" />
        <result column="mk" property="mk" />
        <result column="whs_type" property="whsType" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="io_type" property="ioType" />
        <result column="crn_no" property="crnNo" />
        <result column="ste_no" property="steNo" />
        <result column="out_most" property="outMost" />
        <result column="sheet_no" property="sheetNo" />
        <result column="io_pri" property="ioPri" />
        <result column="wrk_date" property="wrkDate" />
        <result column="loc_no" property="locNo" />
        <result column="sta_no" property="staNo" />
        <result column="source_sta_no" property="sourceStaNo" />
        <result column="source_loc_no" property="sourceLocNo" />
        <result column="loc_sts" property="locSts" />
        <result column="picking" property="picking" />
        <result column="link_mis" property="linkMis" />
        <result column="online_yn" property="onlineYn" />
        <result column="upd_mk" property="updMk" />
        <result column="exit_mk" property="exitMk" />
        <result column="plt_type" property="pltType" />
        <result column="empty_mk" property="emptyMk" />
        <result column="io_time" property="ioTime" />
        <result column="ctn_type" property="ctnType" />
        <result column="packed" property="packed" />
        <result column="ove_mk" property="oveMk" />
        <result column="mtn_type" property="mtnType" />
        <result column="user_no" property="userNo" />
        <result column="crn_str_time" property="crnStrTime" />
        <result column="crn_end_time" property="crnEndTime" />
        <result column="plc_str_time" property="plcStrTime" />
        <result column="crn_pos_time" property="crnPosTime" />
        <result column="load_time" property="loadTime" />
        <result column="exp_time" property="expTime" />
        <result column="ref_wrkno" property="refWrkno" />
        <result column="ref_iotime" property="refIotime" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
        <result column="pause_mk" property="pauseMk" />
        <result column="error_time" property="errorTime" />
        <result column="error_memo" property="errorMemo" />
        <result column="ctn_kind" property="ctnKind" />
        <result column="manu_type" property="manuType" />
        <result column="memo_m" property="memoM" />
        <result column="sc_weight" property="scWeight" />
        <result column="log_mk" property="logMk" />
        <result column="log_err_time" property="logErrTime" />
        <result column="log_err_memo" property="logErrMemo" />
        <result column="barcode" property="barcode" />
        <result column="Pdc_type" property="PdcType" />
        <result column="ctn_no" property="ctnNo" />
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
        <result column="take_none" property="takeNone" />
        <result column="lift_no" property="liftNo" />
        <result column="shuttle_no" property="shuttleNo" />
        <result column="wms_wrk_no" property="wmsWrkNo" />
    </resultMap>
    <select id="selectLatestByWorkNo" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast_log wml,(select top 1 io_time,wrk_no from asr_wrk_mast_log
        where wrk_no = #{workNo}
        group by io_time,wrk_no
        order by io_time desc) a
        where wml.wrk_no = a.wrk_no
        and wml.io_time = a.io_time
    </select>
</mapper>
src/main/resources/mapper/WrkMastMapper.xml
@@ -9,7 +9,6 @@
        <result column="wrk_sts" property="wrkSts" />
        <result column="io_type" property="ioType" />
        <result column="io_pri" property="ioPri" />
        <result column="wrk_date" property="wrkDate" />
        <result column="loc_no" property="locNo" />
        <result column="sta_no" property="staNo" />
        <result column="source_sta_no" property="sourceStaNo" />
@@ -25,6 +24,7 @@
        <result column="barcode" property="barcode" />
        <result column="shuttle_no" property="shuttleNo" />
        <result column="lift_no" property="liftNo" />
        <result column="wms_wrk_no" property="wmsWrkNo" />
    </resultMap>
src/main/webapp/views/index.html
@@ -23,6 +23,7 @@
            <li><a id="lift" onclick="nav(this.id)" class="nav-unselect" href="#">提升机</a></li>
<!--            <li><a id="ste" onclick="nav(this.id)" class="nav-unselect" href="#">穿梭车</a></li>-->
            <li><a id="shuttle" onclick="nav(this.id)" class="nav-unselect" href="#">四向穿梭车</a></li>
            <li><a id="task" onclick="nav(this.id)" class="nav-unselect" href="#">任务管理</a></li>
        </ul>
    </div>
</div>
src/main/webapp/views/task.html
New file
@@ -0,0 +1,323 @@
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>任务管理</title>
        <link rel="stylesheet" href="../static/vue/element/element.css">
        <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
        <script type="text/javascript" src="../static/layui/layui.js"></script>
        <script type="text/javascript" src="../static/js/common.js"></script>
        <script type="text/javascript" src="../static/vue/js/vue.min.js"></script>
        <script type="text/javascript" src="../static/vue/element/element.js"></script>
    </head>
    <body>
        <div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
            <div style="width: 100%;">
                <el-card class="box-card">
                    <el-form :inline="true" :model="tableSearchParam" class="demo-form-inline">
                        <el-form-item label="">
                            <el-input v-model="tableSearchParam.wrk_no" placeholder="请输入工作号"></el-input>
                        </el-form-item>
                        <el-form-item>
                            <el-button type="primary" @click="getTableData">查询</el-button>
                            <el-button type="primary" @click="resetParam">重置</el-button>
                        </el-form-item>
                    </el-form>
                    <el-table ref="singleTable" :data="tableData" style="width: 100%;">
                        <el-table-column property="wrkNo" label="工作号">
                        </el-table-column>
                        <el-table-column property="wmsWrkNo" label="WMS任务号">
                        </el-table-column>
                        <el-table-column property="wrkSts$" label="工作状态">
                        </el-table-column>
                        <el-table-column property="ioType$" label="任务类型">
                        </el-table-column>
                        <el-table-column property="ioPri" label="优先级">
                        </el-table-column>
                        <el-table-column property="sourceStaNo" label="源站">
                        </el-table-column>
                        <el-table-column property="staNo" label="目标站">
                        </el-table-column>
                        <el-table-column property="sourceLocNo" label="源库位">
                        </el-table-column>
                        <el-table-column property="locNo" label="目标库位">
                        </el-table-column>
                        <el-table-column property="barcode" label="托盘码">
                        </el-table-column>
                        <el-table-column property="liftNo" label="提升机">
                        </el-table-column>
                        <el-table-column property="shuttleNo" label="穿梭车">
                        </el-table-column>
                        <el-table-column label="操作" width="100">
                            <template slot-scope="scope">
                                <el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
                                    <el-button icon="el-icon-more" size="mini" type="primary"></el-button>
                                    <el-dropdown-menu slot="dropdown">
<!--                                        <el-dropdown-item command="change">修改</el-dropdown-item>-->
                                        <el-dropdown-item command="complete">完成</el-dropdown-item>
                                        <el-dropdown-item command="cancel">取消</el-dropdown-item>
                                        <el-dropdown-item command="shuttleCommand">穿梭车指令</el-dropdown-item>
                                    </el-dropdown-menu>
                                </el-dropdown>
                            </template>
                        </el-table-column>
                    </el-table>
                    <div style="margin-top: 10px;">
                        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
                            :current-page="currentPage" :page-sizes="pageSizes" :page-size="pageSize"
                            layout="total, sizes, prev, pager, next, jumper" :total="pageTotal">
                        </el-pagination>
                    </div>
                </el-card>
            </div>
            <el-dialog :title="taskWrkFormTitle" :visible.sync="taskWrkFormVisible">
                <el-form :model="taskWrkForm">
                    <el-form-item label="站点状态" :label-width="taskWrkFormLabelWidth">
                        <el-select v-model="taskWrkForm.siteStatus" placeholder="站点状态">
                            <el-option label="无托盘" value="1"></el-option>
                            <el-option label="空盘头" value="2"></el-option>
                            <el-option label="满盘头" value="3"></el-option>
                            <el-option label="空托盘" value="4"></el-option>
                            <el-option label="托盘入站中" value="5"></el-option>
                            <el-option label="托盘出站中" value="6"></el-option>
                            <el-option label="禁用" value="7"></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="物料号" :label-width="taskWrkFormLabelWidth">
                        <el-input v-model="taskWrkForm.matnr" autocomplete="off"></el-input>
                    </el-form-item>
                    <el-form-item label="工作号" :label-width="taskWrkFormLabelWidth">
                        <el-input v-model="taskWrkForm.wrkNo" autocomplete="off"></el-input>
                    </el-form-item>
                    <el-form-item label="托盘码" :label-width="taskWrkFormLabelWidth">
                        <el-input v-model="taskWrkForm.barcode" autocomplete="off"></el-input>
                    </el-form-item>
                </el-form>
                <div slot="footer" class="dialog-footer">
                    <el-button @click="taskWrkFormVisible = false">取 消</el-button>
                    <el-button type="primary" @click="taskWrkFormConfirm">确 定</el-button>
                </div>
            </el-dialog>
        </div>
        <script>
            var $layui = layui.config({
                base: baseUrl + "/static/wms/layui/lay/modules/"
            }).use(['layer', 'form'], function() {})
            var app = new Vue({
                el: '#app',
                data: {
                    tableData: [],
                    currentPage: 1,
                    pageSizes: [16, 30, 50, 100, 150, 200],
                    pageSize: 30,
                    pageTotal: 0,
                    tableSearchParam: {
                        wrk_no: null,
                    },
                    taskWrkFormVisible: false,
                    taskWrkForm: {
                        siteStatus: '1',
                        matnr: '',
                        wrkNo: '',
                        barcode: '',
                    },
                    taskWrkFormLabelWidth: '80px',
                    taskWrkFormTitle: ''
                },
                created() {
                    this.init()
                },
                methods: {
                    init() {
                        this.getTableData()
                    },
                    getTableData() {
                        let that = this;
                        let data = JSON.parse(JSON.stringify(this.tableSearchParam))
                        data.curr = this.currentPage
                        data.limit = this.pageSize
                        if (this.tableSearchParam.datetime != null) {
                            data.datetime = null
                            data.create_time = this.tableSearchParam.datetime[0] + " - " + this.tableSearchParam.datetime[1]
                        }
                        $.ajax({
                            url: baseUrl + "/wrkMast/list/auth",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: data,
                            dataType: 'json',
                            contentType: 'application/json;charset=UTF-8',
                            method: 'GET',
                            success: function(res) {
                                if (res.code == 200) {
                                    that.tableData = res.data.records
                                    that.pageTotal = res.data.total
                                } else if (res.code === 403) {
                                    top.location.href = baseUrl + "/";
                                } else {
                                    that.$message({
                                        message: res.msg,
                                        type: 'error'
                                    });
                                }
                            }
                        });
                    },
                    handleSizeChange(val) {
                        console.log(`每页 ${val} 条`);
                        this.pageSize = val
                        this.getTableData()
                    },
                    handleCurrentChange(val) {
                        console.log(`当前页: ${val}`);
                        this.currentPage = val
                        this.getTableData()
                    },
                    resetParam() {
                        this.tableSearchParam = {
                            task_no: null,
                            status: null,
                            wrk_no: null
                        }
                        this.getTableData()
                    },
                    handleCommand(command, row) {
                        switch (command) {
                            case "complete":
                                this.completeTask(row)
                                break;
                            case "cancel":
                                this.cancelTask(row)
                                break;
                        }
                    },
                    completeTask(row) {
                        let that = this
                        this.$confirm('确定完成该任务吗?', '提示', {
                            confirmButtonText: '确定',
                            cancelButtonText: '取消',
                            type: 'warning'
                        }).then(() => {
                            $.ajax({
                                url: baseUrl + "/openapi/completeTask",
                                contentType: 'application/json',
                                headers: {
                                    'token': localStorage.getItem('token')
                                },
                                data: JSON.stringify({
                                    wrkNo: row.wrkNo,
                                }),
                                method: 'POST',
                                success: function(res) {
                                    if (res.code == 200) {
                                        that.$message({
                                            message: "完成成功",
                                            type: 'success'
                                        });
                                        that.getTableData()
                                    } else if (res.code === 403) {
                                        top.location.href = baseUrl + "/";
                                    } else {
                                        that.$message({
                                            message: res.msg,
                                            type: 'error'
                                        });
                                    }
                                }
                            });
                        }).catch(() => {
                            // this.$message({
                            //     type: 'info',
                            //     message: '已取消删除'
                            // });
                        });
                    },
                    cancelTask(row) {
                        let that = this
                        this.$confirm('确定取消该任务吗?', '提示', {
                            confirmButtonText: '确定',
                            cancelButtonText: '取消',
                            type: 'warning'
                        }).then(() => {
                            $.ajax({
                                url: baseUrl + "/openapi/cancelTask",
                                contentType: 'application/json',
                                headers: {
                                    'token': localStorage.getItem('token')
                                },
                                data: JSON.stringify({
                                    wrkNo: row.wrkNo,
                                }),
                                method: 'POST',
                                success: function(res) {
                                    if (res.code == 200) {
                                        that.$message({
                                            message: "取消成功",
                                            type: 'success'
                                        });
                                        that.getTableData()
                                    } else if (res.code === 403) {
                                        top.location.href = baseUrl + "/";
                                    } else {
                                        that.$message({
                                            message: res.msg,
                                            type: 'error'
                                        });
                                    }
                                }
                            });
                        }).catch(() => {
                            // this.$message({
                            //     type: 'info',
                            //     message: '已取消删除'
                            // });
                        });
                    },
                    taskWrkFormConfirm() {
                        //修改指定任务数据
                        let that = this
                        $.ajax({
                            url: baseUrl + "/basCacheSite/update/auth",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: {
                                id: this.taskWrkForm.id,
                                siteStatus: this.taskWrkForm.siteStatus,
                                matnr: this.taskWrkForm.matnr,
                                wrkNo: this.taskWrkForm.wrkNo,
                                barcode: this.taskWrkForm.barcode,
                            },
                            method: 'POST',
                            success: function(res) {
                                if (res.code == 200) {
                                    that.taskWrkFormVisible = false
                                    that.$message({
                                        message: "更新成功",
                                        type: 'success'
                                    });
                                    that.getTableData()
                                } else if (res.code === 403) {
                                    top.location.href = baseUrl + "/";
                                } else {
                                    that.$message({
                                        message: res.msg,
                                        type: 'error'
                                    });
                                }
                            }
                        });
                    },
                },
            })
        </script>
    </body>
</html>