From 4db714fa4c815ac3b03f71771dcbc54f62a38fa4 Mon Sep 17 00:00:00 2001 From: LHD_HY <2872546851@qq.com> Date: Fri, 30 May 2025 18:26:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E5=9C=BA=E4=BA=BA=E5=91=98=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/poi/ExcelUtil.java | 196 +++++++++++++++++- .../controller/BasePersonController.java | 9 + .../PersonComprehensiveController.java | 19 ++ .../person/dao/PersonComprehensiveDao.java | 2 + .../bmw/person/entity/BasePersonBean.java | 46 ++-- .../bmw/person/service/BasePersonService.java | 1 + .../person/service/BasePersonServiceImp.java | 93 +++++---- .../service/PersonComprehensiveService.java | 7 + .../PersonComprehensiveServiceImp.java | 152 ++++++++++++++ .../service/PersonSettingServiceImpl.java | 2 +- .../mapper/person/BasePersonMapper.xml | 6 +- .../person/PersonComprehensiveMapper.xml | 50 ++++- .../AttendanceMachine/personEntryList.html | 1 + .../AttendanceMachine/personEntryList.js | 44 +++- 14 files changed, 561 insertions(+), 67 deletions(-) diff --git a/common/common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java b/common/common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java index c50a45c..b2c0acd 100644 --- a/common/common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java +++ b/common/common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java @@ -35,6 +35,8 @@ import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; +import static cn.hutool.poi.excel.cell.CellUtil.getCellValue; + /** * Excel相关处理 * @@ -178,6 +180,11 @@ public class ExcelUtil return importExcel(StringUtils.EMPTY, is, titleNum); } + public List importExcelDoubleTitle(InputStream is, int titleNum) throws Exception + { + return importExcelDoubleTitle(StringUtils.EMPTY, is, titleNum); + } + /** * 对excel表单默认第一个索引名转换成list * @@ -364,6 +371,187 @@ public class ExcelUtil return list; } + public List importExcelDoubleTitle(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + while (rows > 0) { + Row currentRow = sheet.getRow(rows); + if (isRowEmpty(currentRow)) { + rows--; // 如果是空行则回退到上一行 + } else { + break; + } + } + + rows++; + + if (rows > 0) + { + int headerRows = 2; + Map cellMap = new LinkedHashMap<>(); + for (int col = 0; col < sheet.getRow(titleNum).getLastCellNum(); col++) { + StringBuilder headerBuilder = new StringBuilder(); + for (int row = 0; row < headerRows; row++) { + Row currentRow = sheet.getRow(titleNum + row); + if (currentRow != null) { + String cellValue = getCellValue(currentRow, col).toString().trim(); + if (!cellValue.isEmpty()) { + if (headerBuilder.length() > 0) { + headerBuilder.append("."); + } + headerBuilder.append(cellValue); + } + } + } + cellMap.put(headerBuilder.toString(), col); + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + headerRows; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + //是否必填 + boolean required = attr.required(); + //是否必须符合电话号码的规则 + String isRegex = attr.isRegex(); + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if(required) { + if(StringUtils.isNull(val) || StringUtils.isEmpty(val.toString().trim())) { + throw new IllegalArgumentException(attr.name()+" 单元格必填项未填写,请正确填写!"); + } + } + else if(StringUtils.isNotEmpty(isRegex)) { + if(StringUtils.isNull(val) || StringUtils.isEmpty(val.toString().trim())) { + throw new IllegalArgumentException(attr.name()+" 单元格必填项未填写,请正确填写!"); + }else{ + boolean b = changeDataType(isRegex, val.toString().trim()); + if(!b) { + throw new IllegalArgumentException(attr.name()+" 单元格必需填写正确的格式!"); + } + } + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + + } + return list; + } + + + + + /** * 对excel表单指定表格索引名转换成list--- @@ -689,8 +877,7 @@ public class ExcelUtil } /** - * 根据Excel注解创建表格头样式 - * + * 根据Excel注解创建表格头样式* * @param wb 工作薄对象 * @return 自定义样式列表 */ @@ -724,7 +911,6 @@ public class ExcelUtil /** * 根据Excel注解创建表格列样式 - * * @param wb 工作薄对象 * @return 自定义样式列表 */ @@ -920,7 +1106,7 @@ public class ExcelUtil /** * 设置 POI XSSFSheet 单元格提示或选择框 - * + * * @param sheet 表单 * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 @@ -1325,7 +1511,7 @@ public class ExcelUtil /** * 格式化不同类型的日期对象 - * + * * @param dateFormat 日期格式 * @param val 被格式化的日期对象 * @return 格式化后的日期字符 diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/controller/BasePersonController.java b/modules/bmw/src/main/java/com/bonus/bmw/person/controller/BasePersonController.java index 5d381f7..29e18ee 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/controller/BasePersonController.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/controller/BasePersonController.java @@ -1,5 +1,6 @@ package com.bonus.bmw.person.controller; +import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson2.JSON; import com.bonus.bmw.person.entity.BasePersonBean; import com.bonus.bmw.person.service.BasePersonService; @@ -9,11 +10,19 @@ import com.bonus.common.core.table.PageTableResponse; import com.bonus.common.log.annotation.Log; import com.bonus.common.log.enums.BusinessType; import com.bonus.common.security.annotation.RequiresPermissions; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.regex.Pattern; /** * 人员库 diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/controller/PersonComprehensiveController.java b/modules/bmw/src/main/java/com/bonus/bmw/person/controller/PersonComprehensiveController.java index 8e15978..5569d4f 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/controller/PersonComprehensiveController.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/controller/PersonComprehensiveController.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import com.bonus.bmw.basic.entity.ProjectBean; +import com.bonus.bmw.basic.entity.ProjectFileBean; import com.bonus.bmw.basic.service.UserService; import com.bonus.bmw.config.IpAndPathConfig; import com.bonus.bmw.person.entity.PersonComprehensiveBean; @@ -13,6 +14,7 @@ import com.bonus.bmw.person.utils.FaceResult; import com.bonus.common.core.domain.R; import com.bonus.common.core.table.PageTableRequest; import com.bonus.common.core.table.PageTableResponse; +import com.bonus.common.core.utils.poi.ExcelUtil; import com.bonus.common.log.annotation.Log; import com.bonus.common.log.enums.BusinessType; import com.bonus.common.security.annotation.RequiresPermissions; @@ -329,4 +331,21 @@ public class PersonComprehensiveController { } } + //导出 +// @GetMapping("/exportBtnOut") +// @Log(title = "出场人员-导出", businessType = BusinessType.EXPORT) +// public void exportBtnOut(HttpServletResponse response, PersonComprehensiveBean o) { +// try{ +// List list = service.exportBtnOut(o); +// ExcelUtil util = new ExcelUtil(PersonComprehensiveBean.class); +// util.exportExcel(response, list, "入场人员管理"); +// }catch (Exception e){ +// log.error(e.toString(),e); +// } +// } + @GetMapping("/exportBtnOut") + public void exportBtnOut(HttpServletResponse response, PageTableRequest request) { + service.exportBtnOut(response,request.getParams()); + } + } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/dao/PersonComprehensiveDao.java b/modules/bmw/src/main/java/com/bonus/bmw/person/dao/PersonComprehensiveDao.java index c8d5c16..4d4cfce 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/dao/PersonComprehensiveDao.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/dao/PersonComprehensiveDao.java @@ -104,6 +104,8 @@ public interface PersonComprehensiveDao { PersonComprehensiveBean selectTeamHistoryData(PersonComprehensiveBean o); + List getBasePersonLists(@Param("params")Map params); + /** * 根据工程查组织 * @param proId diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/entity/BasePersonBean.java b/modules/bmw/src/main/java/com/bonus/bmw/person/entity/BasePersonBean.java index e25f042..19ad174 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/entity/BasePersonBean.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/entity/BasePersonBean.java @@ -21,13 +21,13 @@ public class BasePersonBean { /** * 姓名 */ - @Excel(name = "姓名 * ",required = true) + @Excel(name = "身份证信息.*姓 名",required = true) private String name; /** * 身份证 */ - @Excel(name = "身份证号 * ", isRegex = RegexConstants.IDCARD) + @Excel(name = "*身份证号", isRegex = RegexConstants.IDCARD) private String idNumber; /** @@ -38,66 +38,67 @@ public class BasePersonBean { /** * 性别 */ - @Excel(name = "性别 * ",required = true) +// @Excel(name = "性别 * ",required = true) private String sex; /** * 民族 */ - @Excel(name = "民族 * ",required = true) + @Excel(name = "*民族",required = true) private String ethnic; /** * 出生日期 */ - @Excel(name = "出生日期 * ",required = true) +// @Excel(name = "出生日期 * ",required = true) private String birthday; /** * 家庭地址 */ - @Excel(name = "身份证住址 * ",required = true) + @Excel(name = "*身份证住址",required = true) private String address; /** * 办证机关 */ - @Excel(name = "签发机关 * ",required = true) + @Excel(name = "*签发机关",required = true) private String issueauthority; /** * 有效开始日期 */ - @Excel(name = "有效期限 * ",required = true) + @Excel(name = "*身份证生效日期",required = true) private String signDate; /** * 有效结束日期 */ + @Excel(name = "*身份证失效日期",required = true) private String expiryDate; /** * 联系方式 */ - @Excel(name = "手机号码 * ", isRegex = RegexConstants.PHONE ) + @Excel(name = "*手机号码", isRegex = RegexConstants.PHONE ) private String phone; /** * 文化程度 */ - @Excel(name = "文化程度") +// @Excel(name = "文化程度") private String cultrue; /** * 政治面貌 */ - @Excel(name = "政治面貌") +// @Excel(name = "政治面貌") private String politicalOutlook; /** * 家庭电话 */ - @Excel(name = "家庭电话") +// @Excel(name = "家庭电话") private String addressPhone; /** @@ -108,43 +109,43 @@ public class BasePersonBean { /** * 工种名称 */ - @Excel(name = "工人工种 * ",required = true) +// @Excel(name = "工人工种 * ",required = true) private String postName; /** * 人员类型 */ - @Excel(name = "人员类型") +// @Excel(name = "人员类型") private String personType; /** * 工人技能 */ - @Excel(name = "工人技能") +// @Excel(name = "工人技能") private String workerSkill; /** * 重要人员 */ - @Excel(name = "重要人员") +// @Excel(name = "重要人员") private String importantPerson; /** * 紧急联系人 */ - @Excel(name = "紧急联系人") + @Excel(name = "亲属.*紧急联系人") private String urgentPerson; /** * 紧急联系人电话 */ - @Excel(name = "紧急联系人电话") + @Excel(name = "*紧急联系人电话") private String urgentPersonPhone; /** * 银行名称 */ - @Excel(name = "银行名称") + @Excel(name = "银行卡.银行名称") private String bankName; /** @@ -153,6 +154,9 @@ public class BasePersonBean { @Excel(name = "银行卡号") private String bankCard; + @Excel(name = "银行卡号(选填)") + private String bankInter; + /** * 年龄 */ @@ -239,7 +243,7 @@ public class BasePersonBean { private Integer operate; private int isPlan; - + private String isTeamMan; private String exitVideoPath; private String exitSignPath; @@ -250,7 +254,7 @@ public class BasePersonBean { private List idNumberList; - @Excel(name = "务工类型 * ",required = true) +// @Excel(name = "务工类型 * ",required = true) private String employmentTypes;//关键信息 务工类型 } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonService.java b/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonService.java index d875653..0c92b8a 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonService.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonService.java @@ -7,6 +7,7 @@ import com.bonus.common.core.table.PageTableResponse; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.util.Map; /** * 人员库-业务层 diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonServiceImp.java b/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonServiceImp.java index 1dd0ea5..12e87de 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonServiceImp.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/service/BasePersonServiceImp.java @@ -1,5 +1,7 @@ package com.bonus.bmw.person.service; +import cn.hutool.core.io.IoUtil; +import cn.hutool.poi.excel.ExcelWriter; import com.bonus.bmw.person.dao.BasePersonDao; import com.bonus.bmw.person.dao.TDictDao; import com.bonus.bmw.person.entity.BasePersonBean; @@ -18,7 +20,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -91,10 +97,15 @@ public class BasePersonServiceImp implements BasePersonService{ public R insertBasePersonData(MultipartFile file) throws Exception{ int insertBasicCount = 0; ExcelUtil util = new ExcelUtil(BasePersonBean.class); - List list = util.importExcel(file.getInputStream(),2); + List list = util.importExcelDoubleTitle(file.getInputStream(),2); if(list.size() != 0){ list = listThread(list); insertBasicCount = dao.insertBasePersonBasicData(list); + boolean hasBankData = list.stream() + .anyMatch(p -> !StringUtils.isEmpty(p.getBankCard())); + if(insertBasicCount>0 && hasBankData){ + dao.insertBasePersonBankData(list); + } } return insertBasicCount > 0 ? R.ok(Constants.INSERT_SUCCESS) @@ -203,46 +214,58 @@ public class BasePersonServiceImp implements BasePersonService{ SimpleDateFormat originalFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", java.util.Locale.US); list.forEach(c->{ TrimUtil.trimBean(c); - if(StringUtils.isNotEmpty(c.getSignDate()) && c.getSignDate().contains("-")){ - String signDate = StringUtils.getThreeBarVal(c.getSignDate(),1); - String expiryDate = StringUtils.getThreeBarVal(c.getSignDate(),2); - c.setSignDate(signDate); - c.setExpiryDate(expiryDate); - } +// if(StringUtils.isNotEmpty(c.getSignDate()) && c.getSignDate().contains("/")){ +// String signDate = StringUtils.getThreeBarVal(c.getSignDate(),1); +// String expiryDate = StringUtils.getThreeBarVal(c.getSignDate(),2); +// c.setSignDate(signDate); +// c.setExpiryDate(expiryDate); +// } try { - Date date = originalFormat.parse(c.getBirthday()); + Map resultMap = StringUtils.getBirthdayAgeSex(c.getIdNumber()); + Date sDate = originalFormat.parse(c.getSignDate()); + Date eDate = originalFormat.parse(c.getExpiryDate()); // 转换为LocalDate - LocalDate localDate = date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); + LocalDate sLocalDate = sDate.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); + LocalDate eLocalDate = eDate.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); // 格式化输出为"yyyy-MM-dd" - String formattedDate = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - c.setBirthday(formattedDate); + String sFormattedDate = sLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String eFormattedDate = eLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + c.setSignDate(sFormattedDate); + c.setExpiryDate(eFormattedDate); + c.setBirthday(resultMap.get("birthday")); + if(Objects.equals(resultMap.get("sex"), "1")){ + c.setSex("男"); + } + else{ + c.setSex("女"); + } } catch (Exception e) { e.printStackTrace(); } - //岗位 - AtomicInteger x = new AtomicInteger(); - dictBeanList.forEach(i -> { - if(c.getPostName().equals(i.getValue())){ - c.setPostId(i.getId()); - x.getAndIncrement(); - } - }); - if(x.intValue()==0){ - throw new IllegalArgumentException(c.getPostName()+" 工种无法正确匹配,请正确填写!"); - } - String u = dao.getExistPerson(c.getIdNumber()); - String b = dao.getBlackPerson(c.getIdNumber()); - if (u != null || b != null) { - throw new IllegalArgumentException(c.getIdNumber() + "已存在或为黑名单"); - } - - if(c.getEmploymentTypes().equals("本地务工(兰坪)")){ - c.setEmploymentTypes("0"); - }else if(c.getEmploymentTypes().equals("外地务工")){ - c.setEmploymentTypes("1"); - }else{ - throw new IllegalArgumentException(c.getEmploymentTypes()+"务工类型无法正确匹配,请正确填写!"); - } +// //岗位 +// AtomicInteger x = new AtomicInteger(); +// dictBeanList.forEach(i -> { +// if(c.getPostName().equals(i.getValue())){ +// c.setPostId(i.getId()); +// x.getAndIncrement(); +// } +// }); +// if(x.intValue()==0){ +// throw new IllegalArgumentException(c.getPostName()+" 工种无法正确匹配,请正确填写!"); +// } +// String u = dao.getExistPerson(c.getIdNumber()); +// String b = dao.getBlackPerson(c.getIdNumber()); +// if (u != null || b != null) { +// throw new IllegalArgumentException(c.getIdNumber() + "已存在或为黑名单"); +// } +// +// if(c.getEmploymentTypes().equals("本地务工(兰坪)")){ +// c.setEmploymentTypes("0"); +// }else if(c.getEmploymentTypes().equals("外地务工")){ +// c.setEmploymentTypes("1"); +// }else{ +// throw new IllegalArgumentException(c.getEmploymentTypes()+"务工类型无法正确匹配,请正确填写!"); +// } }); return list; } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveService.java b/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveService.java index 479744f..bfe14e0 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveService.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveService.java @@ -1,11 +1,14 @@ package com.bonus.bmw.person.service; +import com.bonus.bmw.basic.entity.ProjectFileBean; import com.bonus.bmw.person.entity.PersonComprehensiveBean; import com.bonus.common.core.domain.R; import com.bonus.common.core.table.PageTableRequest; import com.bonus.common.core.table.PageTableResponse; +import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.Map; /** * 人员库-业务层 @@ -40,4 +43,8 @@ public interface PersonComprehensiveService { R> getHolidaysList(String nation); List getDownloads(PersonComprehensiveBean bean); + +// List exportBtnOut(PersonComprehensiveBean bean); + + void exportBtnOut(HttpServletResponse response, Map params); } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveServiceImp.java b/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveServiceImp.java index 97672f3..bc48754 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveServiceImp.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/service/PersonComprehensiveServiceImp.java @@ -1,8 +1,12 @@ package com.bonus.bmw.person.service; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.poi.excel.ExcelWriter; +import lombok.extern.slf4j.Slf4j; import com.bonus.bmw.attendanceMachine.dao.AttendanceMachineDao; import com.bonus.bmw.basic.dao.UserDao; +import com.bonus.bmw.basic.entity.ProjectFileBean; import com.bonus.bmw.person.dao.BasePersonDao; import com.bonus.bmw.person.dao.PersonComprehensiveDao; import com.bonus.bmw.person.dao.TDictDao; @@ -25,8 +29,14 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** * 人员库-业务层 @@ -594,4 +604,146 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService }); return list; } +// + @Override + public void exportBtnOut(HttpServletResponse response, Map params) { + + List list = getBasePersonLists(params); + //根据工程计算出合并单元格的数量 + Map collect = list.stream().collect(Collectors.groupingBy(PersonComprehensiveBean::getName, Collectors.counting())); + List integerList = new ArrayList<>(); + collect.forEach((k, v) -> integerList.add(v)); + + int rowNum = list.size(); + String fileName = " 出场人员 "; + //记录用于合并的rowIndex + ArrayList> mergeRows = new ArrayList<>(); + int startRowIndex = 3, start = 0; + start = startRowIndex; + int end = 0; + for (int i = 0; i < integerList.size(); i++) { + end = (int) (start + integerList.get(i)) - 1; + if (end != start) { + HashMap map = new HashMap<>(); + map.put("start", start); + map.put("end", end); + mergeRows.add(map); + } + start = end + 1; + } + // 导出标题 + ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(true); + if (list.size() > 0) { + writer.merge(9, fileName, false); + writer.writeCellValue(0, 1, "序号"); + writer.setColumnWidth(0, 6); + + writer.writeCellValue(1, 1, "姓名"); + writer.setColumnWidth(1, 20); + + writer.writeCellValue(2, 1, "身份证"); + writer.setColumnWidth(2, 20); + + writer.writeCellValue(3, 1, "联系方式"); + writer.setColumnWidth(3, 15); + + + writer.writeCellValue(4, 1, "工种"); + writer.setColumnWidth(4, 10); + + writer.writeCellValue(5, 1, "所属工程"); + writer.setColumnWidth(5, 15); + + writer.writeCellValue(6, 1, "人员类型"); + writer.setColumnWidth(6, 15); + + writer.writeCellValue(7, 1, "红绿灯状态"); + writer.setColumnWidth(7, 20); + + writer.writeCellValue(8, 1, "出入场状态"); + writer.setColumnWidth(8, 20); + + writer.writeCellValue(9, 1, "体检状态"); + writer.setColumnWidth(9, 20); + + // 设置表头高度、单元格宽度 + writer.setRowHeight(0, 25); + for (int i = 0; i < list.size(); i++) { + writer.writeCellValue(0, 2 + i, i + 1); + writer.writeCellValue(1, 2 + i, list.get(i).getName() == null ? "" : list.get(i).getName()); + writer.writeCellValue(2, 2 + i, list.get(i).getIdNumber() == null ? "" : list.get(i).getIdNumber()); + writer.writeCellValue(3, 2 + i, list.get(i).getPhone() == null ? "" : list.get(i).getPhone()); + writer.writeCellValue(4, 2 + i, list.get(i).getPostName() == null ? "" : list.get(i).getPostName()); + writer.writeCellValue(5, 2 + i, list.get(i).getProName() == null ? "" : list.get(i).getProName()); + writer.writeCellValue(6, 2 + i, list.get(i).getEmploymentType() == null ? "" : list.get(i).getEmploymentType()); + writer.writeCellValue(7, 2 + i, list.get(i).getLightStatus() == null ? "" : list.get(i).getLightStatus()); + writer.writeCellValue(8, 2 + i, list.get(i).getExitStatus() == null ? "" : list.get(i).getExitStatus()); + writer.writeCellValue(9, 2 + i, list.get(i).getCheckupState() == null ? "" : list.get(i).getCheckupState()); + } + + + }else{ + writer.merge(9, fileName, false); + writer.writeCellValue(0, 1, "序号"); + writer.setColumnWidth(0, 6); + + writer.writeCellValue(1, 1, "姓名"); + writer.setColumnWidth(1, 20); + + writer.writeCellValue(2, 1, "身份证"); + writer.setColumnWidth(2, 20); + + writer.writeCellValue(3, 1, "联系方式"); + writer.setColumnWidth(3, 15); + + + writer.writeCellValue(4, 1, "工种"); + writer.setColumnWidth(4, 10); + + writer.writeCellValue(5, 1, "所属工程"); + writer.setColumnWidth(5, 15); + + writer.writeCellValue(6, 1, "人员类型"); + writer.setColumnWidth(6, 15); + + writer.writeCellValue(7, 1, "红绿灯状态"); + writer.setColumnWidth(7, 20); + + writer.writeCellValue(8, 1, "出入场状态"); + writer.setColumnWidth(8, 20); + + writer.writeCellValue(9, 1, "体检状态"); + writer.setColumnWidth(9, 20); + + + + writer.merge(2, 2, 0, 9, "无数据", false); + } + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + try { + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + ServletOutputStream out = null; + try { + out = response.getOutputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + writer.flush(out, true); + writer.close(); + IoUtil.close(out); + } + + private List getBasePersonLists (Map < String, Object > params){ + List list = new ArrayList<>(); + try { + list = dao.getBasePersonLists(params); + } catch (Exception e) { + e.printStackTrace(); + } + return list; + } + } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/team/service/PersonSettingServiceImpl.java b/modules/bmw/src/main/java/com/bonus/bmw/team/service/PersonSettingServiceImpl.java index 25b293d..4b02768 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/team/service/PersonSettingServiceImpl.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/team/service/PersonSettingServiceImpl.java @@ -107,7 +107,7 @@ public class PersonSettingServiceImpl implements PersonSettingService { public R importData(MultipartFile file, String teamId, String subId) throws Exception { ExcelUtil util = new ExcelUtil<>(TeamPersonBean.class); //读取文件到list - List list = util.importExcel(file.getInputStream(),0); + List list = util.importExcelDoubleTitle(file.getInputStream(),0); // StringBuffer stringBuffer = new StringBuffer(); list.forEach(i -> { diff --git a/modules/bmw/src/main/resources/mapper/person/BasePersonMapper.xml b/modules/bmw/src/main/resources/mapper/person/BasePersonMapper.xml index 0ea68c0..7e98bec 100644 --- a/modules/bmw/src/main/resources/mapper/person/BasePersonMapper.xml +++ b/modules/bmw/src/main/resources/mapper/person/BasePersonMapper.xml @@ -24,10 +24,10 @@ replace into bm_worker_bank - (`id_number`, `bank_card`, `bank_name`) + (`id_number`, `bank_card`, `bank_name`,`bank_inter`) values - (#{params.idNumber},#{params.bankCard},#{params.bankName}) + (#{params.idNumber},#{params.bankCard},#{params.bankName},#{params.bankInter}) @@ -190,4 +190,4 @@ select COUNT(1) from bm_worker_bank where id_number = #{idNumber} and is_active = '1' - \ No newline at end of file + diff --git a/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml b/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml index 7a7404f..2fa1a7c 100644 --- a/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml +++ b/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml @@ -644,5 +644,53 @@ GROUP BY bw.id_number + + + + diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.html b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.html index b9dfaae..f5400b1 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.html +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.html @@ -80,6 +80,7 @@ href="../../../../downloads/农民工实名制导入模版.xlsx" download="农民工实名制导入模板.xlsx" style="margin-top:0.5%"> 农民工实名制模板下载 + diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.js b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.js index 825320f..0c3c247 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.js +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryList.js @@ -485,4 +485,46 @@ function checkViewEn(idNumber) { } }); -} \ No newline at end of file +} + +//导出excel表格 +function exportPersonnelOnSite() { + var name = $("#mame").val(); + var idNumber = $("#idNumber").val(); + var phone = $("#phone").val(); + var postName = $("#postName").val(); + var proName = $("#proName").val(); + var employmentType = $("#employmentType").val(); + var lightStatus = $("#lightStatus").val(); + var exitStatus = $("#exitStatus").val(); + var checkupState = $("#checkupState").val(); + + window.location.href = ctxPath + "/personComprehensive/exportBtnOut?token=" + token + + "&name=" + name + + "&idNumber=" + idNumber + + "&phone=" + phone + + "&postName=" + postName + + "&proName=" + proName + + "&employmentType=" + employmentType + + "&lightStatus=" + lightStatus + + "&exitStatus=" + exitStatus + + "&checkupState=" + checkupState; + var xhr = new XMLHttpRequest(); + xhr.open("get", url, true); + xhr.responseType = "blob"; // 转换流 + xhr.onload = function () { + layer.close(loadingMsg); + if (this.status === 200) { + var blob = this.response; + var a = document.createElement("a"); + var url = window.URL.createObjectURL(blob); + a.href = url; + a.download = "入场人员信息.xlsx"; // 文件名 + }else { + layer.msg('发生异常,请稍后重试', {icon: 16, scrollbar: false, time: 2000}); + } + a.click() + window.URL.revokeObjectURL(url) + }; + xhr.send(); +}