From a98b9c897c612c12bd4bf1e17411120a67bcceb8 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Sat, 8 Mar 2025 09:05:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=85=E5=A4=B4bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PartyConstructionMemberController.java | 213 ++++++++++-------- ...rtyConstructionOrganizationController.java | 14 +- .../SunshineConstructionListController.java | 149 ++++++++++++ .../controller/WorkerAdmissionController.java | 54 ++++- .../entity/PartyConstructionMember.java | 26 ++- .../entity/SunshineConstructionList.java | 76 +++++++ .../baotou/entity/SunshineProject.java | 52 +++-- .../baotou/entity/WorkerAdmissionDetail.java | 36 +++ .../entity/vo/UploadZipWorkAdmissionVo.java | 124 ++++++---- .../SunshineConstructionListMapper.java | 51 +++++ .../xml/PartyConstructionMemberMapper.xml | 1 + .../xml/SunshineConstructionListMapper.xml | 18 ++ .../IPartyConstructionMemberService.java | 4 + .../ISunshineConstructionListService.java | 65 ++++++ .../service/IWorkerAdmissionService.java | 2 +- .../PartyConstructionMemberServiceImpl.java | 99 +++++--- .../service/impl/ProjectGroupServiceImpl.java | 24 +- .../SunshineConstructionListServiceImpl.java | 91 ++++++++ .../impl/SunshineProjectServiceImpl.java | 2 +- .../WorkerAdmissionDetailServiceImpl.java | 53 +++++ .../impl/WorkerAdmissionServiceImpl.java | 61 ++++- .../impl/ExamTrainRecordServiceImpl.java | 18 +- .../controller/WorkerInfoController.java | 3 +- .../modules/worker/entity/WorkerInfo.java | 24 +- .../worker/mapper/xml/WorkerInfoMapper.xml | 47 +++- .../service/impl/WorkerInfoServiceImpl.java | 98 ++++---- .../java/com/zhgd/xmgl/util/ExcelUtils.java | 35 ++- .../java/com/zhgd/xmgl/util/FlowUtil.java | 14 ++ .../resources/excel/人员入场导入模板.xlsx | Bin 14663 -> 19001 bytes src/main/resources/excel/人员导入模板.xlsx | Bin 14962 -> 15748 bytes 30 files changed, 1171 insertions(+), 283 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/baotou/controller/SunshineConstructionListController.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineConstructionList.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/baotou/mapper/SunshineConstructionListMapper.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/SunshineConstructionListMapper.xml create mode 100644 src/main/java/com/zhgd/xmgl/modules/baotou/service/ISunshineConstructionListService.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineConstructionListServiceImpl.java diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionMemberController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionMemberController.java index 537015885..98641a689 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionMemberController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionMemberController.java @@ -1,33 +1,31 @@ package com.zhgd.xmgl.modules.baotou.controller; -import com.zhgd.annotation.OperLog; -import com.zhgd.xmgl.modules.baotou.entity.vo.PartyConstructionMemberStats; -import io.swagger.annotations.*; - -import java.util.HashMap; - -import springfox.documentation.annotations.ApiIgnore; - -import java.util.List; - -import com.zhgd.jeecg.common.api.vo.Result; -import org.apache.commons.collections.MapUtils; -import com.zhgd.xmgl.modules.baotou.entity.PartyConstructionMember; -import com.zhgd.xmgl.modules.baotou.service.IPartyConstructionMemberService; - -import org.simpleframework.xml.core.Validate; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zhgd.annotation.OperLog; +import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.xmgl.modules.baotou.entity.PartyConstructionMember; +import com.zhgd.xmgl.modules.baotou.entity.vo.PartyConstructionMemberStats; +import com.zhgd.xmgl.modules.baotou.service.IPartyConstructionMemberService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; - +import org.apache.commons.collections.MapUtils; +import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.HashMap; +import java.util.List; /** * @Title: Controller * @Description: 组织建设成员 * @author: pds - * @date: 2024-08-28 + * @date: 2024-08-28 * @version: V1.0 */ @RestController @@ -35,95 +33,112 @@ import org.springframework.web.bind.annotation.*; @Slf4j @Api(tags = "组织建设成员相关Api") public class PartyConstructionMemberController { - @Autowired - private IPartyConstructionMemberService partyConstructionMemberService; + @Autowired + private IPartyConstructionMemberService partyConstructionMemberService; - /** - * 分页列表查询 - * @return - */ + /** + * 分页列表查询 + * + * @return + */ @OperLog(operModul = "组织建设成员管理", operType = "分页查询", operDesc = "分页列表查询组织建设成员信息") - @ApiOperation(value = "分页列表查询组织建设成员信息", notes = "分页列表查询组织建设成员信息", httpMethod="GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "getChildPartyConstructionMemberId", value = "获取自己及子级下的成员的组织建设组织id", paramType = "query", required = true, dataType = "Integer"), - }) - @GetMapping(value = "/page") - public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { - return Result.success(partyConstructionMemberService.queryPageList(param)); - } + @ApiOperation(value = "分页列表查询组织建设成员信息", notes = "分页列表查询组织建设成员信息", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "getChildPartyConstructionMemberId", value = "获取自己及子级下的成员的组织建设组织id", paramType = "query", required = true, dataType = "Integer"), + }) + @GetMapping(value = "/page") + public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(partyConstructionMemberService.queryPageList(param)); + } - /** - * 列表查询 - * @return - */ + /** + * 列表查询 + * + * @return + */ @OperLog(operModul = "组织建设成员管理", operType = "列表查询", operDesc = "列表查询组织建设成员信息") - @ApiOperation(value = "列表查询组织建设成员信息", notes = "列表查询组织建设成员信息", httpMethod="GET") - @GetMapping(value = "/list") - public Result> queryList(@ApiIgnore @RequestParam HashMap param) { - return Result.success(partyConstructionMemberService.queryList(param)); - } + @ApiOperation(value = "列表查询组织建设成员信息", notes = "列表查询组织建设成员信息", httpMethod = "GET") + @GetMapping(value = "/list") + public Result> queryList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(partyConstructionMemberService.queryList(param)); + } - /** - * 添加 - * @param partyConstructionMember - * @return - */ + /** + * 添加 + * + * @param partyConstructionMember + * @return + */ @OperLog(operModul = "组织建设成员管理", operType = "添加", operDesc = "添加组织建设成员信息") - @ApiOperation(value = "添加组织建设成员信息", notes = "添加组织建设成员信息" , httpMethod="POST") - @PostMapping(value = "/add") - public Result add(@RequestBody @Validate PartyConstructionMember partyConstructionMember) { - partyConstructionMemberService.add(partyConstructionMember); - return Result.ok(); - } - - /** - * 编辑 - * @param partyConstructionMember - * @return - */ - @OperLog(operModul = "组织建设成员管理", operType = "编辑", operDesc = "编辑组织建设成员信息") - @ApiOperation(value = "编辑组织建设成员信息", notes = "编辑组织建设成员信息" , httpMethod="POST") - @PostMapping(value = "/edit") - public Result edit(@RequestBody PartyConstructionMember partyConstructionMember) { - partyConstructionMemberService.edit(partyConstructionMember); - return Result.ok(); - } - - /** - * 通过id删除 - * @return - */ - @OperLog(operModul = "组织建设成员管理", operType = "删除", operDesc = "删除组织建设成员信息") - @ApiOperation(value = "删除组织建设成员信息", notes = "删除组织建设成员信息" , httpMethod="POST") - @ApiImplicitParam(name = "id", value = "组织建设成员ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") - @PostMapping(value = "/delete") - public Result delete(@ApiIgnore @RequestBody HashMap map) { - partyConstructionMemberService.delete(MapUtils.getString(map, "id")); + @ApiOperation(value = "添加组织建设成员信息", notes = "添加组织建设成员信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result add(@RequestBody @Validate PartyConstructionMember partyConstructionMember) { + partyConstructionMemberService.add(partyConstructionMember); return Result.ok(); - } + } - /** - * 通过id查询 - * @param id - * @return - */ + /** + * 编辑 + * + * @param partyConstructionMember + * @return + */ + @OperLog(operModul = "组织建设成员管理", operType = "编辑", operDesc = "编辑组织建设成员信息") + @ApiOperation(value = "编辑组织建设成员信息", notes = "编辑组织建设成员信息", httpMethod = "POST") + @PostMapping(value = "/edit") + public Result edit(@RequestBody PartyConstructionMember partyConstructionMember) { + partyConstructionMemberService.edit(partyConstructionMember); + return Result.ok(); + } + + /** + * 通过id删除 + * + * @return + */ + @OperLog(operModul = "组织建设成员管理", operType = "删除", operDesc = "删除组织建设成员信息") + @ApiOperation(value = "删除组织建设成员信息", notes = "删除组织建设成员信息", httpMethod = "POST") + @ApiImplicitParam(name = "id", value = "组织建设成员ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") + @PostMapping(value = "/delete") + public Result delete(@ApiIgnore @RequestBody HashMap map) { + partyConstructionMemberService.delete(MapUtils.getString(map, "id")); + return Result.ok(); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ @OperLog(operModul = "组织建设成员管理", operType = "通过id查询", operDesc = "通过id查询组织建设成员信息") - @ApiOperation(value = "通过id查询组织建设成员信息", notes = "通过id查询组织建设成员信息" , httpMethod="GET") - @ApiImplicitParam(name = "id", value = "组织建设成员ID", paramType = "query", required = true, dataType = "Integer") - @GetMapping(value = "/queryById") - public Result queryById(@RequestParam(name="id",required=true) String id) { - return Result.success(partyConstructionMemberService.queryById(id)); - } + @ApiOperation(value = "通过id查询组织建设成员信息", notes = "通过id查询组织建设成员信息", httpMethod = "GET") + @ApiImplicitParam(name = "id", value = "组织建设成员ID", paramType = "query", required = true, dataType = "Integer") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + return Result.success(partyConstructionMemberService.queryById(id)); + } - @OperLog(operModul = "组织建设成员管理", operType = "通过id查询", operDesc = "党员統计") - @ApiOperation(value = "党员統计", notes = "党员統计" , httpMethod="GET") - @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String") - @GetMapping(value = "/stats") - public Result stats(@RequestParam String projectSn) { - return Result.success(partyConstructionMemberService.stats(projectSn)); - } + @OperLog(operModul = "组织建设成员管理", operType = "通过id查询", operDesc = "党员統计") + @ApiOperation(value = "党员統计", notes = "党员統计", httpMethod = "GET") + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String") + @GetMapping(value = "/stats") + public Result stats(@RequestParam String projectSn) { + return Result.success(partyConstructionMemberService.stats(projectSn)); + } - - } + @OperLog(operModul = "组织建设成员管理", operType = "添加", operDesc = "从人员管理录入成员") + @ApiOperation(value = "从人员管理录入成员", notes = "从人员管理录入成员", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "workerIds", value = "人员ids(多个,分割)", paramType = "query", required = true, dataType = "String"), + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String"), + @ApiImplicitParam(name = "classifyId", value = "组织id", paramType = "query", required = true, dataType = "String"), + }) + @PostMapping(value = "/addFromWorker") + public Result addFromWorker(@RequestBody @Validate HashMap param) { + partyConstructionMemberService.addFromWorker(param); + return Result.ok(); + } +} diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionOrganizationController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionOrganizationController.java index 4eb1ba7b1..f04fbcb43 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionOrganizationController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/PartyConstructionOrganizationController.java @@ -63,13 +63,6 @@ public class PartyConstructionOrganizationController { return Result.success(partyConstructionOrganizationService.queryList(param)); } - @OperLog(operModul = "组织建设组织管理", operType = "列表查询", operDesc = "树形列表查询组织建设组织信息") - @ApiOperation(value = "树形列表查询组织建设组织信息", notes = "树形列表查询组织建设组织信息", httpMethod = "GET") - @GetMapping(value = "/tree/list") - public Result> queryTreeList(@ApiIgnore @RequestParam HashMap param) { - return Result.success(partyConstructionOrganizationService.queryTreeList(param)); - } - /** * 添加 * @@ -126,4 +119,11 @@ public class PartyConstructionOrganizationController { return Result.success(partyConstructionOrganizationService.queryById(id)); } + @OperLog(operModul = "组织建设组织管理", operType = "列表查询", operDesc = "树形列表查询组织建设组织信息") + @ApiOperation(value = "树形列表查询组织建设组织信息", notes = "树形列表查询组织建设组织信息", httpMethod = "GET") + @GetMapping(value = "/tree/list") + public Result> queryTreeList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(partyConstructionOrganizationService.queryTreeList(param)); + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/SunshineConstructionListController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/SunshineConstructionListController.java new file mode 100644 index 000000000..5991ed6a3 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/SunshineConstructionListController.java @@ -0,0 +1,149 @@ +package com.zhgd.xmgl.modules.baotou.controller; + +import com.alibaba.fastjson.JSONObject; +import com.zhgd.annotation.OperLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiImplicitParams; + +import java.util.HashMap; + +import springfox.documentation.annotations.ApiIgnore; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.jeecg.common.util.oConvertUtils; +import org.apache.commons.collections.MapUtils; +import com.zhgd.xmgl.modules.baotou.entity.SunshineConstructionList; +import com.zhgd.xmgl.modules.baotou.service.ISunshineConstructionListService; + +import org.simpleframework.xml.core.Validate; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; + + +/** + * @Title: Controller + * @Description: 施工管理过程公开列表 + * @author: pds + * @date: 2025-03-07 + * @version: V1.0 + */ +@RestController +@RequestMapping("/xmgl/sunshineConstructionList") +@Slf4j +@Api(tags = "施工管理过程公开列表相关Api") +public class SunshineConstructionListController { + @Autowired + private ISunshineConstructionListService sunshineConstructionListService; + + /** + * 分页列表查询 + * + * @return + */ + @OperLog(operModul = "施工管理过程公开列表管理", operType = "分页查询", operDesc = "分页列表查询施工管理过程公开列表信息") + @ApiOperation(value = "分页列表查询施工管理过程公开列表信息", notes = "分页列表查询施工管理过程公开列表信息", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), + }) + @GetMapping(value = "/page") + public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(sunshineConstructionListService.queryPageList(param)); + } + + /** + * 列表查询 + * + * @return + */ + @OperLog(operModul = "施工管理过程公开列表管理", operType = "列表查询", operDesc = "列表查询施工管理过程公开列表信息") + @ApiOperation(value = "列表查询施工管理过程公开列表信息", notes = "列表查询施工管理过程公开列表信息", httpMethod = "GET") + @GetMapping(value = "/list") + public Result> queryList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(sunshineConstructionListService.queryList(param)); + } + + /** + * 添加 + * + * @param sunshineConstructionList + * @return + */ + @OperLog(operModul = "施工管理过程公开列表管理", operType = "添加", operDesc = "添加施工管理过程公开列表信息") + @ApiOperation(value = "添加施工管理过程公开列表信息", notes = "添加施工管理过程公开列表信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result add(@RequestBody @Validate SunshineConstructionList sunshineConstructionList) { + sunshineConstructionListService.add(sunshineConstructionList); + return Result.ok(); + } + + /** + * 编辑 + * + * @param sunshineConstructionList + * @return + */ + @OperLog(operModul = "施工管理过程公开列表管理", operType = "编辑", operDesc = "编辑施工管理过程公开列表信息") + @ApiOperation(value = "编辑施工管理过程公开列表信息", notes = "编辑施工管理过程公开列表信息", httpMethod = "POST") + @PostMapping(value = "/edit") + public Result edit(@RequestBody SunshineConstructionList sunshineConstructionList) { + sunshineConstructionListService.edit(sunshineConstructionList); + return Result.ok(); + } + + /** + * 通过id删除 + * + * @return + */ + @OperLog(operModul = "施工管理过程公开列表管理", operType = "删除", operDesc = "删除施工管理过程公开列表信息") + @ApiOperation(value = "删除施工管理过程公开列表信息", notes = "删除施工管理过程公开列表信息", httpMethod = "POST") + @ApiImplicitParam(name = "id", value = "施工管理过程公开列表ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") + @PostMapping(value = "/delete") + public Result delete(@ApiIgnore @RequestBody HashMap map) { + sunshineConstructionListService.delete(MapUtils.getString(map, "id")); + return Result.ok(); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @OperLog(operModul = "施工管理过程公开列表管理", operType = "通过id查询", operDesc = "通过id查询施工管理过程公开列表信息") + @ApiOperation(value = "通过id查询施工管理过程公开列表信息", notes = "通过id查询施工管理过程公开列表信息", httpMethod = "GET") + @ApiImplicitParam(name = "id", value = "施工管理过程公开列表ID", paramType = "query", required = true, dataType = "Integer") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + return Result.success(sunshineConstructionListService.queryById(id)); + } + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java index 400c102c5..0ebd5ca0f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WorkerAdmissionController.java @@ -134,6 +134,9 @@ public class WorkerAdmissionController { @Lazy @Autowired private IProjectGroupService projectGroupService; + @Lazy + @Autowired + private IPartyConstructionOrganizationService partyConstructionOrganizationService; /** * 分页列表查询 @@ -536,6 +539,16 @@ public class WorkerAdmissionController { return null; } +// @OperLog(operModul = "人员入场管理", operType = "", operDesc = "人员入场导入模板下载") +// @ApiOperation(value = "人员入场导入模板下载", notes = "人员入场导入模板下载", httpMethod = "GET") +// @ApiImplicitParams({ +// @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "query", required = true, dataType = "String"), +// }) +// @GetMapping(value = "/exportExcelWorkAdmissionTemplate") +// public void exportExcelWorkAdmissionTemplate(HttpServletResponse response, String projectSn) { +// workerAdmissionService.exportExcelWorkAdmissionTemplate(response, projectSn); +// } + @ApiOperation(value = "根据“导出人员申请表”查询身份证号列表", notes = "根据“导出人员申请表”查询身份证号列表", httpMethod = "POST") @PostMapping(value = "/getIdCardsByExcel") public Result getIdCardsByExcel(@RequestParam(value = "file") MultipartFile file, @RequestParam String projectSn) throws Exception { @@ -594,14 +607,14 @@ public class WorkerAdmissionController { } } - @OperLog(operModul = "人员入场管理", operType = "", operDesc = "人员入场导入模板下载") - @ApiOperation(value = "人员入场导入模板下载", notes = "人员入场导入模板下载", httpMethod = "GET") + @OperLog(operModul = "人员入场管理", operType = "", operDesc = "人员入场导入zip模板下载") + @ApiOperation(value = "人员入场导入zip模板下载", notes = "人员入场导入zip模板下载", httpMethod = "GET") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "query", required = true, dataType = "String"), }) - @GetMapping(value = "/exportExcelWorkAdmissionTemplate") - public void exportExcelWorkAdmissionTemplate(HttpServletResponse response, String projectSn) { - workerAdmissionService.exportExcelWorkAdmissionTemplate(response, projectSn); + @GetMapping(value = "/exportZipWorkAdmissionTemplate") + public void exportZipWorkAdmissionTemplate(HttpServletResponse response, String projectSn) { + workerAdmissionService.exportZipWorkAdmissionTemplate(response, projectSn); } @OperLog(operModul = "人员入场管理", operType = "", operDesc = "读取导入的人员入场excel模板数据") @@ -726,8 +739,9 @@ public class WorkerAdmissionController { Map certTypeMap = dictionariesRecordService.selectCertTypeList(new MapBuilder() .put("type", 1) .build()).stream().collect(Collectors.toMap(DictionariesRecord::getDictionaryName, Function.identity(), (o1, o2) -> o1)); - ; List isc = Arrays.asList("市场监督管理局", "应急管理局", "住房和城乡建设厅", "人力资源和社会保障部(厅)"); + Map orgMap = partyConstructionOrganizationService.list(new LambdaQueryWrapper() + .eq(PartyConstructionOrganization::getProjectSn, projectSn)).stream().collect(Collectors.toMap(PartyConstructionOrganization::getClassificationName, Function.identity(), (o1, o2) -> o1)); for (Map importInfo : list) { UploadZipWorkAdmissionVo detail = new UploadZipWorkAdmissionVo(); detail.setNum(importInfo.get("*编号")); @@ -757,6 +771,34 @@ public class WorkerAdmissionController { detail.setIssueTime(StrUtil.isNotBlank(issueTime) ? DateUtil.formatDate(DateUtil.parse(issueTime)) : null); String effectTime = importInfo.get("截止日期"); detail.setEffectTime(StrUtil.isNotBlank(effectTime) ? DateUtil.formatDate(DateUtil.parse(effectTime)) : null); + detail.setPartyPosition(importInfo.get("党内职务")); + detail.setNativePlace(importInfo.get("籍贯")); + detail.setNation(importInfo.get("民族")); + List ps = Arrays.asList("群众", + "正式党员", + "预备党员"); + int p = ps.indexOf(importInfo.get("政治面貌")); + detail.setPoliticsStatus(p != -1 ? p + 1 : null); + detail.setPoliticsStatusStr(importInfo.get("政治面貌")); + List edus = Arrays.asList("小学", + "初中", + "中专", + "高中", + "大专", + "本科", + "研究生", + "博士", + "博士后"); + int edu = edus.indexOf(importInfo.get("学历")); + detail.setEducational(edu != -1 ? edu + 1 : null); + detail.setEducationalStr(importInfo.get("学历")); + PartyConstructionOrganization organization = orgMap.get(importInfo.get("支部名称")); + if (organization != null) { + List ids = StrUtil.split(organization.getAncestors(), ","); + ids.remove("0"); + ids.add(organization.getId() + ""); + detail.setBranchIdStr(StrUtil.join("-", ids)); + } admissionVos.add(detail); } return admissionVos; diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/PartyConstructionMember.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/PartyConstructionMember.java index f24c5aa0c..b13280e3b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/PartyConstructionMember.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/PartyConstructionMember.java @@ -73,14 +73,22 @@ public class PartyConstructionMember implements Serializable { @Excel(name = "所属项目SN", width = 15) @ApiModelProperty(value="所属项目SN") private java.lang.String projectSn ; - /**创建时间*/ - @ApiModelProperty(value="创建时间") - private java.util.Date createDate ; - /**更新时间*/ - @ApiModelProperty(value="更新时间") - private java.util.Date updateDate ; + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private java.util.Date createDate; + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + private java.util.Date updateDate; + + @TableField(exist = false) + @ApiModelProperty(value = "劳务人员名称") + private java.lang.String workerName; + @TableField(exist = false) + @ApiModelProperty(value = "组织建设组织名称") + private java.lang.String classificationName; - @TableField(exist = false) - @ApiModelProperty(value="劳务人员名称") - private java.lang.String workerName ; } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineConstructionList.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineConstructionList.java new file mode 100644 index 000000000..6a6d27aa0 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineConstructionList.java @@ -0,0 +1,76 @@ +package com.zhgd.xmgl.modules.baotou.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @Description: 施工管理过程公开列表 + * @author: pds + * @date: 2025-03-07 + * @version: V1.0 + */ +@Data +@TableName("sunshine_construction_list") +@ApiModel(value = "SunshineConstructionList实体类", description = "SunshineConstructionList") +public class SunshineConstructionList implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.Long id; + /** + * 阳光工程id + */ + @ApiModelProperty(value = "阳光工程id") + private java.lang.Long sunshineId; + /** + * 标题 + */ + @ApiModelProperty(value = "标题") + private java.lang.String title; + /** + * 内容 + */ + @ApiModelProperty(value = "内容") + private java.lang.String content; + /** + * 所属项目SN + */ + @ApiModelProperty(value = "所属项目SN") + private java.lang.String projectSn; + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private java.util.Date createDate; + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + private java.util.Date updateDate; + /** + * 记录时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "记录时间") + private java.util.Date recordDate; + /** + * 附件 + */ + @ApiModelProperty(value = "附件") + private java.lang.String attachment; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineProject.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineProject.java index a562c736b..8c2fa390f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineProject.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/SunshineProject.java @@ -29,20 +29,40 @@ public class SunshineProject implements Serializable { private java.lang.Long id ; /**标题*/ @ApiModelProperty(value="标题") - private java.lang.String title ; - /**内容*/ - @ApiModelProperty(value="内容") - private java.lang.String content ; - /**类型:1:招标过程;2:资金使用公开;3:施工管理过程;4:交工验收;5:非招标类物资 服务采购公开;6:征地管理;7:重大合同及设计变更公开;8:装置投用运行效果后评价公开;9:各类检查;*/ - @ApiModelProperty(value="类型:1:招标过程;2:资金使用公开;3:施工管理过程;4:交工验收;5:非招标类物资 服务采购公开;6:征地管理;7:重大合同及设计变更公开;8:装置投用运行效果后评价公开;9:各类检查;") - private java.lang.Integer type ; - /**所属项目SN*/ - @ApiModelProperty(value="所属项目SN") - private java.lang.String projectSn ; - /**创建时间*/ - @ApiModelProperty(value="创建时间") - private java.util.Date createDate ; - /**更新时间*/ - @ApiModelProperty(value="更新时间") - private java.util.Date updateDate ; + private java.lang.String title; + /** + * 内容 + */ + @ApiModelProperty(value = "内容") + private java.lang.String content; + /** + * 类型:1:招标过程;2:资金使用公开;3:施工管理过程;4:交工验收;5:非招标类物资 服务采购公开;6:征地管理;7:重大合同及设计变更公开;8:装置投用运行效果后评价公开;9:各类检查; + */ + @ApiModelProperty(value = "类型:1:招标过程;2:资金使用公开;3:施工管理过程;4:交工验收;5:非招标类物资 服务采购公开;6:征地管理;7:重大合同及设计变更公开;8:装置投用运行效果后评价公开;9:各类检查;") + private java.lang.Integer type; + /** + * 所属项目SN + */ + @ApiModelProperty(value = "所属项目SN") + private java.lang.String projectSn; + /** + * 附件 + */ + @Excel(name = "附件", width = 15) + @ApiModelProperty(value = "附件") + private java.lang.String attachment; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "记录时间 yyyy-MM-dd HH:mm:ss") + private java.util.Date recordDate; + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private java.util.Date createDate; + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + private java.util.Date updateDate; } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java index 56a0658f0..208d5def9 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/WorkerAdmissionDetail.java @@ -185,6 +185,42 @@ public class WorkerAdmissionDetail implements Serializable { */ @ApiModelProperty(value = "区域项目组") private java.lang.Long projectGroup; + /** + * 党内职务 + */ + @Excel(name = "党内职务", width = 15) + @ApiModelProperty(value = "党内职务") + private java.lang.String partyPosition; + /** + * 籍贯 + */ + @Excel(name = "籍贯", width = 15) + @ApiModelProperty(value = "籍贯") + private java.lang.String nativePlace; + /** + * 民族 + */ + @Excel(name = "民族", width = 15) + @ApiModelProperty(value = "民族") + private java.lang.String nation; + /** + * 政治面貌:1:群众,2:正式党员,3:预备党员 + */ + @Excel(name = "政治面貌:1:群众,2:正式党员,3:预备党员", width = 15) + @ApiModelProperty(value = "政治面貌:1:群众,2:正式党员,3:预备党员") + private java.lang.Integer politicsStatus; + /** + * 学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后 + */ + @Excel(name = "学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后", width = 15) + @ApiModelProperty(value = "学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后") + private java.lang.Integer educational; + /** + * 支部名称Id + */ + @Excel(name = "支部名称Id", width = 15) + @ApiModelProperty(value = "支部名称Id") + private java.lang.Long branchId; @TableField(exist = false) private String random; diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/vo/UploadZipWorkAdmissionVo.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/vo/UploadZipWorkAdmissionVo.java index 945272a67..aa1b7efff 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/vo/UploadZipWorkAdmissionVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/vo/UploadZipWorkAdmissionVo.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; import java.util.Date; @@ -14,143 +15,143 @@ public class UploadZipWorkAdmissionVo { * id */ @ApiModelProperty(value = "id") - private java.lang.Long id; + private Long id; /** * 编号 */ @ApiModelProperty(value = "编号") - private java.lang.String num; + private String num; /** * 姓名 */ @ApiModelProperty(value = "姓名") - private java.lang.String workerName; + private String workerName; /** * 人脸采集照片 */ @ApiModelProperty(value = "人脸采集照片") - private java.lang.String fieldAcquisitionUrl; + private String fieldAcquisitionUrl; /** * 身份证人像面 */ @ApiModelProperty(value = "身份证人像面") - private java.lang.String idCardDownPhotoUrl; + private String idCardDownPhotoUrl; /** * 身份证国徽面 */ @ApiModelProperty(value = "身份证国徽面") - private java.lang.String idCardUpPhotoUrl; + private String idCardUpPhotoUrl; /** * EPC承包商 */ @ApiModelProperty(value = "EPC承包商") - private java.lang.Long epcCbs; + private Long epcCbs; /** * 单位 */ @ApiModelProperty(value = "单位") - private java.lang.Long enterpriseId; + private Long enterpriseId; /** * 工作区域(装置) */ @ApiModelProperty(value = "工作区域(装置)") - private java.lang.String workAreaName; + private String workAreaName; /** * 岗位(工种) */ @ApiModelProperty(value = "岗位(工种)") - private java.lang.Long postWorkType; + private Long postWorkType; /** * 班组 */ @ApiModelProperty(value = "班组") - private java.lang.String team; + private String team; /** * 性别,1男,2女 */ @ApiModelProperty(value = "性别,1男,2女") - private java.lang.Integer sex; + private Integer sex; /** * 年龄 */ @ApiModelProperty(value = "年龄") - private java.lang.String age; + private String age; /** * 身份证号 */ @ApiModelProperty(value = "身份证号") - private java.lang.String idCard; + private String idCard; /** * 劳动合同 */ @ApiModelProperty(value = "劳动合同") - private java.lang.String laborContract; + private String laborContract; /** * 保险 */ @ApiModelProperty(value = "保险") - private java.lang.String insurance; + private String insurance; /** * 体检报告 */ @ApiModelProperty(value = "体检报告") - private java.lang.String examinationImage; + private String examinationImage; /** * 截止入场日期 */ @ApiModelProperty(value = "截止入场日期") - private java.lang.String entryDeadline; + private String entryDeadline; /** * 备注 */ @ApiModelProperty(value = "备注") - private java.lang.String remark; + private String remark; /** * 项目sn */ @ApiModelProperty(value = "项目sn") - private java.lang.String projectSn; + private String projectSn; /** * 人员类型 1、劳务人员,2、管理人员,3临时人员 */ @ApiModelProperty(value = "人员类型 1、劳务人员,2、管理人员,3临时人员") - private java.lang.Integer personType; + private Integer personType; /** * 人员入场ID */ @ApiModelProperty(value = "人员入场ID") - private java.lang.Long workerAdmissionId; + private Long workerAdmissionId; /** * 出生日期 */ @ApiModelProperty(value = "出生日期") - private java.lang.String birthday; + private String birthday; /** * 创建时间 */ @ApiModelProperty(value = "创建时间") - private java.util.Date createDate; + private Date createDate; /** * 更新时间 */ @ApiModelProperty(value = "更新时间") - private java.util.Date updateDate; + private Date updateDate; @ApiModelProperty(value = "联系电话") - private java.lang.String phone; + private String phone; @ApiModelProperty(value = "资质是否合格0不合格1合格") - private java.lang.Integer isCertificateQualified; + private Integer isCertificateQualified; @ApiModelProperty(value = "1已经录入0未录入") private Integer isImport; @ApiModelProperty(value = "EPC承包商名称") - private java.lang.String epcCbsName; + private String epcCbsName; @ApiModelProperty(value = "单位名称") - private java.lang.String enterpriseName; + private String enterpriseName; @ApiModelProperty(value = "岗位(工种)名称") - private java.lang.String postWorkTypeName; + private String postWorkTypeName; @ApiModelProperty(value = "成绩") - private java.lang.String score; + private String score; @ApiModelProperty(value = "是否合格") private Integer isPass; @ApiModelProperty(value = "开始考试时间") @@ -158,50 +159,89 @@ public class UploadZipWorkAdmissionVo { @ApiModelProperty(value = "考试记录id") private Long recordId; @ApiModelProperty(value = "办证人") - private java.lang.Long certificateIssuingPerson; + private Long certificateIssuingPerson; /** * 资格证书编号 */ @ApiModelProperty(value = "资格证书编号") - private java.lang.String certificateNumber; + private String certificateNumber; /** * 证书类型 */ @ApiModelProperty(value = "证书类型") - private java.lang.Integer certificateType; + private Integer certificateType; /** * 证书签发单位:1:市场监督管理局;2:应急管理局;3:住房和城乡建设厅;4:人力资源和社会保障部(厅); */ @ApiModelProperty(value = "证书签发单位:1:市场监督管理局;2:应急管理局;3:住房和城乡建设厅;4:人力资源和社会保障部(厅);") - private java.lang.Integer issueCompany; + private Integer issueCompany; /** * 签发日期 */ @ApiModelProperty(value = "签发日期") - private java.lang.String issueTime; + private String issueTime; /** * 截止有效日期 */ @ApiModelProperty(value = "截止有效日期") - private java.lang.String effectTime; + private String effectTime; /** * 证书图片路径 */ @ApiModelProperty(value = "证书图片路径") - private java.lang.String photoUrl; + private String photoUrl; /** * 资质验证 */ @ApiModelProperty(value = "资质验证") - private java.lang.String qualificationVerification; + private String qualificationVerification; /** * 人员入场明细ID */ @ApiModelProperty(value = "人员入场明细ID") - private java.lang.Long workerAdmissionDetailId; + private Long workerAdmissionDetailId; @ApiModelProperty(value = "证书类型名称") - private java.lang.String certificateTypeName; + private String certificateTypeName; @ApiModelProperty(value = "区域项目组") - private java.lang.Long projectGroup; + private Long projectGroup; + /** + * 党内职务 + */ + @Excel(name = "党内职务", width = 15) + @ApiModelProperty(value = "党内职务") + private String partyPosition; + /** + * 籍贯 + */ + @Excel(name = "籍贯", width = 15) + @ApiModelProperty(value = "籍贯") + private String nativePlace; + /** + * 民族 + */ + @Excel(name = "民族", width = 15) + @ApiModelProperty(value = "民族") + private String nation; + /** + * 政治面貌:1:群众,2:正式党员,3:预备党员 + */ + @Excel(name = "政治面貌:1:群众,2:正式党员,3:预备党员", width = 15) + @ApiModelProperty(value = "政治面貌:1:群众,2:正式党员,3:预备党员") + private Integer politicsStatus; + private String politicsStatusStr; + /** + * 学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后 + */ + @Excel(name = "学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后", width = 15) + @ApiModelProperty(value = "学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后") + private Integer educational; + private String educationalStr; + /** + * 支部名称Id + */ + @Excel(name = "支部名称Id", width = 15) + @ApiModelProperty(value = "支部名称Id") + private Long branchId; + private String branchIdStr; } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/SunshineConstructionListMapper.java b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/SunshineConstructionListMapper.java new file mode 100644 index 000000000..9a44cb189 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/SunshineConstructionListMapper.java @@ -0,0 +1,51 @@ +package com.zhgd.xmgl.modules.baotou.mapper; + +import java.util.List; +import java.util.HashMap; + +import com.zhgd.xmgl.modules.baotou.entity.SunshineConstructionList; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 施工管理过程公开列表 + * @author: pds + * @date: 2025-03-07 + * @version: V1.0 + */ +@Mapper +public interface SunshineConstructionListMapper extends BaseMapper { + + /** + * 分页列表查询施工管理过程公开列表信息 + * + * @param page + * @param queryWrapper + * @param param + * @return + */ + IPage queryList(Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper, @Param("param") HashMap param); + + /** + * 列表查询施工管理过程公开列表信息 + * + * @param queryWrapper + * @param param + * @return + */ + List queryList(@Param(Constants.WRAPPER) QueryWrapper queryWrapper, @Param("param") HashMap param); + + + /** + * 通过id查询施工管理过程公开列表信息 + * + * @param id + * @return + */ + SunshineConstructionList queryById(String id); +} diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/PartyConstructionMemberMapper.xml b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/PartyConstructionMemberMapper.xml index 27c1b4ed9..0229446f3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/PartyConstructionMemberMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/PartyConstructionMemberMapper.xml @@ -6,6 +6,7 @@ select * from (select t.*, wi.worker_name + ,pco.classification_name from party_construction_member t left join worker_info wi on wi.id=t.worker_info_id join party_construction_organization pco on t.party_construction_organization_id=pco.id diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/SunshineConstructionListMapper.xml b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/SunshineConstructionListMapper.xml new file mode 100644 index 000000000..87baaffb0 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/mapper/xml/SunshineConstructionListMapper.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/IPartyConstructionMemberService.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/IPartyConstructionMemberService.java index 5f896222d..0b909216a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/IPartyConstructionMemberService.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/IPartyConstructionMemberService.java @@ -45,12 +45,16 @@ public interface IPartyConstructionMemberService extends IService param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/ISunshineConstructionListService.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/ISunshineConstructionListService.java new file mode 100644 index 000000000..c98c3cd55 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/ISunshineConstructionListService.java @@ -0,0 +1,65 @@ +package com.zhgd.xmgl.modules.baotou.service; + +import com.zhgd.xmgl.modules.baotou.entity.SunshineConstructionList; +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: 施工管理过程公开列表 + * @author: pds + * @date: 2025-03-07 + * @version: V1.0 + */ +public interface ISunshineConstructionListService extends IService { + /** + * 分页列表查询施工管理过程公开列表信息 + * + * @param param 参数map + * @return + */ + IPage queryPageList(HashMap param); + + /** + * 列表查询施工管理过程公开列表信息 + * + * @param param 参数map + * @return + */ + List queryList(HashMap param); + + /** + * 添加施工管理过程公开列表信息 + * + * @param sunshineConstructionList 施工管理过程公开列表 + * @return + */ + void add(SunshineConstructionList sunshineConstructionList); + + /** + * 编辑施工管理过程公开列表信息 + * + * @param sunshineConstructionList 施工管理过程公开列表 + * @return + */ + void edit(SunshineConstructionList sunshineConstructionList); + + /** + * 根据id删除施工管理过程公开列表信息 + * + * @param id 施工管理过程公开列表的id + * @return + */ + void delete(String id); + + /** + * 根据id查询施工管理过程公开列表信息 + * + * @param id 施工管理过程公开列表的id + * @return + */ + SunshineConstructionList queryById(String id); + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/IWorkerAdmissionService.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/IWorkerAdmissionService.java index 57c85dea3..c5f4443d4 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/IWorkerAdmissionService.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/IWorkerAdmissionService.java @@ -72,7 +72,7 @@ public interface IWorkerAdmissionService extends IService { void subQualifiedWorkerNum(Long workerAdmissionId); - void exportExcelWorkAdmissionTemplate(HttpServletResponse response, String projectSn); + void exportZipWorkAdmissionTemplate(HttpServletResponse response, String projectSn); Result getUploadExcelWorkAdmissions(MultipartFile excelFile, String projectSn); diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/PartyConstructionMemberServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/PartyConstructionMemberServiceImpl.java index 025c08884..c8fc39c0f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/PartyConstructionMemberServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/PartyConstructionMemberServiceImpl.java @@ -1,48 +1,56 @@ package com.zhgd.xmgl.modules.baotou.service.impl; -import java.math.BigDecimal; +import java.util.Date; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.modules.baotou.entity.PartyConstructionMember; import com.zhgd.xmgl.modules.baotou.entity.vo.PartyConstructionMemberStats; import com.zhgd.xmgl.modules.baotou.mapper.PartyConstructionMemberMapper; import com.zhgd.xmgl.modules.baotou.service.IPartyConstructionMemberService; -import org.hibernate.validator.constraints.Mod10Check; -import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; import com.zhgd.xmgl.util.PageUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - import com.zhgd.xmgl.util.RefUtil; -import org.springframework.transaction.annotation.Transactional; +import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Description: 组织建设成员 * @author: pds - * @date: 2024-08-28 + * @date: 2024-08-28 * @version: V1.0 */ +@Transactional(rollbackFor = Exception.class) @Service public class PartyConstructionMemberServiceImpl extends ServiceImpl implements IPartyConstructionMemberService { @Autowired private PartyConstructionMemberMapper partyConstructionMemberMapper; + @Lazy + @Autowired + private IWorkerInfoService workerInfoService; + @Override public IPage queryPageList(HashMap param) { QueryWrapper queryWrapper = this.getQueryWrapper(param); Page page = PageUtil.getPage(param); - IPage pageList = baseMapper.queryList(page, queryWrapper,param); + IPage pageList = baseMapper.queryList(page, queryWrapper, param); pageList.setRecords(this.dealList(pageList.getRecords())); return pageList; } @@ -72,7 +80,7 @@ public class PartyConstructionMemberServiceImpl extends ServiceImpl mans = members.stream().filter(m -> Objects.equals(m.getSex(), 1)).collect(Collectors.toList()); stats.setMenNum(mans.size()); stats.setWomenNum(members.size() - mans.size()); - stats.setMenPercent(NumberUtil.div(stats.getMenNum(),stats.getTotal(),2)); - stats.setWomenPercent(NumberUtil.div(stats.getWomenNum(),stats.getTotal(),2)); - List dzs = members.stream().filter(m -> Optional.ofNullable(Convert.toInt(m.getEducationalBackground())).map(x->x>=5).orElse(false)).collect(Collectors.toList()); - List sss = members.stream().filter(m -> !Objects.equals(m.getNation(),"汉族")).collect(Collectors.toList()); + stats.setMenPercent(NumberUtil.div(stats.getMenNum(), stats.getTotal(), 2)); + stats.setWomenPercent(NumberUtil.div(stats.getWomenNum(), stats.getTotal(), 2)); + List dzs = members.stream().filter(m -> Optional.ofNullable(Convert.toInt(m.getEducationalBackground())).map(x -> x >= 5).orElse(false)).collect(Collectors.toList()); + List sss = members.stream().filter(m -> !Objects.equals(m.getNation(), "汉族")).collect(Collectors.toList()); stats.setDzNum(dzs.size()); stats.setSsNum(sss.size()); - stats.setDzPercent(NumberUtil.div(stats.getDzNum(),stats.getTotal(),2)); - stats.setSsPercent(NumberUtil.div(stats.getSsNum(),stats.getTotal(),2)); - } + stats.setDzPercent(NumberUtil.div(stats.getDzNum(), stats.getTotal(), 2)); + stats.setSsPercent(NumberUtil.div(stats.getSsNum(), stats.getTotal(), 2)); + } return stats; } + @Override + public void addFromWorker(HashMap param) { + String workerIds = MapUtils.getString(param, "workerIds"); + String projectSn = MapUtils.getString(param, "projectSn"); + Long classifyId = MapUtils.getLong(param, "classifyId"); + if (StrUtil.isBlank(workerIds)) { + return; + } + List workerInfos = workerInfoService.list(new LambdaQueryWrapper() + .eq(WorkerInfo::getId, StrUtil.split(workerIds, ","))); + List idCards = workerInfos.stream().map(WorkerInfo::getIdCard).collect(Collectors.toList()); + Map idCardMap = this.list(new LambdaQueryWrapper() + .eq(PartyConstructionMember::getIdCard, idCards)).stream().collect(Collectors.toMap(PartyConstructionMember::getIdCard, Function.identity(), (o1, o2) -> o1)); + for (WorkerInfo info : workerInfos) { + PartyConstructionMember member = idCardMap.get(info.getIdCard()); + if (member == null) { + member = new PartyConstructionMember(); + } + member.setWorkerInfoId(info.getId()); + member.setPartyConstructionOrganizationId(classifyId); + member.setSex(info.getSex()); + member.setPartyPosition(info.getPartyPosition()); + member.setNation(info.getNation()); + member.setEducationalBackground(info.getEducational()); + member.setNativePlace(info.getNativePlace()); + member.setPersonnelCategory(Optional.ofNullable(info.getPoliticsStatus()).map(m -> m == 2 ? "正式党员" : "预备党员").orElse(null)); + member.setIdCard(info.getIdCard()); + member.setPhoneNumber(info.getPhoneNumber()); + member.setProjectSn(info.getProjectSn()); + if (member.getId() != null) { + this.updateById(member); + } else { + this.save(member); + } + info.setBranchId(classifyId); + workerInfoService.updateById(info); + } + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ProjectGroupServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ProjectGroupServiceImpl.java index 79d38b3e9..177671353 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ProjectGroupServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/ProjectGroupServiceImpl.java @@ -13,8 +13,7 @@ import com.zhgd.redis.lock.redisson.DistributedLock; import com.zhgd.xmgl.modules.baotou.entity.DeviceUnit; import com.zhgd.xmgl.modules.baotou.entity.ProjectGroup; import com.zhgd.xmgl.modules.baotou.entity.ProjectGroupUnit; -import com.zhgd.xmgl.modules.baotou.entity.vo.CountEnterpriseVo; -import com.zhgd.xmgl.modules.baotou.entity.vo.EnterpriseListVo; +import com.zhgd.xmgl.modules.baotou.entity.UserDevGroup; import com.zhgd.xmgl.modules.baotou.entity.vo.ProjectGroupEnterpriseVo; import com.zhgd.xmgl.modules.baotou.mapper.DeviceUnitMapper; import com.zhgd.xmgl.modules.baotou.mapper.ProjectGroupMapper; @@ -23,9 +22,7 @@ import com.zhgd.xmgl.modules.baotou.service.IDeviceUnitService; import com.zhgd.xmgl.modules.baotou.service.IProjectGroupService; import com.zhgd.xmgl.modules.baotou.service.IUserDevGroupService; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; -//import com.zhgd.xmgl.security.SecurityUtil; import com.zhgd.xmgl.security.util.SecurityUtils; -import com.zhgd.xmgl.util.MapBuilder; import com.zhgd.xmgl.util.PageUtil; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -205,10 +202,18 @@ public class ProjectGroupServiceImpl extends ServiceImpl> getTreeList(HashMap param) { + Long userId = SecurityUtils.getUser().getUserId(); List deviceUnits = deviceUnitService.queryList(param); + Integer accountType = SecurityUtils.getUser().getAccountType(); + List devGroupList = new ArrayList<>(); + if (accountType == 6) { + devGroupList = userDevGroupService.list(new LambdaQueryWrapper() + .eq(UserDevGroup::getUserId, userId)); + Map> devMap = devGroupList.stream().filter(o -> o.getType() == 1).collect(Collectors.groupingBy(UserDevGroup::getDevGroupId)); + deviceUnits = deviceUnits.stream().filter(o -> devMap.containsKey(o.getId())).collect(Collectors.toList()); + } List groupList = projectGroupMapper.selectList(new LambdaQueryWrapper() .eq(ProjectGroup::getProjectSn, MapUtils.getString(param, "projectSn"))); List> treeList = new ArrayList<>(); @@ -218,7 +223,14 @@ public class ProjectGroupServiceImpl extends ServiceImpl groups = groupList.stream().filter(o -> projectGroupIds.contains(o.getId().toString())).collect(Collectors.toList()); + List groups; + if (accountType == 6) { + List hasGroupList = devGroupList.stream().filter(o -> o.getNodeId().contains(unit.getId() + "") && o.getType() == 2).collect(Collectors.toList()); + groups = groupList.stream().filter(o -> projectGroupIds.contains(o.getId().toString()) && + hasGroupList.stream().anyMatch(has -> has.getDevGroupId().equals(o.getId()))).collect(Collectors.toList()); + } else { + groups = groupList.stream().filter(o -> projectGroupIds.contains(o.getId().toString())).collect(Collectors.toList()); + } ArrayList> children = new ArrayList<>(); for (ProjectGroup group : groups) { Map m1 = new HashMap<>(); diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineConstructionListServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineConstructionListServiceImpl.java new file mode 100644 index 000000000..9f87bbaa8 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineConstructionListServiceImpl.java @@ -0,0 +1,91 @@ +package com.zhgd.xmgl.modules.baotou.service.impl; + +import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.xmgl.modules.baotou.entity.SunshineConstructionList; +import com.zhgd.xmgl.modules.baotou.mapper.SunshineConstructionListMapper; +import com.zhgd.xmgl.modules.baotou.service.ISunshineConstructionListService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.xmgl.util.PageUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.HashMap; +import java.util.List; + +import com.zhgd.xmgl.util.RefUtil; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 施工管理过程公开列表 + * @author: pds + * @date: 2025-03-07 + * @version: V1.0 + */ +@Service +public class SunshineConstructionListServiceImpl extends ServiceImpl implements ISunshineConstructionListService { + @Autowired + private SunshineConstructionListMapper sunshineConstructionListMapper; + + @Override + public IPage queryPageList(HashMap param) { + QueryWrapper queryWrapper = this.getQueryWrapper(param); + Page page = PageUtil.getPage(param); + IPage pageList = baseMapper.queryList(page, queryWrapper, param); + pageList.setRecords(this.dealList(pageList.getRecords())); + return pageList; + } + + @Override + public List queryList(HashMap param) { + QueryWrapper queryWrapper = getQueryWrapper(param); + return dealList(baseMapper.queryList(queryWrapper, param)); + } + + private QueryWrapper getQueryWrapper(HashMap param) { + QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(SunshineConstructionList.class, param, true); + queryWrapper.orderByDesc(RefUtil.fieldNameUlc(SunshineConstructionList::getId)); + return queryWrapper; + } + + private List dealList(List list) { + return list; + } + + @Override + public void add(SunshineConstructionList sunshineConstructionList) { + sunshineConstructionList.setId(null); + baseMapper.insert(sunshineConstructionList); + } + + @Override + public void edit(SunshineConstructionList sunshineConstructionList) { + SunshineConstructionList oldSunshineConstructionList = baseMapper.selectById(sunshineConstructionList.getId()); + if (oldSunshineConstructionList == null) { + throw new OpenAlertException("未找到对应实体"); + } + baseMapper.updateById(sunshineConstructionList); + } + + @Override + public void delete(String id) { + SunshineConstructionList sunshineConstructionList = baseMapper.selectById(id); + if (sunshineConstructionList == null) { + throw new OpenAlertException("未找到对应实体"); + } + baseMapper.deleteById(id); + } + + @Override + public SunshineConstructionList queryById(String id) { + SunshineConstructionList entity = baseMapper.queryById(id); + if (entity == null) { + throw new OpenAlertException("未找到对应实体"); + } + return entity; + } + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineProjectServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineProjectServiceImpl.java index 4ca60713e..de45ca228 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineProjectServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/SunshineProjectServiceImpl.java @@ -44,7 +44,7 @@ public class SunshineProjectServiceImpl extends ServiceImpl getQueryWrapper(HashMap param) { QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(SunshineProject.class, param, true); - queryWrapper.orderByDesc(RefUtil.fieldNameUlc(SunshineProject::getId)); + queryWrapper.orderByDesc(RefUtil.fieldNameUlc(SunshineProject::getRecordDate)); return queryWrapper; } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java index 317e989a9..791060c15 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/WorkerAdmissionDetailServiceImpl.java @@ -1,6 +1,7 @@ package com.zhgd.xmgl.modules.baotou.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; @@ -12,10 +13,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.constant.Cts; +import com.zhgd.xmgl.modules.baotou.entity.PartyConstructionMember; import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmission; import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmissionCertificateDetail; import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmissionDetail; import com.zhgd.xmgl.modules.baotou.mapper.WorkerAdmissionDetailMapper; +import com.zhgd.xmgl.modules.baotou.service.IPartyConstructionMemberService; import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionCertificateDetailService; import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionDetailService; import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionService; @@ -92,6 +95,9 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl queryPageList(HashMap param) { @@ -362,6 +368,13 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl idCardMap = detailList.stream().collect(Collectors.toMap(WorkerAdmissionDetail::getIdCard, Function.identity(), (o1, o2) -> o1)); existDepartmentInfos.addAll(addDepartments); + //党员身份证 + List partyIdCards = addWorkers.stream().filter(o -> o.getBranchId() != null && (o.getPoliticsStatus() != null && o.getPoliticsStatus() == 2 || o.getPoliticsStatus() == 3)).map(WorkerInfo::getIdCard).collect(Collectors.toList()); + Map existIdCardMap = new HashMap<>(); + if (CollUtil.isNotEmpty(partyIdCards)) { + existIdCardMap = partyConstructionMemberService.list(new LambdaQueryWrapper() + .eq(PartyConstructionMember::getIdCard, partyIdCards)).stream().collect(Collectors.toMap(PartyConstructionMember::getIdCard, Function.identity(), (o1, o2) -> o1)); + } for (WorkerInfo addWorker : addWorkers) { try { if (Objects.equals(addWorker.getPersonType(), 1)) { @@ -374,6 +387,7 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl workerCertificates = addCertificates.stream().filter(o -> Objects.equals(o.getIdCard(), addWorker.getIdCard())).collect(Collectors.toList()); for (WorkerCertificate workerCertificate : workerCertificates) { workerCertificate.setWorkerId(addWorker.getId()); @@ -426,6 +440,39 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl partyIdCards, Map existIdCardMap, WorkerInfo addWorker) { + if (partyIdCards.contains(addWorker.getIdCard())) { + //保存党员 + PartyConstructionMember member = existIdCardMap.get(addWorker.getIdCard()); + if (member == null) { + member = new PartyConstructionMember(); + } + member.setWorkerInfoId(addWorker.getId()); + member.setPartyConstructionOrganizationId(addWorker.getBranchId()); + member.setSex(addWorker.getSex()); + member.setPartyPosition(addWorker.getPartyPosition()); + member.setNation(addWorker.getNation()); + member.setEducationalBackground(addWorker.getEducational()); + member.setNativePlace(addWorker.getNativePlace()); + member.setPersonnelCategory(Optional.ofNullable(addWorker.getPoliticsStatus()).map(m -> m == 2 ? "正式党员" : "预备党员").orElse(null)); + member.setIdCard(addWorker.getIdCard()); + member.setPhoneNumber(addWorker.getPhoneNumber()); + member.setProjectSn(addWorker.getProjectSn()); + if (member.getId() != null) { + partyConstructionMemberService.updateById(member); + } else { + partyConstructionMemberService.save(member); + } + } + } + private String getIssueCompany(Integer issueCompany) { if (issueCompany == null) { return null; @@ -498,6 +545,12 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl queryPageList(HashMap param) { @@ -268,6 +278,26 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl ps = Arrays.asList("群众", + "正式党员", + "预备党员"); + int p = ps.indexOf(FlowUtil.getString(m, "field1540833140001")); + detail.setPoliticsStatus(p != -1 ? p + 1 : null); + List edus = Arrays.asList("小学", + "初中", + "中专", + "高中", + "大专", + "本科", + "研究生", + "博士", + "博士后"); + int edu = edus.indexOf(FlowUtil.getString(m, "field9454332932104")); + detail.setEducational(edu != -1 ? edu + 1 : null); + detail.setBranchId(FlowUtil.getLongByCascade(m, "field7244036504230")); if (nums.contains(num)) { repeatStrs.add(detail.getWorkerName() + "[" + detail.getNum() + "]"); continue; @@ -375,7 +405,7 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl enterpriseInfos = projectEnterpriseService.queryPageList(new MapBuilder() .put("projectSn", projectSn) .put(Cts.PAGE_SIZE, -1) @@ -397,7 +427,34 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl groupList = projectGroupService.list(new LambdaQueryWrapper() .eq(ProjectGroup::getProjectSn, projectSn)); - ExcelUtils.exportExcelWorkAdmissionTemplate(response, epcInfos, enterpriseInfos, deviceUnits, postWorkTypes, certTypeList, groupList); + List organizations = partyConstructionOrganizationService.list(new LambdaQueryWrapper() + .eq(PartyConstructionOrganization::getProjectSn, projectSn)); + String dir = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + "/人员入场导入模版"; + FileUtil.mkdir(dir); + Arrays.asList("体检报告", + "保险", + "劳动合同", + "人脸采集图片", + "人员资质", + "人员资质验证", + "身份证国徽面", + "身份证人像面文件夹").forEach(o -> { + FileUtil.mkdir(new File(dir, o)); + }); + ExcelUtils.exportExcelWorkAdmissionTemplate(response, epcInfos, enterpriseInfos, deviceUnits, postWorkTypes, certTypeList, groupList, new File(dir, "人员入场导入模板.xlsx"), organizations); + ZipUtil.zip(dir); + try { + OutputStream out = response.getOutputStream(); + response.setContentType("application/json"); + response.setHeader("Content-disposition", "attachment; filename=" + + URLEncoder.encode(new File(dir + ".zip").getName(), "UTF-8")); + InputStream fis = new FileInputStream(dir + ".zip"); + IOUtils.copy(fis, out); + out.flush(); + out.close(); + } catch (Exception e) { + log.error("", e); + } } @Override diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/service/impl/ExamTrainRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/exam/service/impl/ExamTrainRecordServiceImpl.java index db6a9dcfa..d1bf309ae 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/service/impl/ExamTrainRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/exam/service/impl/ExamTrainRecordServiceImpl.java @@ -191,8 +191,8 @@ public class ExamTrainRecordServiceImpl extends ServiceImpl admissionDetails = detailList.stream().filter(o -> !Objects.equals(o.getIsPass(), 0)).collect(Collectors.toList()); + List admissionDetails = detailList.stream().sorted((o1, o2) -> o1.getNum().compareTo(o2.getNum())).collect(Collectors.toList()); + String firstNum = ""; if (CollUtil.isNotEmpty(admissionDetails)) { WorkerAdmissionDetail detail = admissionDetails.get(0); - String num = detail.getNum(); - Matcher matcher = lastNumPattern.matcher(num); + firstNum = detail.getNum(); + } + admissionDetails = admissionDetails.stream().sorted(Comparator.comparing(WorkerAdmissionDetail::getIsPass, Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(admissionDetails)) { + Matcher matcher = lastNumPattern.matcher(firstNum); if (matcher.find()) { String group = matcher.group(); - String prefix = StringUtils.substring(num, 0, num.length() - group.length()); + String prefix = StringUtils.substring(firstNum, 0, firstNum.length() - group.length()); Integer n = Convert.toInt(group); for (WorkerAdmissionDetail d : admissionDetails) { String newNum = prefix + NumberUtils.fillZero(n, group.length()); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java index b6f918eea..f88b00dd3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java @@ -174,7 +174,7 @@ public class WorkerInfoController { @ApiImplicitParam(name = "chargePersonName", value = "负责人姓名(部门)", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "belongingSection", value = "所属标段(部门)", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "projectSnList", value = "项目SN列表", paramType = "body", required = false, dataType = "String"), - @ApiImplicitParam(name = "orderBy", value = "排序:1退场时间倒序2进场日期倒序", paramType = "body", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "orderBy", value = "排序:1退场时间倒序2进场日期倒序,numAsc:编号正序,numDesc:编号倒序", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "workerInfos", value = "劳务人员id(多个,分割)", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "presence", value = "1在场2离场", paramType = "body", required = false, dataType = "Integer"), @ApiImplicitParam(name = "attendance", value = "1今日出勤", paramType = "body", required = false, dataType = "Integer"), @@ -183,6 +183,7 @@ public class WorkerInfoController { @ApiImplicitParam(name = "safeScoreLevel", value = "安全得分风险(1高风险2中风险3低风险)", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "workerTypeId", value = "工种id", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "isSpecial", value = "1是特殊工种", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "isPartyMember", value = "1是正式或预备党员", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/selectWorkerInfoList") public Result> selectWorkerInfoList(@RequestBody Map map) { diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java index c148b745a..7bd0ec7c3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java @@ -129,10 +129,10 @@ public class WorkerInfo implements Serializable { @ApiModelProperty(value = "血型") private java.lang.String blood; /** - * 1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后 + * 学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后 */ - @Excel(name = "1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后", width = 15) - @ApiModelProperty(value = "1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后") + @Excel(name = "学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后", width = 15) + @ApiModelProperty(value = "学历:1小学、2初中、3中专、4高中、5大专、6本科、7研究生、8博士、9博士后") private java.lang.String educational; /** * 婚否 1未婚 2已婚 3离异 4丧偶 @@ -141,10 +141,10 @@ public class WorkerInfo implements Serializable { @ApiModelProperty(value = "婚否 1未婚 2已婚 3离异 4丧偶") private java.lang.Integer marry; /** - * 政治面貌:1.中共党员 2.共青团团员 3.普通居民 4.其他党派人士 + * 政治面貌:1:群众,2:正式党员,3:预备党员 */ - @Excel(name = "政治面貌:1.中共党员 2.共青团团员 3.普通居民 4.其他党派人士", width = 15) - @ApiModelProperty(value = "政治面貌:1.中共党员 2.共青团团员 3.普通居民 4.其他党派人士") + @Excel(name = "政治面貌:1:群众,2:正式党员,3:预备党员", width = 15) + @ApiModelProperty(value = "政治面貌:1:群众,2:正式党员,3:预备党员") private java.lang.Integer politicsStatus; /** * 紧急联系人 @@ -363,6 +363,18 @@ public class WorkerInfo implements Serializable { private Long noticeUserId; @ApiModelProperty(value = "区域项目组") private java.lang.Long projectGroup; + /** + * 党内职务 + */ + @Excel(name = "党内职务", width = 15) + @ApiModelProperty(value = "党内职务") + private java.lang.String partyPosition; + /** + * 支部名称Id + */ + @Excel(name = "支部名称Id", width = 15) + @ApiModelProperty(value = "支部名称Id") + private java.lang.Long branchId; @TableField(exist = false) @ApiModelProperty(value = "人脸分数") private java.lang.Integer faceScore; diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml index 8d1430c75..1b23ff2b1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml @@ -53,6 +53,9 @@ and create_time>=current_date group by person_sn ) wa on wa.person_sn = a.person_sn WHERE 1 = 1 + + and (a.politics_status = 2 or a.politics_status = 3) + and a.bt_department like concat('%', #{param.btDepartment},'%') @@ -79,7 +82,7 @@ and if(a.person_type=1,wt.type_name,c.department_name) like concat('%', #{param.postWorkTypeName},'%') - and du.device_unit_name like concat('%',#{param.workAreaName},'%') + and (c.department_name like CONCAT(CONCAT('%',#{param.postWorkTypeName}),'%') or wt.type_name like @@ -270,6 +273,48 @@ order by a.enter_date desc + + order by a.num asc + + + order by a.num desc + + + order by en.enterprise_name asc + + + order by en.enterprise_name desc + + + order by a.worker_name asc + + + order by a.worker_name desc + + + order by post_work_type_name asc + + + order by post_work_type_name desc + + + order by a.sex asc + + + order by a.sex desc + + + order by age asc + + + order by age desc + + + order by a.phone_number asc + + + order by a.phone_number desc + order by a.add_time desc,a.id desc diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index d72c1d543..6d5cf77bf 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -32,9 +32,11 @@ import com.zhgd.xmgl.base.entity.vo.TrendOneVo; import com.zhgd.xmgl.call.HikvisionCall; import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.modules.baotou.entity.DeviceUnit; +import com.zhgd.xmgl.modules.baotou.entity.PartyConstructionOrganization; import com.zhgd.xmgl.modules.baotou.entity.ProjectGroup; import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmissionDetail; import com.zhgd.xmgl.modules.baotou.service.IDeviceUnitService; +import com.zhgd.xmgl.modules.baotou.service.IPartyConstructionOrganizationService; import com.zhgd.xmgl.modules.baotou.service.IProjectGroupService; import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionDetailService; import com.zhgd.xmgl.modules.basicdata.entity.Company; @@ -311,6 +313,9 @@ public class WorkerInfoServiceImpl extends ServiceImpl() +// .eq(Project::getProjectSn, workerInfo.getProjectSn())); +// if (project == null) { +// throw new OpenAlertException("项目不存在"); +// } +// JSONObject param = new JSONObject(); +// String fieldAcquisitionUrl = workerInfo.getFieldAcquisitionUrl(); +// if (StrUtil.isBlank(fieldAcquisitionUrl)) { +// throw new OpenAlertException("fieldAcquisitionUrl不能为空"); +// } +// param.put("facePicBinaryData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(basePath + "/" + fieldAcquisitionUrl))); +// return hikvisionCall.faceScore(project, param); +// } + /** * 修改人员班组 * @@ -393,21 +413,6 @@ public class WorkerInfoServiceImpl extends ServiceImpl() -// .eq(Project::getProjectSn, workerInfo.getProjectSn())); -// if (project == null) { -// throw new OpenAlertException("项目不存在"); -// } -// JSONObject param = new JSONObject(); -// String fieldAcquisitionUrl = workerInfo.getFieldAcquisitionUrl(); -// if (StrUtil.isBlank(fieldAcquisitionUrl)) { -// throw new OpenAlertException("fieldAcquisitionUrl不能为空"); -// } -// param.put("facePicBinaryData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(basePath + "/" + fieldAcquisitionUrl))); -// return hikvisionCall.faceScore(project, param); -// } - @Override public void updateWorkerDepartment(Map map) { String workerIdStr = MapUtils.getString(map, "workerIdStr"); @@ -1144,26 +1149,6 @@ public class WorkerInfoServiceImpl extends ServiceImpl selectProjectWorkerTypeTotalList(Map map) { - List list = workerInfoMapper.selectProjectWorkerTypeTotalList(map); - if (list != null && list.size() > 0) { - List typeData = workerInfoMapper.selelctWorkerTypePersonCount(map); - for (ProjectWorkerTypeTotalVo data : list) { - int num = 0; - String id = data.getId(); - for (ProjectWorkerTypeTotalVo tempData : typeData) { - if (id.equals(tempData.getWorkerTypeId())) { - num = tempData.getPersonNum(); - } - } - //总人数 - data.setWorkerNum(num); - } - } - return list; - } - // @Override // public void exporZipWorkerInfo(HttpServletResponse response, Map map) { // try { @@ -1251,6 +1236,26 @@ public class WorkerInfoServiceImpl extends ServiceImpl selectProjectWorkerTypeTotalList(Map map) { + List list = workerInfoMapper.selectProjectWorkerTypeTotalList(map); + if (list != null && list.size() > 0) { + List typeData = workerInfoMapper.selelctWorkerTypePersonCount(map); + for (ProjectWorkerTypeTotalVo data : list) { + int num = 0; + String id = data.getId(); + for (ProjectWorkerTypeTotalVo tempData : typeData) { + if (id.equals(tempData.getWorkerTypeId())) { + num = tempData.getPersonNum(); + } + } + //总人数 + data.setWorkerNum(num); + } + } + return list; + } + /** * 人员下载 * @@ -1942,7 +1947,9 @@ public class WorkerInfoServiceImpl extends ServiceImpl groupList = projectGroupService.list(new LambdaQueryWrapper() .eq(ProjectGroup::getProjectSn, projectSn)); - ExcelUtils.exporExcelWorkerTemplate(response, deviceUnitList, enterpriseInfoList, departmentList, workerTypeList, groupList); + List organizations = partyConstructionOrganizationService.list(new LambdaQueryWrapper() + .eq(PartyConstructionOrganization::getProjectSn, projectSn)); + ExcelUtils.exporExcelWorkerTemplate(response, deviceUnitList, enterpriseInfoList, departmentList, workerTypeList, groupList, organizations); } @Override @@ -1993,6 +2000,8 @@ public class WorkerInfoServiceImpl extends ServiceImpl deviceUnit)); Map groupMap = projectGroupService.list(new LambdaQueryWrapper() .eq(ProjectGroup::getProjectSn, projectSn)).stream().collect(Collectors.toMap(ProjectGroup::getProjectGroupName, Function.identity(), (o1, o2) -> o1)); + Map orgMap = partyConstructionOrganizationService.list(new LambdaQueryWrapper() + .eq(PartyConstructionOrganization::getProjectSn, projectSn)).stream().collect(Collectors.toMap(PartyConstructionOrganization::getClassificationName, Function.identity(), (o1, o2) -> o1)); for (Map importInfo : list) { WorkerInfo workerInfo = new WorkerInfo(); workerInfo.setProjectSn(projectSn); @@ -2061,17 +2070,14 @@ public class WorkerInfoServiceImpl extends ServiceImpl ps = Arrays.asList("群众", + "正式党员", + "预备党员"); + int p = ps.indexOf(importInfo.get("政治面貌")); + workerInfo.setPoliticsStatus(p != -1 ? p + 1 : null); + workerInfo.setPartyPosition(importInfo.get("党内职务")); workerInfo.setPayRollBankNumber(importInfo.get("银行卡号")); + workerInfo.setBranchId(Optional.ofNullable(orgMap.get(importInfo.get("支部名称"))).map(m -> m.getId()).orElse(null)); workerInfo.setInserviceType(1); workerInfo.setUfaceDevId(ufaceId); workerInfo.setWorkAreaName(importInfo.get("工作区域")); diff --git a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java index 134af3639..2da488c91 100644 --- a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java @@ -2,6 +2,7 @@ package com.zhgd.xmgl.util; import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.modules.baotou.entity.DeviceUnit; +import com.zhgd.xmgl.modules.baotou.entity.PartyConstructionOrganization; import com.zhgd.xmgl.modules.baotou.entity.PostWorkType; import com.zhgd.xmgl.modules.baotou.entity.ProjectGroup; import com.zhgd.xmgl.modules.basicdata.entity.DictionariesRecord; @@ -24,9 +25,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.core.io.ClassPathResource; import javax.servlet.http.HttpServletResponse; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.URLEncoder; import java.util.*; @@ -232,12 +231,22 @@ public class ExcelUtils { } } - public static void exporExcelWorkerTemplate(HttpServletResponse response, List deviceUnitList, List enterpriseInfoList, List departmentList, List typeList, List groupList) { + public static void exporExcelWorkerTemplate(HttpServletResponse response, List deviceUnitList, List enterpriseInfoList, List departmentList, List typeList, List groupList, List organizations) { try { ClassPathResource classPathResource = new ClassPathResource("excel/人员导入模板.xlsx"); InputStream inputStream = classPathResource.getInputStream(); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); - + //支部名称下拉 + XSSFSheet sheet7 = workbook.getSheet("支部名称"); + if (organizations.size() > 0) { + for (int i = 0; i < organizations.size(); i++) { + XSSFRow row1 = sheet7.createRow(i); + XSSFCell cell1 = row1.createCell(0); + PartyConstructionOrganization obj = organizations.get(i); + cell1.setCellType(CellType.STRING); + cell1.setCellValue(obj.getClassificationName()); + } + } //项目组下拉 XSSFSheet sheet5 = workbook.getSheet("项目组"); if (groupList.size() > 0) { @@ -479,11 +488,22 @@ public class ExcelUtils { } } - public static void exportExcelWorkAdmissionTemplate(HttpServletResponse response, List epcInfos, List enterpriseInfos, List deviceUnits, List workerTypeList, List certTypeList, List groupList) { + public static void exportExcelWorkAdmissionTemplate(HttpServletResponse response, List epcInfos, List enterpriseInfos, List deviceUnits, List workerTypeList, List certTypeList, List groupList, File output, List organizations) { try { ClassPathResource classPathResource = new ClassPathResource("excel/人员入场导入模板.xlsx"); InputStream inputStream = classPathResource.getInputStream(); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); + //支部名称下拉 + XSSFSheet sheet7 = workbook.getSheet("支部名称"); + if (organizations.size() > 0) { + for (int i = 0; i < organizations.size(); i++) { + XSSFRow row1 = sheet7.createRow(i); + XSSFCell cell1 = row1.createCell(0); + PartyConstructionOrganization obj = organizations.get(i); + cell1.setCellType(CellType.STRING); + cell1.setCellValue(obj.getClassificationName()); + } + } //资质类型下拉 XSSFSheet sheet6 = workbook.getSheet("资质类型"); if (certTypeList.size() > 0) { @@ -554,7 +574,8 @@ public class ExcelUtils { cell1.setCellValue(obj.getPostWorkTypeName()); } } - downLoadExcel("人员入场导入模板.xlsx", response, workbook); + workbook.write(new FileOutputStream(output)); +// downLoadExcel("人员入场导入模板.xlsx", response, workbook); } catch (IOException e) { log.error("error:", e); } diff --git a/src/main/java/com/zhgd/xmgl/util/FlowUtil.java b/src/main/java/com/zhgd/xmgl/util/FlowUtil.java index 30cc728b6..d0f6f7655 100644 --- a/src/main/java/com/zhgd/xmgl/util/FlowUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/FlowUtil.java @@ -1,5 +1,6 @@ package com.zhgd.xmgl.util; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -216,4 +217,17 @@ public class FlowUtil { } return url.toString(); } + + /** + * 获取级联的最后的long + * + * @param m + * @param name + * @return + */ + public static Long getLongByCascade(Map m, String name) { + List classs = StrUtil.split(FlowUtil.getString(m, name), "-"); + return CollUtil.isNotEmpty(classs) ? Long.valueOf(classs.get(classs.size() - 1)) : null; + } + } diff --git a/src/main/resources/excel/人员入场导入模板.xlsx b/src/main/resources/excel/人员入场导入模板.xlsx index 6986217aa85b1e5eb3630ae92379d3600cc59328..85df1d187d1ced291462f1c2f87477a87e7fc78a 100644 GIT binary patch delta 11878 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