Fixiaobai
2023-10-31 eb91d54dc917ecf30ef4f3f4b9676824a4891fb7
Changes
已修改11个文件
已添加4个文件
611 ■■■■■ 文件已修改
mes-basic/src/main/java/com/chinaztt/mes/basic/controller/DivisionController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/controller/FactoryController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/controller/PartController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/entity/Division.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/entity/Part.java 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/entity/Post.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/service/FactoryService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/service/PartService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/service/impl/FactoryServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/service/impl/PartServiceImpl.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/src/main/java/com/chinaztt/mes/common/config/FeignInterceptor.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/src/main/java/com/chinaztt/mes/common/util/MultipartFileToFile.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/src/main/java/com/chinaztt/mes/common/util/ThreadPoolConfig.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/src/main/java/com/chinaztt/mes/common/util/Threads.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-web/src/main/resources/bootstrap.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-basic/src/main/java/com/chinaztt/mes/basic/controller/DivisionController.java
@@ -94,6 +94,7 @@
    @PostMapping
    @PreAuthorize("@pms.hasPermission('basic_division_add')")
    public R save(@RequestBody Division division) {
        System.out.println(division);
        return R.ok(divisionService.save(division));
    }
    /**
mes-basic/src/main/java/com/chinaztt/mes/basic/controller/FactoryController.java
@@ -64,6 +64,15 @@
        return R.ok(factoryService.getFactoryPage(page, QueryWrapperUtil.gen(factory)));
    }
    /**
     * æ ¹æ®å…¬å¸æŸ¥è¯¢å·¥åŽ‚
     * @param id
     * @return
     */
    @GetMapping("/byCompanyId")
    public R getFactoryByCompany(@RequestParam("id") Long id){
        return R.ok(factoryService.getByCompanyId(id));
    }
    /**
     * é€šè¿‡id查询工厂
mes-basic/src/main/java/com/chinaztt/mes/basic/controller/PartController.java
@@ -17,6 +17,7 @@
package com.chinaztt.mes.basic.controller;
import cn.hutool.core.text.csv.CsvReadConfig;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -24,7 +25,10 @@
import com.chinaztt.mes.basic.entity.Part;
import com.chinaztt.mes.basic.excel.PartData;
import com.chinaztt.mes.basic.excel.PartUploadListener;
import com.chinaztt.mes.basic.mapper.PartMapper;
import com.chinaztt.mes.basic.service.PartService;
import com.chinaztt.mes.basic.util.DictUtils;
import com.chinaztt.mes.basic.util.PartUtils;
import com.chinaztt.mes.common.util.JsonUtil;
import com.chinaztt.mes.common.wrapper.QueryWrapperUtil;
import com.chinaztt.ztt.admin.api.entity.SysDictItem;
@@ -37,7 +41,11 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -62,6 +70,16 @@
    private final RemoteDictService remoteDictService;
    private final RedisTemplate redisTemplate;;
    private DictUtils dictUtils;
    private PartUtils partUtils;
    private PartMapper partMapper;
    private final static Logger logger = LoggerFactory.getLogger(PartController.class);
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
@@ -305,4 +323,40 @@
    public R getRoutingPartPage(Page page, Part part, Long bomId) {
        return R.ok(partService.getRoutingPartPage(page, QueryWrapperUtil.gen(part), bomId));
    }
    @PostMapping("/uploadExcel")
    public R uploadExcel(MultipartFile file) {
        String key = "syncPart_lock" + SecurityUtils.getUser().getId();
        if (redisTemplate.hasKey(key)) {
            throw new RuntimeException("有导入任务正在处理");
        }
        partService.asyncUploadExcel(file);
        return R.ok();
    }
    /**
     * è®¾ç½®Csv读文件配置
     * @return CsvWriteConfig
     */
    public static CsvReadConfig setCsvReadConfig(){
        CsvReadConfig csvReadConfig = new CsvReadConfig();
        // è®¾ç½® æ–‡æœ¬åˆ†éš”符,文本包装符,默认双引号'"'
        //csvReadConfig.setTextDelimiter('\t');
        // å­—段分割符号,默认为逗号
        csvReadConfig.setFieldSeparator('|');
        // è®¾ç½®æ³¨é‡Šç¬¦å·
        // csvReadConfig.setCommentCharacter('#');
        // CSV文件是否包含表头(因为表头不是数据内容)
        csvReadConfig.setContainsHeader(true);
        // æˆ–者使用如下配置设置表头开始行号,-1L代表无表头
        // csvReadConfig.setHeaderLineNo(1L);
        //设置开始的行(包括),默认0,此处为原始文件行号
        // csvReadConfig.setBeginLineNo(0);
        // æ˜¯å¦è·³è¿‡ç©ºç™½è¡Œï¼Œé»˜è®¤ä¸ºtrue
        // csvReadConfig.setSkipEmptyRows(true);
        // è®¾ç½®æ¯è¡Œå­—段个数不同时是否抛出异常,默认false
        // csvReadConfig.setErrorOnDifferentFieldCount(false);
        return csvReadConfig;
    }
}
mes-basic/src/main/java/com/chinaztt/mes/basic/entity/Division.java
@@ -107,5 +107,11 @@
    @TableField(exist = false)
    private String companyName;
    @TableField(exist = false)
    private String factoryId;
    /**
     * å·¥åŽ‚å
     */
    @TableField(exist = false)
    private String factoryName;
}
mes-basic/src/main/java/com/chinaztt/mes/basic/entity/Part.java
@@ -17,6 +17,7 @@
package com.chinaztt.mes.basic.entity;
import cn.hutool.core.annotation.Alias;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
@@ -84,37 +85,49 @@
    @Unique
    @ApiModelProperty(value = "零件号")
    @NonNull
    @Alias("零件号")
    private String partNo;
    /**
     * åç§°
     */
    @ApiModelProperty(value = "名称")
    @Alias("正在使用中的零件描述")
    private String partName;
    /**
     * åç§°
     */
    @ApiModelProperty(value = "检测规则id")
    private Long testRuleId;
    /**
     * é›¶ä»¶ç±»åž‹
     */
    @ApiModelProperty(value = "零件类型")
    private String materialType;
    /**
     * å•位
     */
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
     * å•位2
     */
    @ApiModelProperty(value = "单位2")
    private String sunit;
    /**
     * æè¿°
     */
    @ApiModelProperty(value = "描述")
    @Alias("零件描述")
    private String description;
    /**
     * é›¶ä»¶ç±»åž‹
     */
    @Alias("零件类型")
    private String materialType;
    /**
     * æ£€æµ‹è§„则id
     */
    @ApiModelProperty(value = "检测规则id")
    private Long testRuleId;
    /**
     * å•位
     */
    @Alias("库存计量单位")
    private String unit;
    /**
     * å•位2
     */
    @Alias("重量计量单位")
    private String sunit;
    @Alias("现有数量")
    private String totalNum;
    /**
     * åŽŸå…ˆçš„å“ç±» çŽ°åœ¨æ”¹ä¸º ä¸€çº§åˆ†ç±»
     */
