自动化立体仓库 - WMS系统
pang.jiabao
1 天以前 b51e3b3d5bb721cec65952498d1c2c882d1a01d6
wms功能完善
2个文件已添加
7个文件已删除
22个文件已修改
1942 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MesController.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskLog.java 255 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkDetl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/MesInApply.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/RcsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java 240 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/BareBoardScheduler.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/BlockScheduler.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/CheckDeepScheduler.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/JlerScheduler.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoLocMoveHandler.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/BareBoardHandler.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/CheckDeepHandler.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/JlerHandler.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/LogAspect.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/LicenseCheckListener.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/main.min.css 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basStation/basStation.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/task/task.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/taskLog/taskLog.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MesController.java
@@ -1,13 +1,19 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.BasStation;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.service.BasStationService;
import com.zy.asrs.service.MesService;
import com.zy.common.web.BaseController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@RestController
public class MesController extends BaseController {
@@ -28,9 +34,39 @@
    // 出库申请
    @PostMapping("/api/mes/outBoundOrder")
    public MesReturn outBoundOrder(@RequestBody MesInApply param){
        MesReturn mesReturn = new MesReturn();
        mesReturn.setSuccess(mesService.outBoundOrder(param) == 1 ? "1" : "2");
        // 终点为空,计算接驳位
        BasStation basStation = null;
        if (Cools.isEmpty(param.getNextStationId())) {
            List<BasStation> basStations = basStationService.selectList(new EntityWrapper<BasStation>().eq("loc_sts", "O"));
            if(basStations.isEmpty()) {
                mesReturn.setSuccess("2");
                mesReturn.setMessage("无空接驳位,请稍后再试!");
                return mesReturn;
            }
            // 接驳点
            basStation = basStations.get(0);
            param.setNextStationId(basStation.getDevNo());
            // 先更新接驳点状态
            basStation.setModiTime(new Date());
            basStation.setLocSts("S");
            basStation.setBarcode(param.getDjNo());
            basStationService.updateById(basStation);
        }
        int i = mesService.outBoundOrder(param);
        if(i == 1) {
            mesReturn.setSuccess("1");
        } else {
            // 释放接驳点
            if(basStation != null) {
                basStation.setModiTime(new Date());
                basStation.setLocSts("O");
                basStation.setBarcode("");
                basStationService.updateById(basStation);
            }
            mesReturn.setSuccess("2");
        }
        return mesReturn;
    }
@@ -66,11 +102,47 @@
        return mesService.allowOutStation(param);
    }
    // 下发运输任务
    @Resource
    private BasStationService basStationService;
    // 下发运输任务,mes调用下刀06(呼叫agv搬运)
    @PostMapping("/api/mes/submitTask")
    public JSONObject submitTask(@RequestBody TransTask param){
        // 终点为空,计算接驳位
        BasStation basStation = null;
        if (Cools.isEmpty(param.getNextStationId())) {
            List<BasStation> basStations = basStationService.selectList(new EntityWrapper<BasStation>().eq("loc_sts", "O"));
            if(basStations.isEmpty()) {
                JSONObject result = new JSONObject();
                result.put("taskno", param.getTaskno());
                result.put("Success", "2");
                result.put("Message", "无空接驳位,请稍后再试!");
                return result;
            }
            // 接驳点
            basStation = basStations.get(0);
            param.setNextStationId(basStation.getDevNo());
        return mesService.submitTask(param);
            // 先更新接驳点状态
            basStation.setModiTime(new Date());
            basStation.setLocSts("S");
            basStation.setBarcode(param.getDjNo());
            basStationService.updateById(basStation);
        }
        param.setAgvFactory(1); // 海康
        param.setNextStationId("A1");
        JSONObject sendAgvTask = mesService.submitTask(param);
        if (!"1".equals(sendAgvTask.getString("Success"))) {
            // 释放接驳点
            if(basStation != null) {
                basStation.setModiTime(new Date());
                basStation.setLocSts("O");
                basStation.setBarcode("");
                basStationService.updateById(basStation);
            }
        }
        return sendAgvTask;
    }
    // 接受成品刀可以入库二维码
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -60,6 +60,21 @@
    @Resource
    private StaDescService staDescService;
    // 退空托盘返回产线 pda上操作空托返回产线(刀架返回)
    @GetMapping("/djReturn/auth")
    public R tkt(@RequestParam String djNo){
        return mobileService.djReturn(djNo);
    }
    @RequestMapping("/comb/auth")
    @ManagerAuth(memo = "组托")
    public R comb(@RequestBody CombParam combParam){
        mobileService.comb(combParam, getUserId());
        return R.ok("组托成功");
    }
    // 输送线流动
    @RequestMapping("/pda/WarehouseOut/v1")
    @ManagerAuth(memo = "并板途中拣料-参考念初")
    public R WarehouseOutV1(@RequestBody CombParam combParam) {
@@ -251,12 +266,7 @@
        return R.ok().add(combParams);
    }
    @RequestMapping("/comb/auth")
    @ManagerAuth(memo = "组托")
    public R comb(@RequestBody CombParam combParam){
        mobileService.comb(combParam, getUserId());
        return R.ok("组托成功");
    }
    @RequestMapping("/pack/get/auth")
    @ManagerAuth
src/main/java/com/zy/asrs/entity/TaskLog.java
@@ -1,28 +1,24 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;import com.core.common.SpringUtils;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.*;
import com.zy.asrs.entity.WrkMast;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasWrkStatusService;
import com.zy.asrs.entity.BasWrkStatus;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasWrkIotypeService;
import com.zy.asrs.entity.BasWrkIotype;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasCrnpService;
import com.zy.asrs.entity.BasCrnp;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.entity.LocMast;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.entity.BasDevp;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasDevpService;
@@ -69,7 +65,15 @@
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "")
//    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 任务类型: agv  , crn
     */
    @ApiModelProperty(value= "任务类型: agv  , crn")
    @TableField("task_type")
    private String taskType;
    /**
     * 工作号
@@ -79,15 +83,10 @@
    private Integer wrkNo;
    @ApiModelProperty(value= "")
    @TableField("log_id")
    private Long logId;
    @ApiModelProperty(value= "")
    @TableField("inv_wh")
    private String invWh;
    @ApiModelProperty(value= "")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date ymd;
    @ApiModelProperty(value= "")
@@ -102,7 +101,7 @@
     */
    @ApiModelProperty(value= "工作状态")
    @TableField("wrk_sts")
    private Integer wrkSts;
    private Long wrkSts;
    /**
     * 入出库类型
@@ -112,9 +111,9 @@
    private Integer ioType;
    /**
     * 堆垛机号
     * 堆垛机
     */
    @ApiModelProperty(value= "堆垛机号")
    @ApiModelProperty(value= "堆垛机")
    @TableField("crn_no")
    private Integer crnNo;
@@ -131,7 +130,6 @@
    @ApiModelProperty(value= "")
    @TableField("wrk_date")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date wrkDate;
    /**
@@ -146,14 +144,14 @@
     */
    @ApiModelProperty(value= "目标站")
    @TableField("sta_no")
    private Integer staNo;
    private String staNo;
    /**
     * 源站
     */
    @ApiModelProperty(value= "源站")
    @TableField("source_sta_no")
    private Integer sourceStaNo;
    private String sourceStaNo;
    /**
     * 源库位
@@ -167,9 +165,9 @@
    private String locSts;
    /**
     * 拣料(checkBox)
     * 拣料
     */
    @ApiModelProperty(value= "拣料(checkBox)")
    @ApiModelProperty(value= "拣料")
    private String picking;
    @ApiModelProperty(value= "")
@@ -185,9 +183,9 @@
    private String updMk;
    /**
     * 退出(checkBox)
     * 退出
     */
    @ApiModelProperty(value= "退出(checkBox)")
    @ApiModelProperty(value= "退出")
    @TableField("exit_mk")
    private String exitMk;
@@ -196,9 +194,9 @@
    private Integer pltType;
    /**
     * 空板(checkBox)
     * 空板
     */
    @ApiModelProperty(value= "空板(checkBox)")
    @ApiModelProperty(value= "空板")
    @TableField("empty_mk")
    private String emptyMk;
@@ -207,7 +205,6 @@
     */
    @ApiModelProperty(value= "工作时间")
    @TableField("io_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date ioTime;
    @ApiModelProperty(value= "")
@@ -234,7 +231,6 @@
     */
    @ApiModelProperty(value= "堆垛机启动时间")
    @TableField("crn_str_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date crnStrTime;
    /**
@@ -242,20 +238,14 @@
     */
    @ApiModelProperty(value= "堆垛机停止时间")
    @TableField("crn_end_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date crnEndTime;
    /**
     * 拣料时间
     */
    @ApiModelProperty(value= "拣料时间")
    @ApiModelProperty(value= "")
    @TableField("plc_str_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date plcStrTime;
    @ApiModelProperty(value= "")
    @TableField("crn_pos_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date crnPosTime;
    @ApiModelProperty(value= "")
@@ -270,9 +260,11 @@
    @TableField("ref_wrkno")
    private Double refWrkno;
    @ApiModelProperty(value= "")
    /**
     * 拣料时间
     */
    @ApiModelProperty(value= "拣料时间")
    @TableField("ref_iotime")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date refIotime;
    /**
@@ -287,7 +279,6 @@
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("modi_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date modiTime;
    /**
@@ -302,7 +293,6 @@
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("appe_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date appeTime;
    @ApiModelProperty(value= "")
@@ -311,7 +301,6 @@
    @ApiModelProperty(value= "")
    @TableField("error_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date errorTime;
    @ApiModelProperty(value= "")
@@ -326,9 +315,11 @@
    @TableField("manu_type")
    private String manuType;
    @ApiModelProperty(value= "")
    @TableField("memo_m")
    private String memoM;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    @ApiModelProperty(value= "")
    @TableField("sc_weight")
@@ -340,7 +331,6 @@
    @ApiModelProperty(value= "")
    @TableField("log_err_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date logErrTime;
    @ApiModelProperty(value= "")
@@ -353,6 +343,7 @@
    @ApiModelProperty(value= "条码")
    private String barcode;
    // Y:销售订单出库任务
    @ApiModelProperty(value= "")
    @TableField("Pdc_type")
    private String PdcType;
@@ -362,160 +353,34 @@
    private String ctnNo;
    /**
     * 满板(checkBox)
     * 满板
     */
    @ApiModelProperty(value= "满板(checkBox)")
    @ApiModelProperty(value= "满板")
    @TableField("full_plt")
    private String fullPlt;
    @ApiModelProperty(value= "")
    /**
     * 先入品 / 双重入库
     */
    @ApiModelProperty(value= "先入品")
    @TableField("pre_have")
    private String preHave;
    @ApiModelProperty(value= "")
    /**
     * 空操作 / 取货无箱
     */
    @ApiModelProperty(value= "空操作")
    @TableField("take_none")
    private String takeNone;
    @ApiModelProperty(value= "")
    @TableField("line_number")
    private Long lineNumber;
    /**
     * 外部任务编号
     */
    @ApiModelProperty(value= "外部任务编号")
    @TableField("task_no")
    private String taskNo;
    public TaskLog() {}
    public TaskLog(Long id,Integer wrkNo,Long logId,String invWh,Date ymd,String mk,Integer whsType,Integer wrkSts,Integer ioType,Integer crnNo,String sheetNo,Double ioPri,Date wrkDate,String locNo,Integer staNo,Integer sourceStaNo,String sourceLocNo,String locSts,String picking,String linkMis,String onlineYn,String updMk,String exitMk,Integer pltType,String emptyMk,Date ioTime,Integer ctnType,String packed,String oveMk,Double mtnType,String userNo,Date crnStrTime,Date crnEndTime,Date plcStrTime,Date crnPosTime,Double loadTime,Double expTime,Double refWrkno,Date refIotime,Long modiUser,Date modiTime,Long appeUser,Date appeTime,String pauseMk,Date errorTime,String errorMemo,Integer ctnKind,String manuType,String memoM,Double scWeight,String logMk,Date logErrTime,String logErrMemo,String barcode,String PdcType,String ctnNo,String fullPlt,String preHave,String takeNone,Long lineNumber) {
        this.id = id;
        this.wrkNo = wrkNo;
        this.logId = logId;
        this.invWh = invWh;
        this.ymd = ymd;
        this.mk = mk;
        this.whsType = whsType;
        this.wrkSts = wrkSts;
        this.ioType = ioType;
        this.crnNo = crnNo;
        this.sheetNo = sheetNo;
        this.ioPri = ioPri;
        this.wrkDate = wrkDate;
        this.locNo = locNo;
        this.staNo = staNo;
        this.sourceStaNo = sourceStaNo;
        this.sourceLocNo = sourceLocNo;
        this.locSts = locSts;
        this.picking = picking;
        this.linkMis = linkMis;
        this.onlineYn = onlineYn;
        this.updMk = updMk;
        this.exitMk = exitMk;
        this.pltType = pltType;
        this.emptyMk = emptyMk;
        this.ioTime = ioTime;
        this.ctnType = ctnType;
        this.packed = packed;
        this.oveMk = oveMk;
        this.mtnType = mtnType;
        this.userNo = userNo;
        this.crnStrTime = crnStrTime;
        this.crnEndTime = crnEndTime;
        this.plcStrTime = plcStrTime;
        this.crnPosTime = crnPosTime;
        this.loadTime = loadTime;
        this.expTime = expTime;
        this.refWrkno = refWrkno;
        this.refIotime = refIotime;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.appeUser = appeUser;
        this.appeTime = appeTime;
        this.pauseMk = pauseMk;
        this.errorTime = errorTime;
        this.errorMemo = errorMemo;
        this.ctnKind = ctnKind;
        this.manuType = manuType;
        this.memoM = memoM;
        this.scWeight = scWeight;
        this.logMk = logMk;
        this.logErrTime = logErrTime;
        this.logErrMemo = logErrMemo;
        this.barcode = barcode;
        this.PdcType = PdcType;
        this.ctnNo = ctnNo;
        this.fullPlt = fullPlt;
        this.preHave = preHave;
        this.takeNone = takeNone;
        this.lineNumber = lineNumber;
    }
//    TaskLog taskLog = new TaskLog(
//            null,    //
//            null,    // 工作号[非空]
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    // 工作状态
//            null,    // 入出库类型
//            null,    // 堆垛机号
//            null,    //
//            null,    // 优先级
//            null,    //
//            null,    // 目标库位
//            null,    // 目标站
//            null,    // 源站
//            null,    // 源库位
//            null,    //
//            null,    // 拣料(checkBox)
//            null,    //
//            null,    //
//            null,    //
//            null,    // 退出(checkBox)
//            null,    //
//            null,    // 空板(checkBox)
//            null,    // 工作时间
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    // 堆垛机启动时间
//            null,    // 堆垛机停止时间
//            null,    // 拣料时间
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    // 修改人员
//            null,    // 修改时间
//            null,    // 创建者
//            null,    // 添加时间
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null,    // 条码
//            null,    //
//            null,    //
//            null,    // 满板(checkBox)
//            null,    //
//            null,    //
//            null    //
//    );
    public String getWrkNo$(){
        WrkMastService service = SpringUtils.getBean(WrkMastService.class);
        WrkMast wrkMast = service.selectById(this.wrkNo);
        if (!Cools.isEmpty(wrkMast)){
            return String.valueOf(wrkMast.getId());
        }
        return null;
    }
    public String getYmd$(){
        if (Cools.isEmpty(this.ymd)){
@@ -567,9 +432,19 @@
        return null;
    }
    public String getTaskType$(){
        if (Cools.isEmpty(this.taskType)){return  null;}
        if (taskType.equals("AGV")) {
            return "AGV任务";
        } else {
            return "堆垛机任务";
        }
    }
    public String getStaNo$(){
        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
        BasDevp basDevp = service.selectById(this.staNo);
        BasStationService service = SpringUtils.getBean(BasStationService.class);
        BasStation basDevp = service.selectOne(new EntityWrapper<BasStation>().eq("dev_no", this.staNo));
        if (!Cools.isEmpty(basDevp)){
            return String.valueOf(basDevp.getDevNo());
        }
@@ -577,8 +452,8 @@
    }
    public String getSourceStaNo$(){
        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
        BasDevp basDevp = service.selectById(this.sourceStaNo);
        BasStationService service = SpringUtils.getBean(BasStationService.class);
        BasStation basDevp = service.selectOne(new EntityWrapper<BasStation>().eq("dev_no", this.sourceStaNo));
        if (!Cools.isEmpty(basDevp)){
            return String.valueOf(basDevp.getDevNo());
        }
@@ -640,7 +515,7 @@
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.modiUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getNickname());
            return String.valueOf(user.getUsername());
        }
        return null;
    }
@@ -656,7 +531,7 @@
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getNickname());
            return String.valueOf(user.getUsername());
        }
        return null;
    }
@@ -675,12 +550,12 @@
        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);
    }
}
src/main/java/com/zy/asrs/entity/WrkDetl.java
@@ -10,6 +10,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.text.SimpleDateFormat;
@@ -401,7 +402,7 @@
    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
        BeanUtils.copyProperties(source,this);
    }
}
src/main/java/com/zy/asrs/entity/mes/MesInApply.java
@@ -30,6 +30,10 @@
    @JsonProperty("stationId")
    private String stationId;
    @JsonProperty("NextStationId")
    @JSONField(name = "NextStationId")
    private String NextStationId;
    // 生产订单号
    @JsonProperty("orderNo")
    @JSONField(name = "orderNo")
