diff --git a/common/common-core/src/main/java/com/bonus/common/core/domain/ResultS.java b/common/common-core/src/main/java/com/bonus/common/core/domain/ResultS.java new file mode 100644 index 0000000..ae0091c --- /dev/null +++ b/common/common-core/src/main/java/com/bonus/common/core/domain/ResultS.java @@ -0,0 +1,98 @@ +package com.bonus.common.core.domain; + +/** + * packageName com.bonus.common.core.domain + * + * @author lsun + * @version 1.0.0 + * @className ResultS + * @date 2025/6/3 + * @description 统一返回结果封装类 + */ +public class ResultS { + private Integer code; // 状态码:200成功,其他失败 + private String msg; // 提示信息 + private Object data; // 数据 + + public ResultS() {} + + public ResultS(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public ResultS(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + // 成功静态方法 + public static ResultS ok() { + return new ResultS(200, "操作成功"); + } + + public static ResultS ok(String msg) { + return new ResultS(200, msg); + } + + public static ResultS ok(Object data) { + ResultS result = new ResultS(200, "操作成功"); + result.setData(data); + return result; + } + + // 失败静态方法 + public static ResultS error() { + return new ResultS(500, "操作失败"); + } + + public static ResultS error(String msg) { + return new ResultS(500, msg); + } + + public static ResultS error(Integer code, String msg) { + return new ResultS(code, msg); + } + + // 链式调用方法 + public ResultS data(Object data) { + this.data = data; + return this; + } + + public ResultS msg(String msg) { + this.msg = msg; + return this; + } + + public ResultS code(Integer code) { + this.code = code; + return this; + } + + // getter和setter + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/modules/bmw/pom.xml b/modules/bmw/pom.xml index 2aed08c..73aabdb 100644 --- a/modules/bmw/pom.xml +++ b/modules/bmw/pom.xml @@ -213,6 +213,12 @@ 4.12.0 + + com.belerweb + pinyin4j + 2.5.1 + + diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/controller/ContractController.java b/modules/bmw/src/main/java/com/bonus/bmw/person/controller/ContractController.java index 3f4ce69..5324f44 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/controller/ContractController.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/controller/ContractController.java @@ -135,7 +135,9 @@ public class ContractController { int count = service.addContractInfo(bean); if (count == 1){ ar = R.ok(); - }else { + }else if(count == -1){ + ar = R.fail("合同编号要根据工程名称去生成,请先选择工程名称"); + } else { ar = R.fail(Constants.INSERT_FAIL); } return ar; 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 47b0391..bfb69e2 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 @@ -12,6 +12,7 @@ import com.bonus.bmw.person.service.PersonComprehensiveService; import com.bonus.bmw.person.utils.ArcFaceHelper; import com.bonus.bmw.person.utils.FaceResult; import com.bonus.common.core.domain.R; +import com.bonus.common.core.domain.ResultS; import com.bonus.common.core.table.PageTableRequest; import com.bonus.common.core.table.PageTableResponse; import com.bonus.common.core.utils.poi.ExcelUtil; @@ -40,6 +41,8 @@ import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import com.alibaba.fastjson.JSON; + /** * 人员 综合 * @@ -349,11 +352,41 @@ public class PersonComprehensiveController { service.exportBtnOut(response,request.getParams()); } + @GetMapping("/exportWorkerRosterList") + @ResponseBody + @Log(title = "导出农民工花名册", businessType = BusinessType.EXPORT) + public void exportWorkerRosterList(String param, HttpServletResponse response) { + try { + PersonComprehensiveBean queryDTO = JSON.parseObject(param, PersonComprehensiveBean.class); -// @Log(title = "农民工花名册-根据工程id获取", businessType = BusinessType.SELECT) -// @GetMapping("/getWorkerRosterProList") -// public R getWorkerRosterProList(@PathVariable String proId) { -// return service.getWorkerRosterProList(proId); -// } + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode("农民工花名册.xlsx", "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName); + service.exportWorkerRosterList(queryDTO, response.getOutputStream()); + } catch (Exception e) { + log.error("导出农民工花名册-工程失败", e); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/exportWorkerRoster") + @ResponseBody + @Log(title = "导出农民工花名册-工程", businessType = BusinessType.EXPORT) + public void exportWorkerRoster(String param, HttpServletResponse response) { + try { + PersonComprehensiveBean queryDTO = JSON.parseObject(param, PersonComprehensiveBean.class); + + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode("农民工花名册-工程.xlsx", "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName); + + service.exportWorkerRoster(queryDTO, response.getOutputStream()); + } catch (Exception e) { + log.error("导出农民工花名册-工程失败", e); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } } 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 1cababe..07d6d95 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 @@ -164,4 +164,12 @@ public interface PersonComprehensiveDao { List getWorkerRosterList(@Param("params") Map params, @Param("offset") Integer offset, @Param("limit") Integer limit); List getWorkerRosterProList(@Param("params") Map params, @Param("offset") Integer offset, @Param("limit") Integer limit); + + List exportWorkerRoster(@Param("params") PersonComprehensiveBean bean); + + List exportWorkerRosterList(@Param("params")PersonComprehensiveBean queryDTO); + + String getProNme(String proId); + + int getContractNum(); } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/entity/ContractBean.java b/modules/bmw/src/main/java/com/bonus/bmw/person/entity/ContractBean.java index c3f013e..22a2ab0 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/entity/ContractBean.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/entity/ContractBean.java @@ -39,6 +39,7 @@ public class ContractBean { private String endowmentInsurance; private String isActive; private String stauts; + private String proId;// private String proName;// private String teamName;// private String subName;// diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/entity/PersonComprehensiveBean.java b/modules/bmw/src/main/java/com/bonus/bmw/person/entity/PersonComprehensiveBean.java index ff7d4b0..84642e9 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/entity/PersonComprehensiveBean.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/entity/PersonComprehensiveBean.java @@ -449,4 +449,17 @@ public class PersonComprehensiveBean { * 备注 */ private String remark; + + /** + * 入场时间 + */ + private String einStartDate; + private String einEndDate; + /** + * 出场时间 + */ + private String exitStartDate; + private String exitEndDate; + + private String isActive; } diff --git a/modules/bmw/src/main/java/com/bonus/bmw/person/service/ContractServiceImpl.java b/modules/bmw/src/main/java/com/bonus/bmw/person/service/ContractServiceImpl.java index 8b1a857..3ff421c 100644 --- a/modules/bmw/src/main/java/com/bonus/bmw/person/service/ContractServiceImpl.java +++ b/modules/bmw/src/main/java/com/bonus/bmw/person/service/ContractServiceImpl.java @@ -1,6 +1,8 @@ package com.bonus.bmw.person.service; +import cn.hutool.core.date.DateUtil; import com.bonus.bmw.person.dao.ContractDao; +import com.bonus.bmw.person.dao.PersonComprehensiveDao; import com.bonus.bmw.person.dao.RedListDao; import com.bonus.bmw.person.entity.ContractBean; import com.bonus.bmw.person.entity.RedLightHisBean; @@ -9,8 +11,10 @@ import com.bonus.bmw.team.service.IntegratedQueryService; import com.bonus.common.core.utils.DateUtils; import com.bonus.common.core.utils.StringUtils; import com.bonus.common.core.utils.bean.ContractExportBean; +import net.sourceforge.pinyin4j.PinyinHelper; import org.springframework.stereotype.Service; + import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -27,6 +31,9 @@ public class ContractServiceImpl implements ContractService { @Resource(name = "integratedQueryService") private IntegratedQueryService integratedQueryService; + @Resource(name = "PersonComprehensiveDao") + private PersonComprehensiveDao personComprehensiveDao; + //添加合同照片 public int addContractPhoto(List list) { @@ -44,7 +51,20 @@ public class ContractServiceImpl implements ContractService { i = delContract(bean); } if(i>0){ - i = dao.addContractInfo(bean); + String proId = bean.getProId(); + if(!StringUtils.isEmpty(proId)){ + String proName = personComprehensiveDao.getProNme(proId); + String abbreviation = getInitialsUpperCaseWithPinyin(proName); + int contractNum =personComprehensiveDao.getContractNum(); + String dateStr = DateUtil.format(DateUtil.date(), "yyyyMMdd"); // 使用 Hutool 的 DateUtil + String contractCode = abbreviation + dateStr + contractNum; + bean.setContractCode(contractCode); + i = dao.addContractInfo(bean); + }else{ + i = -1; + return i; + } + } //将合同id存入 出入场表 //1.0先查 最新出入场记录 @@ -186,4 +206,27 @@ public class ContractServiceImpl implements ContractService { public List downloadFullContractFile(String proId) { return dao.downloadFullContractFile(proId); } + + public static String getInitialsUpperCaseWithPinyin(String str) { + if (str == null || str.isEmpty()) { + return ""; + } + + StringBuilder initials = new StringBuilder(); + char[] chars = str.trim().toCharArray(); + + for (char c : chars) { + // 如果是中文,尝试获取拼音首字母 + try { + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c); + if (pinyinArray != null && pinyinArray.length > 0) { + String firstLetter = pinyinArray[0].charAt(0) + ""; + initials.append(firstLetter.toUpperCase()); + } + } catch (Exception e) { + // 忽略异常字符 + } + } + return initials.toString(); + } } 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 ddfb3db..ca12a4a 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 @@ -6,6 +6,9 @@ import com.bonus.common.core.domain.R; import com.bonus.common.core.table.PageTableRequest; import com.bonus.common.core.table.PageTableResponse; +import javax.servlet.ServletOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -58,6 +61,10 @@ public interface PersonComprehensiveService { */ PageTableResponse getWorkerRosterProList(PageTableRequest request); + void exportWorkerRoster(PersonComprehensiveBean queryDTO, ServletOutputStream outputStream) throws IOException; + + void exportWorkerRosterList(PersonComprehensiveBean queryDTO, ServletOutputStream outputStream) throws IOException; + // 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 754a48b..4295bee 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 @@ -24,6 +24,11 @@ import com.bonus.common.core.table.PageTableResponse; import com.bonus.common.core.utils.StringUtils; import com.bonus.common.core.utils.TrimUtil; import com.bonus.common.security.utils.SecurityUtils; +import net.sourceforge.pinyin4j.PinyinHelper; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,15 +40,15 @@ 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; /** * 人员库-业务层 + * * @author zys */ @Service("PersonComprehensiveService") -public class PersonComprehensiveServiceImp implements PersonComprehensiveService{ +public class PersonComprehensiveServiceImp implements PersonComprehensiveService { @Resource(name = "PersonComprehensiveDao") private PersonComprehensiveDao dao; @@ -68,10 +73,10 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService Map params = request.getParams(); String roleLevel = SecurityUtils.getLoginUser().getSysUser().getRoleLevel(); String subId = SecurityUtils.getLoginUser().getSysUser().getSubId(); - if("4".equals(roleLevel)) { + if ("4".equals(roleLevel)) { String subId1 = (String) params.get("subId"); - if(StringUtils.isEmpty(subId1)){ - params.put("subId",subId); + if (StringUtils.isEmpty(subId1)) { + params.put("subId", subId); } } @@ -81,7 +86,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService PersonComprehensiveBean faceContrastNewBean = list.get(i); if (faceContrastNewBean.getIsFacePhoto() != null && faceContrastNewBean.getIsFacePhoto().contains(params.get("isFacePhoto").toString())) { - }else{ + } else { list.remove(i); i--; } @@ -93,7 +98,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService PersonComprehensiveBean faceContrastNewBean = list.get(i); if (faceContrastNewBean.getIsPayCard() != null && faceContrastNewBean.getIsPayCard().contains(params.get("isPayCard").toString())) { - }else{ + } else { list.remove(i); i--; } @@ -105,7 +110,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService PersonComprehensiveBean faceContrastNewBean = list.get(i); if (faceContrastNewBean.getIsContract() != null && faceContrastNewBean.getIsContract().contains(params.get("isContract").toString())) { - }else{ + } else { list.remove(i); i--; } @@ -123,9 +128,9 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService List beanList; Integer offset = request.getOffset(); Integer limit = request.getLimit(); - if((offset+limit) < list.size()){ + if ((offset + limit) < list.size()) { beanList = list.subList(offset, offset + limit); - }else{ + } else { beanList = list.subList(offset, list.size()); } return beanList; @@ -150,45 +155,54 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService throw new IllegalArgumentException(o.getIdNumber() + "已存在或为黑名单,无法新增"); } List list = new ArrayList<>(); - if(StringUtils.isNotEmpty(o.getSocialSecurityNumber()) && - StringUtils.isNotEmpty(o.getSocialSecurityUnit())){ + if (StringUtils.isNotEmpty(o.getSocialSecurityNumber()) && + StringUtils.isNotEmpty(o.getSocialSecurityUnit())) { o.setIsOwnPerson("1"); - }else{ + } else { o.setIsOwnPerson("0"); } o.setRoleId("36"); getLight(o); list.add(o); //第一页数据添加 人员基础数据 - int i= dao.insertBasePersonBasicData(list); - if(StringUtils.isNotEmpty(o.getIsPass())){ + int i = dao.insertBasePersonBasicData(list); + if (StringUtils.isNotEmpty(o.getIsPass())) { dao.insertTrainResultData(o); } //第二页数据添加 加入班组 - if(i>0 && StringUtils.isNotEmpty(o.getTeamId())){ + if (i > 0 && StringUtils.isNotEmpty(o.getTeamId())) { dao.insertPersonToTeam(o); } //第三页数据添加 上传工资卡 - if(i>0 && StringUtils.isNotEmpty(o.getWageBankCard())){ + if (i > 0 && StringUtils.isNotEmpty(o.getWageBankCard())) { dao.insertBasePersonBankData(o); } //第四页数据添加 上传合同 - if(i>0 && StringUtils.isNotEmpty(o.getContractCode())){ + if (i > 0 && StringUtils.isNotEmpty(o.getContractCode())) { + String proId = o.getProId(); + if(!StringUtils.isEmpty(proId)){ + String proName = dao.getProNme(proId); + String abbreviation = getInitialsUpperCaseWithPinyin(proName); + int contractNum =dao.getContractNum(); + String dateStr = DateUtil.format(DateUtil.date(), "yyyyMMdd"); // 使用 Hutool 的 DateUtil + String contractCode = abbreviation + dateStr + contractNum; + o.setContractCode(contractCode); + } dao.insertPersonContractData(o); } - if(o.getLightStatus().equals("0")){ + if (o.getLightStatus().equals("0")) { dao.insertRedPersonData(o); } - if(StringUtils.isNotEmpty(o.getProId())){ - if(StringUtils.isEmpty(o.getSubId())){ + if (StringUtils.isNotEmpty(o.getProId())) { + if (StringUtils.isEmpty(o.getSubId())) { o.setSubId("0"); } - if(StringUtils.isEmpty(o.getTeamId())){ + if (StringUtils.isEmpty(o.getTeamId())) { o.setTeamId("0"); - }else{ + } else { dao.insertTeamData(o); } - if(StringUtils.isEmpty(o.getPostId())){ + if (StringUtils.isEmpty(o.getPostId())) { o.setPostId("0"); } o.setEinTime(DateUtil.now()); @@ -196,21 +210,21 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService PersonComprehensiveBean po = dao.getPrevEinHistoryProId(o); dao.insertPersonEinData(o); dao.insertExamPersonEinData(o); - if(po != null && po.getId() != null){ + if (po != null && po.getId() != null) { //上一次入场时存入了考试日常数据 - if(po.getProId() != null && !po.getProId().equals(o.getProId())){ + if (po.getProId() != null && !po.getProId().equals(o.getProId())) { //工程不一致 //将考试数据全部无效 dao.updateExamPersonData(po.getId()); dao.updatePrevExamEinData(po.getId()); - }else{ + } else { dao.updatePrevExamEinData(po.getId()); //将考试数据关联到此次入场信息上 List completeList = dao.getExamResIds(po.getId()); for (MapBean mapBean : completeList) { mapBean.setName(o.getId()); } - if(completeList.size() > 0){ + if (completeList.size() > 0) { //获取上次 po.setId(o.getId()); dao.updateExamEinData(po); @@ -223,39 +237,39 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService String orgId = dao.selectOrgIdByPro(o.getProId()); o.setOrgId(orgId); //第五页数据添加 建用户 - if( i > 0 ){ + if (i > 0) { //先查询这个手机号是否存在用户 int x = dao.getSysUserByPhone(o.getPhone()); String passWord = passwordEncoder.encode("Lphd@123456"); o.setPassword(passWord); - if(x < 1){ + if (x < 1) { //不存在新建 dao.addSysUser(o); - saveUserRoles(o.getUserId()+"",o.getRoleId()+""); - }else{ + saveUserRoles(o.getUserId() + "", o.getRoleId() + ""); + } else { dao.updateSysUser(o); } } - if(StringUtils.isNotEmpty(o.getFacePhoto())){ - if(StringUtils.isNotEmpty(o.getFaceFeature())){ + if (StringUtils.isNotEmpty(o.getFacePhoto())) { + if (StringUtils.isNotEmpty(o.getFaceFeature())) { o.setFaceFeatureByte(Base64.getDecoder().decode(o.getFaceFeature())); } dao.insertPersonFacePhoto(o); } - if(StringUtils.isNotEmpty(o.getCheckupFilePath())){ + if (StringUtils.isNotEmpty(o.getCheckupFilePath())) { dao.insertCheckupFilePath(o); } - if(o.getStatus().equals("0")){ - if(StringUtils.isNotEmpty(o.getAttendanceMachineArr()) && - o.getAttendanceMachineArr().size() > 0){ + if (o.getStatus().equals("0")) { + if (StringUtils.isNotEmpty(o.getAttendanceMachineArr()) && + o.getAttendanceMachineArr().size() > 0) { o.setOperate(1); - o.getAttendanceMachineArr().forEach(c->{ + o.getAttendanceMachineArr().forEach(c -> { o.setAttendanceMachineId(c); attendanceMachineDao.insertAttendanceMachinePush(o); }); } - }else{ + } else { List suspendPersonList = new ArrayList<>(); suspendPersonList.add(new SuspendPersonListBean(o.getIdNumber(), o.getProId())); suspendPersonDao.addSuspendPerson(suspendPersonList); @@ -263,12 +277,12 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService return i > 0 ? R.ok(Constants.INSERT_SUCCESS) : R.fail(Constants.INSERT_FAIL); } - private void getTeamIsExistForeman(PersonComprehensiveBean o){ - if(StringUtils.isNotEmpty(o.getIsForeman()) && StringUtils.isNotEmpty(o.getTeamId())){ - if(o.getIsForeman().equals("1")){ + private void getTeamIsExistForeman(PersonComprehensiveBean o) { + if (StringUtils.isNotEmpty(o.getIsForeman()) && StringUtils.isNotEmpty(o.getTeamId())) { + if (o.getIsForeman().equals("1")) { String idNumber = dao.selectTeamIsExistForeman(o.getTeamId()); - if(StringUtils.isNotEmpty(idNumber)){ - if(!idNumber.equals(o.getIdNumber())){ + if (StringUtils.isNotEmpty(idNumber)) { + if (!idNumber.equals(o.getIdNumber())) { throw new IllegalArgumentException("此班组已存在班组长!"); } } @@ -278,20 +292,20 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService private void getLight(PersonComprehensiveBean o) { String light = "0"; - if(StringUtils.isNotEmpty(o.getCompanyExamScore()) && + if (StringUtils.isNotEmpty(o.getCompanyExamScore()) && StringUtils.isNotEmpty(o.getDeptExamScore()) && - StringUtils.isNotEmpty(o.getTeamExamScore())){ - if(Integer.parseInt(o.getCompanyExamScore()) >= 80 && + StringUtils.isNotEmpty(o.getTeamExamScore())) { + if (Integer.parseInt(o.getCompanyExamScore()) >= 80 && Integer.parseInt(o.getDeptExamScore()) >= 80 && - Integer.parseInt(o.getTeamExamScore()) >= 80){ + Integer.parseInt(o.getTeamExamScore()) >= 80) { light = "1"; o.setIsPass("1"); - if(StringUtils.isNotEmpty(o.getTeamId()) && + if (StringUtils.isNotEmpty(o.getTeamId()) && StringUtils.isNotEmpty(o.getWageBankCard()) && - StringUtils.isNotEmpty(o.getContractCode())){ + StringUtils.isNotEmpty(o.getContractCode())) { light = "2"; } - }else{ + } else { o.setIsPass("0"); } } @@ -302,7 +316,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService if (roleId != null) { userDao.deleteUserRole(userId); // 新增用户与角色管理 - userDao.saveUserRoles(userId,roleId); + userDao.saveUserRoles(userId, roleId); } } @@ -310,16 +324,16 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService @Override public R getPersonById(String idNumber) { PersonComprehensiveBean bean = dao.getPersonById(idNumber); - if(bean != null){ - if (bean.getFaceFeatureByte() != null){ + if (bean != null) { + if (bean.getFaceFeatureByte() != null) { String feature = Base64.getEncoder().encodeToString(bean.getFaceFeatureByte()); bean.setFaceFeature(feature); bean.setFaceFeatureByte(null); } //如果出入场的合同id不对应,可能查不到合同,这边重查一下 - if(StringUtils.isEmpty(bean.getContractId())){ + if (StringUtils.isEmpty(bean.getContractId())) { PersonComprehensiveBean contractBean = dao.getContractByIdNumber(idNumber); - if(contractBean != null) { + if (contractBean != null) { if (StringUtils.isNotEmpty(contractBean.getContractId())) { bean.setContractId(contractBean.getContractId()); bean.setContractCode(contractBean.getContractCode()); @@ -338,21 +352,21 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService } } } - if(StringUtils.isNotEmpty(bean.getTeamId())){ + if (StringUtils.isNotEmpty(bean.getTeamId())) { bean.setIsHaveTeam(1); } - if(StringUtils.isNotEmpty(bean.getWageCardPath())){ + if (StringUtils.isNotEmpty(bean.getWageCardPath())) { bean.setIsHaveWage(1); } - if(StringUtils.isNotEmpty(bean.getContractId())){ + if (StringUtils.isNotEmpty(bean.getContractId())) { bean.setIsHaveContract(1); } Long userId = bean.getUserId(); - if(userId != null){ + if (userId != null) { bean.setIsHaveUser(1); } } - return bean != null ? R.ok(bean):R.fail(Constants.NO_DATA); + return bean != null ? R.ok(bean) : R.fail(Constants.NO_DATA); } @Override @@ -364,29 +378,29 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService o.setOrgId(orgId); String passWord = passwordEncoder.encode("Lphd@123456"); o.setPassword(passWord); - if(!o.getPhone().trim().equals(o.getOldPhone())){ + if (!o.getPhone().trim().equals(o.getOldPhone())) { int x = dao.getSysUserByPhone(o.getPhone()); - if(x > 0){ + if (x > 0) { throw new IllegalArgumentException(o.getPhone() + "已存在"); - }else{ + } else { int y = dao.getSysUserByPhone(o.getOldPhone()); - if(y > 0){ + if (y > 0) { dao.updateSysUserPhone(o); - }else{ + } else { dao.addSysUser(o); - saveUserRoles(o.getUserId()+"",o.getRoleId()+""); + saveUserRoles(o.getUserId() + "", o.getRoleId() + ""); } } - }else{ + } else { int y = dao.getSysUserByPhone(o.getOldPhone()); - if(y > 0){ + if (y > 0) { dao.updateSysUserPhone(o); - }else{ + } else { dao.addSysUser(o); - saveUserRoles(o.getUserId()+"",o.getRoleId()+""); + saveUserRoles(o.getUserId() + "", o.getRoleId() + ""); } } - if(!o.getIdNumber().trim().equals(o.getId())){ + if (!o.getIdNumber().trim().equals(o.getId())) { String u = dao.getExistPerson(o.getIdNumber().trim()); String b = dao.getBlackPerson(o.getIdNumber().trim()); if (u != null) { @@ -401,76 +415,76 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService basePersonDao.updateIdNumberRelevanceData(basePersonBean); } int i = 0; - if(StringUtils.isNotEmpty(o.getSocialSecurityNumber()) && - StringUtils.isNotEmpty(o.getSocialSecurityUnit())){ + if (StringUtils.isNotEmpty(o.getSocialSecurityNumber()) && + StringUtils.isNotEmpty(o.getSocialSecurityUnit())) { o.setIsOwnPerson("1"); - }else{ + } else { o.setIsOwnPerson("0"); } getLight(o); List beanList = new ArrayList<>(); i = dao.updatePerson(o); dao.updateEvaluationWorkerData(o); - if(StringUtils.isNotEmpty(o.getIsPass())){ + if (StringUtils.isNotEmpty(o.getIsPass())) { dao.insertTrainResultData(o); } //其他关联数据 - if (i>0){ - if(!o.getLightStatus().equals("0")){ + if (i > 0) { + if (!o.getLightStatus().equals("0")) { String id = dao.selectRedPersonData(o.getIdNumber(), o.getProId()); - if(StringUtils.isNotEmpty(id)){ + if (StringUtils.isNotEmpty(id)) { dao.updateRedPersonData(id); } - }else{ + } else { dao.insertRedPersonData(o); } //第二页数据添加 加入班组 - if(StringUtils.isNotEmpty(o.getTeamId())){ + if (StringUtils.isNotEmpty(o.getTeamId())) { dao.insertPersonToTeam(o); } //第三页数据添加 上传工资卡 int j = dao.getWorkerBank(o.getIdNumber()); - if(StringUtils.isNotEmpty(o.getWageBankCard())){ - if(j > 0){ + if (StringUtils.isNotEmpty(o.getWageBankCard())) { + if (j > 0) { dao.updatePersonBankData(o); - }else{ + } else { beanList.add(o); dao.insertBasePersonBankData(o); } } //第四页数据添加 上传合同 //合同签完不能改 - if(o.getIsHaveWage() == 0 && StringUtils.isNotEmpty(o.getContractCode())){ + if (o.getIsHaveWage() == 0 && StringUtils.isNotEmpty(o.getContractCode())) { dao.replacePersonContractData(o); } - if(StringUtils.isNotEmpty(o.getProId())){ - if(StringUtils.isEmpty(o.getSubId())){ + if (StringUtils.isNotEmpty(o.getProId())) { + if (StringUtils.isEmpty(o.getSubId())) { o.setSubId("0"); } - if(StringUtils.isEmpty(o.getTeamId())){ + if (StringUtils.isEmpty(o.getTeamId())) { o.setTeamId("0"); - }else{ + } else { PersonComprehensiveBean bean = dao.selectTeamHistoryData(o); - if(bean == null){ + if (bean == null) { dao.insertTeamData(o); } } - if(StringUtils.isEmpty(o.getPostId())){ + if (StringUtils.isEmpty(o.getPostId())) { o.setPostId("0"); } o.setEinTime(DateUtil.now()); - if(o.getEinStatus().equals("0") && o.getIsFurloughPerson().equals("0")) { + if (o.getEinStatus().equals("0") && o.getIsFurloughPerson().equals("0")) { //查一下上一次出场是不是同一个工程 PersonComprehensiveBean po = dao.getPrevEinHistoryProId(o); dao.insertPersonEinData(o); - if(po != null && po.getId() != null){ + if (po != null && po.getId() != null) { //上一次入场时存入了考试日常数据 - if(po.getProId() != null && !po.getProId().equals(o.getProId())){ + if (po.getProId() != null && !po.getProId().equals(o.getProId())) { //工程不一致 //将考试数据全部无效 dao.updateExamPersonData(po.getId()); dao.updatePrevExamEinData(o.getIdNumber()); dao.insertExamPersonEinData(o); - }else{ + } else { dao.updatePrevExamEinData(o.getIdNumber()); dao.insertExamPersonEinData(o); //将考试数据关联到此次入场信息上 @@ -478,30 +492,30 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService for (MapBean mapBean : completeList) { mapBean.setName(o.getId()); } - if(completeList.size() > 0){ + if (completeList.size() > 0) { //获取上次 po.setId(o.getId()); dao.updateExamEinData(po); dao.updateExamPersonBind(completeList); } } - }else{ + } else { // dao.updateExamPersonData(po.getId()); dao.updatePrevExamEinData(o.getIdNumber()); dao.insertExamPersonEinData(o); } - }else{ + } else { dao.updatePersonEinData(o); } } } //判断用户是否删除了已有的文件(社保文件) - if(o.getFilePathArrProve() != null && !"".equals(o.getFilePathArrProve())){ + if (o.getFilePathArrProve() != null && !"".equals(o.getFilePathArrProve())) { //删除了 dao.updateSocialSecurityPath(o); } //判断用户是否删除了已有的文件(工资卡文件) - if(o.getFilePathArrWageCard() != null && !"".equals(o.getFilePathArrWageCard())){ + if (o.getFilePathArrWageCard() != null && !"".equals(o.getFilePathArrWageCard())) { //删除了 String[] filePathArr = o.getFilePathArrWageCard().split(","); for (int j = 0; j < filePathArr.length; j++) { @@ -509,27 +523,27 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService } } - if(StringUtils.isNotEmpty(o.getFacePhoto())){ - if(StringUtils.isNotEmpty(o.getFaceFeature())){ + if (StringUtils.isNotEmpty(o.getFacePhoto())) { + if (StringUtils.isNotEmpty(o.getFaceFeature())) { o.setFaceFeatureByte(Base64.getDecoder().decode(o.getFaceFeature())); } dao.insertPersonFacePhoto(o); } - if(StringUtils.isNotEmpty(o.getCheckupFilePath())){ + if (StringUtils.isNotEmpty(o.getCheckupFilePath())) { //先删除之前体检报告 int jk = dao.deleteCheckupFilePath(o); - //在添加新的体检报告 + // dao.insertCheckupFilePath(o); - }else{ + } else { //直接删除体检报告 dao.deleteCheckupFile(o); } - if(StringUtils.isNotEmpty(o.getAttendanceMachineArr()) && - o.getAttendanceMachineArr().size() > 0){ + if (StringUtils.isNotEmpty(o.getAttendanceMachineArr()) && + o.getAttendanceMachineArr().size() > 0) { o.setOperate(1); - o.getAttendanceMachineArr().forEach(c->{ + o.getAttendanceMachineArr().forEach(c -> { o.setAttendanceMachineId(c); attendanceMachineDao.insertAttendanceMachinePush(o); }); @@ -545,24 +559,24 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService @Override public void insertSocialSecurityFile(PersonComprehensiveBean bean) { - dao.insertSocialSecurityFile(bean); + dao.insertSocialSecurityFile(bean); } @Override public void insertWageFile(PersonComprehensiveBean bean) { - dao.insertWageFile(bean); + dao.insertWageFile(bean); } @Override public void insertContractFile(PersonComprehensiveBean bean) { - dao.insertContractFile(bean); + dao.insertContractFile(bean); } @Override public R> getHolidaysList(String nation) { List list = Optional.ofNullable(dao.getHolidaysList(nation)). orElseGet(ArrayList::new); - if(list.isEmpty()){ + if (list.isEmpty()) { return R.ok(new ArrayList<>()); } return R.ok(list); @@ -575,6 +589,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService /** * 获取农民工花名册(用工管理台账)-查询list + * * @param request * @return */ @@ -584,10 +599,10 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService Map params = request.getParams(); String roleLevel = SecurityUtils.getLoginUser().getSysUser().getRoleLevel(); String subId = SecurityUtils.getLoginUser().getSysUser().getSubId(); - if("4".equals(roleLevel)) { + if ("4".equals(roleLevel)) { String subId1 = (String) params.get("subId"); - if(StringUtils.isEmpty(subId1)){ - params.put("subId",subId); + if (StringUtils.isEmpty(subId1)) { + params.put("subId", subId); } } @@ -604,9 +619,9 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService List beanList; Integer offset = request.getOffset(); Integer limit = request.getLimit(); - if((offset+limit) < list.size()){ + if ((offset + limit) < list.size()) { beanList = list.subList(offset, offset + limit); - }else{ + } else { beanList = list.subList(offset, list.size()); } return beanList; @@ -617,7 +632,13 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService @Override public PageTableResponse getWorkerRosterProList(PageTableRequest request) { Map params = request.getParams(); - List list = dao.getWorkerRosterProList(params, request.getOffset(), request.getLimit()); +// List list = dao.getWorkerRosterProList(params, request.getOffset(), request.getLimit()); + List list = Optional.ofNullable(dao.getWorkerRosterProList(params, request.getOffset(), request.getLimit())) + .orElseGet(ArrayList::new); + + // 过滤掉所有的 null 元素 + list.removeIf(Objects::isNull); + return new PageTableHandler(new PageTableHandler.CountHandler() { @Override public int count(PageTableRequest request) { @@ -629,9 +650,9 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService List beanList; Integer offset = request.getOffset(); Integer limit = request.getLimit(); - if((offset+limit) < list.size()){ + if ((offset + limit) < list.size()) { beanList = list.subList(offset, offset + limit); - }else{ + } else { beanList = list.subList(offset, list.size()); } return beanList; @@ -639,38 +660,274 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService }).handle(request); } - private List listThread(List list) { - Map map = new HashMap<>(); - map.put("type","postType"); - List dictBeanList = tDictDao.list(map, 0, 1000); - 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); + @Override + public void exportWorkerRoster(PersonComprehensiveBean queryDTO, ServletOutputStream outputStream) throws IOException { + // 查询数据 + List dataList = dao.exportWorkerRoster(queryDTO); + // 过滤掉所有的 null 元素 + dataList.removeIf(Objects::isNull); + + // 创建Excel工作簿 + try (XSSFWorkbook workbook = new XSSFWorkbook()) { + XSSFSheet sheet = workbook.createSheet("农民工花名册"); + + // 创建表头样式 + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 设置表头字体 + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + + // 创建数据单元格样式 + CellStyle dataStyle = workbook.createCellStyle(); + dataStyle.setAlignment(HorizontalAlignment.CENTER); + dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); + dataStyle.setBorderTop(BorderStyle.THIN); + dataStyle.setBorderRight(BorderStyle.THIN); + dataStyle.setBorderBottom(BorderStyle.THIN); + dataStyle.setBorderLeft(BorderStyle.THIN); + + // 创建第一行表头 + Row headerRow1 = sheet.createRow(0); + // 第一列 + createMergedHeader(headerRow1, 0, "序号", 1, headerStyle); + createMergedHeader(headerRow1, 1, "合同编号", 1, headerStyle); + // 身份证信息(8列) + createMergedHeader(headerRow1, 2, "身份证信息", 8, headerStyle); + // 银行卡信息(3列) + createMergedHeader(headerRow1, 10, "银行卡信息", 3, headerStyle); + // 其他信息 + createMergedHeader(headerRow1, 13, "体检日期", 1, headerStyle); + createMergedHeader(headerRow1, 14, "工种", 1, headerStyle); + createMergedHeader(headerRow1, 15, "手机号码", 1, headerStyle); + createMergedHeader(headerRow1, 16, "所属分包单位", 1, headerStyle); + createMergedHeader(headerRow1, 17, "所属班组", 1, headerStyle); + // 亲属信息(2列) + createMergedHeader(headerRow1, 18, "亲属", 2, headerStyle); + // 合同信息(3列) + createMergedHeader(headerRow1, 20, "合同", 3, headerStyle); + // 工资信息(2列) + createMergedHeader(headerRow1, 23, "工资", 2, headerStyle); + // 进退场信息 + createMergedHeader(headerRow1, 25, "进场时间", 1, headerStyle); + createMergedHeader(headerRow1, 26, "退场时间", 1, headerStyle); + createMergedHeader(headerRow1, 27, "备注", 1, headerStyle); + createMergedHeader(headerRow1, 28, "用工类型", 1, headerStyle); + + // 创建第二行表头 + Row headerRow2 = sheet.createRow(1); + String[] subHeaders = new String[]{ + // 身份证信息(8列) + "姓名", "性别", "身份证号", "出生日期", "民族", "签发机关", "身份证住址", "身份证有效期", + // 银行卡信息(3列) + "银行名称", "银行卡号", "银行卡联行号", + // 亲属信息(2列) + "紧急联系人", "紧急联系人电话", + // 合同信息(3列) + "合同期限类型", "签订时间", "终止日期", + // 工资信息(2列) + "工资核定方式", "工资核定标准" + }; + + // 填充第二行表头 + for (int i = 0; i < subHeaders.length; i++) { + Cell cell = headerRow2.createCell(i + 2); // 从第3列开始(前2列是序号和合同编号) + cell.setCellValue(subHeaders[i]); + cell.setCellStyle(headerStyle); } - //岗位 - AtomicInteger x = new AtomicInteger(); - dictBeanList.forEach(i -> { - if(c.getPostName().equals(i.getValue())){ - c.setPostId(i.getId()); - x.getAndIncrement(); + + // 填充数据 + int rowNum = 2; + for (PersonComprehensiveBean data : dataList) { + Row row = sheet.createRow(rowNum++); + int col = 0; + + // 序号和合同编号 + createCell(row, col++, rowNum - 2, dataStyle); + createCell(row, col++, data.getContractCode(), dataStyle); + + // 身份证信息 + createCell(row, col++, data.getName(), dataStyle); + createCell(row, col++, data.getSex(), dataStyle); + createCell(row, col++, data.getIdNumber(), dataStyle); + createCell(row, col++, data.getBirthday(), dataStyle); + createCell(row, col++, data.getEthnic(), dataStyle); + createCell(row, col++, data.getIssueauthority(), dataStyle); + createCell(row, col++, data.getAddress(), dataStyle); + createCell(row, col++, data.getSignDate() + "~" + data.getExpiryDate(), dataStyle); + + // 银行卡信息 + createCell(row, col++, data.getBankName(), dataStyle); + createCell(row, col++, data.getBankCard(), dataStyle); + createCell(row, col++, data.getBankBranch(), dataStyle); + + // 其他信息 + createCell(row, col++, data.getCheckupDate(), dataStyle); + createCell(row, col++, data.getPostName(), dataStyle); + createCell(row, col++, data.getPhone(), dataStyle); + createCell(row, col++, data.getSubName(), dataStyle); + createCell(row, col++, data.getTeamName(), dataStyle); + + // 亲属信息 + createCell(row, col++, data.getUrgentPerson(), dataStyle); + createCell(row, col++, data.getUrgentPersonPhone(), dataStyle); + + // 合同信息 + createCell(row, col++, data.getLaborContractType(), dataStyle); + createCell(row, col++, data.getContractValidDate(), dataStyle); + createCell(row, col++, data.getContractInvalidDate(), dataStyle); + + // 工资信息 + createCell(row, col++, data.getWageApprovedWay(), dataStyle); + createCell(row, col++, data.getWageCriterion(), dataStyle); + + // 进退场信息 + createCell(row, col++, data.getEinTime(), dataStyle); + createCell(row, col++, data.getExitTime(), dataStyle); + createCell(row, col++, data.getRemark(), dataStyle); + + // 用工类型 + String workerType = ""; + if ("0".equals(data.getWorkerType())) { + workerType = "临时用工"; + } else if ("1".equals(data.getWorkerType())) { + workerType = "正式用工"; + } else if ("2".equals(data.getWorkerType())) { + workerType = "分包管理人员"; } - }); - if(x.intValue()==0){ - throw new IllegalArgumentException(c.getPostName()+" 工种无法正确匹配,请正确填写!"); + createCell(row, col, workerType, dataStyle); } - String u = dao.getExistPerson(c.getIdNumber()); - String b = dao.getBlackPerson(c.getIdNumber()); - if (u != null || b != null) { - throw new IllegalArgumentException(c.getIdNumber() + "已存在或为黑名单"); + + // 自动调整列宽 + for (int i = 0; i < 29; i++) { + sheet.autoSizeColumn(i); } - }); - return list; + + // 写入输出流 + workbook.write(outputStream); + outputStream.flush(); + } } -// + + @Override + public void exportWorkerRosterList(PersonComprehensiveBean queryDTO, ServletOutputStream outputStream) throws IOException { +// 查询数据 + List dataList = dao.exportWorkerRosterList(queryDTO); + // 过滤掉所有的 null 元素 + dataList.removeIf(Objects::isNull); + + // 创建Excel工作簿 + try (XSSFWorkbook workbook = new XSSFWorkbook()) { + XSSFSheet sheet = workbook.createSheet("农民工花名册"); + + // 创建表头样式 + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 设置表头字体 + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + + // 创建数据单元格样式 + CellStyle dataStyle = workbook.createCellStyle(); + dataStyle.setAlignment(HorizontalAlignment.CENTER); + dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); + dataStyle.setBorderTop(BorderStyle.THIN); + dataStyle.setBorderRight(BorderStyle.THIN); + dataStyle.setBorderBottom(BorderStyle.THIN); + dataStyle.setBorderLeft(BorderStyle.THIN); + + // 创建表头 + Row headerRow = sheet.createRow(0); + String[] headers = new String[]{ + "序号", "项目部", "工程名称", "工程类型", "工程状态", + "当前在场人数", "已出场人数", "累计入场人数", "第一次人员入场时间" + }; + + // 填充表头 + for (int i = 0; i < headers.length; i++) { + Cell cell = headerRow.createCell(i); + cell.setCellValue(headers[i]); + cell.setCellStyle(headerStyle); + sheet.autoSizeColumn(i); + } + + // 填充数据 + int rowNum = 1; + for (PersonComprehensiveBean data : dataList) { + Row row = sheet.createRow(rowNum++); + int col = 0; + + // 填充每一列的数据 + createCell(row, col++, rowNum - 1, dataStyle); // 序号 + createCell(row, col++, data.getProGeneralName(), dataStyle); // 项目部 + createCell(row, col++, data.getProName(), dataStyle); // 工程名称 + createCell(row, col++, data.getProType(), dataStyle); // 工程类型 + createCell(row, col++, data.getProStatusName(), dataStyle); // 工程状态 + createCell(row, col++, data.getCurrentOnSiteNum(), dataStyle); // 当前在场人数 + createCell(row, col++, data.getExitedNum(), dataStyle); // 已出场人数 + createCell(row, col++, data.getTotalEntryNum(), dataStyle); // 累计入场人数 + createCell(row, col++, data.getFirstEntryTime(), dataStyle); // 第一次人员入场时间 + } + + // 自动调整列宽 + for (int i = 0; i < headers.length; i++) { + sheet.autoSizeColumn(i); + } + + // 写入输出流 + workbook.write(outputStream); + outputStream.flush(); + } + } + + private void createMergedHeader(Row row, int startCol, String value, int colspan, CellStyle style) { + Cell cell = row.createCell(startCol); + cell.setCellValue(value); + cell.setCellStyle(style); + if (colspan > 1) { + row.getSheet().addMergedRegion(new CellRangeAddress( + row.getRowNum(), row.getRowNum(), startCol, startCol + colspan - 1)); + } + + } + + private void createCell(Row row, int col, Object value, CellStyle style) { + + Cell cell = row.createCell(col); + + if (value != null) { + + if (value instanceof String) { + + cell.setCellValue((String) value); + + } else if (value instanceof Integer) { + + cell.setCellValue((Integer) value); + + } else if (value instanceof Double) { + + cell.setCellValue((Double) value); + + } + + } + + cell.setCellStyle(style); + + } + + @Override public void exportBtnOut(HttpServletResponse response, Map params) { @@ -748,7 +1005,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService } - }else{ + } else { writer.merge(9, fileName, false); writer.writeCellValue(0, 1, "序号"); writer.setColumnWidth(0, 6); @@ -782,7 +1039,6 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService writer.setColumnWidth(9, 20); - writer.merge(2, 2, 0, 9, "无数据", false); } response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); @@ -802,7 +1058,7 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService IoUtil.close(out); } - private List getBasePersonLists (Map < String, Object > params){ + private List getBasePersonLists(Map params) { List list = new ArrayList<>(); try { list = dao.getBasePersonLists(params); @@ -812,4 +1068,27 @@ public class PersonComprehensiveServiceImp implements PersonComprehensiveService return list; } -} + public static String getInitialsUpperCaseWithPinyin(String str) { + if (str == null || str.isEmpty()) { + return ""; + } + + StringBuilder initials = new StringBuilder(); + char[] chars = str.trim().toCharArray(); + + for (char c : chars) { + // 如果是中文,尝试获取拼音首字母 + try { + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c); + if (pinyinArray != null && pinyinArray.length > 0) { + String firstLetter = pinyinArray[0].charAt(0) + ""; + initials.append(firstLetter.toUpperCase()); + } + } catch (Exception e) { + // 忽略异常字符 + } + } + return initials.toString(); + } + +} \ No newline at end of file diff --git a/modules/bmw/src/main/resources/mapper/person/ContractMapper.xml b/modules/bmw/src/main/resources/mapper/person/ContractMapper.xml index d916f3b..41582da 100644 --- a/modules/bmw/src/main/resources/mapper/person/ContractMapper.xml +++ b/modules/bmw/src/main/resources/mapper/person/ContractMapper.xml @@ -25,6 +25,7 @@ bwc.contractType AS miurInsurance, IF ( bwc.sub_contract_url IS NULL, bwc.person_contract_url, bwc.sub_contract_url ) AS url, + bp.id as proId, bp.NAME AS proName, bst.team_name AS teamName, bwc.is_audit as isAudit, diff --git a/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml b/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml index db0f1b4..ba8d4fb 100644 --- a/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml +++ b/modules/bmw/src/main/resources/mapper/person/PersonComprehensiveMapper.xml @@ -832,6 +832,7 @@ t.socialSecurityNumber, t.socialSecurityUnit, t.checkupDate, + t.is_active as isActive, GROUP_CONCAT( CONCAT('入场:', bweh.ein_time, ', 出场:', IFNULL(bweh.exit_time, '未出场')) ORDER BY bweh.ein_time DESC SEPARATOR ' | ' @@ -873,6 +874,7 @@ bw.social_security_number AS socialSecurityNumber, bw.social_security_unit AS socialSecurityUnit, bw.checkup_date AS checkupDate, + bweh.`is_active`, @rn := IF(@prev = bw.id_number, @rn + 1, 1) AS rn, @prev := bw.id_number FROM @@ -893,12 +895,51 @@ LEFT JOIN bm_sub_team bst ON bst.id = bweh.team_id AND bst.is_active = '1' WHERE - bp.id = '796' + bp.id = #{ params.proId} ORDER BY bw.id_number, bweh.ein_time DESC) t LEFT JOIN bm_worker_ein_history bweh ON bweh.id_number = t.id_number WHERE t.rn = 1 + + and ( + t.contractCode like concat('%',#{params.name},'%') + or t.name like concat('%',#{params.name},'%') + or t.phone like concat('%',#{params.name},'%') + or t.id_number like concat('%',#{params.name},'%') + ) + + + + and ( + t.subName like concat('%',#{params.subName},'%') + or t.teamName like concat('%',#{params.subName},'%') + ) + + + + and locate (#{params.bankCard},t.bankCard) + + + + and locate (#{params.postName},t.postName) + + + + and locate (#{params.exitStatus},t.is_active) + + + + and locate (#{params.workerType},t.workerType) + + + + AND bweh.ein_time BETWEEN #{params.einStartDate} AND #{params.einEndDate} + + + + AND bweh.exit_time BETWEEN #{params.exitStartDate} AND #{params.exitEndDate} + GROUP BY t.id_number @@ -957,5 +998,204 @@ + + + + + + + + diff --git a/modules/bmw/src/main/resources/static/js/publicJs.js b/modules/bmw/src/main/resources/static/js/publicJs.js index a8967be..f543258 100644 --- a/modules/bmw/src/main/resources/static/js/publicJs.js +++ b/modules/bmw/src/main/resources/static/js/publicJs.js @@ -2,7 +2,7 @@ var ctxPath = getContextPath(); var currentHostname = window.location.hostname; -// //测试 +//测试 var loginPath = "http://" + currentHostname + ":39200";//auth var systemPath = "http://" + currentHostname + ":31910";//system var fileUrl = "http://" + currentHostname + ":31909/file"; @@ -18,8 +18,7 @@ var oiPlanUrl = "http://" + currentHostname + ":31914/oiPlan"; // var oiPlanUrl = "http://" + currentHostname + ":1914/oiPlan"; //文件预览 -let filePreviewUrl = "http://192.168.0.14:8012/onlinePreview?url="; -// let filePreviewUrl = "http://" + currentHostname + ":8012/onlinePreview?url="; +let filePreviewUrl = "http://" + currentHostname + ":8012/onlinePreview?url="; function getContextPath() { var pathName = document.location.pathname; diff --git a/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractManageList.js b/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractManageList.js index 3ab4342..01af6b9 100644 --- a/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractManageList.js +++ b/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractManageList.js @@ -236,10 +236,11 @@ function init() { var workerPostId = row['postId']; var contractType = row['contractType']; var status = row['stauts']; + var proId = row['proId']; var html = ''; if(status != '无数据' && status != '未签订' && status != null){ //存在但重新上传,合同见证上传 - html += uploadContractWitness(idNumber, id, workerName, workerPostId,"sys:personContract:add", pers); + html += uploadContractWitness(proId,idNumber, id, workerName, workerPostId,"sys:personContract:add", pers); //详情页面 html += particularsContractWitness(idNumber,"sys:personContract:query", pers); //纸质合同可以删除 @@ -249,7 +250,7 @@ function init() { } if(status == '未签订' && (contractType == '' || contractType == null)){ //不存在,上传新的合同见证上传 - html += uploadContractWitness(idNumber,id,workerName, workerPostId,"", pers); + html += uploadContractWitness(proId,idNumber,id,workerName, workerPostId,"", pers); //详情页面 html += particularsContractWitness(idNumber,"sys:personContract:query", pers); } @@ -316,22 +317,23 @@ function particularsContractWitnessPage(idNumber) { } //合同见证上传 -function uploadContractWitness(idNumber, id, workerName, workerPostId, permission, pers){ +function uploadContractWitness(proId,idNumber, id, workerName, workerPostId, permission, pers){ if (permission != "") { if ($.inArray(permission, pers) < 0) { return ""; } } - var btn = $(""); + var btn = $(""); return btn.prop("outerHTML"); } //合同见证上传 -function uploadContractWitnessView(idNumber,id,workerName, workerPostId) { +function uploadContractWitnessView(proId,idNumber,id,workerName, workerPostId) { var contractId = getUuid(); //以前有合同,则须通过id删除,并添加新的。无合同删除用-1 if(id!==null && id!=='null'){ let confirm = layer.confirm("合同见证已存在,是否删除并重新上传?",function () { + localStorage.setItem("proId", proId); localStorage.setItem("idNumber", idNumber); localStorage.setItem("workerName", workerName); localStorage.setItem("workerPostId", workerPostId); diff --git a/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractSignUploadFrom.js b/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractSignUploadFrom.js index 92623c6..4263ad0 100644 --- a/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractSignUploadFrom.js +++ b/modules/bmw/src/main/resources/static/js/work/Person/PersonContract/ContractSignUploadFrom.js @@ -1,5 +1,6 @@ var element; var layer; +var proId = localStorage.getItem("proId"); var idNumber = localStorage.getItem("idNumber"); var workerName = localStorage.getItem("workerName"); var workerPostId = localStorage.getItem("workerPostId"); @@ -192,6 +193,7 @@ function addData() { formData.field.idNumber = idNumber; formData.field.workerName = workerName; formData.field.workerPostId = workerPostId; + formData.field.proId = proId; var formUrl = ctxPath + "/contract/addContract"; $.ajax({ type: 'POST', diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryFrom.html b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryFrom.html index e8671e9..fd39b5c 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryFrom.html +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/personEntryFrom.html @@ -546,7 +546,7 @@ -
+
diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.html b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.html index 28a6af7..98816af 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.html +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.html @@ -49,7 +49,7 @@
diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.js b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.js index abaa121..2d00fee 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.js +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterList.js @@ -168,30 +168,120 @@ function checkView(proId) { var fnc = myIframe.setData(proId); //aaa()为子页面的方法 }, }); - // $.ajax({ - // type: 'get', - // contentType: "application/x-www-form-urlencoded", - // url: ctxPath + '/personComprehensive/getWorkerRosterProList'+proId, - // dataType: 'json', - // success: function (data) { - // - // } - // }) } -function buttonUpdate(idNumber, permission, pers) { +function buttonUpdate(proId, permission, pers) { if (permission != "") { if ($.inArray(permission, pers) < 0) { return ""; } } - var btn = $(""); + var btn = $(""); return btn.prop("outerHTML"); } /** * 导出 * */ -function updateView(idNumber) { +function updateView(proIds) { + var index = layer.msg('正在导出,请稍等...', { + icon: 16, + time: 60000, + shade: [0.1, '#fff'] + }); + // 获取查询条件 + let params = { + proId: proIds, + }; + + let token = localStorage.getItem("smz-token"); + let url = ctxPath + "/personComprehensive/exportWorkerRoster?param=" + encodeURIComponent(JSON.stringify(params)); + let xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "blob"; // 转换流 + xhr.setRequestHeader("Authorization", token); + + xhr.onload = function () { + layer.close(index); + if (this.status === 200) { + let blob = this.response; + let a = document.createElement("a"); + let url = window.URL.createObjectURL(blob); + a.href = url; + a.download = "农民工花名册.xlsx"; + a.click(); + window.URL.revokeObjectURL(url); + layer.msg('导出成功'); + } else if (this.status === 401) { + localStorage.removeItem("smz-token"); + layer.msg('用户登录过期,请重新登录', {icon: 5, time: 2000}, function () { + location.href = ctxPath + '/login.html'; + }); + } else { + layer.msg('导出失败,请稍后重试', {icon: 2}); + } + }; + + xhr.onerror = function() { + layer.close(index); + layer.msg('导出失败,请稍后重试', {icon: 2}); + }; + + xhr.send(); +} + + +function checkup(){ + var index = layer.msg('正在导出,请稍等...', { + icon: 16, + time: 60000, + shade: [0.1, '#fff'] + }); + + var proGeneralName = $("#proGeneralName").val(); + var proId = $('#proId').val(); + var proStatusId = $("#proStatusId").val(); + + // 获取查询条件 + let params = { + proGeneralName: proGeneralName, + proId:proId, + proStatusId:proStatusId + }; + + let token = localStorage.getItem("smz-token"); + let url = ctxPath + "/personComprehensive/exportWorkerRosterList?param=" + encodeURIComponent(JSON.stringify(params)); + let xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "blob"; // 转换流 + xhr.setRequestHeader("Authorization", token); + + xhr.onload = function () { + layer.close(index); + if (this.status === 200) { + let blob = this.response; + let a = document.createElement("a"); + let url = window.URL.createObjectURL(blob); + a.href = url; + a.download = "农民工花名册.xlsx"; + a.click(); + window.URL.revokeObjectURL(url); + layer.msg('导出成功'); + } else if (this.status === 401) { + localStorage.removeItem("smz-token"); + layer.msg('用户登录过期,请重新登录', {icon: 5, time: 2000}, function () { + location.href = ctxPath + '/login.html'; + }); + } else { + layer.msg('导出失败,请稍后重试', {icon: 2}); + } + }; + + xhr.onerror = function() { + layer.close(index); + layer.msg('导出失败,请稍后重试', {icon: 2}); + }; + + xhr.send(); } \ No newline at end of file diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.html b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.html index 5ceae85..5dc63d9 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.html +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.html @@ -5,9 +5,14 @@ 农民工花名册-工程 - + + - +
@@ -21,35 +26,80 @@
- +
-
- -
- +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
- -
- + + + +
-
@@ -64,7 +114,7 @@ - + @@ -119,7 +169,8 @@ - + + diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.js b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.js index 0bcb9c0..448eff4 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.js +++ b/modules/bmw/src/main/resources/static/pages/work/Person/AttendanceMachine/workerRosterProList.js @@ -3,12 +3,26 @@ var example; var proIds; function setData(proId){ proIds = proId; - layui.use(['form','layer'], function () { + layui.use(['form','laydate','layer'], function () { + var laydate = layui.laydate; $("#searchBt").click(function () { example.ajax.reload(); }); + + laydate.render({ + elem: '#ein_date_range', + range: ['#einStartDate', '#einEndDate'], + rangeLinked: true + }); + + + laydate.render({ + elem: '#exit_date_range', + range: ['#exitStartDate', '#exitEndDate'], + rangeLinked: true + }); + init(); - // getProByOrgId("","",""); }); } @@ -26,7 +40,7 @@ function init(){ "scrollCollapse": true, "scrollX": true, // 启用横向滚动 "autoWidth": false, // 禁用自动宽度计算 - "scrollY": "600px", // 设置垂直滚动 + "scrollY": false, // 设置垂直滚动 "language": { "url": ctxPath + "/js/plugin/datatables/Chinese.lang" }, @@ -35,9 +49,18 @@ function init(){ "type": "post", "data": function (d) { d.proId =proIds - // d.proGeneralName = $("#proGeneralName").val(); - // d.proId = $('#proId').val(); - // d.proStatusId = $("#proStatusId").val(); + + d.name = $("#name").val(); + d.subName = $('#subName').val(); + d.bankCard = $("#bankCard").val(); + d.postName = $("#postName").val(); + d.exitStatus = $("#exitStatus").val(); + + d.workerType = $("#workerType").val(); + d.einStartDate = $('#einStartDate').val(); + d.einEndDate = $("#einEndDate").val(); + d.exitStartDate = $("#exitStartDate").val(); + d.exitEndDate = $("#exitEndDate").val(); }, "error": function (xhr, textStatus, errorThrown) { var msg = xhr.responseText; @@ -132,141 +155,82 @@ function init(){ {"data": "einTime", "width":"120px"}, {"data": "exitTime", "width":"120px"}, {"data": "remark", "width":"200px"}, - {"data": "workerType", "width":"120px"}, + {"data": "", "width":"120px", + "render": function (data, type, row) { + var workerType = row['workerType']; + var html; + if(workerType == "0"){ + html = "临时用工"; + }else if( workerType == "1"){ + html = "正式用工"; + }else if( workerType == "2"){ + html = "分包管理人员"; + } + return html; + } + }, ], "order": [[0, "desc"], [1, "asc"]], - "createdRow": function(row, data, dataIndex) { - $(row).css({ - "height": "40px" - }); - } }); +} - // 基础样式 - var baseStyle = { - "border": "1px solid #e6e6e6", - "padding": "8px", - "text-align": "center", - "font-size": "13px", - "font-family": "Microsoft YaHei" +/** + * 导出花名册 + */ +function checkup() { + var index = layer.msg('正在导出,请稍等...', { + icon: 16, + time: 60000, + shade: [0.1, '#fff'] + }); + + // 获取查询条件 + let params = { + proId: proIds, + name: $("#name").val(), + subName: $('#subName').val(), + bankCard: $("#bankCard").val(), + postName: $("#postName").val(), + exitStatus: $("#exitStatus").val(), + workerType: $("#workerType").val(), + einStartDate: $('#einStartDate').val(), + einEndDate: $("#einEndDate").val(), + exitStartDate: $("#exitStartDate").val(), + exitEndDate: $("#exitEndDate").val() }; - // 表格整体样式 - $('#dt-table').css({ - "border-collapse": "collapse", - "width": "100%", - "background-color": "#fff" - }); - - // 表头样式 - $('#dt-table thead th').css({ - ...baseStyle, - "background-color": "#f2f2f2", - "font-weight": "500", - "color": "#333" - }); - - // 单元格样式 - $('#dt-table tbody td').css({ - ...baseStyle, - "background-color": "#fff", - "color": "#666", - "white-space": "nowrap", - "overflow": "hidden", - "text-overflow": "ellipsis", - "width":"100px" - }); - - // 奇数行样式 - $('#dt-table tbody tr:odd').css({ - "background-color": "#fafafa" - }); - - // hover效果 - $('#dt-table tbody tr').hover( - function() { - $(this).css({ - "background-color": "#f5f5f5" - }); - }, - function() { - var isOdd = $(this).index() % 2 === 1; - $(this).css({ - "background-color": isOdd ? "#fafafa" : "#fff" + let token = localStorage.getItem("smz-token"); + let url = ctxPath + "/personComprehensive/exportWorkerRoster?param=" + encodeURIComponent(JSON.stringify(params)); + let xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "blob"; // 转换流 + xhr.setRequestHeader("Authorization", token); + + xhr.onload = function () { + layer.close(index); + if (this.status === 200) { + let blob = this.response; + let a = document.createElement("a"); + let url = window.URL.createObjectURL(blob); + a.href = url; + a.download = "农民工花名册-工程.xlsx"; + a.click(); + window.URL.revokeObjectURL(url); + layer.msg('导出成功'); + } else if (this.status === 401) { + localStorage.removeItem("smz-token"); + layer.msg('用户登录过期,请重新登录', {icon: 5, time: 2000}, function () { + location.href = ctxPath + '/login.html'; }); + } else { + layer.msg('导出失败,请稍后重试', {icon: 2}); } - ); - - // 分页样式 - $('.dataTables_paginate').css({ - "margin-top": "10px" - }); - - $('.paginate_button').css({ - "padding": "5px 10px", - "margin": "0 2px", - "border": "1px solid #ddd", - "background-color": "#fff", - "cursor": "pointer" - }); - - $('.paginate_button.current').css({ - "background-color": "#009688", - "color": "#fff", - "border-color": "#009688" - }); -} - -function buttonCheck(proId, permission, pers) { - if (permission != "") { - if ($.inArray(permission, pers) < 0) { - return ""; - } - } - var btn = $(""); - return btn.prop("outerHTML"); -} - -/** - * 详情 - * */ -function checkView(proId) { - var height = '90%'; - var width = '80%'; - $.ajax({ - type: 'get', - contentType: "application/x-www-form-urlencoded", - url: ctxPath + '/personComprehensive/getWorkerRosterProList'+proId, - dataType: 'json', - success: function (data) { - var index = layer.open({ - title: ['详情', 'color:#3B70A1;background-color:#E8ECEB;font-size:20px'], - type: 2, - content: 'workerRosterProList.html', - area: [width, height], - maxmin: false, - success: function (layero, index) { - var myIframe = window[layero.find('iframe')[0]['name']]; - var fnc = myIframe.setData(data.data); //aaa()为子页面的方法 - }, - }); - } - }) -} - -function buttonUpdate(idNumber, permission, pers) { - if (permission != "") { - if ($.inArray(permission, pers) < 0) { - return ""; - } - } - var btn = $(""); - return btn.prop("outerHTML"); -} - -/** - * 导出 - * */ -function updateView(idNumber) { - + }; + + xhr.onerror = function() { + layer.close(index); + layer.msg('导出失败,请稍后重试', {icon: 2}); + }; + + xhr.send(); } \ No newline at end of file diff --git a/modules/bmw/src/main/resources/static/pages/work/Person/PersonContract/ContractSignUploadFrom.html b/modules/bmw/src/main/resources/static/pages/work/Person/PersonContract/ContractSignUploadFrom.html index cbd2be3..4ea71e4 100644 --- a/modules/bmw/src/main/resources/static/pages/work/Person/PersonContract/ContractSignUploadFrom.html +++ b/modules/bmw/src/main/resources/static/pages/work/Person/PersonContract/ContractSignUploadFrom.html @@ -62,10 +62,10 @@
-
+
序号序号 合同编号 身份证信息 银行卡信息