@@ -192,6 +205,7 @@
     * P:虚拟零件计划。无需附加字段
     */
    @ApiModelProperty(value = "计划方法")
    @Alias("零件状态")
    private String planningMethod;
    /**
     * ç‰¹æ€§1
@@ -240,4 +254,60 @@
    @ApiModelProperty(value = "是否原材料检")
    private Integer testRuleType;
    @Alias("是否设备备件")
    private String isEquipment;
    @Alias("资产等级")
    private String assets;
    @Alias("资产类别")
    private String assetsType;
    @Alias("物资状态")
    private String suppliesType;
    @Alias("ABC ç±»")
    private String abcType;
    @Alias("频率级别")
    private String hz;
    @Alias("声明周期")
    private String cycle;
    @Alias("体积计量单位")
    private String volume;
    @Alias("现有获取数量")
    private String getNum;
    @Alias("默认的物料申请供应")
    private String defaultMr;
    @Alias("DOP è¿žæŽ¥")
    private String dopR;
    @Alias("净额交易")
    private String netto;
    @Alias("数量计算取整")
    private String numCount;
    @Alias("库存估价方法")
    private String ivm;
    @Alias("库存件成本层")
    private String icl;
    @Alias("供应商发票事项")
    private String sii;
    @Alias("零成本")
    private String zc;
    @Alias("外部服务成本的方法")
    private String esca;
}
mes-basic/src/main/java/com/chinaztt/mes/basic/entity/Post.java
@@ -44,4 +44,20 @@
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * å…¬å¸
     */
    private Long company;
    /**
     * å·¥åŽ‚
     */
    private Long factory;
    /**
     * éƒ¨é—¨
     */
    private Long division;
}
mes-basic/src/main/java/com/chinaztt/mes/basic/service/FactoryService.java
@@ -22,7 +22,6 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chinaztt.mes.basic.entity.Factory;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -44,4 +43,5 @@
     */
    IPage<List<Factory>> getFactoryPage(Page page, QueryWrapper<Factory> ew);
    List<Factory> getByCompanyId(Long id);
}
mes-basic/src/main/java/com/chinaztt/mes/basic/service/PartService.java
@@ -25,6 +25,7 @@
import com.chinaztt.mes.basic.entity.Part;
import com.chinaztt.mes.basic.excel.PartData;
import com.chinaztt.ztt.common.core.util.R;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -131,4 +132,6 @@
    void syncPart();
    Long syncNewIfs(String date);
    void asyncUploadExcel(MultipartFile file);
}
mes-basic/src/main/java/com/chinaztt/mes/basic/service/impl/FactoryServiceImpl.java
@@ -23,9 +23,7 @@
import com.chinaztt.mes.basic.entity.Factory;
import com.chinaztt.mes.basic.mapper.FactoryMapper;
import com.chinaztt.mes.basic.service.FactoryService;
import com.chinaztt.ztt.common.data.datascope.DataScope;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -54,4 +52,12 @@
    public IPage<List<Factory>> getFactoryPage(Page page, QueryWrapper<Factory> ew) {
        return baseMapper.getFactoryPage(page,ew);
    }
    @Override
    public List<Factory> getByCompanyId(Long id) {
        System.out.println(id);
        QueryWrapper<Factory> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(Factory::getCompanyId,id);
        return baseMapper.selectList(wrapper);
    }
}
mes-basic/src/main/java/com/chinaztt/mes/basic/service/impl/PartServiceImpl.java
@@ -17,6 +17,12 @@
package com.chinaztt.mes.basic.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.csv.CsvData;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvRow;
import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -34,9 +40,11 @@
import com.chinaztt.mes.basic.util.PartUtils;
import com.chinaztt.mes.basic.util.TransactionUtils;
import com.chinaztt.mes.common.util.JsonUtil;
import com.chinaztt.mes.common.util.MultipartFileToFile;
import com.chinaztt.ztt.common.core.util.R;
import com.chinaztt.ztt.common.security.util.SecurityUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -49,21 +57,25 @@
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.*;
import java.util.concurrent.CompletableFuture;
/**
 * é›¶ä»¶
@@ -82,6 +94,9 @@
    private Environment environment;
    private RedisTemplate redisTemplate;
    private TransactionUtils transactionUtils;
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    ;
@@ -378,7 +393,6 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long syncNewIfs(String date) {
        TransactionStatus transaction = transactionUtils.begin(TransactionDefinition.ISOLATION_READ_COMMITTED);
        Map<String, String> dicmattype = dictUtils.getDicKey("material_type");
        Map<String, String> dicunit = dictUtils.getDicKey("unit");
        String key = "syncPart_lock" + SecurityUtils.getUser().getId();
@@ -449,4 +463,124 @@
        }
        return (long) partList.size();
    }
    @Override
    public void asyncUploadExcel(MultipartFile file) {
        String key = "syncPart_lock" + SecurityUtils.getUser().getId();
        if (redisTemplate.hasKey(key)) {
            throw new RuntimeException("有导入任务正在处理");
        }
        redisTemplate.opsForValue().set(key, 1, 1000 * 3600);
        RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(),true);
        Map<String, String> dicmattype = dictUtils.getDicKey("material_type");
        Map<String, String> dicunit = dictUtils.getDicKey("unit");
        CompletableFuture.runAsync(()->{
            asyncExcel(file,dicmattype,dicunit);
            redisTemplate.delete(key);
        },threadPoolTaskExecutor);
    }
    public void asyncExcel(MultipartFile file,Map<String, String> dicmattype,Map<String, String> dicunit){
        File file1 = MultipartFileToFile.multipartFileToFile(file);
        CsvReader reader = CsvUtil.getReader();
        reader.setFieldSeparator(',');
//从文件中读取CSV数据
        CsvData data = reader.read(file1, CharsetUtil.CHARSET_GBK);
        List<CsvRow> rows = data.getRows();
//遍历行
        List<Part>list = new ArrayList<>();
        List<String>no=new ArrayList<String>();
        for (CsvRow csvRow : rows) {
            //getRawList返回一个List列表,列表的每一项为CSV中的一个单元格(既逗号分隔部分)
            List<String> rawList = filter(csvRow.getRawList());
            //System.out.println(rawList);
            if(rawList.get(0).equals("是否设备备件")){
                continue;
            }
            if(rawList.get(1).equals("88.118.1/A0172320")){
                Console.log(rawList);
                for (int i = 0; i < rawList.size(); i++) {
                    System.out.println(i+"====="+rawList.get(i));
                }
                Console.log(rawList.get(6));
            }
            Part part = new Part();
            part.setIsEquipment(rawList.get(0));
            part.setPartNo(rawList.get(1));
            no.add(rawList.get(1));
            part.setPartName(rawList.get(2));
            part.setDescription(rawList.get(3));
            part.setMaterialType(rawList.get(6));
            part.setUnit(rawList.get(8));
            part.setAssets(rawList.get(16));
            part.setAssetsType(rawList.get(17));
            part.setPlanningMethod(rawList.get(18));
            part.setSuppliesType(rawList.get(19));
            part.setAbcType(rawList.get(20));
            part.setHz(rawList.get(21));
            part.setCycle(rawList.get(22));
            part.setSunit(rawList.get(33));
            part.setVolume(rawList.get(35));
            part.setTotalNum(rawList.get(36));
            part.setGetNum(rawList.get(37));
            part.setDefaultMr(rawList.get(60));
            part.setDopR(rawList.get(61));
            part.setNetto(rawList.get(62));
            part.setNumCount(rawList.get(64));
            part.setIvm(rawList.get(66));
            part.setIcl(rawList.get(67));
            part.setSii(rawList.get(68));
            part.setZc(rawList.get(69));
            part.setEsca(rawList.get(72));
            list.add(part);
        }
        list.forEach(r->{
            r.setEngChgLevel("1");
            no.add(r.getPartNo());
            r.setMaterialType(dicmattype.get(r.getMaterialType()));
            r.setUnit(dicunit.get(r.getUnit()));
            r.setSunit(dicunit.get(r.getSunit()));
        });
        list.stream().filter(r-> Objects.isNull(r.getMaterialType())).forEach(System.out::println);
        if(list.size()>0) {
            List<List<String>> partition = Lists.partition(no, 10000);
            partition.forEach(l->{
                QueryWrapper<Part> queryWrapper = new QueryWrapper<>();
                queryWrapper.lambda().select(Part::getPartNo).in(Part::getPartNo, l);
                List<Part> selectList = baseMapper.selectList(queryWrapper);
                list.removeIf(mainObj -> selectList.stream().anyMatch(subObj -> subObj.getPartNo().equals(mainObj.getPartNo())));
            });
            log.info("过滤后长度=============================》"+list.size());
            list.forEach(l->{
                try {
                    baseMapper.insert(l);
                }catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        MultipartFileToFile.delteTempFile(file1);
    }
    /**
     * è¿‡æ»¤ä¿®æ”¹ä¸æ­£ç¡®æ•°æ®æ ¼å¼
     * @param rawList
     * @return
     */
    public static List<String> filter( List<String> rawList){
        List<String>filters = new ArrayList<>();
        for (int i = 0; i < rawList.size(); i++) {
            if (rawList.get(i).contains("|")&&rawList.get(i).contains(",")&&rawList.get(i).split(",").length>1) {
                String[] split = rawList.get(i).split(",");
                if (!Objects.equals(split[1], "") &&split[0].charAt(0)==split[1].charAt(0)){
                    Arrays.stream(split).forEach(filters::add);
                }else {
                    filters.add(rawList.get(i));
                }
            }else {
                filters.add(rawList.get(i));
            }
        }
        return filters;
    }
}
mes-common/src/main/java/com/chinaztt/mes/common/config/FeignInterceptor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.chinaztt.mes.common.config;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
 * @Author å¼ å®¾
 * @Date 2023/10/31
 */