@@ -40,6 +44,8 @@
    @JSONField(name = "taskNo")
    private String taskNo;
    private String taskname;
    // agv运输类型
    @JsonProperty("transType")
    @JSONField(name = "transType")
@@ -50,6 +56,10 @@
    @JSONField(name = "createTime")
    private String createTime;
    // 刀架编号
    @JsonProperty("DJNo")
    private String djNo;
    // 入库详情
    @JsonProperty("details")
    @JSONField(name = "details")
src/main/java/com/zy/asrs/service/MobileService.java
@@ -99,4 +99,10 @@
     * @version 1.0
     */
    R OutCallAgv(AgvCallParams params, Long userId);
    /**
     * 刀架返回
     * @param djNo 刀架号
     */
    R djReturn(String djNo);
}
src/main/java/com/zy/asrs/service/RcsService.java
@@ -20,7 +20,7 @@
     * @param rcsFactory 1 海康;2 华晓;
     * @return
     */
    int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory);
    RcsReturn submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory);
    /**
     * 2.1.3任务继续执行接口
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -4,6 +4,7 @@
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
@@ -272,6 +273,7 @@
     * @param mesOutApply
     * @return 1 成功;-1 订单重复;
     */
    @Transactional
    public int outBoundOrder(MesInApply mesOutApply){
        // docType根据库类型确定
@@ -300,7 +302,7 @@
        orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
        orderPakout.setPakinPakoutStatus(2);
        if (!orderPakoutService.insert(orderPakout)) {
            log.error("MES保存出库订单主档失败");
            log.error("MES保存出库订单主档失败:{}",orderPakout);
            throw new CoolException("保存出库订单主档失败");
        }
@@ -310,7 +312,7 @@
            OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
            orderDetlPakout.setOrderId(orderPakout.getId());
            orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
            orderDetlPakout.setAnfme(Double.valueOf(item.getAnfme()));
            orderDetlPakout.setAnfme(item.getAnfme());
            orderDetlPakout.setQty(0.0);
            orderDetlPakout.setMatnr(mat.getMatnr());
            orderDetlPakout.setMaktx(mat.getMaktx());
@@ -323,61 +325,37 @@
            orderDetlPakout.setStatus(1);
            orderDetlPakout.setPakinPakoutStatus(2);
            if (!orderDetlPakoutService.insert(orderDetlPakout)) {
                log.error("MES保存出库订单明细档失败");
                log.error("MES保存出库订单明细档失败:{}",orderDetlPakout);
                throw new CoolException("保存出库订单明细档失败");
            }
        }
        // TODO:CTU出库动作
        // todo 呼叫agv产线取空料架
        // TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。
        // 立库生成订单后,自动调度AGV从产线运输空刀架至立库缓存区。
        try {
            if (!StringUtils.isEmpty(mesOutApply.getTaskNo()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
                TransTask transTask = new TransTask();
                transTask.setTaskno(mesOutApply.getTaskNo());
//                        transTask.setTaskname(mesOutApply.getTaskname());
                transTask.setTaskname(mesOutApply.getTaskname());
                transTask.setOrderNo(mesOutApply.getOrderNo());
                transTask.setTransType("02");    //运回刀架时默认02(下空托) mesOutApply.getTransType()
                transTask.setCurProcess(mesOutApply.getProductLineId());
                transTask.setCurStationId(mesOutApply.getStationId());
//                        transTask.setNextProcess();
                transTask.setNextStationId(WMS_TRANS_START_STATION_1);
                transTask.setNextProcess(mesOutApply.getProductLineId());
                transTask.setNextStationId(mesOutApply.getNextStationId());
//                transTask.setItemno(mesOutApply.getItemNo());
                transTask.setQty(0);
                transTask.setQty(1);
                transTask.setProductLineId(mesOutApply.getProductLineId());
//                        transTask.setItemBarcode(codes);
//                        transTask.setTuoPanId(entry.getKey());
                transTask.setDjNo(mesOutApply.getDjNo());
                transTask.setOperateType(1);
                transTask.setAgvFactory(1);
                JSONObject sendAgvTask = submitTask(transTask);
                if (!"1".equals(sendAgvTask.getString("Success"))) {
                    log.error("出库下发agv运输任务失败", JSONObject.toJSONString(transTask));
                    log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                }
//                // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码
////                String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
//                EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
//                matItemBarcodeEntityWrapper.in("item_barcode", barCode);
//                List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
//                if (barcodes != null) {
//                    Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
//                    for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
//                        List<MatItemBarcode> list = entry.getValue();
//                        List<String> codes = new ArrayList<>();
//                        for (MatItemBarcode zapllet : list) {
//                            codes.add(zapllet.getItemBarcode());
//                        }
//
//
//                    }
//                }
            }
        } catch (Exception e) {
            log.error("下发AGV运输任务失败", e);
        }
        return 1;
    }
@@ -423,6 +401,7 @@
     * @param mesInApply
     * @return 1 成功;-1 入库订单重复;0 部分失败;
     */
    @Transactional
    public int inBoundOrder(MesInApply mesInApply, int check){
        // docType根据库类型确定
@@ -461,7 +440,7 @@
            OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
            orderDetlPakin.setOrderId(orderPakin.getId());
            orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
            orderDetlPakin.setAnfme(Double.valueOf(item.getAnfme()));
            orderDetlPakin.setAnfme(item.getAnfme());
            orderDetlPakin.setQty(0.0);
            orderDetlPakin.setMatnr(mat.getMatnr());
            orderDetlPakin.setMaktx(mat.getMaktx());
@@ -483,6 +462,28 @@
            }
        }
        // 呼叫agv搬运
        if (!StringUtils.isEmpty(mesInApply.getTaskNo())) {
            TransTask transTask = new TransTask();
            transTask.setTaskno(mesInApply.getTaskNo());
            transTask.setTaskname(mesInApply.getTaskNo());
            transTask.setOrderNo(mesInApply.getOrderNo());
            transTask.setTransType(mesInApply.getTransType());
            transTask.setCurProcess(mesInApply.getProductLineId());
            transTask.setCurStationId(mesInApply.getStationId());
            transTask.setNextStationId(WMS_TRANS_START_STATION_1);
//            transTask.setItemno(mesInApply.get());
//            transTask.setQty(mesInApply.getQty());
            transTask.setProductLineId(mesInApply.getProductLineId());
//            transTask.setItemBarcode(itemBarcode);
            transTask.setDjNo(mesInApply.getDjNo());
            transTask.setOperateType(1);
            transTask.setAgvFactory(1);
            JSONObject sendAgvTask = submitTask(transTask);
            if (!"1".equals(sendAgvTask.getString("Success"))) {
                log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
            }
        }
