diff --git a/src/main/java/com/kiisoo/ic/common/utils/ExcelUtils.java b/src/main/java/com/kiisoo/ic/common/utils/ExcelUtils.java new file mode 100644 index 0000000..61100fa --- /dev/null +++ b/src/main/java/com/kiisoo/ic/common/utils/ExcelUtils.java @@ -0,0 +1,80 @@ +package com.kiisoo.ic.common.utils; + +import org.apache.poi.ss.usermodel.Cell; + +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author jinchaofan + * @date 2018/9/19 11:11 + * @company kiisoo + * @details + */ +public class ExcelUtils { + + /** + * 是否是2007的excel,返回true是2007 + * @param filePath 文件路径 + * @return boolean + */ + public static boolean isExcel2007(String filePath) { + return filePath.matches("^.+\\.(?i)(xlsx)$"); + } + + /** + * 读取cell单元格的值,如果为日期格式,进行转换 + * @author jinchaofan + * @param cell 名字 + * @return String + */ + @SuppressWarnings("deprecation") + public static String getCellValue(Cell cell) { + if (cell == null) { + return ""; + } + if (cell.getCellType() == Cell.CELL_TYPE_STRING) { + return cell.getStringCellValue(); + } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { + return String.valueOf(cell.getBooleanCellValue()); + } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { + return cell.getCellFormula(); + } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { + short format = cell.getCellStyle().getDataFormat(); + + SimpleDateFormat sdf; + if (format == 14 || format == 31 || format == 57 || format == 58 + || (176 <= format && format <= 178) || (182 <= format && format <= 196) + || (210 <= format && format <= 213) || (208 == format)) { + // 日期 + sdf = new SimpleDateFormat("yyyy-MM-dd"); + } else if (format == 20 || format == 32 || format == 183 || (200 <= format && format <= 209)) { + // 时间 + sdf = new SimpleDateFormat("HH:mm"); + } else if(format == 0) { + DecimalFormat df = new DecimalFormat("#"); + return df.format(cell.getNumericCellValue()); + } else { + // 不是日期格式 + return String.valueOf(cell.getNumericCellValue()); + } + double value = cell.getNumericCellValue(); + Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value); + if (date == null || "".equals(date)) { + return ""; + } + String result; + try { + result = sdf.format(date); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + return result; + } + return ""; + } + + +} diff --git a/src/main/java/com/kiisoo/ic/employee/entity/ImportErrorDTO.java b/src/main/java/com/kiisoo/ic/employee/entity/ImportErrorDTO.java new file mode 100644 index 0000000..a6d46e6 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/employee/entity/ImportErrorDTO.java @@ -0,0 +1,21 @@ +package com.kiisoo.ic.employee.entity; + +import lombok.Data; + +/** + * @Description: 门店号管理批量上传显示类 + * @Auther: yechenhao + * @Date: 2020/4/10 16:29 + * @Version: v1 + */ +@Data +public class ImportErrorDTO { + /** + * 行数 + */ + private Integer row; + /** + * 原因 + */ + private String reason; +} diff --git a/src/main/java/com/kiisoo/ic/store/constant/Constants.java b/src/main/java/com/kiisoo/ic/store/constant/Constants.java index 2ab5597..f41ee5a 100644 --- a/src/main/java/com/kiisoo/ic/store/constant/Constants.java +++ b/src/main/java/com/kiisoo/ic/store/constant/Constants.java @@ -10,6 +10,14 @@ public class Constants { * 数据库中的 mobile 字段 */ public static final String DATABASE_STORE_ID_KEY = "store_id"; + /** + * 数据库中的 name 字段 + */ + public static final String DATABASE_NAME_KEY = "name"; + /** + * 数据库中的 code 字段 + */ + public static final String DATABASE_CODE_KEY = "code"; /** * 客户统计数据 0 diff --git a/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java b/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java index 8110f6d..b53e164 100644 --- a/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java +++ b/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java @@ -1,15 +1,14 @@ package com.kiisoo.ic.store.controller; import com.kiisoo.ic.common.BaseController; -import com.kiisoo.ic.store.service.PoiStoreService; import com.kiisoo.ic.store.service.StoreEmployeeService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; import java.util.Map; @@ -43,4 +42,19 @@ public class StoreEmployeeController extends BaseController { } } + /** + * + * @return + */ + @RequestMapping(value = "list",method = RequestMethod.POST) + @ResponseBody + public Map importShopEmpByExcel(@RequestParam("file") MultipartFile file) { + try { + storeEmployeeService.importShopEmpByExcel(file); + return data(null); + } catch (Exception e) { + log.error("添加用户失败", e); + return fail(); + } + } } diff --git a/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java b/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java index 2eedbd4..d6e6e57 100644 --- a/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java +++ b/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java @@ -3,8 +3,14 @@ package com.kiisoo.ic.store.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; +import com.kiisoo.ic.common.utils.ExcelUtils; +import com.kiisoo.ic.department.entity.DepartmentDO; +import com.kiisoo.ic.department.mapper.PrivilageDepartmentDOMapper; +import com.kiisoo.ic.employee.entity.EmployeeDO; +import com.kiisoo.ic.employee.entity.ImportErrorDTO; import com.kiisoo.ic.employee.entity.PrivilageCpUserDO; import com.kiisoo.ic.employee.mapper.PrivilageCpUserDOMapper; +import com.kiisoo.ic.employee.service.EmployeeService; import com.kiisoo.ic.store.entity.PoiStore; import com.kiisoo.ic.store.entity.PrivilageCpUserStoreDO; import com.kiisoo.ic.store.entity.StoreUserDTO; @@ -12,12 +18,25 @@ import com.kiisoo.ic.store.mapper.PoiStoreDOMapper; import com.kiisoo.ic.store.mapper.PoiStoreStaffDOMapper; import com.kiisoo.ic.store.mapper.PrivilageCpUserStoreDOMapper; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; -import java.util.*; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import static com.kiisoo.ic.store.constant.Constants.DATABASE_STORE_ID_KEY; +import static com.kiisoo.ic.employee.constant.Constants.ADD_CP_CODE_BINDED; +import static com.kiisoo.ic.store.constant.Constants.*; /** * @Description: 门店号管理service @@ -36,6 +55,10 @@ public class StoreEmployeeService { private PoiStoreStaffDOMapper poiStoreStaffDOMapper; + private PrivilageDepartmentDOMapper departmentDOMapper; + + private EmployeeService employeeService; + /** * 查询门店号 * @param storeId 门店id @@ -82,4 +105,131 @@ public class StoreEmployeeService { Page pageList = (Page)storeUserDTOS; } + + /** + * 导入excel门店号 + * @param file excel文件 + * @return + * @throws Exception + */ + public List importShopEmpByExcel(MultipartFile file) throws Exception { + List results = new ArrayList<>(); + if (file != null) { + if (!file.isEmpty()) { + //获取文件名 + String fileName = file.getOriginalFilename(); + InputStream fileInput = file.getInputStream(); + // 根据后缀创建EXCEL对象 + Workbook book; + if (ExcelUtils.isExcel2007(fileName)) { + book = new XSSFWorkbook(fileInput); + } else { + book = new HSSFWorkbook(fileInput); + } + + // 得到第一个sheet + Sheet sheet = book.getSheetAt(0); + // 得到Excel的行数 + int totalRows = sheet.getPhysicalNumberOfRows(); + + // 循环Excel行数,获取数据 + for (int r = 1; r < totalRows; r++) { + Row dataRow = sheet.getRow(r); + if (dataRow == null) { + continue; + } + addRowInfo(dataRow,results,r); + } + } + } + return results; + } + + /** + * Excel导入门店号-添加行信息 + * @param dataRow 行对象 + * @param results 错误信息集合 + * @param row 行数 + * @throws Exception + */ + private void addRowInfo(Row dataRow,List results,Integer row) throws Exception { + //初始化导购对象 + EmployeeDO employeeDO = new EmployeeDO(); + //获取店铺名和店铺code + String shopName = dataRow.getCell(0).getStringCellValue(); + if (StringUtils.isBlank(shopName)){ + getReason(row,"未填写店铺名",results); + return; + } + String shopCode = dataRow.getCell(1).getStringCellValue(); + if (StringUtils.isBlank(shopCode)){ + getReason(row,"未填写店铺Code",results); + return; + } + //查询店铺信息 + QueryWrapper storeParams = new QueryWrapper<>(); + storeParams.eq(DATABASE_NAME_KEY,shopName); + storeParams.eq(DATABASE_CODE_KEY,shopCode); + PoiStore poiStore = poiStoreDOMapper.selectOne(storeParams); + if (poiStore == null){ + getReason(row,"未找到店铺",results); + return; + } + employeeDO.setStoreId(poiStore.getId()); + //获取企业微信账号(user_id) + String cpUserId = dataRow.getCell(2).getStringCellValue(); + if (StringUtils.isBlank(cpUserId)){ + getReason(row,"未填写账号",results); + return; + } + employeeDO.setUserId(cpUserId); + + //获取企业微信别名 + String align = dataRow.getCell(3).getStringCellValue(); + employeeDO.setAlias(align); + + //获取部门信息 + String departmentName = dataRow.getCell(4).getStringCellValue(); + if (StringUtils.isBlank(departmentName)){ + getReason(row,"未填写部门",results); + return; + } + QueryWrapper depParams = new QueryWrapper(); + depParams.eq(DATABASE_NAME_KEY,departmentName); + DepartmentDO departmentDO = departmentDOMapper.selectOne(depParams); + if (departmentDO == null){ + getReason(row,"未找到部门",results); + return; + } + Long[] depIds = new Long[1]; + depIds[0] = departmentDO.getId(); + employeeDO.setDepartIds(depIds); + + String mobile = dataRow.getCell(5).getStringCellValue(); + if (StringUtils.isBlank(mobile)){ + getReason(row,"未填写手机号",results); + return; + } + employeeDO.setMobile(mobile); + + String returnCode = employeeService.addUser(employeeDO); + if (returnCode.contains(ADD_CP_CODE_BINDED)){ + String[] split = returnCode.split("&"); + getReason(row,"该账号已绑定【"+ split[1] +"】店铺",results); + } + } + + /** + * 添加错误原因 + * @param row 行数 + * @param reason 原因 + * @param results 错误集合 + */ + private void getReason(Integer row,String reason,List results){ + ImportErrorDTO importErrorDTO = new ImportErrorDTO(); + importErrorDTO.setRow(row); + reason = "第"+ row + "行导入失败,原因:"+reason; + importErrorDTO.setReason(reason); + results.add(importErrorDTO); + } }