自动化立体仓库 - WMS系统
zyx
2024-01-05 0e46bb0cfc8b59ad5527f0b70c49f95aeac4bbbd
# 入库拣货功能添加
12个文件已添加
22个文件已修改
1185 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConfigTypeController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/PlaController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ConfigType.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Pla.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/PlaQty.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ConfigTypeMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/PlaQtyMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/ConfigTypeService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/PlaQtyService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/PlaService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/ConfigTypeServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/PlaQtyServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/PlaServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/configType/configType.js 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/out.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/picking/picking.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/pla/plaDetl.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/pla/productionInfo.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/pla/qualityInfo.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/configType/configType.html 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/configType/configTypeAdd.html 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/order.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/out.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/picking/picking.html 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pla/plaDetl.html 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConfigTypeController.java
New file
@@ -0,0 +1,74 @@
package com.zy.asrs.controller;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.zy.asrs.entity.ConfigType;
import com.zy.asrs.service.ConfigTypeService;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Map;
@RestController
public class ConfigTypeController extends BaseController {
    @Autowired
    private ConfigTypeService configTypeService;
    @RequestMapping(value = "/cinfigType/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") Long id) {
        return R.ok(configTypeService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/cinfigType/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        excludeTrash(param);
        EntityWrapper<ConfigType> wrapper = new EntityWrapper<>();
        convert(param, wrapper);
        wrapper.orderBy("id", false);
        return R.ok(configTypeService.selectPage(new Page<>(curr, limit), wrapper));
    }
    @RequestMapping(value = "/configType/add/auth")
    @ManagerAuth
    public R list(ConfigType configType){
        if (Cools.isEmpty(configType)){
            return R.error();
        }
        configType.setCreateTime(new Date());
        configTypeService.insert(configType);
        return R.ok();
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
}
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -2,7 +2,6 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
@@ -16,8 +15,6 @@
import com.zy.asrs.entity.result.MobileAdjustResult;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.model.WrkDto;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
@@ -421,5 +418,35 @@
        return mobileService.manDetlOriginOut(json,getUser());
    }
    @RequestMapping("/plaDetl/packin/v1")
//    @ManagerAuth(memo="pla入库")
    public R plaPackIn(@RequestBody JSONObject json){
        String locNo = json.get("locNo").toString();
        String batch = json.get("batch").toString();
        String packageNo = json.get("packageNo").toString();
        if(Cools.isEmpty(locNo) || Cools.isEmpty(batch) || Cools.isEmpty(packageNo)){
            return R.error("有参数为空,无法入库");
        }
        mobileService.plaPakin(locNo,batch,packageNo);
        return R.ok();
    }
    @RequestMapping("/plaDetl/packout/v1")