//        // TODO:是否绑定货物和托盘?
@@ -726,11 +727,32 @@
        List<Task> tasks = taskService.selectList(wrapper);
        if (tasks != null && !tasks.isEmpty()) {
            result.put("Success", "2");
            result.put("Message", "任务重复发送");
            result.put("Message", "任务号重复发送:" + transTask.getTaskno());
            return result;
        }
        try {
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        // 模板名
        rcsTaskSubmit.setTaskType("CS");
        rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
        RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
        startRoute.setSeq(0);
        startRoute.setCode(transTask.getCurStationId());
        startRoute.setOperation("COLLECT");
        targetRouteList.add(startRoute);
        RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
        endRoute.setSeq(1);
        endRoute.setCode(transTask.getNextStationId());
        endRoute.setOperation("DELIVERY");
        targetRouteList.add(endRoute);
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        // 转发给海康或华晓RCS
        RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (rcsReturn.getCode().equals("SUCCESS")) {
            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
            Date now = new Date();
            Task task = new Task();
@@ -747,87 +769,30 @@
            task.setAppeUser(defaultUserId);
            task.setAppeTime(now);
            task.setTaskNo(transTask.getTaskno());
            task.setBarcode(transTask.getDjNo()); // 刀架号
            task.setMemo(JSONObject.toJSONString(transTask));
            taskService.insert(task);
            if (taskService.insert(task)) {
                Mat mat = matService.selectByMatnr("emptyDj");
                TaskDetl taskDetl = new TaskDetl();
                taskDetl.setWrkNo(task.getWrkNo());
                taskDetl.setIoTime(task.getIoTime());
                taskDetl.setMatnr(mat.getMatnr());
                taskDetl.setAnfme(0.0);
                taskDetl.setStandby1(String.valueOf(transTask.getQty()));
                taskDetl.setMaktx(mat.getMaktx());
                taskDetl.setSpecs(mat.getSpecs());
                taskDetl.setOrderNo(transTask.getOrderNo());
                taskDetl.setModiUser(defaultUserId);
                taskDetl.setModiTime(now);
                taskDetl.setAppeUser(defaultUserId);
                taskDetl.setAppeTime(now);
                taskDetlService.insert(taskDetl);
            Mat mat = matService.selectByMatnr("emptyDj");
            TaskDetl taskDetl = new TaskDetl();
            taskDetl.setWrkNo(task.getWrkNo());
            taskDetl.setIoTime(task.getIoTime());
            taskDetl.setMatnr(mat.getMatnr());
            taskDetl.setAnfme(1.0);
            taskDetl.setMaktx(mat.getMaktx());
            taskDetl.setSpecs(mat.getSpecs());
            taskDetl.setOrderNo(transTask.getOrderNo());
            taskDetl.setModiUser(defaultUserId);
            taskDetl.setModiTime(now);
            taskDetl.setAppeUser(defaultUserId);
            taskDetl.setAppeTime(now);
            taskDetlService.insert(taskDetl);
            result.put("Success", "1");
            result.put("Message", "任务接收成功");
//                EntityWrapper<WaitPakin> wrapper1 = new EntityWrapper<>();
//                wrapper1.eq("order_no", transTask.getTaskno())
//                        .eq("matnr", mat.getMatnr())
//                        .eq("anfme", transTask.getQty());
//                WaitPakin waitPakin = waitPakinService.selectOne(wrapper1);
//                if (waitPakin != null)
//                {
//                    TaskDetl taskDetl = new TaskDetl();
//                    taskDetl.setWrkNo(task.getWrkNo());
//                    taskDetl.setIoTime(task.getIoTime());
//                    taskDetl.setMatnr(transTask.getItemno());
//                taskDetl.setAnfme(Double.valueOf(transTask.getQty()));
//                    taskDetl.setAnfme(0.0);
//                    taskDetl.setStandby1(String.valueOf(transTask.getQty()));
//                    taskDetl.setZpallet(waitPakin.getZpallet());
//                    taskDetl.setMaktx(mat.getMaktx());
//                    taskDetl.setSpecs(mat.getSpecs());
//                    taskDetl.setOrderNo(transTask.getOrderNo());
//                    taskDetl.setModiUser(defaultUserId);
//                    taskDetl.setModiTime(now);
//                    taskDetl.setAppeUser(defaultUserId);
//                    taskDetl.setAppeTime(now);
//                    taskDetlService.insert(taskDetl);
//                }
//                else {
//                    result.put("Success", "2");
//                    result.put("Message", "接收任务失败");
//                    // Throw
//                }
                // 下发给RCS
                RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
                rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
                rcsTaskSubmit.setInitPriority(10);  //默认10
                List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
                RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
                startRoute.setSeq(0);
                startRoute.setCode(transTask.getCurStationId());
                startRoute.setOperation("COLLECT");
                targetRouteList.add(startRoute);
                RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
                endRoute.setSeq(1);
                endRoute.setCode(transTask.getNextStationId());
                endRoute.setOperation("DELIVERY");
                targetRouteList.add(endRoute);
                rcsTaskSubmit.setTargetRoute(targetRouteList);
                // 转发给海康或华晓RCS
                int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
                if (success == 1) {
                    result.put("Success", "1");
                    result.put("Message", "任务接收成功");
                } else {
                    result.put("Success", "2");
                    result.put("Message", "任务下发给RCS失败");
                }
            } else {
                result.put("Success", "2");
                result.put("Message", "接收任务失败");
            }
        } catch (Exception e) {
            log.error("下发运输任务错位 - {}", transTask, e);
        } else {
            result.put("Success", "2");
            result.put("Message", "任务下发给RCS失败");
        }
        return result;
@@ -1061,9 +1026,8 @@
            task.setMemo(JSONObject.toJSONString(transTask));
            taskService.updateById(task);
            // 转发给海康或华晓RCS
            int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
            if (success == 1) {
            RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
            if (rcsReturn.getCode().equals("SUCCESS")) {
                flag = true;
            }
        } catch (Exception e) {
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -7,7 +7,11 @@
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.TransTask;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.rcs.RcsReturn;
import com.zy.asrs.entity.rcs.RcsTaskSubmit;
import com.zy.asrs.entity.rcs.RcsTaskTargetRoute;
import com.zy.asrs.enums.CommonEnum;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.mapper.LocMastMapper;
@@ -19,6 +23,7 @@
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
@@ -114,6 +119,85 @@
    private BasStationService basStationService;
    @Autowired
    private BasContainerService basContainerService;
    @Resource
    private RcsService rcsService;
    @Override
    @Transactional
    public R djReturn(String djNo) {
        Task task = taskService.selectOne(new EntityWrapper<Task>().eq("barcode", djNo));
        if(task == null) {
            log.error("刀架号:{},不存在任务!",djNo);
            return R.parse("刀架号:"+djNo+"不存在任务");
        } else if(task.getWrkSts() == 305) {
            task.setWrkSts(301L);
            task.setModiTime(new Date());
            task.setTaskNo(task.getTaskNo()+"-1"); // 更新任务号
            String sourceStaNo = task.getSourceStaNo();
            task.setSourceStaNo(task.getStaNo());
            task.setStaNo(sourceStaNo);
            TransTask transTask = JSONObject.parseObject(task.getMemo(), TransTask.class);
            transTask.setTaskno(task.getTaskNo());
            transTask.setCurStationId(sourceStaNo);
            transTask.setNextStationId(task.getStaNo());
            if(transTask.getTransType().equals("06")) {
                transTask.setTransType("01");
            } else if(transTask.getTransType().equals("02")) {
                transTask.setTransType("05");
            } else{
                log.error("刀架号:{},运输类型有误:{}",djNo,transTask.getTransType());
                return R.parse("刀架号:"+djNo+",运输类型有误:" + transTask.getTransType());
            }
            // 更新备注
            task.setMemo(JSONObject.toJSONString(transTask));
            // 下发给RCS
            RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
            // 模板名
            rcsTaskSubmit.setTaskType("CS");
            rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
            rcsTaskSubmit.setInitPriority(10);  //默认10
            List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
            RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
            startRoute.setSeq(0);
            startRoute.setCode(transTask.getCurStationId());
            startRoute.setOperation("COLLECT");
            targetRouteList.add(startRoute);
            RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
            endRoute.setSeq(1);
            endRoute.setCode(transTask.getNextStationId());
            endRoute.setOperation("DELIVERY");
            targetRouteList.add(endRoute);
            rcsTaskSubmit.setTargetRoute(targetRouteList);
            // 转发给海康或华晓RCS
            RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
            if (rcsReturn.getCode().equals("SUCCESS")) {
                // 更新agv任务记录
                taskService.updateById(task);
                // 更新接驳位状态
                BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getSourceStaNo()));
                if(station.getLocSts().equals("F")) {
                    station.setLocSts("R");
                    station.setModiTime(new Date());
                    basStationService.updateById(station);
                } else {
                    log.error("agv回调end,接驳点状态不为F,agv任务号:{},状态:{}",task.getTaskNo(),task.getWrkSts());
                }
            } else {
                log.error("下发rcs搬运命令失败:{}",rcsReturn);
                return R.parse("下发rcs失败:" + rcsReturn.getMessage());
            }
            return R.ok("RCS命令下发成功!");
        }else {
            log.error("刀架号:{},任务状态不对:{}",djNo,task.getWrkSts());
            return R.parse("刀架号:"+djNo+",任务状态不对:" + task.getWrkSts());
        }
    }
    @Override
    @Transactional
@@ -606,11 +690,12 @@
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
                }
//                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
//                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
//                }
                WaitPakin waitPakin = new WaitPakin();
                BeanUtils.copyProperties(mat, waitPakin);
                waitPakin.setMemo("");
                waitPakin.setBatch(detlDto.getBatch());
                waitPakin.setZpallet(param.getBarcode());
                waitPakin.setIoStatus("N");
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service.impl;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.*;
@@ -39,6 +40,8 @@
    @Value("${mes.defaultUserId}")
    public long defaultUserId;
    @Resource
    private BasStationService basStationService;
    @Resource
    private MesService mesService;
@@ -155,6 +158,9 @@
    // region 海康RCS,AGV
    @Resource
    private ApiLogService apiLogService;
    /**
     * 2.1.2任务下发接口
     * 厂家:海量、华晓
@@ -163,23 +169,47 @@
     * @param rcsFactory 1 海康;2 华晓;
     * @return
     */
    public int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
        return 1;
    public RcsReturn submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
        RcsReturn rcsReturn = new RcsReturn();
        boolean success = false;
        String url = rcsFactory == 2 ? HX_URL : HIK_URL + "api/robot/controller/task/submit";
        String response = "";
        try {
            response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit));
            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
                if ("SUCCESS".equals(rcsReturn.getCode())) {
                    // 模拟返回
//            rcsReturn.setCode("SUCCESS");
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.put("robotTaskCode","2025121301");
//            rcsReturn.setData(jsonObject);
                    success = true;
//        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/submit";
//        String response = sendPost(url, rcsTaskSubmit.toString());
//        if (!StringUtils.isEmpty(response) && response.contains("code")){
//            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
//            if("SUCCESS".equals(rcsReturn.getCode())) {
//                JSONObject data = rcsReturn.getData();
//                String robotTaskCode = data.getString("robotTaskCode");
//                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
//                    return 1;
//                }
//            }
//        }
//
//        return 0;
                    log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                } else {
                    log.error("呼叫agv搬运失败!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                }
            }
        } catch (Exception e) {
            log.error("呼叫agv搬运异常", e);
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "呼叫agv搬运",
                        url,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(rcsTaskSubmit),
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("呼叫agv搬运保存接口日志异常", e);
            }
        }
        return rcsReturn;
    }
    /**
@@ -192,7 +222,7 @@
    public int continueTask(RcsTaskContinue rcsTaskContinue, int rcsFactory){
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/extend/continue";
        String response = sendPost(url, rcsTaskContinue.toString());
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
@@ -217,7 +247,7 @@
    public int cancelTask(RcsTaskCancel rcsTaskCancel, int rcsFactory){
        String url = rcsFactory == 2 ? HX_URL :HIK_URL  + "api/robot/controller/task/cancel";
        String response = sendPost(url, rcsTaskCancel.toString());
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskCancel));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
@@ -242,7 +272,7 @@
    private int notifyEqpt(RcsEqptNotify rcsEqptNotify, int rcsFactory){
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/wcs/robot/eqpt/notify";
        String response = sendPost(url, rcsEqptNotify.toString());
        String response = sendPost(url, JSONObject.toJSONString(rcsEqptNotify));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
@@ -274,9 +304,43 @@
        // start : 任务开始;outbin : 走出储位;end : 任务完成
        String method = values.getString("method");
        String carrierType = values.getString("carrierType");
        Date now = new Date();
        try {
            if ("Q3".equals(carrierType) || "Q8".equals(carrierType)) {    //AGV
            if (singleRobotCode.equals("14") || singleRobotCode.equals("15")) { // 两台CTU库机器人编号
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("task_no", robotTaskCode));
                if(wrkMast != null) {
                    Integer ioType = wrkMast.getIoType();
                    switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                        case TASK_START: {
                            if (ioType == 1 || ioType == 10 || ioType == 53) {
                                wrkMast.setCrnStrTime(now);
                                wrkMast.setModiTime(now);
                                wrkMastService.updateById(wrkMast);
                            } else if (ioType == 101 || ioType == 110 || ioType == 103) {
                            } else {
                                log.error("{}ioType{}不在end反馈处理中", wrkMast.getWrkNo(), ioType);
                            }
                        }
                        break;
                        case TASK_END: {
                            if (ioType == 1 || ioType == 10 || ioType == 53) {
                                wrkMast.setWrkSts(4L);
                                wrkMast.setCrnEndTime(now);
                                wrkMast.setModiTime(now);
                                wrkMastService.updateById(wrkMast);
                            } else if (ioType == 101 || ioType == 110 || ioType == 103) {
                            } else {
                                log.error("{}ioType{}不在end反馈处理中", wrkMast.getWrkNo(), ioType);
                            }
                        }
                        break;
                        default:
                    }
                }
            } else { //AGV
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
@@ -292,6 +356,17 @@
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
                        if(memo.getString("TransType").equals("05") || memo.getString("TransType").equals("01")) {
                            BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getSourceStaNo()));
                            if(station.getLocSts().equals("R")) {
                                station.setLocSts("O");
                                station.setBarcode("");
                                station.setModiTime(new Date());
                                basStationService.updateById(station);
                            } else {
                                log.error("agv回调start,接驳点状态不为R,agv任务号:{},状态:{}",task.getTaskNo(),task.getWrkSts());
                            }
                        }
                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
@@ -300,12 +375,28 @@
//                    case TASK_OUT_BIN: {} break;
                    case TASK_END: {
                        // 更新任务状态等内部逻辑
                        task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        if(memo.getString("TransType").equals("06") || memo.getString("TransType").equals("02")) {
                            // 06下刀来的空刀架需要回去,02来的要上刀05的空刀架上满后需要回去,pda上做任务转换
                            task.setWrkSts(305L); // 305.任务转换
                            BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo()));
                            if(station.getLocSts().equals("S")) {
                                station.setLocSts("F");
                                station.setModiTime(new Date());
                                basStationService.updateById(station);
                            } else {
                                log.error("agv回调end,接驳点状态不为S,agv任务号:{},状态:{}",task.getTaskNo(),task.getWrkSts());
                            }
                        } else {
                            task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        }
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        taskService.updateById(task);
                        // 任务完成
                        mesService.reporterTask(rcsReporterTask);
                        // 更新接驳位置状态
//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
//                    wapper2.eq("wrk_no", task.getWrkNo())
@@ -353,7 +444,7 @@
                        TransArrivalStation arrivalStation = new TransArrivalStation();
                        arrivalStation.setTaskno(robotTaskCode);
                        arrivalStation.setTaskname(memo.getString("taskName"));
                        arrivalStation.setTuoPanId(taskDetl == null || taskDetl.getZpallet() == null ? "" : taskDetl.getZpallet());
//                        arrivalStation.setTuoPanId(taskDetl == null || taskDetl.getZpallet() == null ? "" : taskDetl.getZpallet());
                        arrivalStation.setDaotype(memo.getString("TransType"));
                        arrivalStation.setProductLineId(memo.getString("ProductLineId"));
//                        arrivalStation.setStationId(task.getStaNo());
@@ -379,53 +470,54 @@
                    } break;
                    default: {} break;
                }
            } else if ("CTU".equals(carrierType)) { //CTU
                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                WrkMast task = wrkMastService.selectOne(wrapper);
                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                    rcsReturn.setCode("Err_RobotCodeNotMatch");
                    rcsReturn.setMessage("");
                    JSONObject data = new JSONObject();
                    data.put("robotTaskCode", robotTaskCode);
                    rcsReturn.setData(data);
                    return rcsReturn;
                }
//                JSONObject memo = JSONObject.parseObject(task.getMemo());
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
//                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
            }
//            else if ("CTU".equals(carrierType)) { //CTU
//                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
//                wrapper.eq("task_no", robotTaskCode);
//                WrkMast task = wrkMastService.selectOne(wrapper);
//                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
//                    rcsReturn.setCode("Err_RobotCodeNotMatch");
//                    rcsReturn.setMessage("");
//                    JSONObject data = new JSONObject();
//                    data.put("robotTaskCode", robotTaskCode);
//                    rcsReturn.setData(data);
//                    return rcsReturn;
//                }
////                JSONObject memo = JSONObject.parseObject(task.getMemo());
//
//                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
//                    case TASK_START: {
////                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
////                        task.setModiTime(new Date());
////                        task.setModiUser(defaultUserId);
////                        taskService.updateById(task);
//                    } break;
////                    case TASK_OUT_BIN: {} break;
//                    case TASK_END: {
//                        // 更新任务状态等内部逻辑
//                        long wrkSts = task.getWrkSts(); // 1.入库;101.出库;
//                        if (task.getIoType() == 1) {
//                            wrkSts = 4L;
//                        } else if (task.getIoType() == 101) {
//                            wrkSts = 14L;
//                        }
//
//                        task.setWrkSts(wrkSts); // 4.入库完成;14.已出库未确认;
//                        task.setModiTime(new Date());
//                        task.setModiUser(defaultUserId);
//                        taskService.updateById(task);
                    } break;
//                    case TASK_OUT_BIN: {} break;
                    case TASK_END: {
                        // 更新任务状态等内部逻辑
                        long wrkSts = task.getWrkSts(); // 1.入库;101.出库;
                        if (task.getIoType() == 1) {
                            wrkSts = 4L;
                        } else if (task.getIoType() == 101) {
                            wrkSts = 14L;
                        }
                        task.setWrkSts(wrkSts); // 4.入库完成;14.已出库未确认;
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        wrkMastService.updateById(task);
                        // TODO:任务完成触发出入库变更操作
//                        // 入库完成
//                        mesService.inFeedback(memo.getString("OrderNo"));
//                        // 出库完成
//                        mesService.outFeedback(memo.getString("OrderNo"));
                    } break;
                    default: {} break;
                }
            }
//                        wrkMastService.updateById(task);
//
//                        // TODO:任务完成触发出入库变更操作
//
//
////                        // 入库完成
////                        mesService.inFeedback(memo.getString("OrderNo"));
////                        // 出库完成
////                        mesService.outFeedback(memo.getString("OrderNo"));
//                    } break;
//                    default: {} break;
//                }
//            }
            // 返回RCS
            rcsReturn.setCode("SUCCESS");
@@ -553,11 +645,15 @@
            log.info("sendPost - {} - {}", url, param);
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Content-Length", "<calculated when request is sent>");
            conn.setRequestProperty("Host", "<calculated when request is sent>");
            conn.setRequestProperty("Accept", "*/*");
            conn.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
            conn.setRequestProperty("Connection", "keep-alive");
            conn.setRequestProperty("X-lr-request-id", String.valueOf(new Date().getTime()));
            conn.setRequestProperty("X-lr-version", "4.3");
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setDoOutput(true);
src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java
@@ -38,7 +38,7 @@
        }
        TaskLog taskLog = new TaskLog();
        BeanUtils.copyProperties(task, taskLog);
        taskLog.setLogId(task.getId());
