zoukankan      html  css  js  c++  java
  • Linux环境下应用生成图片中出现乱码的问题处理

    问题:  用java生成图片上传到linux服务器,中文出现乱码问题解决

    思路: 查看本地java字符集编码格式   查看linux服务器字符集编码  如果编码格式不一致会导致程序在服务器运行时报错 

    解决:  1、查看linux服务器字符集编码格式: echo $LANG 

    修改linux服务器字符集编码格式的命令:   

    1、用root用户登录服务器  export LANG=zh_CN.UTF-8  

    2、vim /etc/sysconfig/i18n      修改LANG="zh_CN.UTF-8"     source /etc/sysconfig/i18n

    查看linux环境可编译字符集的命令:  

    1、fc-list|grep 宋    

    2、fc-list :lang=zh-cn | sort  

    3、查看之后加入不存在汉字编码字符集,可以将windows环境的字符集编码脚本上传到linux环境 

    C:WindowsFonts下找到字体文件simsun.ttc,重命名为simsun.ttf;

    在linux服务器/usr/share/fonts/ 路径下创建fallback文件夹,如果后期有问题,可能是文件夹名称有问题,可以修改为zh_CN尝试  

    修改文件权限755    chmod 775 fallback  

    mkfontscale (如果提示 mkfontscale: command not found,需自行安装 # yum install mkfontscale )

    mkfontdir

    fc-cache -fv (如果提示 fc-cache: command not found,则需要安装# yum install fontconfig )或 fc-cache /usr/share/fonts/zh_CN/

    上述三个命令必须要执行,否则上传的脚本无法正常使用  

    fc-list :lang=zh-cn | sort  查看字符集编译是否成功  

    重启服务器  

    用java生成图片的源码 :

    package com.sinosoft.tphi.task.mail;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.nio.charset.Charset;
    import java.text.ParseException;
    import java.util.Arrays;
    
    import org.apache.log4j.Logger;
    
    
    import com.sinosoft.utility.CErrors;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    /**
     * author: wcg 
     * time: 2019-05-17
     * funnction: 生成发送邮件的图片 
     * 
     */
    
    public class ImageUtilCommon {
        
        
        public CErrors mErrors = new CErrors();
        private final Logger logger = Logger.getLogger("ImageUtilCommon");
        
        /**
         * 生成发送邮件的图片
         * 
         */
        public boolean myGraphicsGeneration(String cellsValue[][], String path) {
            String csn = Charset.defaultCharset().name();
            System.out.println("字符集"+csn);
            System.out.println("=======开始生成图片============");
            System.out.println(Arrays.deepToString(cellsValue));
            // 字体大小
            int fontTitileSize = 11;
            // 横线的行数
            int totalrow = cellsValue.length+1;
            // 竖线的行数
            int totalcol = 0;
            if (cellsValue[0]  != null) {
                totalcol = cellsValue[0].length;
            }
            // 图片宽度
            int imageWidth = 1024;
            // 行高
            int rowheight = 40;
            //图片高度
            int imageHeight = totalrow*rowheight+50;
            // 起始高度
            int startHeight = 10;
            // 起始宽度
            int startWidth = 10;
            //单元格宽度
            int colwidth = (int)((imageWidth-20)/totalcol);
            BufferedImage image = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);
            Graphics graphics = image.getGraphics();
            graphics.setColor(Color.WHITE);
            graphics.fillRect(0,0, imageWidth, imageHeight);
            graphics.setColor(new Color(220,240,240));
    
    
            //画横线
            for(int j=0;j<totalrow; j++){
                graphics.setColor(Color.black);
                graphics.drawLine(startWidth, startHeight+(j+1)*rowheight, startWidth+colwidth*totalcol, startHeight+(j+1)*rowheight);
            }
            //画竖线
            for(int k=0;k<totalcol+1;k++){
                graphics.setColor(Color.black);
                graphics.drawLine(startWidth+k*colwidth, startHeight+rowheight, startWidth+k*colwidth, startHeight+rowheight*totalrow);
            }
            //设置字体
            Font font = new Font("微软雅黑",Font.BOLD,fontTitileSize);
            graphics.setFont(font);
            //写标题
            String title = "【报送批次查询结果】";
            graphics.drawString(title, startWidth, startHeight+rowheight-10);
            //写入内容
            for(int n=0;n<cellsValue.length;n++){
                    for(int l=0;l<cellsValue[n].length;l++){
                        if (n == 0) {
                            font = new Font("微软雅黑",Font.BOLD,fontTitileSize);
                            graphics.setFont(font);
                        }else if (n > 0 && l >0) {
                            font = new Font("微软雅黑",Font.PLAIN,fontTitileSize);
                            graphics.setFont(font);
                            graphics.setColor(Color.RED);
                        } else {
                            font = new Font("微软雅黑",Font.PLAIN,fontTitileSize);
                            graphics.setFont(font);
                            graphics.setColor(Color.BLACK);
                        }
                    
                    graphics.drawString(cellsValue[n][l].toString(), startWidth+colwidth*l+5, startHeight+rowheight*(n+2)-10);
                }
            }
            // 保存图片
            System.out.println("++输出文件的生成路劲+++"+path);
            delAllFile(path);
            createImage(image, path);
            System.out.println("+++调用createImage++++");
            return true;
        }
        /**
         * 用IO流将图片写入到指定目录下面
         * 
         * @param image
         * @param fileLocation
         */
        public void createImage(BufferedImage image, String fileLocation) {
            try {
                System.out.println("+++调用createImage++6666++");
                FileOutputStream fos = new FileOutputStream(fileLocation);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
                encoder.encode(image);
                bos.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
        }
        
        /**
         * 清空存放图片的文件夹
         * 
         * 
         */
        
        public static boolean delAllFile(String path) {  
            boolean flag = false;  
            File file = new File(path);  
            if (!file.exists()) {  
              return flag;  
            }  
            if (!file.isDirectory()) {  
              return flag;  
            }  
            String[] tempList = file.list();  
            File temp = null;  
            for (int i = 0; i < tempList.length; i++) {  
               if (path.endsWith(File.separator)) {  
                  temp = new File(path + tempList[i]);  
               } else {  
                   temp = new File(path + File.separator + tempList[i]);  
               }  
    
    
                  temp.delete();  
              
              
            }  
            return true;  
          }  
        
    
        public static void main(String[] args) throws ParseException{
            /*MonitorWaiSubmit mMonitorWaiSubmit = new MonitorWaiSubmit();
            mMonitorWaiSubmit.submitData("");*/
            
            String csn = Charset.defaultCharset().name();
            System.out.println("字符集"+csn);
    
        }
        
        
        
        
    }

    用java生成统计图源码: 

    package com.sinosoft.tphi.task.mail;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.CategoryLabelPositions;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.BarRenderer;
    import org.jfree.chart.renderer.category.LineAndShapeRenderer;
    import org.jfree.chart.renderer.category.StackedBarRenderer;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.general.DatasetUtilities;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.data.general.PieDataset;
    
    /**
     * 压力点测试工具类
     * @author WangLiping
     */
    public class SendEmailTest3 {
        private static final String CHART_PATH = "E://";
        /**
         * 测试
         * @param args
         * @author WangLiping
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            SendEmailTest3 pm = new SendEmailTest3();
            // 生成饼状图
            pm.makePieChart();
            // 生成单组柱状图
           /* pm.makeBarChart();
            // 生成多组柱状图
            pm.makeBarGroupChart();
            // 生成堆积柱状图
            pm.makeStackedBarChart();
            // 生成折线图
            pm.makeLineAndShapeChart();*/
        }
    
        /**
         * 生成折线图
         */
        public void makeLineAndShapeChart() {
            double[][] data = new double[][] { { 672, 766, 223, 540, 126 },
                    { 325, 521, 210, 340, 106 }, { 332, 256, 523, 240, 526 } };
            String[] rowKeys = { "苹果", "梨子", "葡萄" };
            String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
            CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
            createTimeXYChar("折线图", "x轴", "y轴", dataset, "lineAndShap.jpg");
        }
    
        /**
         * 生成分组的柱状图
         */
        public void makeBarGroupChart() {
            double[][] data = new double[][] { { 672, 766, 223, 540, 126 },
                    { 325, 521, 210, 340, 106 }, { 332, 256, 523, 240, 526 } };
            String[] rowKeys = { "苹果", "梨子", "葡萄" };
            String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
            CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
            createBarChart(dataset, "x坐标", "y坐标", "柱状图", "barGroup.png");
        }
    
        /**
         * 生成柱状图
         */
        public void makeBarChart() {
            double[][] data = new double[][] { { 672, 766, 223, 540, 126 } };
            String[] rowKeys = { "苹果" };
            String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
            CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
            createBarChart(dataset, "x坐标", "y坐标", "柱状图", "bar.png");
        }
    
        /**
         * 生成堆栈柱状图
         */
        public void makeStackedBarChart() {
            double[][] data = new double[][] { { 0.21, 0.66, 0.23, 0.40, 0.26 },
                    { 0.25, 0.21, 0.10, 0.40, 0.16 } };
            String[] rowKeys = { "苹果", "梨子" };
            String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
            CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
            createStackedBarChart(dataset, "x坐标", "y坐标", "柱状图", "stsckedBar.png");
        }
    
        /**
         * 生成饼状图
         */
        public void makePieChart() {
            double[] data = { 9, 91 };
            String[] keys = { "失败率", "成功率" };
    
            createValidityComparePimChar(getDataPieSetByUtil(data, keys), "饼状图",
                    "pie2.png", keys);
        }
    
        // 柱状图,折线图 数据集
        public CategoryDataset getBarData(double[][] data, String[] rowKeys,
                String[] columnKeys) {
            return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
        }
    
        // 饼状图 数据集
        public PieDataset getDataPieSetByUtil(double[] data,
                String[] datadescription) {
    
            if (data != null && datadescription != null) {
                if (data.length == datadescription.length) {
                    DefaultPieDataset dataset = new DefaultPieDataset();
                    for (int i = 0; i < data.length; i++) {
                        dataset.setValue(datadescription[i], data[i]);
                    }
                    return dataset;
                }
    
            }
    
            return null;
        }
    
        /**
         * 柱状图
         * 
         *@param dataset
         *            数据集
         * @param xName
         *            x轴的说明(如种类,时间等)
         * @param yName
         *            y轴的说明(如速度,时间等)
         * @param chartTitle
         *            图标题
         * @param charName
         *            生成图片的名字
         * @return
         */
        public String createBarChart(CategoryDataset dataset, String xName,
            String yName, String chartTitle, String charName) {
            JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题
                    xName, // 目录轴的显示标签
                    yName, // 数值轴的显示标签
                    dataset, // 数据集
                    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                    true, // 是否显示图例(对于简单的柱状图必须是false)
                    false, // 是否生成工具
                    false // 是否生成URL链接
                    );
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
            /*
             * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,
             * 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看
             */
            // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
            chart.setTextAntiAlias(false);
            chart.setBackgroundPaint(Color.white);
            // create plot
            CategoryPlot plot = chart.getCategoryPlot();
            // 设置横虚线可见
            plot.setRangeGridlinesVisible(true);
            // 虚线色彩
            plot.setRangeGridlinePaint(Color.gray);
    
            // 数据轴精度
            NumberAxis vn = (NumberAxis) plot.getRangeAxis();
            // vn.setAutoRangeIncludesZero(true);
            DecimalFormat df = new DecimalFormat("#0.00");
            vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
            // x轴设置
            CategoryAxis domainAxis = plot.getDomainAxis();
            domainAxis.setLabelFont(labelFont);// 轴标题
            domainAxis.setTickLabelFont(labelFont);// 轴数值
    
            // Lable(Math.PI/3.0)度倾斜
            // domainAxis.setCategoryLabelPositions(CategoryLabelPositions
            // .createUpRotationLabelPositions(Math.PI / 3.0));
    
            domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示
    
            // 设置距离图片左端距离
            domainAxis.setLowerMargin(0.1);
            // 设置距离图片右端距离
            domainAxis.setUpperMargin(0.1);
            // 设置 columnKey 是否间隔显示
            // domainAxis.setSkipCategoryLabelsToFit(true);
    
            plot.setDomainAxis(domainAxis);
            // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
            plot.setBackgroundPaint(new Color(255, 255, 204));
    
            // y轴设置
            ValueAxis rangeAxis = plot.getRangeAxis();
            rangeAxis.setLabelFont(labelFont);
            rangeAxis.setTickLabelFont(labelFont);
            // 设置最高的一个 Item 与图片顶端的距离
            rangeAxis.setUpperMargin(0.15);
            // 设置最低的一个 Item 与图片底端的距离
            rangeAxis.setLowerMargin(0.15);
            plot.setRangeAxis(rangeAxis);
    
            BarRenderer renderer = new BarRenderer();
            // 设置柱子宽度
            renderer.setMaximumBarWidth(0.05);
            // 设置柱子高度
            renderer.setMinimumBarLength(0.2);
            // 设置柱子边框颜色
            renderer.setBaseOutlinePaint(Color.BLACK);
            // 设置柱子边框可见
            renderer.setDrawBarOutline(true);
    
            // // 设置柱的颜色
            renderer.setSeriesPaint(0, new Color(204, 255, 255));
            renderer.setSeriesPaint(1, new Color(153, 204, 255));
            renderer.setSeriesPaint(2, new Color(51, 204, 204));
    
            // 设置每个地区所包含的平行柱的之间距离
            renderer.setItemMargin(0.0);
    
            // 显示每个柱的数值,并修改该数值的字体属性
            renderer.setIncludeBaseInRange(true);
            renderer
                    .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            renderer.setBaseItemLabelsVisible(true);
    
            plot.setRenderer(renderer);
            // 设置柱的透明度
            plot.setForegroundAlpha(1.0f);
    
            FileOutputStream fos_jpg = null;
            try {
                isChartPathExist(CHART_PATH);
                String chartName = CHART_PATH + charName;
                fos_jpg = new FileOutputStream(chartName);
                ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
                return chartName;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    fos_jpg.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 横向图
         * 
         * @param dataset
         *            数据集
         * @param xName
         *            x轴的说明(如种类,时间等)
         * @param yName
         *            y轴的说明(如速度,时间等)
         * @param chartTitle
         *            图标题
         * @param charName
         *            生成图片的名字
         * @return
         */
        public String createHorizontalBarChart(CategoryDataset dataset,
                String xName, String yName, String chartTitle, String charName) {
            JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题
                    xName, // 目录轴的显示标签
                    yName, // 数值轴的显示标签
                    dataset, // 数据集
                    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                    true, // 是否显示图例(对于简单的柱状图必须是false)
                    false, // 是否生成工具
                    false // 是否生成URL链接
                    );
    
            CategoryPlot plot = chart.getCategoryPlot();
            // 数据轴精度
            NumberAxis vn = (NumberAxis) plot.getRangeAxis();
            // 设置刻度必须从0开始
            // vn.setAutoRangeIncludesZero(true);
            DecimalFormat df = new DecimalFormat("#0.00");
            vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
    
            CategoryAxis domainAxis = plot.getDomainAxis();
    
            domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的
            // Lable
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
    
            domainAxis.setLabelFont(labelFont);// 轴标题
            domainAxis.setTickLabelFont(labelFont);// 轴数值
    
            domainAxis.setMaximumCategoryLabelWidthRatio(0.8f);// 横轴上的 Lable 是否完整显示
            // domainAxis.setVerticalCategoryLabels(false);
            plot.setDomainAxis(domainAxis);
    
            ValueAxis rangeAxis = plot.getRangeAxis();
            // 设置最高的一个 Item 与图片顶端的距离
            rangeAxis.setUpperMargin(0.15);
            // 设置最低的一个 Item 与图片底端的距离
            rangeAxis.setLowerMargin(0.15);
            plot.setRangeAxis(rangeAxis);
            BarRenderer renderer = new BarRenderer();
            // 设置柱子宽度
            renderer.setMaximumBarWidth(0.03);
            // 设置柱子高度
            renderer.setMinimumBarLength(30);
    
            renderer.setBaseOutlinePaint(Color.BLACK);
    
            // 设置柱的颜色
            renderer.setSeriesPaint(0, Color.GREEN);
            renderer.setSeriesPaint(1, new Color(0, 0, 255));
            // 设置每个地区所包含的平行柱的之间距离
            renderer.setItemMargin(0.5);
            // 显示每个柱的数值,并修改该数值的字体属性
            renderer
                    .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            // 设置柱的数值可见
            renderer.setBaseItemLabelsVisible(true);
    
            plot.setRenderer(renderer);
            // 设置柱的透明度
            plot.setForegroundAlpha(0.6f);
    
            FileOutputStream fos_jpg = null;
            try {
                isChartPathExist(CHART_PATH);
                String chartName = CHART_PATH + charName;
                fos_jpg = new FileOutputStream(chartName);
                ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
                return chartName;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    fos_jpg.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 饼状图
         * 
         * @param dataset
         *            数据集
         * @param chartTitle
         *            图标题
         * @param charName
         *            生成图的名字
         * @param pieKeys
         *            分饼的名字集
         * @return
         */
        public String createValidityComparePimChar(PieDataset dataset,
                String chartTitle, String charName, String[] pieKeys) {
            JFreeChart chart = ChartFactory.createPieChart3D(chartTitle, // chart
                    // title
                    dataset,// data
                    true,// include legend
                    true, false);
    
            // 使下说明标签字体清晰,去锯齿类似于
            // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);的效果
            chart.setTextAntiAlias(false);
            // 图片背景色
            chart.setBackgroundPaint(Color.white);
            // 设置图标题的字体重新设置title
            Font font = new Font("隶书", Font.BOLD, 25);
            TextTitle title = new TextTitle(chartTitle);
            title.setFont(font);
            chart.setTitle(title);
    
            PiePlot3D plot = (PiePlot3D) chart.getPlot();
            // 图片中显示百分比:默认方式
    
            // 指定饼图轮廓线的颜色
            // plot.setBaseSectionOutlinePaint(Color.BLACK);
            // plot.setBaseSectionPaint(Color.BLACK);
    
            // 设置无数据时的信息
            plot.setNoDataMessage("无对应的数据,请重新查询。");
    
            // 设置无数据时的信息显示颜色
            plot.setNoDataMessagePaint(Color.red);
    
            // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
            plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                    "{0}={1}({2})", NumberFormat.getNumberInstance(),
                    new DecimalFormat("0.00%")));
            // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
            plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
                    "{0}={1}({2})"));
    
            plot.setLabelFont(new Font("SansSerif", Font.TRUETYPE_FONT, 12));
    
            // 指定图片的透明度(0.0-1.0)
            plot.setForegroundAlpha(0.65f);
            // 指定显示的饼图上圆形(false)还椭圆形(true)
            plot.setCircular(false, true);
    
            // 设置第一个 饼块section 的开始位置,默认是12点钟方向
            plot.setStartAngle(90);
    
            // // 设置分饼颜色
            plot.setSectionPaint(pieKeys[0], new Color(244, 194, 144));
            plot.setSectionPaint(pieKeys[1], new Color(144, 233, 144));
    
            FileOutputStream fos_jpg = null;
            try {
                // 文件夹不存在则创建
                isChartPathExist(CHART_PATH);
                String chartName = CHART_PATH + charName;
                fos_jpg = new FileOutputStream(chartName);
                // 高宽的设置影响椭圆饼图的形状
                ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 230);
    
                return chartName;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    fos_jpg.close();
                    System.out.println("create pie-chart.");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        /**
         * 判断文件夹是否存在,如果不存在则新建
         * 
         * @param chartPath
         */
        private void isChartPathExist(String chartPath) {
            File file = new File(chartPath);
            if (!file.exists()) {
                file.mkdirs();
                // log.info("CHART_PATH="+CHART_PATH+"create.");
            }
        }
    
        /**
         * 折线图
         * 
         * @param chartTitle
         * @param x
         * @param y
         * @param xyDataset
         * @param charName
         * @return
         */
        public String createTimeXYChar(String chartTitle, String x, String y,
                CategoryDataset xyDataset, String charName) {
    
            JFreeChart chart = ChartFactory.createLineChart(chartTitle, x, y,
                    xyDataset, PlotOrientation.VERTICAL, true, true, false);
    
            chart.setTextAntiAlias(false);
            chart.setBackgroundPaint(Color.WHITE);
            // 设置图标题的字体重新设置title
            Font font = new Font("隶书", Font.BOLD, 25);
            TextTitle title = new TextTitle(chartTitle);
            title.setFont(font);
            chart.setTitle(title);
            // 设置面板字体
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
    
            chart.setBackgroundPaint(Color.WHITE);
    
            CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
            // x轴 // 分类轴网格是否可见
            categoryplot.setDomainGridlinesVisible(true);
            // y轴 //数据轴网格是否可见
            categoryplot.setRangeGridlinesVisible(true);
    
            categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
    
            categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
    
            categoryplot.setBackgroundPaint(Color.lightGray);
    
            // 设置轴和面板之间的距离
            // categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
    
            CategoryAxis domainAxis = categoryplot.getDomainAxis();
    
            domainAxis.setLabelFont(labelFont);// 轴标题
            domainAxis.setTickLabelFont(labelFont);// 轴数值
    
            domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的
            // Lable
            // 45度倾斜
            // 设置距离图片左端距离
            domainAxis.setLowerMargin(0.0);
            // 设置距离图片右端距离
            domainAxis.setUpperMargin(0.0);
    
            NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
            numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            numberaxis.setAutoRangeIncludesZero(true);
    
            // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
            LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
                    .getRenderer();
    
            lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
            lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
    
            // 显示折点数据
            // lineandshaperenderer.setBaseItemLabelGenerator(new
            // StandardCategoryItemLabelGenerator());
            // lineandshaperenderer.setBaseItemLabelsVisible(true);
    
            FileOutputStream fos_jpg = null;
            try {
                isChartPathExist(CHART_PATH);
                String chartName = CHART_PATH + charName;
                fos_jpg = new FileOutputStream(chartName);
    
                // 将报表保存为png文件
                ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 510);
    
                return chartName;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    fos_jpg.close();
                    System.out.println("create time-createTimeXYChar.");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 堆栈柱状图
         * 
         * @param dataset
         * @param xName
         * @param yName
         * @param chartTitle
         * @param charName
         * @return
         */
        public String createStackedBarChart(CategoryDataset dataset, String xName,
                String yName, String chartTitle, String charName) {
            // 1:得到 CategoryDataset
    
            // 2:JFreeChart对象
            JFreeChart chart = ChartFactory.createStackedBarChart(chartTitle, // 图表标题
                    xName, // 目录轴的显示标签
                    yName, // 数值轴的显示标签
                    dataset, // 数据集
                    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                    true, // 是否显示图例(对于简单的柱状图必须是false)
                    false, // 是否生成工具
                    false // 是否生成URL链接
                    );
            // 图例字体清晰
            chart.setTextAntiAlias(false);
    
            chart.setBackgroundPaint(Color.WHITE);
    
            // 2 .2 主标题对象 主标题对象是 TextTitle 类型
            chart
                    .setTitle(new TextTitle(chartTitle, new Font("隶书", Font.BOLD,
                            25)));
            // 2 .2.1:设置中文
            // x,y轴坐标字体
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
    
            // 2 .3 Plot 对象 Plot 对象是图形的绘制结构对象
            CategoryPlot plot = chart.getCategoryPlot();
    
            // 设置横虚线可见
            plot.setRangeGridlinesVisible(true);
            // 虚线色彩
            plot.setRangeGridlinePaint(Color.gray);
    
            // 数据轴精度
            NumberAxis vn = (NumberAxis) plot.getRangeAxis();
            // 设置最大值是1
            vn.setUpperBound(1);
            // 设置数据轴坐标从0开始
            // vn.setAutoRangeIncludesZero(true);
            // 数据显示格式是百分比
            DecimalFormat df = new DecimalFormat("0.00%");
            vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
            // DomainAxis (区域轴,相当于 x 轴), RangeAxis (范围轴,相当于 y 轴)
            CategoryAxis domainAxis = plot.getDomainAxis();
    
            domainAxis.setLabelFont(labelFont);// 轴标题
            domainAxis.setTickLabelFont(labelFont);// 轴数值
    
            // x轴坐标太长,建议设置倾斜,如下两种方式选其一,两种效果相同
            // 倾斜(1)横轴上的 Lable 45度倾斜
            // domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
            // 倾斜(2)Lable(Math.PI 3.0)度倾斜
            // domainAxis.setCategoryLabelPositions(CategoryLabelPositions
            // .createUpRotationLabelPositions(Math.PI / 3.0));
    
            domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示
    
            plot.setDomainAxis(domainAxis);
    
            // y轴设置
            ValueAxis rangeAxis = plot.getRangeAxis();
            rangeAxis.setLabelFont(labelFont);
            rangeAxis.setTickLabelFont(labelFont);
            // 设置最高的一个 Item 与图片顶端的距离
            rangeAxis.setUpperMargin(0.15);
            // 设置最低的一个 Item 与图片底端的距离
            rangeAxis.setLowerMargin(0.15);
            plot.setRangeAxis(rangeAxis);
    
            // Renderer 对象是图形的绘制单元
            StackedBarRenderer renderer = new StackedBarRenderer();
            // 设置柱子宽度
            renderer.setMaximumBarWidth(0.05);
            // 设置柱子高度
            renderer.setMinimumBarLength(0.1);
            // 设置柱的边框颜色
            renderer.setBaseOutlinePaint(Color.BLACK);
            // 设置柱的边框可见
            renderer.setDrawBarOutline(true);
    
            // // 设置柱的颜色(可设定也可默认)
            renderer.setSeriesPaint(0, new Color(204, 255, 204));
            renderer.setSeriesPaint(1, new Color(255, 204, 153));
    
            // 设置每个地区所包含的平行柱的之间距离
            renderer.setItemMargin(0.4);
    
            plot.setRenderer(renderer);
            // 设置柱的透明度(如果是3D的必须设置才能达到立体效果,如果是2D的设置则使颜色变淡)
            // plot.setForegroundAlpha(0.65f);
    
            FileOutputStream fos_jpg = null;
            try {
                isChartPathExist(CHART_PATH);
                String chartName = CHART_PATH + charName;
                fos_jpg = new FileOutputStream(chartName);
                ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
                return chartName;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    fos_jpg.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    }

    java发送邮件的类源码:  

    package com.sinosoft.tphi.task.mail;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.NoSuchProviderException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import org.apache.log4j.Logger;
    import com.sinosoft.utility.CError;
    import com.sinosoft.utility.CErrors;
    import com.sinosoft.utility.ExeSQL;
    import com.sinosoft.utility.SSRS;
    import com.sinosoft.utility.TransferData;
    
    
    
    
    public class EmailUtilCommon {
    
         /**
         * @param 发送邮件的工具类
         * @author wcg 
         * @time 2019-04-11
         */
        private TransferData mTransferData = new TransferData();
        private final  String tport = "mail.host";
        private final  String tprotocol = "mail.transport.protocol";
        private final  String tauth = "mail.smtp.auth";
        private final Logger logger = Logger.getLogger("SentMailTest");
        private  String mport = "";
        private  String mprotocol = "";
        private  String mauth = "";
        private String msusername = "";
        private String mpassword = "";
        private String mRusername = "";
        private String mTransdate = "";
        private String mBatchno = "";
        private String mMSG = "";
        private String mErrorAtio = "";
        private List<String> tList = new ArrayList<String>();
        public CErrors mErrors = new CErrors();
        private Transport ts;
        private static String mas = null;
        private static String title = null;
        private static String path = null;
        
        public boolean submitData(String mas ,String title,String path) {
             
            this.mas = mas;
            this.title = title;
            this.path = path;
            
            if (!checkData()) {
                CError tError = new CError();
                tError.moduleName = "DealBatchData";
                tError.functionName = "checkData";
                tError.errorMessage = "输入有误,开始时间大于结束时间!";
                this.mErrors.addOneError(tError);
                return false;
            }
        
            // 查询数据推送情况
            logger.info("===========>>>==开始进行邮件发送操作,当前时间:"+java.util.Calendar.getInstance().getTime());
            if (!dealData()) {
                logger.info("===========>>>==邮件发送操作结束!结束时间:"+java.util.Calendar.getInstance().getTime());
                return false;
            }
            logger.info("===========>>>==成功发送邮件!结束时间:"+java.util.Calendar.getInstance().getTime());
            return true;
            
        }    
        
       private boolean dealData() { 
           String tSQL = "";
           ExeSQL tExeSQL = new ExeSQL();
           /**
            * 查询邮箱服务器的ip地址
            * 
            */
            tSQL = "select sysvarvalue from ldsysvar where sysvar='EmailPortServiceType'";
            mport = tExeSQL.getOneValue(tSQL);
            System.out.println("=======mport====="+mport);
            if (mport == null || mport.equals("")) {
                CError tError = new CError();
                tError.moduleName = "SentMailTest";
                tError.functionName = "dealData";
                tError.errorMessage = "获取邮件服务器ip地址失败!";
                this.mErrors.addOneError(tError);
                return false;
            }
            /**
             * 查询邮箱服务器的发送协议类型
             * 
             */
            tSQL = "select sysvarvalue from ldsysvar where sysvar='EmProtoServiceType'";
                mprotocol = tExeSQL.getOneValue(tSQL);
                System.out.println("=======mprotocol====="+mprotocol);
                if (mprotocol == null || mprotocol.equals("")) {
                    CError tError = new CError();
                    tError.moduleName = "SentMailTest";
                    tError.functionName = "dealData";
                    tError.errorMessage = "获取邮件服务协议失败!";
                    this.mErrors.addOneError(tError);
                    return false;
                }
            /**
             * 查询是否启用邮件debug模式
             *     
             */
                
            tSQL = "select sysvarvalue from ldsysvar where sysvar='EmAuthServiceType'";
            mauth = tExeSQL.getOneValue(tSQL);
                System.out.println("=======mauth====="+mauth);
                if (mauth == null || mauth.equals("")) {
                    CError tError = new CError();
                    tError.moduleName = "SentMailTest";
                    tError.functionName = "dealData";
                    tError.errorMessage = "获取邮件dubug模式失败!";
                    this.mErrors.addOneError(tError);
                    return false;
                }    
           /**
            * 查询发送邮件邮箱的用户名
            * 
            */
            tSQL = "select sysvarvalue from ldsysvar where sysvar='EmSuserServiceType'";
            msusername = tExeSQL.getOneValue(tSQL);
                    System.out.println("=======msusername====="+msusername);
                    if (msusername == null || msusername.equals("")) {
                        CError tError = new CError();
                        tError.moduleName = "SentMailTest";
                        tError.functionName = "dealData";
                        tError.errorMessage = "获取发送邮件用户名失败!";
                        this.mErrors.addOneError(tError);
                        return false;
                    }        
            /**
              * 查询发送邮件邮箱的密码
              * 
              */
            tSQL = "select sysvarvalue from ldsysvar where sysvar='EmPassServiceType'";
            mpassword = tExeSQL.getOneValue(tSQL);
            System.out.println("=======mpassword=====" + mpassword);
            if (mpassword == null || mpassword.equals("")) {
                CError tError = new CError();
                tError.moduleName = "SentMailTest";
                tError.functionName = "dealData";
                tError.errorMessage = "获取发送邮件密码失败!";
                this.mErrors.addOneError(tError);
                return false;
            }        
                
                    
           /**
            * 设置发送邮件的参数  
            *         
            */
           Properties prop = new Properties();    
           prop.setProperty(tport, mport);
           prop.setProperty(tprotocol, mprotocol);
           prop.setProperty(tauth, mauth);
           //使用JavaMail发送邮件的5个步骤
           //1、创建session
           Session session = Session.getInstance(prop);
           //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
          session.setDebug(true);
           //2、通过session得到transport对象
          
        try {
             //2、通过session得到transport对象
             ts = session.getTransport();
             //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
             ts.connect(mport, msusername, mpassword);
             //查询加收邮件的邮箱地址  
             tSQL = "select distinct useremail  from dxusermess where usergroup = '保单登记平台' and messflag = 'YJ'"; 
             SSRS tSSRS = tExeSQL.execSQL(tSQL);
                   for (int i=1;i<=tSSRS.getMaxRow();i++){
                       mRusername = tSSRS.GetText(i, 1);
                     if(mRusername == null || mRusername.equals("")){
                            CError tError = new CError();
                            tError.moduleName = "SentMailTest";
                            tError.functionName = "dealData";
                            tError.errorMessage = "获取收件人邮箱失败!";
                            this.mErrors.addOneError(tError);
                            return false;
                        }
                      //4、创建邮件
                     Message message = createSimpleMail(session,mRusername);
                       //5、发送邮件        
                    ts.sendMessage(message, message.getAllRecipients());     
                   }      
             
             
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (ts!=null){
                 try {
                    ts.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
            
        } 
        
           return true;
        }
    
    
    
    
    
    
    
    private boolean checkData() {
            // TODO Auto-generated method stub
            return true;
        }
    
    
        public static MimeMessage createSimpleMail(Session session,String mRuserName)
                throws Exception {
            //创建邮件对象
            MimeMessage message = new MimeMessage(session);
            //指明邮件的发件人
            message.setFrom(new InternetAddress("mail@192.168.XX.XX"));
            //指明邮件的发送人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(mRuserName));
            //邮件的标题
            message.setSubject(title);
          /*  //邮件的文本内容
            message.setContent("你好啊!", "text/html;charset=UTF-8");
    */       
          //创建邮件正文,为了避免邮件正文中文乱码问题,需要使用charset=UTF-8指明字符编码
           /* MimeBodyPart text = new MimeBodyPart();
            text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");*/
            MimeBodyPart text = new MimeBodyPart();
            // 描述数据关系
            MimeMultipart mm = new MimeMultipart();
            if(path == null || path.equals("")){
                text.setContent(mas, "text/html;charset=UTF-8");
            }else{
                text.setContent(mas+"<br/><img src='cid:myPic.jpg'>", "text/html;charset=UTF-8");
                // 准备图片数据
                MimeBodyPart image = new MimeBodyPart();
                DataHandler dh = new DataHandler(new FileDataSource(path));
                image.setDataHandler(dh);
                image.setContentID("myPic.jpg");
                mm.addBodyPart(image);
            }
            
            
    
    
            mm.addBodyPart(text);       
            mm.setSubType("related");
    
            message.setContent(mm);
            message.saveChanges();
           
            
            
            //返回创建好的邮件对象
            return message;
        }    
        
    }

    短信发送的类源码:  

    import java.io.ByteArrayOutputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.Enumeration;
    
    import org.apache.log4j.Logger;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.output.XMLOutputter;
    
    import com.sinosoft.lis.pubfun.GlobalInput;
    import com.sinosoft.lis.pubfun.MMap;
    import com.sinosoft.lis.pubfun.PubFun;
    import com.sinosoft.lis.pubfun.PubFun1;
    import com.sinosoft.lis.pubfun.PubSubmit;
    import com.sinosoft.lis.schema.DXUSERMESSSchema;
    import com.sinosoft.lis.schema.PTSENDRECORDSchema;
    import com.sinosoft.utility.CError;
    import com.sinosoft.utility.CErrors;
    import com.sinosoft.utility.ExeSQL;
    import com.sinosoft.utility.SSRS;
    import com.sinosoft.utility.TransferData;
    import com.sinosoft.utility.VData;
    
    /**
     *
     * @作者:wcg
     * @时间:2019-03-14
     * @描述:短信发送工具类   
     * @version: 1.0
     */
    
    public class PtSendCommon {
        /** 错误处理类,每个需要错误处理的类中都放置该类 */
        public CErrors mErrors = new CErrors();
        /** 往界面传输数据的容器 */
        private VData mResult = new VData();
        private MMap mMap = new MMap();
        /** 数据操作字符串 */
        private String mOperate;
        /** 往后面传输数据的容器 */
        private VData mInputData;
        private String CurrDate = PubFun.getCurrentDate();
        private String mTransDate = null;
        private String CurrTime = PubFun.getCurrentTime();
        private GlobalInput mGlobalInput = new GlobalInput();
        
        Logger mLog = Logger.getLogger("UWSMSLog");
        private String mXMLToString;
        private String mEndPoint = "";
        private String mUser = "";
        private String mComCode = "";
        private String mPass = "";
        private int mMaxNum = 5000;
        private String msendflag = "你好";
        private String mContent = "";
        private String mtablename = "";
        private String mbatchno = "";
        private int mcount = 0;
        private String MobilePhone = "";//联系人手机号
        private String mFailureReason = "";
        private String mServiceType = "";
        private String mtransdate = "";
        private static final String mExtension = "true";
        private TransferData mTransferData;
        
        public boolean submitData(VData cInputData, String tsendflag) {
            mTransDate = PubFun.calDate(CurrDate, -1, "D", "");
            System.out.println("-------send message begin----");
            this.msendflag = tsendflag; 
            //将操作数据拷贝到本类中
            mInputData = (VData) cInputData.clone();
            //得到外部传入的数据,将数据备份到本类中
            if (!getInputData(cInputData)) {
                return false;
            }
    
            System.out.println("aftergetInputData send message:::");
    
            if (!checkData()) {
                return false;
            }
    
            //数据准备操作(dealData())
            if (!dealData()) {
                return false;
            }
    
            System.out.println("afterdealDate send message:");
    
            //数据准备操作(dealData())
            if (!prepareData()) {
                return false;
            }
    
            if (!doPubSubmit()){
                
                return false;
            }
            return true;
        }
        
        
        
        private boolean doPubSubmit() {
            
            PubSubmit tPubSubmit = new PubSubmit();
            if (!tPubSubmit.submitData(mResult, "")){
                CError tError = new CError();
                 tError.moduleName = "短信信息插入表提交";
                 tError.functionName = "tPubSubmit";
                 tError.errorMessage = "向表PTSENDRECORD中提交短信信息失败!";
                 this.mErrors.addOneError(tError);
                 return false;
            }
            return true;
        }
    
    
    
        /**
         * 初始化数据:获取发送短信类型的标志sendflag 和 需要发送短信的表范围 
         * 
         * @param cInputData
         * @return
         */
        private boolean getInputData(VData cInputData) {
            
            mTransferData = (TransferData) mInputData.getObjectByObjectName("TransferData",0);
            if(msendflag.equals("LT")){
              mtablename = (String) mTransferData.getValueByName("mtablename");
            }else if(msendflag.equals("YC")){
              mtablename = (String) mTransferData.getValueByName("mtablename");    
            }else if(msendflag.equals("CW")){
              mbatchno = (String)mTransferData.getValueByName("mbatchno");    
              mcount = (Integer)mTransferData.getValueByName("mcount");         
            }            
            return true;
        }
    
        /**
         * 对外传数据进行校验,目前不需要添加校验的功能
         * 
         * @return
         */
        private boolean checkData() {
    
            return true;
        }
    
        /**
         * 具体处理短信发送业务,按照不同的要求发送短信
         * 
         * @return
         */
        
         private boolean dealData() {
             //调用短信发送的类发送陪你过短信  
             if (msendflag.equals("LT")){
                 if(!SendMessage()){
                     System.out.println("==短信发送失败==");
                     return false;
                 }    
             }else if (msendflag.equals("YC")){
                 if(!SendMessage()){
                     System.out.println("==短信发送失败==");
                     return false;
                 }    
             }else if (msendflag.equals("cw")){
                 if(!SendMessage1()){
                     System.out.println("==短信发送失败==");
                     return false;
                 }    
             }
                 
                 
             return true;
         }
    
        /**
         * 对数据进行前期准备
         * 
         * 
         * @return
         */
     
         private boolean prepareData() {
            mResult.clear();
            mResult.add(mMap);
            return true;
         }
          
        
         private boolean SendMessage(){
               
               ExeSQL tExeSQL = new ExeSQL();
               String tSQL = "";
             
               tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtSMServiceType'";
               mServiceType = tExeSQL.getOneValue(tSQL);
             System.out.println("=======mServiceType====="+mServiceType);
             if (mServiceType == null || mServiceType.equals("")) {
                 CError tError = new CError();
                 tError.moduleName = "GEdorValidBL";
                 tError.functionName = "SendMessage";
                 tError.errorMessage = "获取短信平台服务类型失败!";
                 this.mErrors.addOneError(tError);
                 return false;
             }
               
               tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtSMWebServiceURL'";
               mEndPoint = tExeSQL.getOneValue(tSQL);
               System.out.println("=======mEndPoint====="+mEndPoint);
               if (mEndPoint == null || mEndPoint.equals("")) {
                   CError tError = new CError();
                   tError.moduleName = "GEdorValidBL";
                   tError.functionName = "SendMessage";
                   tError.errorMessage = "获取短信平台WebService地址失败!";
                   this.mErrors.addOneError(tError);
                   return false;
               }
               tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtBQID'";
               mUser = tExeSQL.getOneValue(tSQL);
               if (mUser == null || mUser.equals("")) {
                   CError tError = new CError();
                   tError.moduleName = "GEdorValidBL";
                   tError.functionName = "SendMessage";
                   tError.errorMessage = "获取短信平台用户名失败!";
                   this.mErrors.addOneError(tError);
                   return false;
               }
    
               tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtBQCOM'";
               mComCode = tExeSQL.getOneValue(tSQL);
               if (mComCode == null || mComCode.equals("")) {
                   CError tError = new CError();
                   tError.moduleName = "GEdorValidBL";
                   tError.functionName = "SendMessage";
                   tError.errorMessage = "获取短信平台机构代码失败!";
                   this.mErrors.addOneError(tError);
                   return false;
               }
    
               tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtBQPASS'";
               mPass = tExeSQL.getOneValue(tSQL);
               if (mPass == null || mPass.equals("")) {
                   CError tError = new CError();
                   tError.moduleName = "GEdorValidBL";
                   tError.functionName = "SendMessage";
                   tError.errorMessage = "获取短信平台密码失败!";
                   this.mErrors.addOneError(tError);
                   return false;
               }
    
               // 一次最多可以发送的条数
               tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtMaxNum'";
               String tNum = tExeSQL.getOneValue(tSQL);
               if (tNum == null || tNum.equals("")) {
                   mMaxNum = 500;
               } else {
                   try {
                       mMaxNum = Integer.parseInt(tNum);
                   } catch (NumberFormatException e) {
                       mMaxNum = 500;
                   }
               }
               //查询用户的手机号,因为一张表可能对应多个用户,所以需要循环查询出所有需要发送短信的用户
               String mobile_sql = " select userphone  from dxusermess where tablename = '"+mtablename+"'";
               SSRS tSSRS = tExeSQL.execSQL(mobile_sql);
               for (int i=1;i<=tSSRS.getMaxRow();i++){
                 MobilePhone = tSSRS.GetText(i, 1);
                 if(MobilePhone == null || MobilePhone.equals("")){
                        CError tError = new CError();
                        tError.moduleName = "GEdorValidBL";
                        tError.functionName = "SendMessage";
                        tError.errorMessage = "获取联系人手机号失败!";
                        this.mErrors.addOneError(tError);
                        return false;
                    }
                     //循环每一个手机号并进行处理       
                     mLog.info("GEdorValidBL->dealData:开始进行业务逻辑处理");
                    if (!makeXML()) {
                        mLog.info("GEdorValidBL->dealData:生成xml数据失败");
                        return false;
                    }
                    if (!modifyStauts("1")) {
                        mLog.info("GEdorValidBL->dealData:短信成功状态更新失败");
                        return false;
                    }
                    if (!callRemoteService()) {
                        mLog.info("GEdorValidBL->dealData:短信调用失败,开始进行短信状态的置值");
                        if (!modifyStauts("2")) {
                            mLog.info("GEdorValidBL->dealData:短信失败状态更新失败");
                            return false;
                        }
                       return false;
                    }                                      
               }        
               mLog.info("GEdorValidBL->dealData:业务逻辑处理结束!");
               return true;
             
         }
         /**
          * 函数功能:为每天监控的错误数据量发送日志
          * 
          * 
          */
         private boolean SendMessage1(){
              
                ExeSQL tExeSQL = new ExeSQL();
                String tSQL = "";
              
                tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtSMServiceType'";
                mServiceType = tExeSQL.getOneValue(tSQL);
              System.out.println("=======mServiceType====="+mServiceType);
              if (mServiceType == null || mServiceType.equals("")) {
                  CError tError = new CError();
                  tError.moduleName = "GEdorValidBL";
                  tError.functionName = "SendMessage";
                  tError.errorMessage = "获取短信平台服务类型失败!";
                  this.mErrors.addOneError(tError);
                  return false;
              }
                
                tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtSMWebServiceURL'";
                mEndPoint = tExeSQL.getOneValue(tSQL);
                System.out.println("=======mEndPoint====="+mEndPoint);
                if (mEndPoint == null || mEndPoint.equals("")) {
                    CError tError = new CError();
                    tError.moduleName = "GEdorValidBL";
                    tError.functionName = "SendMessage";
                    tError.errorMessage = "获取短信平台WebService地址失败!";
                    this.mErrors.addOneError(tError);
                    return false;
                }
                tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtBQID'";
                mUser = tExeSQL.getOneValue(tSQL);
                if (mUser == null || mUser.equals("")) {
                    CError tError = new CError();
                    tError.moduleName = "GEdorValidBL";
                    tError.functionName = "SendMessage";
                    tError.errorMessage = "获取短信平台用户名失败!";
                    this.mErrors.addOneError(tError);
                    return false;
                }
    
                tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtBQCOM'";
                mComCode = tExeSQL.getOneValue(tSQL);
                if (mComCode == null || mComCode.equals("")) {
                    CError tError = new CError();
                    tError.moduleName = "GEdorValidBL";
                    tError.functionName = "SendMessage";
                    tError.errorMessage = "获取短信平台机构代码失败!";
                    this.mErrors.addOneError(tError);
                    return false;
                }
    
                tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtBQPASS'";
                mPass = tExeSQL.getOneValue(tSQL);
                if (mPass == null || mPass.equals("")) {
                    CError tError = new CError();
                    tError.moduleName = "GEdorValidBL";
                    tError.functionName = "SendMessage";
                    tError.errorMessage = "获取短信平台密码失败!";
                    this.mErrors.addOneError(tError);
                    return false;
                }
    
                // 一次最多可以发送的条数
                tSQL = "select sysvarvalue from ldsysvar where sysvar='CsPtMaxNum'";
                String tNum = tExeSQL.getOneValue(tSQL);
                if (tNum == null || tNum.equals("")) {
                    mMaxNum = 500;
                } else {
                    try {
                        mMaxNum = Integer.parseInt(tNum);
                    } catch (NumberFormatException e) {
                        mMaxNum = 500;
                    }
                }
                //为保单登记平台的每个用户发送一条短信   
                String mobile_sql = " select userphone from dxusermess where messflag = 'CW'";
                SSRS tSSRS = tExeSQL.execSQL(mobile_sql);
                for (int i=1;i<=tSSRS.getMaxRow();i++){
                  MobilePhone = tSSRS.GetText(i, 1);
                  if(MobilePhone == null || MobilePhone.equals("")){
                         CError tError = new CError();
                         tError.moduleName = "GEdorValidBL";
                         tError.functionName = "SendMessage";
                         tError.errorMessage = "获取联系人手机号失败!";
                         this.mErrors.addOneError(tError);
                         return false;
                     }
                      //循环每一个手机号并进行处理       
                      mLog.info("GEdorValidBL->dealData:开始进行业务逻辑处理");
                     if (!makeXML()) {
                         mLog.info("GEdorValidBL->dealData:生成xml数据失败");
                         return false;
                     }
                     if (!modifyStauts("1")) {
                         mLog.info("GEdorValidBL->dealData:短信成功状态更新失败");
                         return false;
                     }
                     if (!callRemoteService()) {
                         mLog.info("GEdorValidBL->dealData:短信调用失败,开始进行短信状态的置值");
                         if (!modifyStauts("2")) {
                             mLog.info("GEdorValidBL->dealData:短信失败状态更新失败");
                             return false;
                         }
                        return false;
                     }                                      
                }        
                mLog.info("GEdorValidBL->dealData:业务逻辑处理结束!");
                return true;
              
          }
         
         
         
           /**
            * 该方法用于生成XML文件,然后包装到mVData中
            * 
            * @return
            */
           public boolean makeXML() {
               
               String ipnum = getServerIp();
               System.out.println("+++++输出服务器的ip地址++++++"+ipnum);
               mLog.info("GEdorValidBL->makeXML:开始生成短信xml格式");
               // MMap tMap = new MMap();
               Element tRoot, tSubRoot, tMessage, tReceiver, tContents;
               Document tDocument;
               tRoot = new Element("Messages");// 首先建立根元素
    
               tDocument = new Document(tRoot);
    
               tSubRoot = new Element("Organization");
               tSubRoot.setText(mComCode);
               tRoot.addContent(tSubRoot);
    
               tSubRoot = new Element("ServiceType");
               tSubRoot.setText(mServiceType);
               tRoot.addContent(tSubRoot);
    
               tSubRoot = new Element("Extension");
               tSubRoot.setText(mExtension);
               tRoot.addContent(tSubRoot);
    
               tSubRoot = new Element("StartDate");
               tSubRoot.setText(CurrDate);
               tRoot.addContent(tSubRoot);
    
               tSubRoot = new Element("EndDate");
               tSubRoot.setText(PubFun.calDate(CurrDate, 1, "D", ""));
               tRoot.addContent(tSubRoot);
    
               tSubRoot = new Element("StartTime");
               tSubRoot.setText("00:00:00");
               tRoot.addContent(tSubRoot);
    
               tSubRoot = new Element("EndTime");
               tSubRoot.setText("23:59:59");
               tRoot.addContent(tSubRoot);
               String[] dateSign1;
               String[] dateSign2;
               String year1 = "";
               String month1 = "";
               String day1 = "";
               String year2 = "";
               String month2 = "";
               String day2 = "";
                   tMessage = new Element("Message");
    
                   tReceiver = new Element("Receiver");
                   tReceiver.setText(MobilePhone);
                   System.out.println("==1===="+MobilePhone);
                System.out.println("==输出短信发送标志===="+msendflag);  
             if(msendflag.equals("LT")){            
                       mContent = "lsm:早上好! 外围表"
                               + mtablename
                               + "在"
                               + mTransDate
                               + "的数据"
                               + "没有推送到北京查询机,请及时处理,祝好!";
                           
             }else if("YC".equals(msendflag)){
                    mContent = "lsm:早上好! 外围表"
                              + mtablename
                              + "在"
                              + mTransDate
                              +"的数据没有按时推送到北京查询机,保单登记平台提数时数据还在推送,请及时排查原因,祝好!";
             }else if ("cw".equals(msendflag)){
                            mContent = "lsm:您有一条新短消息! 今天的增量批次 "
                            + mbatchno
                            + "在"
                            + mTransDate
                            + "这天插入lderrorlog表中的错误数据量达到了"
                            + mcount 
                            +" 请及时排查原因,祝好!";
                 
             }
                
               System.out.println("==输出短信发送内容===="+mContent);  
                   tContents = new Element("Contents");
                   tContents.setText(mContent);
                   
                   tMessage.addContent(tReceiver);
                   tMessage.addContent(tContents);
    
                   tRoot.addContent(tMessage);
    
    
               XMLOutputter tXMLOutputter = new XMLOutputter(); // xml导出对象
               OutputStream tOutputStream = new ByteArrayOutputStream();
               try {
                   tXMLOutputter.setEncoding("GBK");
                   tXMLOutputter.setTrimText(true);
                   tXMLOutputter.setIndent(" ");// 调整输出xml的缩进值
                   tXMLOutputter.setExpandEmptyElements(true);// 是否扩展空值标签
                   tXMLOutputter.setNewlines(true);// 是否分行输出
                   tXMLOutputter.output(tDocument, tOutputStream);
                   this.mXMLToString = tOutputStream.toString();
                   System.out.println(mXMLToString);
                   mLog.info("GEdorValidBL->makeXML:短信信息-》" + mXMLToString);
                   // tXMLOutputter.output(tDocument, new
                   // FileOutputStream("c:/test1.xml")); //输出
    
               } catch (Exception e) {
                   e.printStackTrace();
                   mLog.info("GEdorValidBL->makeXML:生成xml失败," + e.getMessage());
                   return false;
               }
               System.out.println("短信接口:MakeXmlBL生成xml成功-------------");
               mLog.info("GEdorValidBL->makeXML:生成xml成功,处理结束");
               return true;
           } 
           /**
            * 修改短信发送状态 add by chenrong 2011-6-10
            * 
            * @param cStatus
            * @return
            */
           private boolean modifyStauts(String cStatus) {
               System.out.println("++++开始将错误数据插入短信数据表中 +++++");
               PubFun1 pubFun = new PubFun1();
               String[] dateSign1;
               String[] dateSign2;
               String year1 = "";
               String month1 = "";
               String day1 = "";
               String year2 = "";
               String month2 = "";
               String day2 = "";
               String PtMSS = pubFun.CreateMaxNo("PtMSS", 20);
               System.out.println("+++++短信内容插入信息表中的流水号+++++"+PtMSS);
                //将发送短信的信息插入到短信信息表中  
                PTSENDRECORDSchema tPTSENDRECORDSchema = new PTSENDRECORDSchema();
                if (cStatus.equals("1")) {
                    tPTSENDRECORDSchema.setSERIALNO(PtMSS);
                    tPTSENDRECORDSchema.setSMSTYPE(mServiceType);
                    tPTSENDRECORDSchema.setMOBILENO(MobilePhone);
                    tPTSENDRECORDSchema.setSMSCONTENTS(mContent);
                    tPTSENDRECORDSchema.setSENDSTATE(cStatus);
                    tPTSENDRECORDSchema.setSENDDATE(PubFun.getCurrentDate());
                    tPTSENDRECORDSchema.setSENDTIME(PubFun.getCurrentTime());
                    tPTSENDRECORDSchema.setOPERATOR("zl");
                    tPTSENDRECORDSchema.setMAKEDATE(PubFun.getCurrentDate());
                    tPTSENDRECORDSchema.setMAKETIME(PubFun.getCurrentTime());
                    tPTSENDRECORDSchema.setMODIFYDATE(PubFun.getCurrentDate());
                    tPTSENDRECORDSchema.setMODIFYTIME(PubFun.getCurrentTime());
                    mMap.put(tPTSENDRECORDSchema, "INSERT");     
                }
                
               return true;
       }
           
           /**
            * 调用远程短信接口
            * 
            * @return
            */
           private boolean callRemoteService() {
               System.out.println("++++开始调用短信发送接口 +++++");
               try {
    
                   mLog.info("GEdorValidBL->callRemoteService:开始调用短信接口");
                   WsClientLocator tService = new WsClientLocator();
                   WsClientHttpBindingStub tWsClientHttpBindingStub;
                   tService.setWsClientHttpPortWSDDServiceName(mEndPoint);
    
                   tWsClientHttpBindingStub = (WsClientHttpBindingStub) tService
                           .getWsClientHttpPort();
                   tWsClientHttpBindingStub.sendSMS(mUser, mPass, mComCode,
                           mXMLToString);
                   mLog
                           .info("GEdorValidBL->callRemoteService:调用短信接口成功,callRemoteService处理结束");
                   return true;
               } catch (ClientException e) {
                   System.out.println("短信接口->ClientException:");
                   System.out.println("mFailureReason:"+ e.toString());
                   e.printStackTrace();
                   System.out.println("remFailureReason:"+ e.toString());
                   mFailureReason = e.toString();
                   CError tError = new CError();
                   tError.moduleName = "SMSSendBL";
                   tError.functionName = "callRemoteService";
                   tError.errorMessage = "调用远程短信接口失败:" + e.toString();
                   this.mErrors.addOneError(tError);
                   mLog.info("GEdorValidBL->callRemoteService:调用短信接口失败,"
                           + mFailureReason);
                   return false;
               } catch (Exception e) {
                   System.out.println("短信接口->Exception:");
                   System.out.println("mFailureReason:"+ e.toString());
                   e.printStackTrace();
                   mFailureReason = e.toString();
                 System.out.println("remFailureReason:"+ e.toString());
                   CError tError = new CError();
                   tError.moduleName = "GEdorValidBL";
                   tError.functionName = "callRemoteService";
                   tError.errorMessage = "调用远程短信接口失败:" + e.toString();
                   this.mErrors.addOneError(tError);
                   mLog.info("GEdorValidBL->callRemoteService:调用短信接口失败,"
                           + mFailureReason);
                   return false;
               }
    
           }
        
        public  String  getServerIp(){
            String SERVER_IP = null;
            try {
                Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();
               InetAddress ip = null;
               while (netInterfaces.hasMoreElements()) {
                   NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
                   ip = (InetAddress) ni.getInetAddresses().nextElement();
                   SERVER_IP = ip.getHostAddress();
                 if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress()
                          && ip.getHostAddress().indexOf(":") == -1) {
                       SERVER_IP = ip.getHostAddress();
                       break;
                   } else {
                       ip = null;
                   }
               }
           } catch (SocketException e) {       
             e.printStackTrace();
          }
     
          return SERVER_IP;
       }
    }
           
           
           
  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/wcgstudy/p/10941962.html
Copyright © 2011-2022 走看看