From 58d31795acedec0662907a00b8ffe8b8d3889db6 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Fri, 24 Jan 2025 17:37:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(smartfactory):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=91=98=E5=B7=A5=E7=9B=B8=E5=85=B3=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增员工导入模板下载和导入功能 - 添加获取指定厂区员工列表的接口 - 优化员工信息相关接口,移除不必要的字段 - 重构员工信息的数据库表结构 --- .../admin/staff/StaffController.java | 65 +++++++++- .../admin/staff/vo/StaffImportExcelVO.java | 43 +++++++ .../admin/staff/vo/StaffImportRespVO.java | 24 ++++ .../admin/staff/vo/StaffPageReqVO.java | 26 +--- .../admin/staff/vo/StaffRespVO.java | 38 +++--- .../admin/staff/vo/StaffSaveReqVO.java | 33 ++--- .../dal/dataobject/staff/StaffDO.java | 45 ++++--- .../dal/mysql/staff/StaffMapper.java | 12 +- .../service/staff/StaffService.java | 39 +++++- .../service/staff/StaffServiceImpl.java | 119 ++++++++++++++++++ .../resources/mapper/staff/StaffMapper.xml | 8 +- 11 files changed, 359 insertions(+), 93 deletions(-) create mode 100644 zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportExcelVO.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportRespVO.java diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/StaffController.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/StaffController.java index 93dfe8d0..357813c0 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/StaffController.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/StaffController.java @@ -6,36 +6,47 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffPageReqVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffRespVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffSaveReqVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.*; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO; +import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService; import cn.iocoder.yudao.module.smartfactory.service.staff.StaffService; +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; +import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 员工") @RestController -@RequestMapping("/factory/staff") +@RequestMapping("/smartfactory/staff") @Validated public class StaffController { @Resource private StaffService staffService; + @Resource + private FactoryInfoService factoryInfoService; + + @Resource + private DictDataApi dictDataApi; + @PostMapping("/create") @Operation(summary = "创建员工") @PreAuthorize("@ss.hasPermission('factory:staff:create')") @@ -69,6 +80,17 @@ public class StaffController { return success(BeanUtils.toBean(staff, StaffRespVO.class)); } + @GetMapping("/getListByFactory") + @Operation(summary = "获得指定厂区得员工") + @Parameter(name = "factoryId", description = "厂区编号", required = true, example = "1024") + @Parameter(name = "isIn", description = "是否获取该厂区得员工", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('factory:staff:query')") + public CommonResult> getListByFactory(@RequestParam("factoryId") Long factoryId, + @RequestParam("isIn") Boolean isIn) { + List staffs = staffService.getListByFactory(factoryId, isIn); + return success(BeanUtils.toBean(staffs, StaffRespVO.class)); + } + @GetMapping("/page") @Operation(summary = "获得员工分页") @PreAuthorize("@ss.hasPermission('factory:staff:query')") @@ -90,4 +112,39 @@ public class StaffController { BeanUtils.toBean(list, StaffRespVO.class)); } + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + + //获取部门名称 + List factoryInfoDOS = factoryInfoService.getFactoryListByType(); + List factoryName = factoryInfoDOS.stream() + .map(item -> item.getId() + ":" + item.getName()) + .collect(Collectors.toList()); + + //获取工种名称 + List workTypeVOs = dictDataApi.getDictDataList("user_work_type").getCheckedData(); + List workTypeName = workTypeVOs.stream() + .map(item -> item.getValue() + ":" + item.getLabel()) + .collect(Collectors.toList()); + + // 输出 + ExcelUtils.write(response, "工人导入模板.xlsx", "工人列表", + StaffImportExcelVO.class, null, + 1, factoryName, + 2, workTypeName); + } + + @PostMapping("/import") + @Operation(summary = "导入用户") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('factory:staff:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, StaffImportExcelVO.class); + return success(staffService.importUserList(list, updateSupport)); + } } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportExcelVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportExcelVO.java new file mode 100644 index 00000000..af42ec3a --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportExcelVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo; + +import cn.iocoder.yudao.framework.common.validation.IdCard; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class StaffImportExcelVO { + + @ExcelProperty("用户名称") + private String nickName; + + @ExcelProperty("厂区名称") + private String factoryName; + + @ExcelProperty("工种名称") + private String workTypeName; + + @ExcelProperty("手机号码") + @Mobile + private String mobile; + + @ExcelProperty("身份证号码") + @IdCard + private String idCard; + + @ExcelProperty("薪资") + private BigDecimal salary; +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportRespVO.java new file mode 100644 index 00000000..9c6732b7 --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffImportRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 用户导入 Response VO") +@Data +@Builder +public class StaffImportRespVO { + + @Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createUsernames; + + @Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateUsernames; + + @Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureUsernames; + +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffPageReqVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffPageReqVO.java index efcc01e5..dc6dbc10 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffPageReqVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffPageReqVO.java @@ -1,13 +1,10 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo; -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; @Schema(description = "管理后台 - 员工分页 Request VO") @Data @@ -15,9 +12,6 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class StaffPageReqVO extends PageParam { - @Schema(description = "员工编号") - private String staffNo; - @Schema(description = "员工昵称") private String nickName; @@ -27,23 +21,13 @@ public class StaffPageReqVO extends PageParam { @Schema(description = "用户性别(0男 1女 2未知)") private Integer sex; - @Schema(description = "岗位id", example = "28091") - private Long postId; - @Schema(description = "工种id", example = "6971") - private Long workTypeId; + private Integer workTypeId; @Schema(description = "工厂id", example = "6971") private Long factoryId; - @Schema(description = "身份证号") - private String idCard; - @Schema(description = "0离职 1在职", example = "1") private Integer status; - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffRespVO.java index cf8babb1..0d0f7506 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffRespVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffRespVO.java @@ -1,27 +1,23 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; +import lombok.Data; + import java.time.LocalDateTime; -import com.alibaba.excel.annotation.*; @Schema(description = "管理后台 - 员工 Response VO") @Data @ExcelIgnoreUnannotated public class StaffRespVO { - @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8717") - @ExcelProperty("主键id") + @Schema(description = "主键id") + @ExcelProperty("序号") private Long id; - @Schema(description = "员工编号") - @ExcelProperty("员工编号") - private String staffNo; - @Schema(description = "员工昵称") + @ExcelProperty("姓名") private String nickName; @Schema(description = "年龄") @@ -29,29 +25,31 @@ public class StaffRespVO { private Integer age; @Schema(description = "用户性别(0男 1女 2未知)") + @ExcelProperty("性别") private Integer sex; - @Schema(description = "岗位id", example = "28091") - @ExcelProperty("岗位id") - private Long postId; - @Schema(description = "工种id", example = "6971") - @ExcelProperty("工种id") - private Long workTypeId; + private Integer workTypeId; @Schema(description = "工厂id", example = "6971") private Long factoryId; + @Schema(description = "工厂名称", example = "6971") + @ExcelProperty("工厂名称") + private String factoryName; + + @Schema(description = "手机号") + @ExcelProperty("手机号") + private String mobile; + @Schema(description = "身份证号") @ExcelProperty("身份证号") private String idCard; - @Schema(description = "0离职 1在职", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("0离职 1在职") + @Schema(description = "0离职 1在职 2工伤") private Integer status; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") private LocalDateTime createTime; } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffSaveReqVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffSaveReqVO.java index c09b352a..7e75f02f 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffSaveReqVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/staff/vo/StaffSaveReqVO.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo; +import cn.iocoder.yudao.framework.common.validation.IdCard; +import cn.iocoder.yudao.framework.common.validation.Mobile; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import javax.validation.constraints.*; -import java.util.*; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; @Schema(description = "管理后台 - 员工新增/修改 Request VO") @Data @@ -13,9 +15,6 @@ public class StaffSaveReqVO { @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8717") private Long id; - @Schema(description = "员工编号") - private String staffNo; - @Schema(description = "员工昵称") private String nickName; @@ -25,20 +24,26 @@ public class StaffSaveReqVO { @Schema(description = "用户性别(0男 1女 2未知)") private Integer sex; - @Schema(description = "岗位id", example = "28091") - private Long postId; - @Schema(description = "工种id", example = "6971") - private Long workTypeId; + private Integer workTypeId; @Schema(description = "工厂id", example = "6971") private Long factoryId; - @Schema(description = "身份证号") + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @NotNull(message = "手机号不能为空") + @Mobile + private String mobile; + + @Schema(description = "身份证号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @NotNull(message = "身份证号不能为空") + @IdCard private String idCard; - @Schema(description = "0离职 1在职", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "0离职 1在职不能为空") + @Schema(description = "薪资") + private BigDecimal salary; + + @Schema(description = "0离职 1在职 2工伤") private Integer status; } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/staff/StaffDO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/staff/StaffDO.java index da5235d0..346a27b8 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/staff/StaffDO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/staff/StaffDO.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff; -import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; /** * 员工 DO @@ -13,7 +14,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; * @author 艾楷 */ @TableName("sf_staff") -@KeySequence("sf_staff_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -27,47 +27,52 @@ public class StaffDO extends BaseDO { */ @TableId private Long id; - /** - * 员工编号 - */ - private String staffNo; + /** * 员工昵称 */ private String nickName; + /** * 年龄 */ private Integer age; + /** * 用户性别(0男 1女 2未知) */ private Integer sex; - /** - * 岗位id - */ - private Long postId; + /** * 工种id */ - private Long workTypeId; + private Integer workTypeId; + /** * 工厂id */ private Long factoryId; + + /** + * 手机号 + */ + private String mobile; + /** * 身份证号 */ private String idCard; + /** - * 0离职 1在职 + * 工资 + */ + private BigDecimal salary; + + /** + * 0离职 1在职 2工伤 */ private Integer status; - /** - * 岗位名称 - */ @TableField(exist = false) private String postName; - } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/staff/StaffMapper.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/staff/StaffMapper.java index 1cb1fb5e..26903be2 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/staff/StaffMapper.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/staff/StaffMapper.java @@ -20,28 +20,24 @@ public interface StaffMapper extends BaseMapperX { default PageResult selectPage(StaffPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(StaffDO::getStaffNo, reqVO.getStaffNo()) .eqIfPresent(StaffDO::getAge, reqVO.getAge()) - .eqIfPresent(StaffDO::getPostId, reqVO.getPostId()) .eqIfPresent(StaffDO::getWorkTypeId, reqVO.getWorkTypeId()) - .eqIfPresent(StaffDO::getIdCard, reqVO.getIdCard()) .eqIfPresent(StaffDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(StaffDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(StaffDO::getId)); } /** * 通过工厂id获取员工信息 * - * @param factoryId - * @return + * @param factoryId 工厂编号 + * @return 员工信息列表 */ List getStaffData(@Param("factoryId") Long factoryId); /** * 获取员工信息 - * @param factoryId - * @return + * @param factoryId 工厂编号 + * @return 员工信息列表 */ List getStaffDataV2(@Param("factoryId") Long factoryId); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffService.java index 47074973..b4b6c852 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffService.java @@ -1,12 +1,13 @@ package cn.iocoder.yudao.module.smartfactory.service.staff; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffPageReqVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffSaveReqVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.*; import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.StaffDataRespVO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO; import javax.validation.Valid; +import java.util.Collection; +import java.util.List; /** * 员工 Service 接口 @@ -69,8 +70,40 @@ public interface StaffService { /** * 查询工厂员工信息 - * @param factoryId + * @param factoryId 工厂编号 * @return */ StaffDataRespVO getStaffDataV2(Long factoryId); + + /** + * 导入员工 + * @param list 导入数据集合 + * @param updateSupport 是否可更新 + * @return 导入结果 + */ + StaffImportRespVO importUserList(List list, Boolean updateSupport); + + /** + * 获取指定厂区得员工列表 + * + * @param factoryId 工厂编号 + * @param isIn 是否获取该厂区员工 + * @return 员工列表 + */ + List getListByFactory(Long factoryId, Boolean isIn); + + /** + * 获取指定厂区得员工列表 + * + * @param factoryIds 工厂编号集合 + * @return 员工列表 + */ + List getListByFactoryIds(Collection factoryIds); + + /** + * 获取员工信息列表 + * @param staffIds 员工编号集合 + * @return 员工信息列表 + */ + List getList(Collection staffIds); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java index 4ddf7bff..54c6fb1c 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java @@ -1,19 +1,35 @@ package cn.iocoder.yudao.module.smartfactory.service.staff; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.string.DTO.IdCardDO; +import cn.iocoder.yudao.framework.common.util.string.StrUtils; +import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.StaffDataRespVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffImportExcelVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffImportRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffPageReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffSaveReqVO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO; import cn.iocoder.yudao.module.smartfactory.dal.mysql.staff.StaffMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; + /** * 员工 Service 实现类 @@ -38,6 +54,7 @@ public class StaffServiceImpl implements StaffService { @Override public void updateStaff(StaffSaveReqVO updateReqVO) { + validateUserForCreateOrUpdate(updateReqVO.getId(), null, null, null); // 更新 StaffDO updateObj = BeanUtils.toBean(updateReqVO, StaffDO.class); staffMapper.updateById(updateObj); @@ -49,6 +66,22 @@ public class StaffServiceImpl implements StaffService { staffMapper.deleteById(id); } + private void validateUserForCreateOrUpdate(Long id, String username, String mobile, String idCard) { + // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 + DataPermissionUtils.executeIgnore(() -> { + + // 校验用户名、身份证号是否已经存在 + Long cunt = staffMapper.selectCount(new LambdaQueryWrapperX() + .eqIfPresent(StaffDO::getId, id) + .eqIfPresent(StaffDO::getNickName, username) + .eqIfPresent(StaffDO::getIdCard, idCard) + .eqIfPresent(StaffDO::getMobile, mobile)); + if (cunt > 0) { + throw exception(USER_USERNAME_EXISTS); + } + }); + } + @Override public StaffDO getStaff(Long id) { return staffMapper.selectById(id); @@ -86,4 +119,90 @@ public class StaffServiceImpl implements StaffService { return vo; } + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public StaffImportRespVO importUserList(List importUsers, Boolean updateSupport) { + if (CollUtil.isEmpty(importUsers)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + StaffImportRespVO respVO = StaffImportRespVO.builder() + .createUsernames(new ArrayList<>()) + .updateUsernames(new ArrayList<>()) + .failureUsernames(new HashMap<>()).build(); + + importUsers.forEach(importUser -> { + if (importUser.getNickName() == null) { + return; + } + //校验,判断是否有不符合的原因 + try { + if (!updateSupport) { + validateUserForCreateOrUpdate(null, importUser.getNickName(), null, importUser.getIdCard()); + } + } catch (ServiceException ex) { + respVO.getFailureUsernames().put(importUser.getNickName(), ex.getMessage()); + return; + } + + StaffDO updateUser = BeanUtils.toBean(importUser, StaffDO.class); + + //解析身份证号码 + IdCardDO idCardDO = StrUtils.IdCardAnalysis(updateUser.getIdCard()); + + //设置 性别、年龄 + updateUser.setSex(idCardDO.getSex()); + updateUser.setAge(idCardDO.getAge()); + + //设置部门ID + if (StrUtil.isNotEmpty(importUser.getFactoryName())) { + + //excel接受到工厂名称格式为 id:name + updateUser.setFactoryId(Long.valueOf(importUser.getFactoryName().split(":")[0])); + } + + //设置岗位ID + if (StrUtil.isNotEmpty(importUser.getWorkTypeName())) { + + //excel接受到工种名称格式为 id:name + updateUser.setWorkTypeId(Integer.valueOf(importUser.getWorkTypeName().split(":")[0])); + } + + // 判断如果不存在,在进行插入 + if (updateSupport) { + StaffDO staffDO = staffMapper.selectOne(new LambdaQueryWrapperX() + .eq(StaffDO::getIdCard, importUser.getIdCard()) + .eq(StaffDO::getNickName, importUser.getNickName())); + + updateUser.setId(staffDO.getId()); + staffMapper.updateById(updateUser); + respVO.getUpdateUsernames().add(importUser.getNickName()); + return; + } + + // 插入用户 + staffMapper.insert(updateUser); + respVO.getCreateUsernames().add(importUser.getNickName()); + }); + + return respVO; + } + + @Override + public List getListByFactory(Long factoryId, Boolean isIn) { + return staffMapper.selectList(new LambdaQueryWrapperX() + .eq(isIn, StaffDO::getFactoryId, factoryId) + .ne(!isIn, StaffDO::getFactoryId, factoryId) + .ne(StaffDO::getStatus, 0)); + } + + @Override + public List getListByFactoryIds(Collection factoryIds) { + + return staffMapper.selectList(StaffDO::getFactoryId, factoryIds); + } + + @Override + public List getList(Collection staffIds) { + return staffMapper.selectList(StaffDO::getId, staffIds); + } } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/staff/StaffMapper.xml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/staff/StaffMapper.xml index 8020e892..d502a30e 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/staff/StaffMapper.xml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/staff/StaffMapper.xml @@ -12,10 +12,12 @@