//        taskLog.setLogId(task.getId());
        if (!this.insert(taskLog)) {
            throw new CoolException("任务日志保存失败!!");
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/BareBoardScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/BlockScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/CheckDeepScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/JlerScheduler.java
New file
@@ -0,0 +1,40 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.handler.JlerHandler;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * @author pang.jiabao
 * @description 济南二机床刀具库相关定时任务
 * @createDate 2025/11/18 14:18
 */
@Component
public class JlerScheduler {
    @Resource
    private JlerHandler jlerHandler;
    @Resource
    private WrkMastService wrkMastService;
    /**
     * 货物到达入库口接驳位开始呼叫料箱机器人
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    private void callAgvToWarehouse() {
        List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("mk", "Y").eq("wrk_sts", 2));
        for (WrkMast wrkMast : wrkMastList) {
            jlerHandler.callAgvToWarehouse(wrkMast);
        }
    }
}
src/main/java/com/zy/asrs/task/handler/AutoLocMoveHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/BareBoardHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/CheckDeepHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/JlerHandler.java
New file
@@ -0,0 +1,70 @@
package com.zy.asrs.task.handler;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.rcs.RcsReturn;
import com.zy.asrs.entity.rcs.RcsTaskSubmit;
import com.zy.asrs.entity.rcs.RcsTaskTargetRoute;
import com.zy.asrs.service.RcsService;
import com.zy.asrs.service.WrkMastService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * @author pang.jiabao
 * @description 济南二机床刀具库相关定时任务
 * @createDate 2025/12/10 14:25
 */
@Slf4j
@Service
public class JlerHandler {
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private RcsService rcsService;
    @Transactional
    public void callAgvToWarehouse(WrkMast wrkMast) {
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        // 模板名
        rcsTaskSubmit.setTaskType("CTU1");
        rcsTaskSubmit.setRobotTaskCode(String.valueOf(new Date().getTime()));
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
        RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
        startRoute.setSeq(0);
        startRoute.setCode("106");
        startRoute.setOperation("COLLECT");
        startRoute.setType("SITE");
        targetRouteList.add(startRoute);
        RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
        endRoute.setSeq(1);
        endRoute.setCode(wrkMast.getLocNo());
        endRoute.setOperation("DELIVERY");
        endRoute.setType("STORAGE");
        targetRouteList.add(endRoute);
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        // 转发给海康或华晓RCS
        RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, 1);
        if (rcsReturn.getCode().equals("SUCCESS")) {
            wrkMast.setWrkSts(3L);
            wrkMast.setModiTime(new Date());
            wrkMast.setTaskNo(rcsTaskSubmit.getRobotTaskCode());
            wrkMastService.updateById(wrkMast);
            log.info("入库给料箱机器人发送命令成功,工作号:{},任务号:{}",wrkMast.getWrkNo(),rcsTaskSubmit.getRobotTaskCode());
        } else {
            log.error("入库给料箱机器人发送命令失败,工作号:{},任务号:{}",wrkMast.getWrkNo(),rcsTaskSubmit.getRobotTaskCode());
        }
    }
}
src/main/java/com/zy/common/config/LogAspect.java
@@ -22,7 +22,7 @@
/**
 * Created by Administrator on 2019-07-09.
 */
@Component
//@Component
@Aspect
@Slf4j
@Order(2)
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -34,7 +34,7 @@
        } else {
            this.locType1 = 2; // 高库位
        }
        log.info(JSON.toJSONString(this));
//        log.info(JSON.toJSONString(this));
    }
}
src/main/java/com/zy/common/web/WcsController.java
@@ -168,21 +168,26 @@
//        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
//        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
        // 获取空库位
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").orderBy("lev1").orderBy("bay1").orderBy("row1"));
        if (locMast == null) {
            throw new CoolException("无空库位!");
        }
        int workNo =commonService.getWorkNo(0);
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo() + "");
        wrkMast.setStaNo(dto.getStaNo() + "");
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setCrnNo(1);
        wrkMast.setSourceStaNo("104");
        wrkMast.setStaNo("106");
        wrkMast.setLocNo(locMast.getLocNo());
        wrkMast.setBarcode(barcode); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -213,7 +218,7 @@
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                .eq("zpallet", barcode);
        WaitPakin setParam = new WaitPakin();
        setParam.setLocNo(dto.getLocNo());
        setParam.setLocNo(locMast.getLocNo());
        setParam.setIoStatus("Y");
        setParam.setModiTime(now);
        if (!waitPakinService.update(setParam, wrapper)) {
@@ -226,7 +231,6 @@
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
@@ -234,8 +238,14 @@
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(locMast.getLocNo()+"目标库位已被占用");
        }
        StartupDto dto = new StartupDto();
        dto.setWorkNo(workNo);
        dto.setLocNo(locMast.getLocNo());
        dto.setSourceStaNo(104);
        dto.setStaNo(106);
        dto.setCrnNo(1);
        return dto;
    }
@@ -244,9 +254,20 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
//
//        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").orderBy("lev1").orderBy("bay1").orderBy("row1"));
        if (locMast == null) {
            throw new CoolException("无空库位!");
        }
        StartupDto dto = new StartupDto();
        dto.setWorkNo(commonService.getWorkNo(0));
        dto.setCrnNo(1);
        dto.setSourceStaNo(104);
        dto.setStaNo(106);
        dto.setLocNo(locMast.getLocNo());
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -280,7 +301,6 @@
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(new Date());
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -128,24 +128,24 @@
        if(expectedCheckModel != null && serverCheckModel != null){
            //校验IP地址
            if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){
                throw new LicenseContentException("当前服务器的IP没在授权范围内");
            }
            //校验Mac地址
            if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){
                throw new LicenseContentException("当前服务器的Mac地址没在授权范围内");
            }
            //校验主板序列号
            if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){
                throw new LicenseContentException("当前服务器的主板序列号没在授权范围内");
            }
            //校验CPU序列号
            if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){
                throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内");
            }
//            if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){
//                throw new LicenseContentException("当前服务器的IP没在授权范围内");
//            }
//
//            //校验Mac地址
//            if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){
//                throw new LicenseContentException("当前服务器的Mac地址没在授权范围内");
//            }
//
//            //校验主板序列号
//            if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){
//                throw new LicenseContentException("当前服务器的主板序列号没在授权范围内");
//            }
//
//            //校验CPU序列号
//            if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){
//                throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内");
//            }
        }else{
            throw new LicenseContentException("不能获取服务器硬件信息");
        }
src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
@@ -84,29 +84,29 @@
                LicenseVerify licenseVerify = new LicenseVerify();
                //安装证书
//                LicenseContent install = licenseVerify.install(param);
                LicenseContent install = licenseVerify.install(param);
                logger.info("++++++++ 许可证加载结束 ++++++++");
                logger.info("++++++++ 许可证加载标记,搜索修改 ++++++++");
                licenseTimer.setSystemSupport(true);
                licenseTimer.setLicenseDays(9999);
                return true;
//                licenseTimer.setSystemSupport(true);
//                licenseTimer.setLicenseDays(9999);
//                return true;
//                licenseTimer.setSystemSupport(install!=null);
//
//                if (install != null) {
//                    Date start = new Date();
//                    Date end = install.getNotAfter();
//                    Long starTime = start.getTime();
//                    Long endTime = end.getTime();
//                    Long num = endTime - starTime;//时间戳相差的毫秒数
//                    int day = (int) (num / 24 / 60 / 60 / 1000);
//                    licenseTimer.setLicenseDays(day);
//                }
//
//
//                return install != null;
                licenseTimer.setSystemSupport(install!=null);
                if (install != null) {
                    Date start = new Date();
                    Date end = install.getNotAfter();
                    Long starTime = start.getTime();
                    Long endTime = end.getTime();
                    long num = endTime - starTime;//时间戳相差的毫秒数
                    int day = (int) (num / 24 / 60 / 60 / 1000);
                    licenseTimer.setLicenseDays(day);
                }
                return install != null;
            } catch (Exception e) {
                return false;
            }
src/main/resources/application-dev.yml
@@ -131,7 +131,7 @@
#海康对接
hik:
  url: http://127.0.0.1:8089/hik/
  url: http://172.26.11.98:80/rcs/rtas/
#华晓对接
hx:
src/main/resources/mapper/WrkMastMapper.xml
@@ -70,7 +70,7 @@
        select * from asr_wrk_mast
        where wrk_sts=5
        or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,3,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,1,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp))
        order by io_time,wrk_no asc
    </select>
