浏览代码

贵州Excel导入模板,角色和权限

lijihong 6 年之前
父节点
当前提交
e24eebede0

+ 1 - 1
TRS.WCM.Developer/myconfig/application.properties

@@ -1,3 +1,3 @@
-mysql_connectUrl = jdbc:mysql://127.0.0.1:3306/liion?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
+mysql_connectUrl = jdbc:mysql://127.0.0.1:3306/trs_data_migration?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
 user_name = root
 pswd = zxcv1234

二进制
TRS.WCM.Developer/myconfig/template/贵州-权限数据-填充模板.xlsx


+ 187 - 0
TRS.WCM.Developer/src/com/trs/util/ExcelReader.java

@@ -0,0 +1,187 @@
+package com.trs.util;
+
+import com.trs.infra.util.CMyString;
+import org.apache.log4j.Logger;
+import org.apache.poi.ss.usermodel.*;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+
+
+/**
+ * Excel导入工具类
+ *
+ * @author linc on 2015/6/10
+ */
+public class ExcelReader {
+
+    private static final Logger logger = Logger.getLogger(ExcelReader.class);
+
+    public static final String EXCEL_XLS_EXT = "xls";
+
+    public static final String EXCEL_XLSX_EXT = "xlsx";
+
+    private ExcelReader() {
+        super();
+    }
+
+    /**
+     * 读取excel文件的内容,将内容保存在一个字符串二维数组中
+     *
+     * @param file      文件
+     * @param rowOffset 行偏移量
+     * @param colOffset 列偏移量
+     * @param isTitle   是否是title
+     * @return 读取文档的结果
+     */
+    private static String[][] readExcel(File file, int sheetNum, int rowOffset, int colOffset, boolean isTitle) {
+
+        if (file == null) {
+            return new String[][]{};
+        }
+        // 创建输入流
+        InputStream in = null;
+        try {
+            in = new FileInputStream(file);
+        } catch (FileNotFoundException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return readExcel(in, sheetNum, rowOffset, colOffset, isTitle);
+    }
+
+    public static String[][] readExcelTitle(File file, int sheetNum, boolean needNull) {
+        return readExcel(file, sheetNum, 0, 0, true);
+    }
+
+    public static String[][] readExcel(File file, int sheetNum, int rowOffset, int colOffset) {
+        return readExcel(file, sheetNum, rowOffset, colOffset, false);
+    }
+
+
+    /**
+     * 读取excel文件的流的值
+     * 1、将结果放置在一个字符串的二维数组中
+     *
+     * @param in        文件的流
+     * @param rowOffset 从0开始有效,但该参数的最小值应为1,意味着excel文件应是带标题行的,从第二行开始读取内容
+     * @param colOffset 从0开始有效,最小值可以为0,意味着从首列开始算
+     * @return 解析后的数据
+     */
+    private static String[][] readExcel(InputStream in, int sheetNum, int rowOffset, int colOffset, boolean istitle) {
+        if (in == null) {
+            return new String[][]{};
+        }
+        Workbook workbook = null;
+        String[][] contentsArray = null;
+        try {
+            //工作簿
+            workbook = WorkbookFactory.create(in);
+            //表
+            Sheet sheet = workbook.getSheetAt(sheetNum);
+
+            int rows;
+            int cols;
+            //有title和没有title的区别
+            if (istitle) {
+                rows = 1;
+                cols = sheet.getRow(rows).getLastCellNum();
+            } else {
+                rows = sheet.getLastRowNum() + 1 - rowOffset;
+                cols = sheet.getRow(rowOffset - 1).getLastCellNum() - colOffset; // 应以标题的列数为准
+            }
+
+            contentsArray = new String[rows][cols];
+
+            for (int i = 0; i < contentsArray.length; i++) {
+
+                int rownum = i + rowOffset;
+                // 获取第i行,第j列的值
+                Row row = sheet.getRow(rownum);
+                if (row == null
+                        || CMyString.isEmpty(getCellValueAsString(row.getCell(colOffset)))) {
+                    continue;
+                }
+                for (int j = 0; j < contentsArray[i].length; j++) {
+
+                    int cellnum = j + colOffset;
+                    Cell cell = row.getCell(cellnum);
+                    if (cell == null) {
+                        continue;
+                    }
+
+                    String cellValue;
+                    CellType type = cell.getCellTypeEnum();
+                    if (type == CellType.NUMERIC) {
+                        if (DateUtil.isCellDateFormatted(cell)) {
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                            cellValue = sdf.format(cell.getDateCellValue());
+                        } else {
+                            cellValue = String.valueOf(cell.getNumericCellValue());
+                        }
+                    } else if (type == CellType.FORMULA) {
+                        if (DateUtil.isCellDateFormatted(cell)) {
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                            cellValue = sdf.format(cell.getDateCellValue());
+                        } else {
+                            cellValue = String.valueOf(cell.getNumericCellValue());
+                        }
+                    } else {
+                        cellValue = cell.getRichStringCellValue().getString();
+                    }
+                    contentsArray[i][j] = cellValue;
+                }
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        } finally {
+            try {
+                in.close();
+            } catch (IOException e) {
+                logger.error(e.getMessage());
+            }
+            if (workbook != null) {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    logger.error(e.getMessage());
+                }
+            }
+        }
+        return contentsArray;
+    }
+
+    public static String[][] readExcel(InputStream in, int sheetNum, int rowOffset, int colOffset) {
+        return readExcel(in, sheetNum, rowOffset, colOffset, false);
+    }
+
+
+    /**
+     * 将单元格的值做一些简单处理,返回字符串
+     * 1、只是针对数值型的单元格做了一些处理
+     *
+     * @param cell 单元格
+     * @return 处理好的值
+     */
+    private static String getCellValueAsString(Cell cell) {
+        String v = "";
+        switch (cell.getCellTypeEnum()) {
+            case NUMERIC: // 数字
+                double dv = cell.getNumericCellValue();
+                // 用于去除无用的小数点和0(当超过long的最大值时,不起作用)
+                long lv = new BigDecimal(String.valueOf(dv)).longValue();
+                if (Double.compare(dv, lv) == 0) {
+                    v = String.valueOf(lv);
+                } else {
+                    v = String.valueOf(dv);
+                }
+                break;
+            case STRING: // 字符串
+                v = cell.getStringCellValue();
+                break;
+            default:
+                break;
+        }
+        return v;
+    }
+}

+ 213 - 0
TRS.WCM.Developer/test/com/trs/web2frame/WCMRoleRightCallerTest.java

@@ -0,0 +1,213 @@
+package com.trs.web2frame;
+
+import com.trs.infra.common.BizError;
+import com.trs.infra.common.WCMException;
+import com.trs.infra.util.CMyString;
+import com.trs.infra.util.Loader;
+import com.trs.support.ApplicationProperties;
+import com.trs.util.DBUtil;
+import com.trs.util.ExcelReader;
+import com.trs.web2frame.dispatch.Dispatch;
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Title: TRS 内容协作平台(TRS WCM) <BR>
+ * Description: <BR>
+ * TODO <BR>
+ * Copyright: Copyright (c) 2004-2005 TRS信息技术有限公司 <BR>
+ * Company: TRS信息技术有限公司(www.trs.com.cn) <BR>
+ *
+ * @author TRS信息技术有限公司 LY
+ * @version 1.0
+ */
+
+public class WCMRoleRightCallerTest extends TestCase {
+
+
+    private static final String connectUrl = ApplicationProperties.get("mysql_connectUrl");
+    private static final String userName = ApplicationProperties.get("user_name");
+    private static final String pswd = ApplicationProperties.get("pswd");
+    private static Connection connection;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        connection = DBUtil.getConnection(connectUrl, userName, pswd);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        try {
+            if (connection != null) {
+                connection.close();
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 批量创建模板
+     */
+    public void testCreateRightTemplate() throws WCMException {
+
+        String filePath = Loader.getResource("template").getPath() + "/贵州-权限数据-填充模板.xlsx";
+
+
+        String[][] values = ExcelReader.readExcel(new File(filePath), 0, 1, 0);
+        //获取站点的偏移量
+        List<Map<String, Object>> siteOffset = querySiteOffset();
+        if (siteOffset == null || siteOffset.isEmpty()) {
+            throw new BizError("偏移量表未获取到数据");
+        }
+        testRightTemplate(values, siteOffset);
+    }
+
+    /**
+     * 批量创建角色,授权
+     */
+    public void testCreateRole() throws WCMException {
+
+        String filePath = Loader.getResource("template").getPath() + "/贵州-权限数据-填充模板.xlsx";
+
+        String[][] values = ExcelReader.readExcel(new File(filePath), 1, 1, 0);
+        //获取站点的偏移量
+        List<Map<String, Object>> siteOffset = querySiteOffset();
+        if (siteOffset == null || siteOffset.isEmpty()) {
+            throw new BizError("偏移量表未获取到数据");
+        }
+        //获取栏目的偏移量
+        List<Map<String, Object>> channelOffset = queryChannelOffset();
+        if (channelOffset == null || channelOffset.isEmpty()) {
+            throw new BizError("偏移量表未获取到数据");
+        }
+        testRole(values, siteOffset, channelOffset);
+    }
+
+    private void testRightTemplate(String[][] values, List<Map<String, Object>> siteOffset) throws WCMException {
+
+        String sServiceId = "gov_right";
+
+        String sMethodName = "saveRightTemplate";
+
+        for (String[] strings : values) {
+
+            HashMap<String, Object> hParameters = new HashMap<>();
+
+            hParameters.put("CurrUserName", "admin"); // 当前操作的用户
+            if (CMyString.isEmpty(strings[0])) {
+                throw new BizError("权限模板名称不能为空");
+            }
+            hParameters.put("RTName", strings[0]);
+
+            if (!CMyString.isEmpty(strings[1])) {
+                long siteId = Double.valueOf(strings[1]).longValue();
+                long offsetNum = getOffset(siteOffset, siteId);
+                hParameters.put("SITEID", siteId + offsetNum);
+            }
+            if (CMyString.isEmpty(strings[2])) {
+                throw new BizError("权限值不能为空");
+            }
+            hParameters.put("RIGHTVALUE", strings[2]);
+
+            Dispatch oResult = WCMServiceCaller.Call(sServiceId, sMethodName, hParameters, true);
+
+            System.out.println("结果:" + oResult.getResponseText());
+        }
+
+    }
+
+    private void testRole(String[][] values, List<Map<String, Object>> siteOffset, List<Map<String, Object>> channelOffset) throws BizError {
+
+        String sServiceId = "gov_role";
+
+        String sMethodName = "saveRolesAndRelations";
+
+        for (String[] strings : values) {
+
+            HashMap<String, Object> hParameters = new HashMap<>();
+            hParameters.put("CurrUserName", "admin"); // 当前操作的用户
+            if (CMyString.isEmpty(strings[0])) {
+                throw new BizError("角色名称不能为空");
+            }
+            hParameters.put("ROLENAME", strings[0]);
+            if (CMyString.isEmpty(strings[1])) {
+                throw new BizError("权限模板名称不能为空");
+            }
+            hParameters.put("RIGHTTEMNAME", strings[1]);
+            if (!CMyString.isEmpty(strings[2])) {
+                long siteId = Double.valueOf(strings[2]).longValue();
+                long siteOffsetNum = getOffset(siteOffset, siteId);
+                hParameters.put("SITEID", siteId + siteOffsetNum);
+            }
+            if (!CMyString.isEmpty(strings[3])) {
+                long channelId = Double.valueOf(strings[3]).longValue();
+                long channelOffsetNum = getOffset(channelOffset, channelId);
+                hParameters.put("CHANNELID", channelId + channelOffsetNum);
+            }
+            if (!CMyString.isEmpty(strings[4])) {
+                hParameters.put("USERNAMES", strings[4]);
+            }
+            if (!CMyString.isEmpty(strings[5])) {
+                hParameters.put("GROUPNAMES", strings[5]);
+            }
+            if (!CMyString.isEmpty(strings[6])) {
+                String channelIds = strings[6];
+                channelIds = channelIds.replaceAll(",", ",");
+                String[] channelIdStrs = CMyString.split(channelIds, ",");
+                StringBuilder stringBuilder = new StringBuilder();
+                for (String channelIdStr : channelIdStrs) {
+                    long channelId = Long.parseLong(channelIdStr);
+                    long channelOffsetNum = getOffset(channelOffset, channelId);
+                    stringBuilder.append(channelId + channelOffsetNum).append(",");
+                }
+                stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+                hParameters.put("CHANNELIDS", stringBuilder.toString());
+            }
+            Dispatch oResult = WCMServiceCaller.Call(sServiceId, sMethodName, hParameters, true);
+
+            System.out.println("结果:" + oResult.getResponseText());
+
+        }
+    }
+
+    private List<Map<String, Object>> querySiteOffset() throws WCMException {
+
+        String sql = "SELECT * FROM data_migration_offset WHERE table_name = ?;";
+        List<Object> list = new ArrayList<>();
+        list.add("wcmwebsite");
+        return DBUtil.getDBManager().executeStringsQuery(connection, sql, list);
+    }
+
+    private List<Map<String, Object>> queryChannelOffset() throws WCMException {
+
+        String sql = "SELECT * FROM data_migration_offset WHERE table_name = ?;";
+        List<Object> list = new ArrayList<>();
+        list.add("wcmchannel");
+        return DBUtil.getDBManager().executeStringsQuery(connection, sql, list);
+    }
+
+    private long getOffset(List<Map<String, Object>> offsetMap, long id) throws BizError {
+        long offsetNum = -1;
+        for (Map<String, Object> objectMap : offsetMap) {
+            long startId = (long) objectMap.get("START_ID");
+            long endId = (long) objectMap.get("END_ID");
+            if (id > startId && id <= endId) {
+                offsetNum = (long) objectMap.get("OFFSET_NUM");
+            }
+        }
+        if (offsetNum == -1) {
+            throw new BizError("没有找到对应的偏移量");
+        }
+        return offsetNum;
+    }
+}