@Component
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if(requestAttributes != null){
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            String authorization = request.getHeader("Authorization");
            template.header("Authorization", authorization);
        }
    }
}
mes-common/src/main/java/com/chinaztt/mes/common/util/MultipartFileToFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.chinaztt.mes.common.util;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.Objects;
/**
 * @Author å¼ å®¾
 * @Date 2022/8/5
 */
public class MultipartFileToFile {
    /**
     * MultipartFile è½¬ File
     *
     * @param file
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) {
        File toFile = null;
        try {
            if ("".equals(file) || file.getSize() <= 0) {
                file = null;
            } else {
                InputStream ins = null;
                ins = file.getInputStream();
                toFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
                inputStreamToFile(ins, toFile);
                ins.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return toFile;
    }
    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * åˆ é™¤æœ¬åœ°ä¸´æ—¶æ–‡ä»¶
     * @param file
     */
    public static void delteTempFile(File file) {
        if (file != null) {
            File del = new File(file.toURI());
            del.deleteOnExit();
        }
    }
}
mes-common/src/main/java/com/chinaztt/mes/common/util/ThreadPoolConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.chinaztt.mes.common.util;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
 * çº¿ç¨‹æ± é…ç½®
 *
 * @author å¼ å®¾
 **/
@Configuration
public class ThreadPoolConfig
{
    // æ ¸å¿ƒçº¿ç¨‹æ± å¤§å°
    private int corePoolSize = 80;
    // æœ€å¤§å¯åˆ›å»ºçš„线程数
    private int maxPoolSize = 92;
    // é˜Ÿåˆ—最大长度
    private int queueCapacity = 80;
    // çº¿ç¨‹æ± ç»´æŠ¤çº¿ç¨‹æ‰€å…è®¸çš„空闲时间
    private int keepAliveSeconds = 300;
    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor()
    {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // çº¿ç¨‹æ± å¯¹æ‹’绝任务(无线程可用)的处理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
    /**
     * æ‰§è¡Œå‘¨æœŸæ€§æˆ–定时任务
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService()
    {
        return new ScheduledThreadPoolExecutor(corePoolSize,
                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build())
        {
            @Override
            protected void afterExecute(Runnable r, Throwable t)
            {
                super.afterExecute(r, t);
                Threads.printException(r, t);
            }
        };
    }
}
mes-common/src/main/java/com/chinaztt/mes/common/util/Threads.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.chinaztt.mes.common.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.*;
/**
 * çº¿ç¨‹ç›¸å…³å·¥å…·ç±».
 *
 * @author å¼ å®¾
 */
public class Threads
{
    private static final Logger logger = LoggerFactory.getLogger(Threads.class);
    /**
     * sleep等待,单位为毫秒
     */
    public static void sleep(long milliseconds)
    {
        try
        {
            Thread.sleep(milliseconds);
        }
        catch (InterruptedException e)
        {
            return;
        }
    }
    /**
     * åœæ­¢çº¿ç¨‹æ± 
     * å…ˆä½¿ç”¨shutdown, åœæ­¢æŽ¥æ”¶æ–°ä»»åŠ¡å¹¶å°è¯•å®Œæˆæ‰€æœ‰å·²å­˜åœ¨ä»»åŠ¡.
     * å¦‚果超时, åˆ™è°ƒç”¨shutdownNow, å–消在workQueue中Pending的任务,并中断所有阻塞函数.
     * å¦‚果仍人超時,則強制退出.
     * å¦å¯¹åœ¨shutdown时线程本身被调用中断做了处理.
     */
    public static void shutdownAndAwaitTermination(ExecutorService pool)
    {
        if (pool != null && !pool.isShutdown())
        {
            pool.shutdown();
            try
            {
                if (!pool.awaitTermination(120, TimeUnit.SECONDS))
                {
                    pool.shutdownNow();
                    if (!pool.awaitTermination(120, TimeUnit.SECONDS))
                    {
                        logger.info("Pool did not terminate");
                    }
                }
            }
            catch (InterruptedException ie)
            {
                pool.shutdownNow();
                Thread.currentThread().interrupt();
            }
        }
    }
    /**
     * æ‰“印线程异常信息
     */
    public static void printException(Runnable r, Throwable t)
    {
        if (t == null && r instanceof Future<?>)
        {
            try
            {
                Future<?> future = (Future<?>) r;
                if (future.isDone())
                {
                    future.get();
                }
            }
            catch (CancellationException ce)
            {
                t = ce;
            }
            catch (ExecutionException ee)
            {
                t = ee.getCause();
            }
            catch (InterruptedException ie)
            {
                Thread.currentThread().interrupt();
            }
        }
        if (t != null)
        {
            logger.error(t.getMessage(), t);
        }
    }
}
mes-web/src/main/resources/bootstrap.yml
@@ -1,5 +1,5 @@
server:
  port: 6060
  port: 6066
spring:
  datasource:
@@ -17,7 +17,7 @@
      #      password: nacos
      password: zttZTT123!
      discovery:
        server-addr: 127.0.0.1:8848
        server-addr: 106.13.194.57:8848
        metadata:
          #          VERSION: 10.88.15.224
          VERSION: 127.0.0.1