src/main/webapp/static/css/main.min.css
@@ -1 +1 @@
@import url(https://fonts.googleapis.com/css?family=Homenaje);@import url(https://fonts.googleapis.com/css?family=Noto+Serif+JP);@-webkit-keyframes animateSsplashStr{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}20%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}30%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes animateSsplashStr{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}20%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}30%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{height:100%}body{min-height:100%;font-family:Homenaje,sans-serif;letter-spacing:.15em;background-color:#111}@media all and (min-width:569px) and (max-width:1366px){body{font-size:14px;font-size:.875rem}}@media all and (max-width:568px){body{font-size:12px;font-size:.75rem}}body.is-opened-index{overflow:auto}body.is-picked{cursor:pointer}a{text-decoration:none}::-moz-selection{color:#fff;background:rgba(0,0,0,.5)}::selection{color:#fff;background:rgba(0,0,0,.5)}.l-contents{position:relative;z-index:10}.l-contents.is-fixed{position:fixed;top:0;right:0;left:0}.l-page--white{color:#fff}.l-page--white a{color:#fff}.l-page--white svg{fill:#fff}.l-page--black{color:#222}.l-page--black a{color:#222}.l-page--black svg{fill:#222}.c-btn-circle{width:60px;height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin-top:5px;border-radius:50%}.c-btn-circle svg{width:30px;height:30px}.c-btn-circle--white{background-color:#fff}.c-btn-circle--white .path-fill{fill:#222}.c-btn-circle--black{background-color:#222}.c-btn-circle--black .path-fill{fill:#fff}.c-button{height:2em;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:1.25em;padding-left:1.25em;border-radius:1em;border-width:2px;border-style:solid}.c-button--white{border-color:#fff}.c-button--black{border-color:#222}.c-button__icon{display:block;margin-right:.7em}.c-button__icon--back{width:.3em;height:.3em;border-top:2px solid #fff;border-left:2px solid #fff;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.c-button__icon--white{border-color:#fff}.c-button__icon--black{border-color:#222}.c-button__label{font-weight:700}.c-button__label .js-split-str{display:inline-block}.c-button__icon{-webkit-transition-duration:.4s;transition-duration:.4s}.c-button:hover .c-button__icon{-webkit-transform:translateX(-5px) rotate(-45deg);transform:translateX(-5px) rotate(-45deg)}.c-button:hover .c-button__label .js-split-str{-webkit-animation-name:animateSsplashStr;animation-name:animateSsplashStr;-webkit-animation-duration:.6s;animation-duration:.6s}.c-button:hover .c-button__label .js-split-str:nth-of-type(1){-webkit-animation-delay:0s;animation-delay:0s}.c-button:hover .c-button__label .js-split-str:nth-of-type(2){-webkit-animation-delay:20ms;animation-delay:20ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(3){-webkit-animation-delay:40ms;animation-delay:40ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(4){-webkit-animation-delay:60ms;animation-delay:60ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(5){-webkit-animation-delay:80ms;animation-delay:80ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(6){-webkit-animation-delay:.1s;animation-delay:.1s}.c-button:hover .c-button__label .js-split-str:nth-of-type(7){-webkit-animation-delay:.12s;animation-delay:.12s}.c-button:hover .c-button__label .js-split-str:nth-of-type(8){-webkit-animation-delay:.14s;animation-delay:.14s}.c-button:hover .c-button__label .js-split-str:nth-of-type(9){-webkit-animation-delay:.16s;animation-delay:.16s}.c-button:hover .c-button__label .js-split-str:nth-of-type(10){-webkit-animation-delay:.18s;animation-delay:.18s}.c-button:hover .c-button__label .js-split-str:nth-of-type(11){-webkit-animation-delay:.2s;animation-delay:.2s}.c-button:hover .c-button__label .js-split-str:nth-of-type(12){-webkit-animation-delay:.22s;animation-delay:.22s}.c-button:hover .c-button__label .js-split-str:nth-of-type(13){-webkit-animation-delay:.24s;animation-delay:.24s}.c-button:hover .c-button__label .js-split-str:nth-of-type(14){-webkit-animation-delay:.26s;animation-delay:.26s}.c-button:hover .c-button__label .js-split-str:nth-of-type(15){-webkit-animation-delay:.28s;animation-delay:.28s}.c-button:hover .c-button__label .js-split-str:nth-of-type(16){-webkit-animation-delay:.3s;animation-delay:.3s}.c-button:hover .c-button__label .js-split-str:nth-of-type(17){-webkit-animation-delay:.32s;animation-delay:.32s}.c-button:hover .c-button__label .js-split-str:nth-of-type(18){-webkit-animation-delay:.34s;animation-delay:.34s}.c-button:hover .c-button__label .js-split-str:nth-of-type(19){-webkit-animation-delay:.36s;animation-delay:.36s}.c-button:hover .c-button__label .js-split-str:nth-of-type(20){-webkit-animation-delay:.38s;animation-delay:.38s}.c-button:hover .c-button__label .js-split-str:nth-of-type(21){-webkit-animation-delay:.4s;animation-delay:.4s}.c-button:hover .c-button__label .js-split-str:nth-of-type(22){-webkit-animation-delay:.42s;animation-delay:.42s}.c-button:hover .c-button__label .js-split-str:nth-of-type(23){-webkit-animation-delay:.44s;animation-delay:.44s}.c-button:hover .c-button__label .js-split-str:nth-of-type(24){-webkit-animation-delay:.46s;animation-delay:.46s}.c-button:hover .c-button__label .js-split-str:nth-of-type(25){-webkit-animation-delay:.48s;animation-delay:.48s}.c-button:hover .c-button__label .js-split-str:nth-of-type(26){-webkit-animation-delay:.5s;animation-delay:.5s}.c-button:hover .c-button__label .js-split-str:nth-of-type(27){-webkit-animation-delay:.52s;animation-delay:.52s}.c-button:hover .c-button__label .js-split-str:nth-of-type(28){-webkit-animation-delay:.54s;animation-delay:.54s}.c-button:hover .c-button__label .js-split-str:nth-of-type(29){-webkit-animation-delay:.56s;animation-delay:.56s}.c-button:hover .c-button__label .js-split-str:nth-of-type(30){-webkit-animation-delay:.58s;animation-delay:.58s}.c-text-link{display:inline-block;position:relative}.c-text-link__label{display:inline-block;position:relative;z-index:2}.c-text-link__bg{height:2px;display:block;position:absolute;top:50%;right:0;left:0}.c-text-link__bg--white{background-color:#fff}.c-text-link__bg--black{background-color:#222}@-webkit-keyframes openTextLinkBar{0%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:left;transform-origin:left}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:left;transform-origin:left}}@keyframes openTextLinkBar{0%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:left;transform-origin:left}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:left;transform-origin:left}}@-webkit-keyframes closeTextLinkBar{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:right;transform-origin:right}100%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right}}@keyframes closeTextLinkBar{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:right;transform-origin:right}100%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right}}.c-text-link__label{-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1)}.c-text-link__bg{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-animation-name:closeTextLinkBar;animation-name:closeTextLinkBar;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.075,.82,.165,1);animation-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.c-text-link:hover .c-text-link__bg{-webkit-animation-name:openTextLinkBar;animation-name:openTextLinkBar}.p-badges{position:fixed;z-index:100;bottom:20px;right:20px}@media all and (max-width:568px){.p-badges{width:90px}}.p-badges img{width:100%}.p-canvas-webgl{position:fixed;z-index:1;top:0;left:0}.p-dummy-scroll{position:relative;z-index:1}.p-hold-button{width:60px;height:60px;opacity:0;position:fixed;z-index:10;pointer-events:none}.p-hold-button.is-pc{opacity:1;top:0;left:0}.p-hold-button.is-smartphone{cursor:pointer;bottom:35px;right:0;left:0;opacity:1;margin-right:auto;margin-left:auto}.p-hold-button__border{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;position:absolute}.p-hold-button__border--out{width:60px;height:60px;top:0;left:0;border:1px solid #fff}.p-hold-button__border--in{width:54px;height:54px;top:3px;left:3px;border:1px solid #fff}.p-hold-button__label{width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;top:0;left:0;z-index:2;mix-blend-mode:difference;padding-left:.15em}.p-hold-button__progress{width:54px;height:54px;overflow:hidden;position:absolute;top:3px;left:3px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.p-hold-button__progress-in{width:108px;height:54px;background-color:#fff;-webkit-transform:skewX(-45deg) translateX(50%);transform:skewX(-45deg) translateX(50%);-webkit-transform-origin:right bottom;transform-origin:right bottom}.p-hold-button__label{opacity:0;font-size:14px;font-size:.875rem}.p-hold-button__border{opacity:0;-webkit-transform:rotate(45deg) scale(.6);transform:rotate(45deg) scale(.6)}.p-hold-button.is-enabled{pointer-events:auto}.p-hold-button.is-shown .p-hold-button__label{opacity:1;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-delay:.3s;transition-delay:.3s;-webkit-transition-property:opacity;transition-property:opacity}.p-hold-button.is-shown .p-hold-button__border{opacity:1;-webkit-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition-duration:.8s;transition-duration:.8s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-shown .p-hold-button__border--out{-webkit-transition-delay:.1s;transition-delay:.1s}.p-hold-button.is-shown .p-hold-button__border--in{-webkit-transition-delay:.2s;transition-delay:.2s}.p-hold-button.is-shown .p-hold-button__progress{opacity:1;-webkit-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-delay:.3s;transition-delay:.3s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-hidden .p-hold-button__label{opacity:0;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-property:opacity;transition-property:opacity}.p-hold-button.is-hidden .p-hold-button__border{opacity:0;-webkit-transform:rotate(45deg) scale(.8);transform:rotate(45deg) scale(.8);-webkit-transition-duration:.8s;transition-duration:.8s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-hidden .p-hold-button__progress{opacity:0;-webkit-transform:rotate(45deg) scale(.5);transform:rotate(45deg) scale(.5);-webkit-transition-duration:.8s;transition-duration:.8s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-pressed .p-hold-button__border--out{-webkit-transform:rotate(45deg) scale(1.12);transform:rotate(45deg) scale(1.12);-webkit-transition-delay:0s;transition-delay:0s}.p-hold-button.is-released .p-hold-button__border--out{-webkit-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition-delay:0s;transition-delay:0s}@-webkit-keyframes loopFollow{0%{-webkit-transform:translateY(-100.5%);transform:translateY(-100.5%)}100%{-webkit-transform:translateY(100.5%);transform:translateY(100.5%)}}@keyframes loopFollow{0%{-webkit-transform:translateY(-100.5%);transform:translateY(-100.5%)}100%{-webkit-transform:translateY(100.5%);transform:translateY(100.5%)}}.p-introduction{width:100%;height:100vh;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:1.5;position:relative;z-index:10;color:#fff;text-align:center;letter-spacing:.2em}.p-introduction__wrap{position:absolute;right:0;bottom:0;left:0}.p-introduction__row{opacity:0;-webkit-transform:translateY(-10px);transform:translateY(-10px);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-introduction__row.is-shown{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.p-introduction__row.is-shown:nth-of-type(1){-webkit-transition-delay:5s;transition-delay:5s}.p-introduction__row.is-shown:nth-of-type(2){-webkit-transition-delay:5.25s;transition-delay:5.25s}.p-introduction__row.is-shown:nth-of-type(3){-webkit-transition-delay:5.5s;transition-delay:5.5s}.p-introduction__row.is-shown:nth-of-type(4){-webkit-transition-delay:5.75s;transition-delay:5.75s}.p-introduction__row.is-shown:nth-of-type(5){-webkit-transition-delay:6s;transition-delay:6s}.p-introduction__links{margin-top:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.p-introduction__link{width:18px;height:18px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;opacity:0;-webkit-transform:scale(1.8);transform:scale(1.8);margin:0 12px;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-introduction__link svg{width:18px}.p-introduction__link.is-shown{opacity:1;-webkit-transform:scale(1);transform:scale(1);-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.p-introduction__link.is-shown:nth-of-type(1){-webkit-transition-delay:5.6s;transition-delay:5.6s}.p-introduction__link.is-shown:nth-of-type(2){-webkit-transition-delay:5.7s;transition-delay:5.7s}.p-introduction__link.is-shown:nth-of-type(3){-webkit-transition-delay:5.8s;transition-delay:5.8s}.p-introduction__link.is-shown:nth-of-type(4){-webkit-transition-delay:5.9s;transition-delay:5.9s}.p-introduction__link.is-shown:nth-of-type(5){-webkit-transition-delay:6s;transition-delay:6s}.p-introduction__follow{width:15px;height:10vh;overflow:hidden;position:relative;margin:6vh auto 0;opacity:0;-webkit-transition-property:opacity;transition-property:opacity}.p-introduction__follow.is-shown{opacity:1;-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-delay:3s;transition-delay:3s}.p-introduction__follow-in{width:1px;height:100%;position:absolute;top:0;background-color:#fff;-webkit-animation-name:loopFollow;animation-name:loopFollow;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.p-introduction__follow-in--1{left:0}.p-introduction__follow-in--2{left:50%;margin-left:-1px;-webkit-animation-delay:.3s;animation-delay:.3s}.p-introduction__follow-in--3{right:0;-webkit-animation-delay:.15s;animation-delay:.15s}.p-preloader{position:fixed;top:50%;left:50%;z-index:100;pointer-events:none}@media all and (min-width:569px){.p-preloader{width:60px;height:60px;margin-top:-30px;margin-left:-30px}}@media all and (max-width:568px){.p-preloader{width:30px;height:30px;margin-top:-15px;margin-left:-15px}}.p-preloader.is-hidden{opacity:0;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-property:opacity;transition-property:opacity}.p-preloader__box{width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:0;left:0;border-style:solid;-webkit-animation-name:rotatePreloaderBox;animation-name:rotatePreloaderBox;-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:both;animation-fill-mode:both}@media all and (min-width:569px){.p-preloader__box{border-width:3px}}@media all and (max-width:568px){.p-preloader__box{border-width:2px}}.p-preloader__box--blank{border-color:#111}.p-preloader__box--white{border-color:#fff}.p-preloader__box--02{-webkit-animation-delay:1s;animation-delay:1s}.p-preloader__box--03{-webkit-animation-delay:2s;animation-delay:2s}@-webkit-keyframes rotatePreloaderBox{0%{opacity:0;-webkit-transform:scale(.1) rotate(0);transform:scale(.1) rotate(0)}12.5%{opacity:1}25%{-webkit-transform:scale(1) rotate(180deg);transform:scale(1) rotate(180deg)}37.5%{opacity:1;-webkit-transform:scale(1) rotate(270deg);transform:scale(1) rotate(270deg)}50%{opacity:0;-webkit-transform:scale(1.2) rotate(360deg);transform:scale(1.2) rotate(360deg)}100%{opacity:0}}@keyframes rotatePreloaderBox{0%{opacity:0;-webkit-transform:scale(.1) rotate(0);transform:scale(.1) rotate(0)}12.5%{opacity:1}25%{-webkit-transform:scale(1) rotate(180deg);transform:scale(1) rotate(180deg)}37.5%{opacity:1;-webkit-transform:scale(1) rotate(270deg);transform:scale(1) rotate(270deg)}50%{opacity:0;-webkit-transform:scale(1.2) rotate(360deg);transform:scale(1.2) rotate(360deg)}100%{opacity:0}}.p-config-menu{position:fixed;bottom:20px;right:20px;z-index:100}.p-sketch-index{max-width:1366px;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative;top:0;right:0;left:0;z-index:100000;margin-right:auto;margin-left:auto}@media all and (min-width:1025px){.p-sketch-index{padding-top:100px;padding-bottom:50px;padding-right:7.5%;padding-left:7.5%}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index{padding-top:100px;padding-bottom:50px;padding-right:7.5%;padding-left:7.5%}}@media all and (max-width:568px){.p-sketch-index{padding-top:70px;padding-bottom:40px;padding-right:10px;padding-left:10px}}.p-sketch-index__item{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}@media all and (min-width:1025px){.p-sketch-index__item{width:33.3%;margin-bottom:60px;padding-right:15px;padding-left:15px}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index__item{width:50%;margin-bottom:40px;padding-right:10px;padding-left:10px}}@media all and (max-width:568px){.p-sketch-index__item{width:100%;margin-bottom:30px;padding-right:10px;padding-left:10px}}.p-sketch-index__item-wrap{display:block}.p-sketch-index__item-thumb{width:100%;position:relative;margin-bottom:10px;padding-top:52.5%;background-color:#fff;background-size:cover}.p-sketch-index__item-thumb:after,.p-sketch-index__item-thumb:before{content:"";display:block;position:absolute;top:0;right:0;bottom:0;left:0}.p-sketch-index__item-thumb:before{background-color:#fff}.p-sketch-index__item-thumb:after{background-color:rgba(0,0,0,.7)}.p-sketch-index__item-thumb-label{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;top:0;left:0;z-index:10;letter-spacing:.2em}@media all and (min-width:1025px){.p-sketch-index__item-thumb-label{font-size:24px;font-size:1.5rem}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index__item-thumb-label{font-size:21px;font-size:1.3125rem}}@media all and (max-width:568px){.p-sketch-index__item-thumb-label{font-size:18px;font-size:1.125rem}}.p-sketch-index__item-title{letter-spacing:.1em}@media all and (min-width:1025px){.p-sketch-index__item-title{font-size:32px;font-size:2rem}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index__item-title{font-size:28px;font-size:1.75rem}}@media all and (max-width:568px){.p-sketch-index__item-title{font-size:24px;font-size:1.5rem}}.p-sketch-index__item-title .js-split-str{display:inline-block}.p-sketch-index__item-date{margin-top:5px;font-size:12px;font-size:.75rem}.p-sketch-index__item-thumb{-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-delay:.4s;transition-delay:.4s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1)}.p-sketch-index__item-thumb:before{-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-delay:.6s;transition-delay:.6s}.p-sketch-index__item-thumb:after{opacity:0;-webkit-transition-duration:.4s;transition-duration:.4s}.p-sketch-index__item-thumb-label .js-split-str{opacity:0;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transition-duration:.6s;transition-duration:.6s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(1){-webkit-transition-delay:0s;transition-delay:0s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(2){-webkit-transition-delay:20ms;transition-delay:20ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(3){-webkit-transition-delay:40ms;transition-delay:40ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(4){-webkit-transition-delay:60ms;transition-delay:60ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(5){-webkit-transition-delay:80ms;transition-delay:80ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(6){-webkit-transition-delay:.1s;transition-delay:.1s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(7){-webkit-transition-delay:.12s;transition-delay:.12s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(8){-webkit-transition-delay:.14s;transition-delay:.14s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(9){-webkit-transition-delay:.16s;transition-delay:.16s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(10){-webkit-transition-delay:.18s;transition-delay:.18s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(11){-webkit-transition-delay:.2s;transition-delay:.2s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(12){-webkit-transition-delay:.22s;transition-delay:.22s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(13){-webkit-transition-delay:.24s;transition-delay:.24s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(14){-webkit-transition-delay:.26s;transition-delay:.26s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(15){-webkit-transition-delay:.28s;transition-delay:.28s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(16){-webkit-transition-delay:.3s;transition-delay:.3s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(17){-webkit-transition-delay:.32s;transition-delay:.32s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(18){-webkit-transition-delay:.34s;transition-delay:.34s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(19){-webkit-transition-delay:.36s;transition-delay:.36s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(20){-webkit-transition-delay:.38s;transition-delay:.38s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(21){-webkit-transition-delay:.4s;transition-delay:.4s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(22){-webkit-transition-delay:.42s;transition-delay:.42s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(23){-webkit-transition-delay:.44s;transition-delay:.44s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(24){-webkit-transition-delay:.46s;transition-delay:.46s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(25){-webkit-transition-delay:.48s;transition-delay:.48s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(26){-webkit-transition-delay:.5s;transition-delay:.5s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(27){-webkit-transition-delay:.52s;transition-delay:.52s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(28){-webkit-transition-delay:.54s;transition-delay:.54s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(29){-webkit-transition-delay:.56s;transition-delay:.56s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(30){-webkit-transition-delay:.58s;transition-delay:.58s}.p-sketch-index__item-title .js-split-str{opacity:0;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transition-duration:.6s;transition-duration:.6s}.p-sketch-index__item-title .js-split-str:nth-of-type(1){-webkit-transition-delay:.6s;transition-delay:.6s}.p-sketch-index__item-title .js-split-str:nth-of-type(2){-webkit-transition-delay:.62s;transition-delay:.62s}.p-sketch-index__item-title .js-split-str:nth-of-type(3){-webkit-transition-delay:.64s;transition-delay:.64s}.p-sketch-index__item-title .js-split-str:nth-of-type(4){-webkit-transition-delay:.66s;transition-delay:.66s}.p-sketch-index__item-title .js-split-str:nth-of-type(5){-webkit-transition-delay:.68s;transition-delay:.68s}.p-sketch-index__item-title .js-split-str:nth-of-type(6){-webkit-transition-delay:.7s;transition-delay:.7s}.p-sketch-index__item-title .js-split-str:nth-of-type(7){-webkit-transition-delay:.72s;transition-delay:.72s}.p-sketch-index__item-title .js-split-str:nth-of-type(8){-webkit-transition-delay:.74s;transition-delay:.74s}.p-sketch-index__item-title .js-split-str:nth-of-type(9){-webkit-transition-delay:.76s;transition-delay:.76s}.p-sketch-index__item-title .js-split-str:nth-of-type(10){-webkit-transition-delay:.78s;transition-delay:.78s}.p-sketch-index__item-title .js-split-str:nth-of-type(11){-webkit-transition-delay:.8s;transition-delay:.8s}.p-sketch-index__item-title .js-split-str:nth-of-type(12){-webkit-transition-delay:.82s;transition-delay:.82s}.p-sketch-index__item-title .js-split-str:nth-of-type(13){-webkit-transition-delay:.84s;transition-delay:.84s}.p-sketch-index__item-title .js-split-str:nth-of-type(14){-webkit-transition-delay:.86s;transition-delay:.86s}.p-sketch-index__item-title .js-split-str:nth-of-type(15){-webkit-transition-delay:.88s;transition-delay:.88s}.p-sketch-index__item-title .js-split-str:nth-of-type(16){-webkit-transition-delay:.9s;transition-delay:.9s}.p-sketch-index__item-title .js-split-str:nth-of-type(17){-webkit-transition-delay:.92s;transition-delay:.92s}.p-sketch-index__item-title .js-split-str:nth-of-type(18){-webkit-transition-delay:.94s;transition-delay:.94s}.p-sketch-index__item-title .js-split-str:nth-of-type(19){-webkit-transition-delay:.96s;transition-delay:.96s}.p-sketch-index__item-title .js-split-str:nth-of-type(20){-webkit-transition-delay:.98s;transition-delay:.98s}.p-sketch-index__item-title .js-split-str:nth-of-type(21){-webkit-transition-delay:1s;transition-delay:1s}.p-sketch-index__item-title .js-split-str:nth-of-type(22){-webkit-transition-delay:1.02s;transition-delay:1.02s}.p-sketch-index__item-title .js-split-str:nth-of-type(23){-webkit-transition-delay:1.04s;transition-delay:1.04s}.p-sketch-index__item-title .js-split-str:nth-of-type(24){-webkit-transition-delay:1.06s;transition-delay:1.06s}.p-sketch-index__item-title .js-split-str:nth-of-type(25){-webkit-transition-delay:1.08s;transition-delay:1.08s}.p-sketch-index__item-title .js-split-str:nth-of-type(26){-webkit-transition-delay:1.1s;transition-delay:1.1s}.p-sketch-index__item-title .js-split-str:nth-of-type(27){-webkit-transition-delay:1.12s;transition-delay:1.12s}.p-sketch-index__item-title .js-split-str:nth-of-type(28){-webkit-transition-delay:1.14s;transition-delay:1.14s}.p-sketch-index__item-title .js-split-str:nth-of-type(29){-webkit-transition-delay:1.16s;transition-delay:1.16s}.p-sketch-index__item-title .js-split-str:nth-of-type(30){-webkit-transition-delay:1.18s;transition-delay:1.18s}.p-sketch-index__item-date{opacity:0;-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-delay:.8s;transition-delay:.8s}.p-sketch-index__item.is-shown .p-sketch-index__item-thumb{-webkit-transform:scaleY(1);transform:scaleY(1)}.p-sketch-index__item.is-shown .p-sketch-index__item-thumb:before{opacity:0}.p-sketch-index__item.is-shown .p-sketch-index__item-title .js-split-str{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.p-sketch-index__item.is-shown .p-sketch-index__item-date{opacity:1}.p-sketch-index__item:hover .p-sketch-index__item-thumb:after{opacity:1}.p-sketch-index__item:hover .p-sketch-index__item-thumb-label .js-split-str{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.p-sketch-outline{position:fixed;z-index:100;bottom:22px;left:20px}@media all and (max-width:568px){.p-sketch-outline{right:20px}}.p-sketch-outline__title{line-height:1;margin-top:0;margin-bottom:.075em;margin-left:-.05em;font-weight:100;letter-spacing:.05em}@media all and (min-width:1367px){.p-sketch-outline__title{font-size:80px}}@media all and (min-width:569px) and (max-width:1366px){.p-sketch-outline__title{font-size:6vw}}@media all and (max-width:568px){.p-sketch-outline__title{font-size:62.48px}}.p-sketch-outline__date{line-height:1;margin:0}.p-sketch-outline__description{line-height:1.5;margin:10px 0 0}.p-sketch-outline__assets{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:8px;margin-bottom:0}.p-sketch-outline__assets dd{margin:0}.p-sketch-outline__assets ul{display:-webkit-box;display:-ms-flexbox;display:flex;list-style-type:none;margin:0;padding:0}.p-sketch-outline__assets li{margin-left:12px}.p-utility-menu{position:fixed;z-index:100;top:25px;right:20px}.p-website-outline{position:fixed;z-index:100;top:20px;left:20px}.p-website-outline__title{margin:0 0 5px;font-size:18px;font-size:1.125rem}.p-website-outline__description{line-height:1.25;margin:0}.p-website-outline__links{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:15px}.p-website-outline__link{width:18px;height:18px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:20px}.p-website-outline__link svg{width:18px}
@-webkit-keyframes animateSsplashStr{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}20%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}30%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes animateSsplashStr{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}20%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}30%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{height:100%}body{min-height:100%;font-family:Homenaje,sans-serif;letter-spacing:.15em;background-color:#111}@media all and (min-width:569px) and (max-width:1366px){body{font-size:14px;font-size:.875rem}}@media all and (max-width:568px){body{font-size:12px;font-size:.75rem}}body.is-opened-index{overflow:auto}body.is-picked{cursor:pointer}a{text-decoration:none}::-moz-selection{color:#fff;background:rgba(0,0,0,.5)}::selection{color:#fff;background:rgba(0,0,0,.5)}.l-contents{position:relative;z-index:10}.l-contents.is-fixed{position:fixed;top:0;right:0;left:0}.l-page--white{color:#fff}.l-page--white a{color:#fff}.l-page--white svg{fill:#fff}.l-page--black{color:#222}.l-page--black a{color:#222}.l-page--black svg{fill:#222}.c-btn-circle{width:60px;height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin-top:5px;border-radius:50%}.c-btn-circle svg{width:30px;height:30px}.c-btn-circle--white{background-color:#fff}.c-btn-circle--white .path-fill{fill:#222}.c-btn-circle--black{background-color:#222}.c-btn-circle--black .path-fill{fill:#fff}.c-button{height:2em;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:1.25em;padding-left:1.25em;border-radius:1em;border-width:2px;border-style:solid}.c-button--white{border-color:#fff}.c-button--black{border-color:#222}.c-button__icon{display:block;margin-right:.7em}.c-button__icon--back{width:.3em;height:.3em;border-top:2px solid #fff;border-left:2px solid #fff;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.c-button__icon--white{border-color:#fff}.c-button__icon--black{border-color:#222}.c-button__label{font-weight:700}.c-button__label .js-split-str{display:inline-block}.c-button__icon{-webkit-transition-duration:.4s;transition-duration:.4s}.c-button:hover .c-button__icon{-webkit-transform:translateX(-5px) rotate(-45deg);transform:translateX(-5px) rotate(-45deg)}.c-button:hover .c-button__label .js-split-str{-webkit-animation-name:animateSsplashStr;animation-name:animateSsplashStr;-webkit-animation-duration:.6s;animation-duration:.6s}.c-button:hover .c-button__label .js-split-str:nth-of-type(1){-webkit-animation-delay:0s;animation-delay:0s}.c-button:hover .c-button__label .js-split-str:nth-of-type(2){-webkit-animation-delay:20ms;animation-delay:20ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(3){-webkit-animation-delay:40ms;animation-delay:40ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(4){-webkit-animation-delay:60ms;animation-delay:60ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(5){-webkit-animation-delay:80ms;animation-delay:80ms}.c-button:hover .c-button__label .js-split-str:nth-of-type(6){-webkit-animation-delay:.1s;animation-delay:.1s}.c-button:hover .c-button__label .js-split-str:nth-of-type(7){-webkit-animation-delay:.12s;animation-delay:.12s}.c-button:hover .c-button__label .js-split-str:nth-of-type(8){-webkit-animation-delay:.14s;animation-delay:.14s}.c-button:hover .c-button__label .js-split-str:nth-of-type(9){-webkit-animation-delay:.16s;animation-delay:.16s}.c-button:hover .c-button__label .js-split-str:nth-of-type(10){-webkit-animation-delay:.18s;animation-delay:.18s}.c-button:hover .c-button__label .js-split-str:nth-of-type(11){-webkit-animation-delay:.2s;animation-delay:.2s}.c-button:hover .c-button__label .js-split-str:nth-of-type(12){-webkit-animation-delay:.22s;animation-delay:.22s}.c-button:hover .c-button__label .js-split-str:nth-of-type(13){-webkit-animation-delay:.24s;animation-delay:.24s}.c-button:hover .c-button__label .js-split-str:nth-of-type(14){-webkit-animation-delay:.26s;animation-delay:.26s}.c-button:hover .c-button__label .js-split-str:nth-of-type(15){-webkit-animation-delay:.28s;animation-delay:.28s}.c-button:hover .c-button__label .js-split-str:nth-of-type(16){-webkit-animation-delay:.3s;animation-delay:.3s}.c-button:hover .c-button__label .js-split-str:nth-of-type(17){-webkit-animation-delay:.32s;animation-delay:.32s}.c-button:hover .c-button__label .js-split-str:nth-of-type(18){-webkit-animation-delay:.34s;animation-delay:.34s}.c-button:hover .c-button__label .js-split-str:nth-of-type(19){-webkit-animation-delay:.36s;animation-delay:.36s}.c-button:hover .c-button__label .js-split-str:nth-of-type(20){-webkit-animation-delay:.38s;animation-delay:.38s}.c-button:hover .c-button__label .js-split-str:nth-of-type(21){-webkit-animation-delay:.4s;animation-delay:.4s}.c-button:hover .c-button__label .js-split-str:nth-of-type(22){-webkit-animation-delay:.42s;animation-delay:.42s}.c-button:hover .c-button__label .js-split-str:nth-of-type(23){-webkit-animation-delay:.44s;animation-delay:.44s}.c-button:hover .c-button__label .js-split-str:nth-of-type(24){-webkit-animation-delay:.46s;animation-delay:.46s}.c-button:hover .c-button__label .js-split-str:nth-of-type(25){-webkit-animation-delay:.48s;animation-delay:.48s}.c-button:hover .c-button__label .js-split-str:nth-of-type(26){-webkit-animation-delay:.5s;animation-delay:.5s}.c-button:hover .c-button__label .js-split-str:nth-of-type(27){-webkit-animation-delay:.52s;animation-delay:.52s}.c-button:hover .c-button__label .js-split-str:nth-of-type(28){-webkit-animation-delay:.54s;animation-delay:.54s}.c-button:hover .c-button__label .js-split-str:nth-of-type(29){-webkit-animation-delay:.56s;animation-delay:.56s}.c-button:hover .c-button__label .js-split-str:nth-of-type(30){-webkit-animation-delay:.58s;animation-delay:.58s}.c-text-link{display:inline-block;position:relative}.c-text-link__label{display:inline-block;position:relative;z-index:2}.c-text-link__bg{height:2px;display:block;position:absolute;top:50%;right:0;left:0}.c-text-link__bg--white{background-color:#fff}.c-text-link__bg--black{background-color:#222}@-webkit-keyframes openTextLinkBar{0%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:left;transform-origin:left}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:left;transform-origin:left}}@keyframes openTextLinkBar{0%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:left;transform-origin:left}100%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:left;transform-origin:left}}@-webkit-keyframes closeTextLinkBar{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:right;transform-origin:right}100%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right}}@keyframes closeTextLinkBar{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:right;transform-origin:right}100%{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right}}.c-text-link__label{-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1)}.c-text-link__bg{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-animation-name:closeTextLinkBar;animation-name:closeTextLinkBar;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.075,.82,.165,1);animation-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.c-text-link:hover .c-text-link__bg{-webkit-animation-name:openTextLinkBar;animation-name:openTextLinkBar}.p-badges{position:fixed;z-index:100;bottom:20px;right:20px}@media all and (max-width:568px){.p-badges{width:90px}}.p-badges img{width:100%}.p-canvas-webgl{position:fixed;z-index:1;top:0;left:0}.p-dummy-scroll{position:relative;z-index:1}.p-hold-button{width:60px;height:60px;opacity:0;position:fixed;z-index:10;pointer-events:none}.p-hold-button.is-pc{opacity:1;top:0;left:0}.p-hold-button.is-smartphone{cursor:pointer;bottom:35px;right:0;left:0;opacity:1;margin-right:auto;margin-left:auto}.p-hold-button__border{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;position:absolute}.p-hold-button__border--out{width:60px;height:60px;top:0;left:0;border:1px solid #fff}.p-hold-button__border--in{width:54px;height:54px;top:3px;left:3px;border:1px solid #fff}.p-hold-button__label{width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;top:0;left:0;z-index:2;mix-blend-mode:difference;padding-left:.15em}.p-hold-button__progress{width:54px;height:54px;overflow:hidden;position:absolute;top:3px;left:3px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.p-hold-button__progress-in{width:108px;height:54px;background-color:#fff;-webkit-transform:skewX(-45deg) translateX(50%);transform:skewX(-45deg) translateX(50%);-webkit-transform-origin:right bottom;transform-origin:right bottom}.p-hold-button__label{opacity:0;font-size:14px;font-size:.875rem}.p-hold-button__border{opacity:0;-webkit-transform:rotate(45deg) scale(.6);transform:rotate(45deg) scale(.6)}.p-hold-button.is-enabled{pointer-events:auto}.p-hold-button.is-shown .p-hold-button__label{opacity:1;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-delay:.3s;transition-delay:.3s;-webkit-transition-property:opacity;transition-property:opacity}.p-hold-button.is-shown .p-hold-button__border{opacity:1;-webkit-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition-duration:.8s;transition-duration:.8s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-shown .p-hold-button__border--out{-webkit-transition-delay:.1s;transition-delay:.1s}.p-hold-button.is-shown .p-hold-button__border--in{-webkit-transition-delay:.2s;transition-delay:.2s}.p-hold-button.is-shown .p-hold-button__progress{opacity:1;-webkit-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-delay:.3s;transition-delay:.3s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-hidden .p-hold-button__label{opacity:0;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-property:opacity;transition-property:opacity}.p-hold-button.is-hidden .p-hold-button__border{opacity:0;-webkit-transform:rotate(45deg) scale(.8);transform:rotate(45deg) scale(.8);-webkit-transition-duration:.8s;transition-duration:.8s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-hidden .p-hold-button__progress{opacity:0;-webkit-transform:rotate(45deg) scale(.5);transform:rotate(45deg) scale(.5);-webkit-transition-duration:.8s;transition-duration:.8s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-hold-button.is-pressed .p-hold-button__border--out{-webkit-transform:rotate(45deg) scale(1.12);transform:rotate(45deg) scale(1.12);-webkit-transition-delay:0s;transition-delay:0s}.p-hold-button.is-released .p-hold-button__border--out{-webkit-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition-delay:0s;transition-delay:0s}@-webkit-keyframes loopFollow{0%{-webkit-transform:translateY(-100.5%);transform:translateY(-100.5%)}100%{-webkit-transform:translateY(100.5%);transform:translateY(100.5%)}}@keyframes loopFollow{0%{-webkit-transform:translateY(-100.5%);transform:translateY(-100.5%)}100%{-webkit-transform:translateY(100.5%);transform:translateY(100.5%)}}.p-introduction{width:100%;height:100vh;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:1.5;position:relative;z-index:10;color:#fff;text-align:center;letter-spacing:.2em}.p-introduction__wrap{position:absolute;right:0;bottom:0;left:0}.p-introduction__row{opacity:0;-webkit-transform:translateY(-10px);transform:translateY(-10px);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-introduction__row.is-shown{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.p-introduction__row.is-shown:nth-of-type(1){-webkit-transition-delay:5s;transition-delay:5s}.p-introduction__row.is-shown:nth-of-type(2){-webkit-transition-delay:5.25s;transition-delay:5.25s}.p-introduction__row.is-shown:nth-of-type(3){-webkit-transition-delay:5.5s;transition-delay:5.5s}.p-introduction__row.is-shown:nth-of-type(4){-webkit-transition-delay:5.75s;transition-delay:5.75s}.p-introduction__row.is-shown:nth-of-type(5){-webkit-transition-delay:6s;transition-delay:6s}.p-introduction__links{margin-top:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.p-introduction__link{width:18px;height:18px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;opacity:0;-webkit-transform:scale(1.8);transform:scale(1.8);margin:0 12px;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.p-introduction__link svg{width:18px}.p-introduction__link.is-shown{opacity:1;-webkit-transform:scale(1);transform:scale(1);-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.p-introduction__link.is-shown:nth-of-type(1){-webkit-transition-delay:5.6s;transition-delay:5.6s}.p-introduction__link.is-shown:nth-of-type(2){-webkit-transition-delay:5.7s;transition-delay:5.7s}.p-introduction__link.is-shown:nth-of-type(3){-webkit-transition-delay:5.8s;transition-delay:5.8s}.p-introduction__link.is-shown:nth-of-type(4){-webkit-transition-delay:5.9s;transition-delay:5.9s}.p-introduction__link.is-shown:nth-of-type(5){-webkit-transition-delay:6s;transition-delay:6s}.p-introduction__follow{width:15px;height:10vh;overflow:hidden;position:relative;margin:6vh auto 0;opacity:0;-webkit-transition-property:opacity;transition-property:opacity}.p-introduction__follow.is-shown{opacity:1;-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-delay:3s;transition-delay:3s}.p-introduction__follow-in{width:1px;height:100%;position:absolute;top:0;background-color:#fff;-webkit-animation-name:loopFollow;animation-name:loopFollow;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.p-introduction__follow-in--1{left:0}.p-introduction__follow-in--2{left:50%;margin-left:-1px;-webkit-animation-delay:.3s;animation-delay:.3s}.p-introduction__follow-in--3{right:0;-webkit-animation-delay:.15s;animation-delay:.15s}.p-preloader{position:fixed;top:50%;left:50%;z-index:100;pointer-events:none}@media all and (min-width:569px){.p-preloader{width:60px;height:60px;margin-top:-30px;margin-left:-30px}}@media all and (max-width:568px){.p-preloader{width:30px;height:30px;margin-top:-15px;margin-left:-15px}}.p-preloader.is-hidden{opacity:0;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-property:opacity;transition-property:opacity}.p-preloader__box{width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:0;left:0;border-style:solid;-webkit-animation-name:rotatePreloaderBox;animation-name:rotatePreloaderBox;-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:both;animation-fill-mode:both}@media all and (min-width:569px){.p-preloader__box{border-width:3px}}@media all and (max-width:568px){.p-preloader__box{border-width:2px}}.p-preloader__box--blank{border-color:#111}.p-preloader__box--white{border-color:#fff}.p-preloader__box--02{-webkit-animation-delay:1s;animation-delay:1s}.p-preloader__box--03{-webkit-animation-delay:2s;animation-delay:2s}@-webkit-keyframes rotatePreloaderBox{0%{opacity:0;-webkit-transform:scale(.1) rotate(0);transform:scale(.1) rotate(0)}12.5%{opacity:1}25%{-webkit-transform:scale(1) rotate(180deg);transform:scale(1) rotate(180deg)}37.5%{opacity:1;-webkit-transform:scale(1) rotate(270deg);transform:scale(1) rotate(270deg)}50%{opacity:0;-webkit-transform:scale(1.2) rotate(360deg);transform:scale(1.2) rotate(360deg)}100%{opacity:0}}@keyframes rotatePreloaderBox{0%{opacity:0;-webkit-transform:scale(.1) rotate(0);transform:scale(.1) rotate(0)}12.5%{opacity:1}25%{-webkit-transform:scale(1) rotate(180deg);transform:scale(1) rotate(180deg)}37.5%{opacity:1;-webkit-transform:scale(1) rotate(270deg);transform:scale(1) rotate(270deg)}50%{opacity:0;-webkit-transform:scale(1.2) rotate(360deg);transform:scale(1.2) rotate(360deg)}100%{opacity:0}}.p-config-menu{position:fixed;bottom:20px;right:20px;z-index:100}.p-sketch-index{max-width:1366px;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative;top:0;right:0;left:0;z-index:100000;margin-right:auto;margin-left:auto}@media all and (min-width:1025px){.p-sketch-index{padding-top:100px;padding-bottom:50px;padding-right:7.5%;padding-left:7.5%}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index{padding-top:100px;padding-bottom:50px;padding-right:7.5%;padding-left:7.5%}}@media all and (max-width:568px){.p-sketch-index{padding-top:70px;padding-bottom:40px;padding-right:10px;padding-left:10px}}.p-sketch-index__item{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}@media all and (min-width:1025px){.p-sketch-index__item{width:33.3%;margin-bottom:60px;padding-right:15px;padding-left:15px}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index__item{width:50%;margin-bottom:40px;padding-right:10px;padding-left:10px}}@media all and (max-width:568px){.p-sketch-index__item{width:100%;margin-bottom:30px;padding-right:10px;padding-left:10px}}.p-sketch-index__item-wrap{display:block}.p-sketch-index__item-thumb{width:100%;position:relative;margin-bottom:10px;padding-top:52.5%;background-color:#fff;background-size:cover}.p-sketch-index__item-thumb:after,.p-sketch-index__item-thumb:before{content:"";display:block;position:absolute;top:0;right:0;bottom:0;left:0}.p-sketch-index__item-thumb:before{background-color:#fff}.p-sketch-index__item-thumb:after{background-color:rgba(0,0,0,.7)}.p-sketch-index__item-thumb-label{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;top:0;left:0;z-index:10;letter-spacing:.2em}@media all and (min-width:1025px){.p-sketch-index__item-thumb-label{font-size:24px;font-size:1.5rem}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index__item-thumb-label{font-size:21px;font-size:1.3125rem}}@media all and (max-width:568px){.p-sketch-index__item-thumb-label{font-size:18px;font-size:1.125rem}}.p-sketch-index__item-title{letter-spacing:.1em}@media all and (min-width:1025px){.p-sketch-index__item-title{font-size:32px;font-size:2rem}}@media all and (min-width:569px) and (max-width:1024px){.p-sketch-index__item-title{font-size:28px;font-size:1.75rem}}@media all and (max-width:568px){.p-sketch-index__item-title{font-size:24px;font-size:1.5rem}}.p-sketch-index__item-title .js-split-str{display:inline-block}.p-sketch-index__item-date{margin-top:5px;font-size:12px;font-size:.75rem}.p-sketch-index__item-thumb{-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-delay:.4s;transition-delay:.4s;-webkit-transition-timing-function:cubic-bezier(.075,.82,.165,1);transition-timing-function:cubic-bezier(.075,.82,.165,1)}.p-sketch-index__item-thumb:before{-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-delay:.6s;transition-delay:.6s}.p-sketch-index__item-thumb:after{opacity:0;-webkit-transition-duration:.4s;transition-duration:.4s}.p-sketch-index__item-thumb-label .js-split-str{opacity:0;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transition-duration:.6s;transition-duration:.6s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(1){-webkit-transition-delay:0s;transition-delay:0s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(2){-webkit-transition-delay:20ms;transition-delay:20ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(3){-webkit-transition-delay:40ms;transition-delay:40ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(4){-webkit-transition-delay:60ms;transition-delay:60ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(5){-webkit-transition-delay:80ms;transition-delay:80ms}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(6){-webkit-transition-delay:.1s;transition-delay:.1s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(7){-webkit-transition-delay:.12s;transition-delay:.12s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(8){-webkit-transition-delay:.14s;transition-delay:.14s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(9){-webkit-transition-delay:.16s;transition-delay:.16s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(10){-webkit-transition-delay:.18s;transition-delay:.18s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(11){-webkit-transition-delay:.2s;transition-delay:.2s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(12){-webkit-transition-delay:.22s;transition-delay:.22s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(13){-webkit-transition-delay:.24s;transition-delay:.24s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(14){-webkit-transition-delay:.26s;transition-delay:.26s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(15){-webkit-transition-delay:.28s;transition-delay:.28s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(16){-webkit-transition-delay:.3s;transition-delay:.3s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(17){-webkit-transition-delay:.32s;transition-delay:.32s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(18){-webkit-transition-delay:.34s;transition-delay:.34s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(19){-webkit-transition-delay:.36s;transition-delay:.36s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(20){-webkit-transition-delay:.38s;transition-delay:.38s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(21){-webkit-transition-delay:.4s;transition-delay:.4s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(22){-webkit-transition-delay:.42s;transition-delay:.42s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(23){-webkit-transition-delay:.44s;transition-delay:.44s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(24){-webkit-transition-delay:.46s;transition-delay:.46s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(25){-webkit-transition-delay:.48s;transition-delay:.48s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(26){-webkit-transition-delay:.5s;transition-delay:.5s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(27){-webkit-transition-delay:.52s;transition-delay:.52s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(28){-webkit-transition-delay:.54s;transition-delay:.54s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(29){-webkit-transition-delay:.56s;transition-delay:.56s}.p-sketch-index__item-thumb-label .js-split-str:nth-of-type(30){-webkit-transition-delay:.58s;transition-delay:.58s}.p-sketch-index__item-title .js-split-str{opacity:0;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transition-duration:.6s;transition-duration:.6s}.p-sketch-index__item-title .js-split-str:nth-of-type(1){-webkit-transition-delay:.6s;transition-delay:.6s}.p-sketch-index__item-title .js-split-str:nth-of-type(2){-webkit-transition-delay:.62s;transition-delay:.62s}.p-sketch-index__item-title .js-split-str:nth-of-type(3){-webkit-transition-delay:.64s;transition-delay:.64s}.p-sketch-index__item-title .js-split-str:nth-of-type(4){-webkit-transition-delay:.66s;transition-delay:.66s}.p-sketch-index__item-title .js-split-str:nth-of-type(5){-webkit-transition-delay:.68s;transition-delay:.68s}.p-sketch-index__item-title .js-split-str:nth-of-type(6){-webkit-transition-delay:.7s;transition-delay:.7s}.p-sketch-index__item-title .js-split-str:nth-of-type(7){-webkit-transition-delay:.72s;transition-delay:.72s}.p-sketch-index__item-title .js-split-str:nth-of-type(8){-webkit-transition-delay:.74s;transition-delay:.74s}.p-sketch-index__item-title .js-split-str:nth-of-type(9){-webkit-transition-delay:.76s;transition-delay:.76s}.p-sketch-index__item-title .js-split-str:nth-of-type(10){-webkit-transition-delay:.78s;transition-delay:.78s}.p-sketch-index__item-title .js-split-str:nth-of-type(11){-webkit-transition-delay:.8s;transition-delay:.8s}.p-sketch-index__item-title .js-split-str:nth-of-type(12){-webkit-transition-delay:.82s;transition-delay:.82s}.p-sketch-index__item-title .js-split-str:nth-of-type(13){-webkit-transition-delay:.84s;transition-delay:.84s}.p-sketch-index__item-title .js-split-str:nth-of-type(14){-webkit-transition-delay:.86s;transition-delay:.86s}.p-sketch-index__item-title .js-split-str:nth-of-type(15){-webkit-transition-delay:.88s;transition-delay:.88s}.p-sketch-index__item-title .js-split-str:nth-of-type(16){-webkit-transition-delay:.9s;transition-delay:.9s}.p-sketch-index__item-title .js-split-str:nth-of-type(17){-webkit-transition-delay:.92s;transition-delay:.92s}.p-sketch-index__item-title .js-split-str:nth-of-type(18){-webkit-transition-delay:.94s;transition-delay:.94s}.p-sketch-index__item-title .js-split-str:nth-of-type(19){-webkit-transition-delay:.96s;transition-delay:.96s}.p-sketch-index__item-title .js-split-str:nth-of-type(20){-webkit-transition-delay:.98s;transition-delay:.98s}.p-sketch-index__item-title .js-split-str:nth-of-type(21){-webkit-transition-delay:1s;transition-delay:1s}.p-sketch-index__item-title .js-split-str:nth-of-type(22){-webkit-transition-delay:1.02s;transition-delay:1.02s}.p-sketch-index__item-title .js-split-str:nth-of-type(23){-webkit-transition-delay:1.04s;transition-delay:1.04s}.p-sketch-index__item-title .js-split-str:nth-of-type(24){-webkit-transition-delay:1.06s;transition-delay:1.06s}.p-sketch-index__item-title .js-split-str:nth-of-type(25){-webkit-transition-delay:1.08s;transition-delay:1.08s}.p-sketch-index__item-title .js-split-str:nth-of-type(26){-webkit-transition-delay:1.1s;transition-delay:1.1s}.p-sketch-index__item-title .js-split-str:nth-of-type(27){-webkit-transition-delay:1.12s;transition-delay:1.12s}.p-sketch-index__item-title .js-split-str:nth-of-type(28){-webkit-transition-delay:1.14s;transition-delay:1.14s}.p-sketch-index__item-title .js-split-str:nth-of-type(29){-webkit-transition-delay:1.16s;transition-delay:1.16s}.p-sketch-index__item-title .js-split-str:nth-of-type(30){-webkit-transition-delay:1.18s;transition-delay:1.18s}.p-sketch-index__item-date{opacity:0;-webkit-transition-duration:1s;transition-duration:1s;-webkit-transition-delay:.8s;transition-delay:.8s}.p-sketch-index__item.is-shown .p-sketch-index__item-thumb{-webkit-transform:scaleY(1);transform:scaleY(1)}.p-sketch-index__item.is-shown .p-sketch-index__item-thumb:before{opacity:0}.p-sketch-index__item.is-shown .p-sketch-index__item-title .js-split-str{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.p-sketch-index__item.is-shown .p-sketch-index__item-date{opacity:1}.p-sketch-index__item:hover .p-sketch-index__item-thumb:after{opacity:1}.p-sketch-index__item:hover .p-sketch-index__item-thumb-label .js-split-str{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.p-sketch-outline{position:fixed;z-index:100;bottom:22px;left:20px}@media all and (max-width:568px){.p-sketch-outline{right:20px}}.p-sketch-outline__title{line-height:1;margin-top:0;margin-bottom:.075em;margin-left:-.05em;font-weight:100;letter-spacing:.05em}@media all and (min-width:1367px){.p-sketch-outline__title{font-size:80px}}@media all and (min-width:569px) and (max-width:1366px){.p-sketch-outline__title{font-size:6vw}}@media all and (max-width:568px){.p-sketch-outline__title{font-size:62.48px}}.p-sketch-outline__date{line-height:1;margin:0}.p-sketch-outline__description{line-height:1.5;margin:10px 0 0}.p-sketch-outline__assets{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:8px;margin-bottom:0}.p-sketch-outline__assets dd{margin:0}.p-sketch-outline__assets ul{display:-webkit-box;display:-ms-flexbox;display:flex;list-style-type:none;margin:0;padding:0}.p-sketch-outline__assets li{margin-left:12px}.p-utility-menu{position:fixed;z-index:100;top:25px;right:20px}.p-website-outline{position:fixed;z-index:100;top:20px;left:20px}.p-website-outline__title{margin:0 0 5px;font-size:18px;font-size:1.125rem}.p-website-outline__description{line-height:1.25;margin:0}.p-website-outline__links{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:15px}.p-website-outline__link{width:18px;height:18px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:20px}.p-website-outline__link svg{width:18px}
src/main/webapp/static/js/basStation/basStation.js
@@ -23,14 +23,15 @@
        cols: [[
            {type: 'checkbox'}
            , {field: 'devNo', align: 'center', title: '站点台号'}
            , {field: 'decDesc', align: 'center', title: '设备描述'}
            , {field: 'decDesc', align: 'center', title: '设备描述',hide:true}
            , {field: 'area', align: 'center', title: '区域'}
            , {field: 'locSts$', align: 'center', title: '状态'}
            , {field: 'barcode', align: 'center', title: '刀架号'}
            , {field: 'ioTime', align: 'center', title: '入出库时间'}
            , {field: 'modiUser$', align: 'center', title: '修改人员'}
            , {field: 'modiTime$', align: 'center', title: '修改时间'}
            , {field: 'appeUser$', align: 'center', title: '创建者'}
            , {field: 'appeTime$', align: 'center', title: '添加时间'}
            , {field: 'appeUser$', align: 'center', title: '创建者',hide: true}
            , {field: 'appeTime$', align: 'center', title: '添加时间',hide: true}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 120}
        ]],
        request: {
src/main/webapp/static/js/task/task.js
@@ -22,20 +22,24 @@
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            , {field: 'wrkNo', align: 'center', title: '工作号', sort: true, width: 105}
            , {field: 'ioTime$', align: 'center', title: '工作时间', width: 160}
            , {field: 'wrkNo', align: 'center', title: '工作号', sort: true}
            , {field: 'taskNo', align: 'center', title: 'AGV任务号', sort: true}
            // , {field: 'ioTime$', align: 'center', title: '工作时间', width: 160}
            , {field: 'wrkSts$', align: 'center', title: '工作状态', width: 150}
            , {field: 'ioType$', align: 'center', title: '入出库类型', width: 150}
            , {field: 'ioPri', align: 'center', title: '优先级', width: 80}
            , {field: 'taskType$', align: 'center', title: '任务类型'}
            , {field: 'ioType$', align: 'center', title: '入出库类型', width: 150, hide: true}
            , {field: 'ioPri', align: 'center', title: '优先级', width: 80, hide: true}
            , {field: 'taskType$', align: 'center', title: '任务类型', hide: true}
            , {field: 'crnNo$', align: 'center', title: '堆垛机', hide: true}
            , {field: 'sourceStaNo$', align: 'center', title: '源站'}
            , {field: 'staNo$', align: 'center', title: '目标站', width: 120}
            , {field: 'sourceLocNo', align: 'center', title: '源库位', width: 120}
            , {field: 'locNo', align: 'center', title: '目标库位', width: 120}
            , {field: 'barcode', align: 'center', title: '条码', width: 110}
            , {field: 'preHave', align: 'center', title: '先入品', hide: true}
            , {field: 'takeNone', align: 'center', title: '空操作', hide: true}
            , {field: 'sourceStaNo', align: 'center', title: '源站'}
            , {field: 'staNo', align: 'center', title: '目标站', width: 120}
            // , {field: 'sourceLocNo', align: 'center', title: '源库位', width: 120}
            // , {field: 'locNo', align: 'center', title: '目标库位', width: 120}
            , {field: 'barcode', align: 'center', title: '刀架号', width: 110}
            , {field: 'memo', align: 'center', title: '备注'}
            // , {field: 'preHave', align: 'center', title: '先入品', hide: true}
            // , {field: 'takeNone', align: 'center', title: '空操作', hide: true}
            , {field: 'modiUser$', align: 'center', title: '创建人员'}
            , {field: 'appeTime$', align: 'center', title: '创建时间'}
            , {field: 'modiUser$', align: 'center', title: '修改人员', hide: true}
            , {field: 'modiTime$', align: 'center', title: '修改时间', hide: true, width: 160}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 200}