//    @ManagerAuth(memo="pla出库")
    public R plaPackOut(@RequestBody JSONObject json){
        String locNo = json.get("locNo").toString();
        String batch = json.get("batch").toString();
        String packageNo = json.get("packageNo").toString();
        String orderNo = json.get("orderNo").toString();
        String orderDetlId = json.get("orderDetlId").toString();
        String wrkNo = json.get("wrkNo").toString();
        Double anfme = Double.parseDouble(json.get("anfme").toString());
        if(Cools.isEmpty(locNo) || Cools.isEmpty(batch) || Cools.isEmpty(packageNo)){
            return R.error("有参数为空,无法入库");
        }
        mobileService.plaPakout(locNo,batch,packageNo,orderNo,orderDetlId,wrkNo,anfme);
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/OrderController.java
@@ -9,7 +9,6 @@
import com.core.annotations.ManagerAuth;
import com.core.common.*;
import com.core.exception.CoolException;
import com.sun.org.apache.xpath.internal.operations.Or;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.OrderDomainParam;
import com.zy.asrs.entity.result.OrderDetlVo;
@@ -228,7 +227,8 @@
        List<DetlDto> list = new ArrayList<>();
        for (OrderDetl orderDetl : param.getOrderDetlList()) {
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch());
            if (DetlDto.has(list, dto)) {
            //if (DetlDto.has(list, dto)) {
            if(false){
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch());
                item.setAnfme(item.getAnfme() + orderDetl.getAnfme());
                if (!orderDetlService.updateById(item)) {
src/main/java/com/zy/asrs/controller/OutController.java
@@ -11,13 +11,15 @@
import com.zy.common.model.TaskDto;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -45,6 +47,10 @@
    private ManPakOutService manPakOutService;
    @Autowired
    private ManLocDetlService manLocDetlService;
    @Autowired
    private PlaService plaService;
    @Autowired
    private PlaQtyService plaQtyService;
    @PostMapping("/out/pakout/orderDetlIds/auth")
@@ -68,6 +74,15 @@
            }
        }
        List<PlaQty> plaQties = new ArrayList<>();
        for (OrderDetl orderDetl : orderDetls) {
            plaService.queryStock(orderDetl,plaQties);
        }
        return R.ok(plaQties);
/*
        Set<String> exist = new HashSet<>();
        for (OrderDetl orderDetl : orderDetls) {
@@ -108,12 +123,13 @@
                locDtos.add(locDto);
            }
        }
        return R.ok().add(locDtos);
        return R.ok().add(locDtos); */
    }
    @PostMapping("/out/pakout/auth")
    @ManagerAuth(memo = "订单出库")
    public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
        int[][] is=new int[locDtos.size()][2];
        for (int i=0;i<locDtos.size();i++){
            LocDto locDto=locDtos.get(locDtos.size()-1-i);
@@ -168,8 +184,29 @@
    @PostMapping("/out/pakout2/auth")
    @ManagerAuth(memo = "生成拣货单")
    public synchronized R pakout2(@RequestBody List<LocDto> locDtos) throws InterruptedException {
        int[][] is = new int[locDtos.size()][2];
    @Transactional
    public synchronized R pakout2(@RequestBody List<PlaQty> plaQties) throws InterruptedException {
        for (PlaQty plaQty : plaQties){
            if(Cools.isEmpty(plaQty.getLocNo())){
                continue;
            }
            plaQtyService.insert(plaQty);
            addPakOUT(plaQty);
            Pla pla = plaService.selectByBatchAndPackageNo(plaQty.getBatch(), plaQty.getPackageNo());
            pla.setQtyAnfme(pla.getQtyAnfme() + plaQty.getQtyAnfme());
            plaService.updateById(pla);
            OrderDetl orderDetl = orderDetlService.selectById(plaQty.getOrderDetlId());
            orderDetl.setWorkQty(orderDetl.getWorkQty() + plaQty.getQtyAnfme());
            orderDetlService.updateById(orderDetl);
            orderService.updateSettle(plaQty.getOrderId(),2L,null);
        }
        return R.ok();
    /*  int[][] is = new int[locDtos.size()][2];
        List<String> matnrs=new ArrayList<>();
        for (int i = 0; i < locDtos.size(); i++) {
            LocDto locDto = locDtos.get(locDtos.size() - 1 - i);
@@ -261,6 +298,24 @@
                addPakOUT(locDto,uuid).equals(R.ok());
            }
        }
        return R.ok(); */
    }
    private R addPakOUT(PlaQty plaQty){
        ManPakOut manPakOut=new ManPakOut();
        manPakOut.setWrkNo(plaQty.getOrderNo()+"-"+System.currentTimeMillis());
        manPakOut.setWrkSts((long)1);
        manPakOut.setAnfme(plaQty.getQtyAnfme());
        manPakOut.setLocNo(plaQty.getLocNo());
        manPakOut.setBatch(plaQty.getBatch());
        manPakOut.setBarcode(plaQty.getPackageNo());
        manPakOut.setUuid(String.valueOf(System.currentTimeMillis()));
        manPakOut.setCreateTime(new Date());
        manPakOut.setUpdateTime(new Date());
        manPakOut.setCount(0.0);
        manPakOut.setDocNum(plaQty.getOrderNo());
        manPakOut.setNodeId(plaQty.getOrderDetlId());
        manPakOutService.insert(manPakOut);
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/PlaController.java
@@ -56,7 +56,6 @@
        return R.ok();
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
src/main/java/com/zy/asrs/entity/ConfigType.java
New file
@@ -0,0 +1,18 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
@Data
@TableName("asr_config_type")
public class ConfigType {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String type;
    private String value;
    private Date createTime;
}
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -327,6 +327,23 @@
    @TableField("uuid")
    private String uuid;
    //最大熔指
    private double fingerMeltingMin;
    //最小熔指
    private double fingerMeltingMax;
    //最大熔点
    private double fusingPointMin;
    //最小熔点
    private double fusingPointMax;
    //最大黄度
    private double yellownessMin;
    //最大黄度
    private double yellownessMax;
    //最小不透明度
    private double opacityMin;
    //最大不透明度
    private double opacityMax;
    public String getOwner$(){
        LocOwnerService service = SpringUtils.getBean(LocOwnerService.class);
        LocOwner locOwner = service.selectById(this.owner);
src/main/java/com/zy/asrs/entity/Pla.java
@@ -30,7 +30,7 @@
    private String brand;
    //重量
    private double weight;
    private Double weight;
    //车间
    private String workshop;
@@ -48,37 +48,37 @@
    private String filmWrap;
    //熔指
    private double fingerMelting;
    private Double fingerMelting;
    //熔点
    private double fusingPoint;
    private Double fusingPoint;
    //挥发份1
    private double vadf1;
    private Double vadf1;
    //挥发份2
    private double vadf2;
    private Double vadf2;
    //黄度
    private double yellowness;
    private Double yellowness;
    //不透明度
    private double opacity;
    private Double opacity;
    //水分
    private double water;
    private Double water;
    //L值
    private double l;
    private Double l;
    //a值
    private double a;
    private Double a;
    //b值
    private double b;
    private Double b;
    //填充
    private double fillIn;
    private Double fillIn;
    //质量状态
    private String massState;
@@ -93,7 +93,9 @@
    private String locNo;
    //剩余重量
    private String weightAnfme;
    private Double weightAnfme = 0.0;
    //剩余重量
    private Double qtyAnfme = 0.0;
    //状态
    private String status;
src/main/java/com/zy/asrs/entity/PlaQty.java
New file
@@ -0,0 +1,52 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@TableName("asr_pla_qty")
public class PlaQty {
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    //批号
    private String batch;
    //包装号
    private String packageNo;
    //单据明细id
    private Long orderDetlId;
    //单据id
    private Long orderId;
    //单据编号
    private String orderNo;
    //该明细对于该批次的pla作业数量
    private Double qtyAnfme;
    //库位号
    private String locNo;
    //创建时间
    private Date createTime;
    public PlaQty(String batch, String packageNo, Long orderDetlId, Long orderId, String orderNo, Double qtyAnfme, String locNo, Date createTime) {
        this.batch = batch;
        this.packageNo = packageNo;
        this.orderDetlId = orderDetlId;
        this.orderNo = orderNo;
        this.qtyAnfme = qtyAnfme;
        this.locNo = locNo;
        this.createTime = createTime;
        this.orderId = orderId;
    }
}
src/main/java/com/zy/asrs/mapper/ConfigTypeMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.ConfigType;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface ConfigTypeMapper extends BaseMapper<ConfigType> {
}
src/main/java/com/zy/asrs/mapper/PlaQtyMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.PlaQty;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface PlaQtyMapper extends BaseMapper<PlaQty> {
}
src/main/java/com/zy/asrs/service/ConfigTypeService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.ConfigType;
public interface ConfigTypeService extends IService<ConfigType> {
}
src/main/java/com/zy/asrs/service/MobileService.java
@@ -53,4 +53,8 @@
    R manDetlOrigInNo(JSONObject json, User user);
    R manDetlOriginOut(JSONObject json, User user);
    void plaPakin(String locNo, String batch, String packageNo);
    void plaPakout(String locNo, String batch, String packageNo, String orderNo, String orderDetlId, String wrkNo,Double anfme);
}
src/main/java/com/zy/asrs/service/PlaQtyService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.PlaQty;
public interface PlaQtyService extends IService<PlaQty> {
}
src/main/java/com/zy/asrs/service/PlaService.java
@@ -1,8 +1,16 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.Pla;
import com.zy.asrs.entity.PlaQty;
import java.util.List;
public interface PlaService extends IService<Pla> {
    Pla selectByBatchAndPackageNo(String batch, String packageNo);
    void queryStock(OrderDetl orderDetl, List<PlaQty> plaQties);
}
src/main/java/com/zy/asrs/service/impl/ConfigTypeServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.ConfigType;
import com.zy.asrs.mapper.ConfigTypeMapper;
import com.zy.asrs.service.ConfigTypeService;
import org.springframework.stereotype.Service;
@Service
public class ConfigTypeServiceImpl extends ServiceImpl<ConfigTypeMapper, ConfigType> implements ConfigTypeService {
}
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1,26 +1,24 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.*;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.exception.CoolException;
import com.sun.org.apache.xpath.internal.operations.Or;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.MobileAdjustNewParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.SaasUtils;
import com.zy.common.CodeRes;
import com.zy.common.constant.MesConstant;
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.common.utils.Synchro;
import com.zy.system.entity.User;
import lombok.extern.slf4j.Slf4j;
@@ -29,8 +27,10 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
 * 移动端服务核心类
@@ -98,6 +98,8 @@
    @Autowired
    private LocOwnerService locOwnerService;
    @Autowired
    private PlaService plaService;
@@ -1198,4 +1200,51 @@
        }
        return R.ok();
    }
    @Override
    public void plaPakin(String locNo, String batch, String packageNo) {
        Pla pla = plaService.selectByBatchAndPackageNo(batch, packageNo);
        if("已入库".equals(pla.getStatus())){
            throw new CoolException("该物料已入库");
        }
        pla.setStatus("已入库");
        pla.setModifyTime(new Date());
        plaService.updateById(pla);
    }
    @Override
    @Transactional
    public void plaPakout(String locNo, String batch, String packageNo, String orderNo, String orderDetlId, String wrkNo, Double anfme) {
        Pla pla = plaService.selectByBatchAndPackageNo(batch, packageNo);
        //Order order = orderService.selectByNo(orderNo);
        OrderDetl orderDetl = orderDetlService.selectById(orderDetlId);
        ManPakOut manPakOut = manPakOutService.selectById(wrkNo);
        //更新拣货单信息
        if(manPakOut.getCount() + anfme > manPakOut.getAnfme()){
            throw new CoolException("拣货重量大于拣货单所需拣货重量,请重新分配拣货重量");
        }
        manPakOut.setCount(manPakOut.getCount() + anfme);
        if (manPakOut.getAnfme().equals(manPakOut.getCount())){
            manPakOut.setStatus(1);
            manPakOutService.updateById(manPakOut);
        }
        //更新单据明细
        orderDetl.setQty(orderDetl.getQty() + anfme);
        orderDetlService.updateById(orderDetl);
        //更新单据信息
        orderService.checkComplete(orderNo);
        //更新pla明细
        pla.setWeightAnfme(pla.getWeightAnfme() - anfme);
        if(pla.getWeightAnfme() <= 0){
            pla.setStatus("全部出库");
        }else {
            pla.setStatus("部分出库");
        }
        plaService.updateById(pla);
    }
}
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
@@ -2,11 +2,11 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.Cools;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.OrderDetlService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.service.OrderDetlService;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -21,6 +21,8 @@
    @Override
    public Page<OrderDetl> getPakoutPage(Page<OrderDetl> page) {
        List<OrderDetl> pakoutPage = baseMapper.getPakoutPage(page.getCondition());
        System.out.println(pakoutPage);
        page.setRecords(baseMapper.getPakoutPage(page.getCondition()));
        page.setTotal(baseMapper.getPakoutPageCount(page.getCondition()));
        return page;
src/main/java/com/zy/asrs/service/impl/PlaQtyServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.PlaQty;
import com.zy.asrs.mapper.PlaQtyMapper;
import com.zy.asrs.service.PlaQtyService;
import org.springframework.stereotype.Service;
@Service("plaQtyService")
public class PlaQtyServiceImpl extends ServiceImpl<PlaQtyMapper, PlaQty> implements PlaQtyService {
}
src/main/java/com/zy/asrs/service/impl/PlaServiceImpl.java
@@ -1,12 +1,87 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.Pla;
import com.zy.asrs.entity.PlaQty;
import com.zy.asrs.mapper.PlaMapper;
import com.zy.asrs.service.PlaQtyService;
import com.zy.asrs.service.PlaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@Service("plaService")
public class PlaServiceImpl extends ServiceImpl<PlaMapper, Pla> implements PlaService {
    @Autowired
    private PlaQtyService plaQtyService;
    public Pla selectByBatchAndPackageNo(String batch, String packageNo) {
        return this.selectOne(new EntityWrapper<Pla>().eq("batch",batch).eq("package_no",packageNo));
    }
    @Override
    @Transactional
    public void queryStock(OrderDetl orderDetl, List<PlaQty> plaQties) {
        //筛选条件 批号、包好、熔点、熔指、黄度、不透明度
        Wrapper<Pla> wrapper = new EntityWrapper<Pla>();
        if(!Cools.isEmpty(orderDetl.getBatch())){
            wrapper.eq("batch",orderDetl.getBatch());
        }
        if(!Cools.isEmpty(orderDetl.getBrand())){
            wrapper.eq("package_no",orderDetl.getBrand());
        }
        wrapper.eq("status","已入库");
        wrapper.ge("finger_melting", orderDetl.getFingerMeltingMin()).le("finger_melting", orderDetl.getFingerMeltingMax());
        wrapper.ge("fusing_point", orderDetl.getFusingPointMin()).le("fusing_point", orderDetl.getFusingPointMax());
        wrapper.ge("yellowness", orderDetl.getYellownessMin()).le("yellowness", orderDetl.getYellownessMax());
        wrapper.ge("opacity", orderDetl.getOpacityMin()).le("opacity", orderDetl.getOpacityMax());
        wrapper.orderBy("pakin_time");
        List<Pla> plas = this.selectList(wrapper);
        //总共的出库的数量(总计出库数量-作业数量)
        if(Cools.isEmpty(orderDetl.getWorkQty())){
            orderDetl.setWorkQty(0.0);
        }
        Double anfme = orderDetl.getAnfme() - orderDetl.getWorkQty();
        for (Pla pla : plas){
            //库存数量(剩余重量-库存作业数量)
            Double weightAnfme = pla.getWeightAnfme() - pla.getQtyAnfme();
            if(weightAnfme <= 0){
                continue;
            }
            //需要减去此次出库预览其他订单需出库的数量
            for (PlaQty plaQty : plaQties){
                if(Cools.eq(plaQty.getBatch(),pla.getBatch()) && Cools.eq(plaQty.getPackageNo(),pla.getPackageNo())){
                    weightAnfme -= plaQty.getQtyAnfme();
                }
            }
            if(weightAnfme > anfme){
                //如果该批次包号剩余重量大于订单明细数量,则返回plaQties
                PlaQty plaQty = new PlaQty(pla.getBatch(),pla.getPackageNo(),orderDetl.getId(),orderDetl.getOrderId(),orderDetl.getOrderNo(),anfme,pla.getLocNo(),new Date());
                anfme = 0.0;
                plaQties.add(plaQty);
                break;
            }else {
                PlaQty plaQty = new PlaQty(pla.getBatch(),pla.getPackageNo(),orderDetl.getId(),orderDetl.getOrderId(),orderDetl.getOrderNo(),weightAnfme,pla.getLocNo(),new Date());
                anfme -= weightAnfme;
                plaQties.add(plaQty);
            }
        }
        if(anfme > 0){
            PlaQty plaQty = new PlaQty(orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getId(),orderDetl.getOrderId(),orderDetl.getOrderNo(),anfme,null,new Date());
            plaQties.add(plaQty);
        }
    }
}
src/main/resources/mapper/OrderDetlMapper.xml
@@ -48,6 +48,14 @@
        <result column="owner" property="owner" />
        <result column="payment" property="payment" />
        <result column="uuid" property="uuid" />
        <result column="finger_melting_min" property="fingerMeltingMin" />
        <result column="finger_melting_max" property="fingerMeltingMax" />
        <result column="fusing_point_min" property="fusingPointMin" />
        <result column="fusing_point_max" property="fusingPointMax" />
        <result column="yellowness_min" property="yellownessMin" />
        <result column="yellowness_max" property="yellownessMax" />
        <result column="opacity_min" property="opacityMin" />
        <result column="opacity_max" property="opacityMax" />
    </resultMap>
src/main/webapp/static/js/configType/configType.js
New file
@@ -0,0 +1,387 @@
var pageCurr;
var roleId;
var powerTreeData;
layui.use(['table','laydate', 'form'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    // 数据渲染
    tableIns = table.render({
        elem: '#configType',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/cinfigType/list/auth',
        page: true,
        limit: 16,
        limits: [16, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        cols: [[
            {type: 'checkbox', fixed: 'left'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
            ,{field: 'type', align: 'center',title: '类型'}
            ,{field: 'value', align: 'center',title: '值'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:150}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // 监听排序事件
    table.on('sort(role)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {
                curr: 1
            },
            done: function (res, curr, count) {
                if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                }
                pageCurr=curr;
                limit();
            }
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(configType)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id);
        switch(obj.event) {
            case 'addData':
                layer.open({
                    type: 2,
                    title: '新增',
                    maxmin: true,
                    area: ['800px', top.detailHeight],
                    shadeClose: false,
                    content: 'configTypeAdd.html',
                    success: function(layero, index){
                        clearFormVal(layer.getChildFrame('#detail', index));
                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
                    }
                });
                break;
            case 'refreshData':
                tableIns.reload({
                    page: {
                        curr: pageCurr
                    }
                });
                limit();
                break;
            case 'deleteData':
                var data = checkStatus.data;
                var ids=[];
                data.map(function (track) {
                    ids.push(track.id);
                });
                if (ids.length === 0){
                    layer.msg('请选择数据');
                } else {
                    layer.confirm('确定删除'+(ids.length===1?'此':ids.length)+'条数据吗', function(){
                        $.ajax({
                            url: baseUrl+"/role/delete/auth",
                            headers: {'token': localStorage.getItem('token')},
                            data: {ids: ids},
                            method: 'POST',
                            traditional:true,
                            success: function (res) {
                                if (res.code === 200){
                                    layer.closeAll();
                                    tableReload(false);
                                } else if (res.code === 403){
                                    top.location.href = baseUrl+"/";
                                } else {
                                    layer.msg(res.msg)
                                }
                            }
                        })
                    });
                }
                break;
            case 'exportData':
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'role': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/role/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg)
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(role)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            // 详情
            case 'detail':
                layer.open({
                    type: 2,
                    title: '详情',
                    maxmin: true,
                    area: [top.detailWidth, top.detailHeight],
                    shadeClose: false,
                    content: 'role_detail.html',
                    success: function(layero, index){
                        setFormVal(layer.getChildFrame('#detail', index), data, true);
                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
                        layer.getChildFrame('#data-detail-submit,#prompt', index).hide();
                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
                    }
                });
                break;
            // 编辑
            case 'edit':
                layer.open({
                    type: 2,
                    title: '修改',
                    maxmin: true,
                    area: [top.detailWidth, top.detailHeight],
                    shadeClose: false,
                    content: 'role_detail.html',
                    success: function(layero, index){
                        setFormVal(layer.getChildFrame('#detail', index), data, false);
                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), false);
                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
                    }
                });
                break;
            case 'leader':
                var param = top.reObject(data).leader;
                if (param === undefined) {
                    layer.msg("无数据");
                } else {
                   layer.open({
                       type: 2,
                       title: '详情',
                       maxmin: true,
                       area: [top.detailHeight, top.detailWidth],
                       shadeClose: false,
                       content: '../role/role_detail.html',
                       success: function(layero, index){
                           $.ajax({
                               url: baseUrl+"/role/"+ param +"/auth",
                               headers: {'token': localStorage.getItem('token')},
                               method: 'GET',
                               success: function (res) {
                                   if (res.code === 200){
                                       setFormVal(layer.getChildFrame('#detail', index), res.data, true);
                                       top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
                                       layer.getChildFrame('#data-detail-submit,#prompt', index).hide();
                                       layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
                                       layero.find('iframe')[0].contentWindow.layui.form.render('select');
                                   } else if (res.code === 403){
                                       parent.location.href = "/";
                                   }else {
                                       layer.msg(res.msg)
                                   }
                               }
                           })
                       }
                   });
                }
                break;
            case 'power':
                roleId = data.id;
                layer.open({
                    type: 2,
                    title: data.name + ' 权限分配',
                    maxmin: true,
                    area: [top.detailWidth/2, '85%'],
                    shadeClose: false,
                    content: 'role_power_detail.html',
                    success: function(layero, index){
                    }
                });
                break;
        }
    });
    // 数据修改动作
    form.on('submit(edit)', function () {
        var index = layer.load(1, {
            shade: [0.5,'#000'] //0.1透明度的背景
        });
        var data = {
            type: $('#type').val(),
            value: $('#value').val(),
        };
        $.ajax({
            url: baseUrl+"/configType/add/auth",
            headers: {'token': localStorage.getItem('token')},
            data: top.reObject(data),
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    parent.layer.closeAll();
                    tableReload(true);
                    $("#data-detail :input").each(function () {
                        $(this).val("");
                    });
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg)
                }
                layer.close(index);
            }
        })
    });
    // 搜索栏搜索事件
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // 搜索栏重置事件
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 时间选择器
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    (child ? parent.tableIns : tableIns).reload({
        where: searchData,
        page: {
            curr: pageCurr
        },
        done: function (res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            if (res.data.length === 0 && count !== 0) {
                tableIns.reload({
                    where: searchData,
                    page: {
                        curr: pageCurr-1
                    }
                });
                pageCurr -= 1;
            }
            limit(child);
        }
    });
}
function setFormVal(el, data, showImg) {
    for (var val in data) {
        var find = el.find(":input[id='" + val + "']");
        find.val(data[val]);
        if (showImg){
            var next = find.next();
            if (next.get(0)){
                if (next.get(0).localName === "img") {
                    find.hide();
                    next.attr("src", data[val]);
                    next.show();
                }
            }
        }
    }
}
function clearFormVal(el) {
    $(':input', el)
        .val('')
        .removeAttr('checked')
        .removeAttr('selected');
}
function detailScreen(index) {
    var detail = layer.getChildFrame('#data-detail', index);
    var height = detail.height()+60;
    if (height > ($(window).height()*0.9)) {
        height = ($(window).height()*0.9);
    }
    layer.style(index, {
        top: (($(window).height()-height)/3)+"px",
        height: height+'px'
    });
    $(".layui-layer-shade").remove();
}
$('body').keydown(function () {
    if (event.keyCode === 13) {
        $("#search").click();
    }
});
src/main/webapp/static/js/order/order.js
@@ -190,22 +190,24 @@
                        cellMinWidth: 100,
                        cols: [[
                            {type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 160},
                            {field: 'maktx', title: '商品名称', width: 160},
                            {field: 'batch', title: '批号'},
                            // {field: 'matnr', title: '商品编码', width: 160},
                            // {field: 'maktx', title: '商品名称', width: 160},
                            //
                            // {field: 'batch', title: '批号'},
                            {field: 'batch', title: '批次'},
                            {field: 'brand', title: '牌号'},
                            {field: 'fingerMeltingMin', title: '最小熔指'},
                            {field: 'fingerMeltingMax', title: '最大熔指'},
                            {field: 'fusingPointMin', title: '最小熔点'},
                            {field: 'fusingPointMax', title: '最大熔点'},
                            {field: 'yellownessMin', title: '最小黄度'},
                            {field: 'yellownessMax', title: '最大黄度'},
                            {field: 'opacityMin', title: '最小不透明度'},
                            {field: 'opacityMax', title: '最大不透明度'},
                            {field: 'anfme', title: '数量'},
                            {field: 'workQty', title: '作业数量'},
                            {field: 'qty', title: '完成数量', style: 'font-weight: bold'},
                            // {field: 'unit', title: '单位'},
                            // {
                            //     field: 'createTime$', title: '创建时间', sort: true, templet: function (d) {
                            //         return util.toDateString(d.createTime);
                            //     },  width: 180
                            // },
                            // {field: 'inQty', title: '已入库量'},
                            // {field: 'color', title: '颜色'},
                            // {field: 'specs', title: '规格'},
                        ]],
                        request: {
                            pageName: 'curr',
@@ -260,14 +262,18 @@
                    let nList = admin.util.deepClone(xxDataList);
                    console.log(nList);
                    for (let xi = 0; xi < nList.length; xi++) {
                        if(!nList[xi].anfme){
                            layer.msg('明细数量不合法', {icon: 2});
                            return false;
                        }
                        if (nList[xi].anfme <= 0){
                            layer.msg('明细数量不合法', {icon: 2});
                            return false;
                        }
                        if (nList[xi].batch == null || nList[xi].batch == ""){
                            layer.msg('批次不合法', {icon: 2});
                            return false;
                        }
                        // if (nList[xi].batch == null || nList[xi].batch == ""){
                        //     layer.msg('批次不合法', {icon: 2});
                        //     return false;
                        // }
                        if (nList[xi].anfme < nList[xi].workQty){
                            layer.msg('数量不能小于已作业数量', {icon: 2});
                            return false;
@@ -312,14 +318,24 @@
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 200},
                        {field: 'specs', title: '规格'},
                        // {field: 'matnr', title: '商品编码', width: 160},
                        // {field: 'maktx', title: '商品名称', width: 200},
                        // {field: 'specs', title: '规格'},
                        {field: 'batch', title: '批次', edit: true},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'brand', title: '牌号', edit: true},
                        {field: 'fingerMeltingMin', title: '最小熔指', edit: true},
                        {field: 'fingerMeltingMax', title: '最大熔指', edit: true},
                        {field: 'fusingPointMin', title: '最小熔点', edit: true},
                        {field: 'fusingPointMax', title: '最大熔点', edit: true},
                        {field: 'yellownessMin', title: '最小黄度', edit: true},
                        {field: 'yellownessMax', title: '最大黄度', edit: true},
                        {field: 'opacityMin', title: '最小不透明度', edit: true},
                        {field: 'opacityMax', title: '最大不透明度', edit: true},
                        {field: 'anfme', title: '重量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        // {field: 'payment', title: '货物状态',align: 'center', templet: '#payment'},
                        {field: 'qty', title: '作业数量',  minWidth: 100, width: 100},
                        {field: 'qty', title: '作业重量',  minWidth: 100, width: 100},
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
@@ -430,6 +446,9 @@
                // 显示添加明细表单弹窗
                function showEditModel2(exp) {
                    xxDataList.push({});
                    insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                    return;
                    admin.open({
                        type: 1,
                        offset: '150px',
src/main/webapp/static/js/order/out.js
@@ -30,15 +30,23 @@
        height: 'full-120',
        where: {order_id: 9999999999},
        cols: [[
            {type: 'checkbox'}
            ,{type: 'numbers', title: '#'}
            ,{field: 'orderNo', align: 'center',title: '单据编号', templet: '#orderNoTpl', width: 160}
            ,{field: 'matnr', align: 'center',title: '商品编码', width: 160}
            ,{field: 'maktx', align: 'center',title: '商品名称', width: 200}
            {type: 'checkbox'},
            {type: 'numbers', title: '#'},
            {field: 'orderNo', align: 'center',title: '单据编号', templet: '#orderNoTpl'},
            {field: 'fingerMeltingMin', title: '最小熔指'},
            {field: 'fingerMeltingMax', title: '最大熔指'},
            {field: 'fusingPointMin', title: '最小熔点'},
            {field: 'fusingPointMax', title: '最大熔点'},
            {field: 'yellownessMin', title: '最小黄度'},
            {field: 'yellownessMax', title: '最大黄度'},
            {field: 'opacityMin', title: '最小不透明度'},
            {field: 'opacityMax', title: '最大不透明度'},
            // ,{field: 'matnr', align: 'center',title: '商品编码', width: 160}
            // ,{field: 'maktx', align: 'center',title: '商品名称', width: 200}
            ,{field: 'anfme', align: 'center',title: '总数量', style: 'font-weight: bold'}
            ,{field: 'enableQty', align: 'center',title: '待出数量', style: 'font-weight: bold'}
            ,{field: 'unit', align: 'center',title: '单位', hide: true}
            ,{field: 'barcode', align: 'center',title: '商品条码', hide: true}
            // ,{field: 'unit', align: 'center',title: '单位', hide: true}
            // ,{field: 'barcode', align: 'center',title: '商品条码', hide: true}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 160}
        ]],
        request: {
@@ -144,13 +152,16 @@
                                cols: [[
                                    // {type: 'checkbox', merge: ['orderNo']},
                                    {field: 'orderNo', title: '单据编号', merge: true, align: 'center'},
                                    {field: 'title', title: '商品', merge: true, align: 'center', width: 350},
                                    {field: 'hostId', title: 'id', align: 'center'},
                                    {field: 'batch', title: '批号', merge: true, align: 'center'},
                                    {field: 'packageNo', title: '包号', align: 'center'},
                                    {field: 'orderDetlId', title: 'id', align: 'center',hide:true},
                                    {field: 'qtyAnfme', title: '出库数量', align: 'center'},
                                    {field: 'locNo', title: '库位号', align: 'center',templet: '#locNoTpl'},
                                    // { title: '剩余需求量', align: 'center' , width: 120, toolbar: '#checkNeedQty'},
                                    // {field: 'anfme', title: '实际数量', align: 'center', width: 90, style: 'font-weight: bold'},
                                    { title: '出库数量', align: 'center',field: 'anfme', width: 90, style: 'font-weight: bold; color: red'},
                                    {field: 'locNo', title: '货位', align: 'center', width: 100, templet: '#locNoTpl'},
                                    {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
                                    // { title: '出库数量', align: 'center',field: 'anfme', width: 90, style: 'font-weight: bold; color: red'},
                                    // {field: 'locNo', title: '货位', align: 'center', width: 100, templet: '#locNoTpl'},
                                    // {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
                                    // {type: 'checkbox', merge: ['locNo']},
                                ]],
                                done: function (res) {
src/main/webapp/static/js/picking/picking.js
@@ -131,8 +131,10 @@
                                ,{field: 'docNum', align: 'center',title: '拣货单号'}
                                ,{field: 'uuid', align: 'center',title: 'uuid'}
                                ,{field: 'locNo', align: 'center',title: '库位'}
                                ,{field: 'matnr', align: 'center',title: '物料号'}
                                ,{field: 'maktx', align: 'center',title: '商品名称'}
                                ,{field: 'batch', align: 'center',title: '批号'}
                                ,{field: 'barcode', align: 'center',title: '包号'}
                                // ,{field: 'matnr', align: 'center',title: '物料号'}
                                // ,{field: 'maktx', align: 'center',title: '商品名称'}
                                ,{field: 'anfme', align: 'center',title: '数量'}
                                ,{field: 'createTime$', align: 'center',title: '操作时间'}
                                ,{field: 'count', align: 'center',title: '完成数'}
@@ -296,9 +298,9 @@
                            var className = templateDom.attr("class");
                            if (className === 'template-barcode') {
                                json.data[i]["barcodeUrl"] = baseUrl + "/ManPakOut/code/auth?type=2&param=" + (json.data[i].docNum+";"+json.data[i].matnr+";"+json.data[i].batch+";"+json.data[i].anfme+";"+json.data[i].locNo+";");
                                json.data[i]["barcodeUrl"] = baseUrl + "/ManPakOut/code/auth?type=2&param=" + (json.data[i].docNum+";"+json.data[i].matnr+";"+json.data[i].batch+";"+json.data[i].anfme+";"+json.data[i].locNo+";"+json.data[i].barcode+";"+json.data[i].nodeId+";"+json.data[i].wrkNo+";");
                            } else {
                                json.data[i]["barcodeUrl"] = baseUrl + "/ManPakOut/code/auth?type=2&param=" + (json.data[i].docNum+";"+json.data[i].matnr+";"+json.data[i].batch+";"+json.data[i].anfme+";"+json.data[i].locNo+";");
                                json.data[i]["barcodeUrl"] = baseUrl + "/ManPakOut/code/auth?type=2&param=" + (json.data[i].docNum+";"+json.data[i].matnr+";"+json.data[i].batch+";"+json.data[i].anfme+";"+json.data[i].locNo+";"+json.data[i].barcode+";"+json.data[i].nodeId+";"+json.data[i].wrkNo+";");
                            }
                        }
                        var tpl = templateDom.html();
src/main/webapp/static/js/pla/plaDetl.js
@@ -25,6 +25,10 @@
        ,{field: 'yellowness', align: 'center',title: '黄度',  hide:true}
        ,{field: 'opacity', align: 'center',title: '不透明度(0-100%)', hide:true}
        ,{field: 'water', align: 'center',title: '水分(ppm)', hide:true}
        ,{field: 'l', align: 'center',title: 'l值', edit: true}
        ,{field: 'a', align: 'center',title: 'a值', edit: true}
        ,{field: 'b', align: 'center',title: 'b值', edit: true}
        ,{field: 'fillIn', align: 'center',title: '填充(%)', edit: true}
        ,{field: 'massState', align: 'center',title: '质量状态', hide:true}
        ,{field: 'problem', align: 'center',title: '质量问题', hide:true}
        ,{field: 'stash', align: 'center',title: '仓库', edit:true}
src/main/webapp/static/js/pla/productionInfo.js
@@ -94,7 +94,7 @@
        let dataOld = [];
        for(var i=0; i<data.length; i++){
            if(data[i].LAY_CHECKED){
                if(!data[i].batch){
                if(!data[i].batch || !data[i].packageNo || !data[i].brand || !data[i].weight || !data[i].workshop || !data[i].line || !data[i].packageType || !data[i].zpalletType){
                    layer.msg("有未填写字段");
                    return;
                }
@@ -104,6 +104,10 @@
                dataOld.push(data[i]);
            }
        }
        if(!dataSave || dataSave.length < 1){
            layer.msg("未勾选提交项,无法提交");
            return;
        }
        $.ajax({
            url: baseUrl+"/pla/add/auth",
            headers: {'token': localStorage.getItem('token')},
src/main/webapp/static/js/pla/qualityInfo.js
@@ -25,6 +25,10 @@
        ,{field: 'yellowness', align: 'center',title: '黄度', edit: true}
        ,{field: 'opacity', align: 'center',title: '不透明度(0-100%)', edit: true}
        ,{field: 'water', align: 'center',title: '水分(ppm)', edit: true}
        ,{field: 'l', align: 'center',title: 'l值', edit: true}
        ,{field: 'a', align: 'center',title: 'a值', edit: true}
        ,{field: 'b', align: 'center',title: 'b值', edit: true}
        ,{field: 'fillIn', align: 'center',title: '填充(%)', edit: true}
        ,{field: 'massState', align: 'center',title: '质量状态', edit: true}
        ,{field: 'problem', align: 'center',title: '质量问题', edit: true}
    ];
src/main/webapp/views/configType/configType.html
New file
@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
</head>
<body>
<!-- 搜索栏 -->
<div id="search-box" class="layui-form layui-card-header">
    <div class="layui-inline" >
        <div class="layui-input-inline cool-auto-complete">
            <input class="layui-input" type="text" name="type" placeholder="类型" autocomplete="off">
            <div class="cool-auto-complete-window">
                <input class="cool-auto-complete-window-input" data-key="roleQueryByleader" onkeyup="autoLoad(this.getAttribute('data-key'))">
                <select class="cool-auto-complete-window-select" data-key="roleQueryByleaderSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                </select>
            </div>
        </div>
    </div>
    <!-- 待添加 -->
    <div id="data-search-btn" class="layui-btn-container layui-form-item">
        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">搜索</button>
        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">重置</button>
    </div>
</div>
<!-- 表格 -->
<table class="layui-hide" id="configType" lay-filter="configType"></table>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="power">删除</a>
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="edit">编辑</a>
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/configType/configType.js" charset="utf-8"></script>
<iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe>
</body>
</html>
src/main/webapp/views/configType/configTypeAdd.html
New file
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
</head>
<body>
<!-- 详情 -->
<div id="data-detail" class="layer_self_wrap">
    <form id="detail" class="layui-form">
        <div class="layui-inline"  style="width:45%;">
            <label class="layui-form-label"><span class="not-null">*</span>类  型:</label>
            <div class="layui-input-inline">
                <input id="type" class="layui-input" type="text" lay-verify="required" >
            </div>
        </div>
        <div class="layui-inline"  style="width:45%;">
            <label class="layui-form-label"><span class="not-null">*</span>值:</label>
            <div class="layui-input-inline">
                <input id="value" class="layui-input" type="text" lay-verify="required" >
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
            <div id="data-detail-submit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">保存</div>
            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">关闭</div>
        </div>
<!--        <div id="prompt">-->
<!--            温馨提示:请仔细填写相关信息,<span class="extrude"><span class="not-null">*</span> 为必填选项。</span>-->
<!--        </div>-->
    </form>
</div>
</body>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/configType/configType.js" charset="utf-8"></script>
</html>
src/main/webapp/views/order/order.html
@@ -178,7 +178,7 @@
    <form id="matEditForm" lay-filter="matEditForm" class="layui-form model-form">
        <input name="experimentId" type="hidden"/>
        <div class="layui-form-item" style="float: left">
            <label class="layui-form-label">物料 - 多选</label>
            <label class="layui-form-label">批号 - 多选</label>
            <div class="layui-input-block">
                <div id="mat" name="mat">
                </div>
src/main/webapp/views/order/out.html
@@ -196,7 +196,7 @@
<script type="text/html" id="locNoTpl">
    <span name="locNo"
          {{# if( d.lack === false){ }}
          {{# if( d.locNo){ }}
          class="layui-badge layui-badge-green" >{{d.locNo}}</span>
    {{# } else { }}
    class="layui-badge layui-badge-red" >库存不足</span>
src/main/webapp/views/picking/picking.html
@@ -163,10 +163,10 @@
    <table width="100%" style="border:0;border-bottom:#0C0C0C solid 2px; margin-bottom:20px;padding:0;overflow: hidden;font-size: xx-small;table-layout: fixed;">
        <tr style="height: 25px;font-size: 15px;">
            <td align="left" scope="col" colspan="1" style="width: 100px;">
                料号:
                <!-- 料号: -->批号
            </td>
            <td>
                {{this.matnr}}
                <!-- {{this.matnr}} -->{{this.batch}}
            </td>
            <td align="left" scope="col" colspan="1" rowspan="4">
                <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" width="100px">
@@ -174,10 +174,10 @@
        </tr>
        <tr style="height: 25px;font-size: 15px;">
            <td align="left" scope="col" colspan="1" style="width: 100px;">
                商品名:
<!--                商品名:-->包号
            </td>
            <td>
                {{this.maktx}}
<!--                {{this.maktx}}--> {{this.barcode}}
            </td>
        </tr>
        <tr style="height: 25px; font-size: 15px;">
src/main/webapp/views/pla/plaDetl.html
@@ -62,7 +62,24 @@
            transition: 0.4s;
            cursor: pointer;
        }
        .function-btn1 {
            font-size: 16px;
            padding: 1px 1px 1px 1px;
            width: 150px;
            height: 40px;
            border-color: #2b425b;
            border-radius: 4px;
            border-width: 1px;
            background: none;
            border-style: solid;
            transition: 0.4s;
            cursor: pointer;
        }
        .function-btn:hover {
            background-color: #2b425b;
            color: #fff;
        }
        .function-btn1:hover {
            background-color: #2b425b;
            color: #fff;
        }
@@ -93,6 +110,10 @@
<!-- 功能区 -->
<div class="function-area">
    <button id="rework" style="alignment: right" class="function-btn">重做</button>
    <button id="updateZpallet" style="alignment: right" class="function-btn1">换包装/托盘/缠膜</button>  |
    <button id="sellout" style="alignment: right" class="function-btn">卖出</button>
    <button id="pickup" style="alignment: right" class="function-btn">取货</button>  |
    <button id="returned" style="alignment: right" class="function-btn">退回</button>
</div>
<!-- 行 -->