src/main/webapp/static/js/taskLog/taskLog.js
@@ -20,20 +20,27 @@
        toolbar: '#toolbar',
        cellMinWidth: 50,
        cols: [[
            {field: 'wrkNo', align: 'center', title: '工作号', event: 'wrkNo', sort: true}
            , {field: 'ioTime$', align: 'center', title: '工作时间', width: 160, sort: true}
            , {field: 'wrkSts$', align: 'center', title: '工作状态', width: 160}
            , {field: 'ioType$', align: 'center', title: '入出库类型', width: 160}
            , {field: 'ioPri', align: 'center', title: '优先级'}
            , {field: 'crnNo$', align: 'center', title: '堆垛机号'}
            , {field: 'sourceStaNo$', align: 'center', title: '源站'}
            , {field: 'staNo$', align: 'center', title: '目标站'}
            , {field: 'sourceLocNo$', align: 'center', title: '源库位'}
            , {field: 'locNo$', align: 'center', title: '目标库位'}
            {field: 'wrkNo', align: 'center', title: '工作号', sort: true}
            , {field: 'taskNo', align: 'center', title: 'AGV任务号', sort: true}
            // , {field: 'ioTime$', align: 'center', title: '工作时间', width: 160}
            , {field: 'wrkSts$', align: 'center', title: '工作状态', width: 150}
            , {field: 'ioType$', align: 'center', title: '入出库类型', width: 150, hide: true}
            , {field: 'ioPri', align: 'center', title: '优先级', width: 80, hide: true}
            , {field: 'taskType$', align: 'center', title: '任务类型', hide: true}
            , {field: 'crnNo$', align: 'center', title: '堆垛机', hide: true}
            , {field: 'sourceStaNo', align: 'center', title: '源站'}
            , {field: 'staNo', align: 'center', title: '目标站', width: 120}
            // , {field: 'sourceLocNo', align: 'center', title: '源库位', width: 120}
            // , {field: 'locNo', align: 'center', title: '目标库位', width: 120}
            , {field: 'barcode', align: 'center', title: '刀架号', width: 110}
            , {field: 'memo', align: 'center', title: '备注'}
            // , {field: 'preHave', align: 'center', title: '先入品', hide: true}
            // , {field: 'takeNone', align: 'center', title: '空操作', hide: true}
            , {field: 'modiUser$', align: 'center', title: '创建人员'}
            , {field: 'appeTime$', align: 'center', title: '创建时间'}
            , {field: 'modiUser$', align: 'center', title: '修改人员', hide: true}
            , {field: 'modiTime$', align: 'center', title: '修改时间', hide: true}
            , {field: 'barcode', align: 'center', title: '条码'}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 80}
            , {field: 'modiTime$', align: 'center', title: '修改时间', hide: true, width: 160}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 200}
        ]],
        request: {
            pageName: 'curr',