Преглед изворни кода

Add后台服务增加校友导入功能

Yue пре 2 година
родитељ
комит
732a9a271e

BIN
DOC/校友数据_20240218.xlsx


+ 29 - 0
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/controller/AmAlumnusController.java

@@ -5,7 +5,9 @@ import cn.dev33.satoken.annotation.SaMode;
 import cn.xyh.amActivity.domain.bo.AmAlumnusBo;
 import cn.xyh.amActivity.domain.vo.AmAlumnusCountVo;
 import cn.xyh.amActivity.domain.vo.AmAlumnusDetailVo;
+import cn.xyh.amActivity.domain.vo.AmAlumnusImportVo;
 import cn.xyh.amActivity.domain.vo.AmAlumnusVo;
+import cn.xyh.amActivity.listener.AmAlumnusImportListener;
 import cn.xyh.amActivity.service.IAmAlumnusService;
 import cn.xyh.common.annotation.Log;
 import cn.xyh.common.annotation.RepeatSubmit;
@@ -16,16 +18,20 @@ import cn.xyh.common.core.page.TableDataInfo;
 import cn.xyh.common.core.validate.AddGroup;
 import cn.xyh.common.core.validate.EditGroup;
 import cn.xyh.common.enums.BusinessType;
+import cn.xyh.common.excel.ExcelResult;
 import cn.xyh.common.utils.StringUtils;
 import cn.xyh.common.utils.poi.ExcelUtil;
 import cn.xyh.system.permissions.PermissionName;
 import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -137,6 +143,29 @@ public class AmAlumnusController extends BaseController {
         return toAjax(amAlumnusService.deleteWithValidByIds(Arrays.asList(amIds), true));
     }
 
+    /**
+     * 导入数据
+     *
+     * @param file          导入文件
+     * @param updateSupport 是否更新已存在数据
+     */
+    @Log(title = "校友信息", businessType = BusinessType.IMPORT)
+    @SaCheckPermission(PermissionName.SystemUserImport)
+    @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> importData(@NotNull @RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelResult<AmAlumnusImportVo> result = ExcelUtil.importExcel(file.getInputStream(), AmAlumnusImportVo.class, new AmAlumnusImportListener(updateSupport));
+        return R.ok(result.getAnalysis());
+    }
+
+    /**
+     * 获取导入模板
+     */
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response) {
+        ExcelUtil.exportExcel(new ArrayList<>(), "校友数据", AmAlumnusImportVo.class, response);
+    }
+
+
     /**
      * 修改校友隐私设置
      */

+ 2 - 1
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/domain/bo/AmAlumnusBo.java

@@ -195,7 +195,8 @@ public class AmAlumnusBo extends BaseEntity {
     private String avatar;
 
     private String auditStatus;
-
+    private String auditUser;
+    private String auditTime;
     private String notAuditStatus;
 
 }

+ 221 - 0
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/domain/vo/AmAlumnusImportVo.java

@@ -0,0 +1,221 @@
+package cn.xyh.amActivity.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户对象导入VO
+ *
+ * @author Yue
+ */
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = false)
+public class AmAlumnusImportVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @ExcelProperty(value = "校友ID")
+    private Long amId;
+
+    /**
+     * 用户ID
+     */
+    @ExcelProperty(value = "用户ID")
+    private Long userId;
+
+    /**
+     * 组织结构ID
+     */
+    @ExcelProperty(value = "组织ID")
+    private Long orgId;
+
+    /**
+     * 用户账号
+     */
+    @ExcelProperty(value = "用户名")
+    private String userName;
+
+    /**
+     * 用户邮箱
+     */
+    @ExcelProperty(value = "邮箱")
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    @ExcelProperty(value = "手机号码")
+    private String phonenumber;
+
+    /**
+     * 姓名
+     */
+    @ExcelProperty(value = "姓名")
+    private String name;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别")
+    private String gender;
+
+    /**
+     * 出生日期
+     */
+    @ExcelProperty(value = "出生日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthday;
+
+    /**
+     * 校友身份(0校友 1教职工 2校友及教职工 3其他)
+     */
+    @ExcelProperty(value = "校友身份")
+    private String type;
+
+    /**
+     * 入学年份
+     */
+    @ExcelProperty(value = "入学年份")
+    private String enrolYear;
+
+    /**
+     * 毕业年份
+     */
+    @ExcelProperty(value = "毕业年份")
+    private String graduateYear;
+
+    /**
+     * 班级
+     */
+    @ExcelProperty(value = "班级")
+    private String amClass;
+
+    /**
+     * 最高学历
+     */
+    @ExcelProperty(value = "最高学历")
+    private String education;
+
+    /**
+     * 省份
+     */
+    @ExcelProperty(value = "省份")
+    private String province;
+
+    /**
+     * 城市
+     */
+    @ExcelProperty(value = "城市")
+    private String city;
+
+    /**
+     * 区县
+     */
+    @ExcelProperty(value = "区县")
+    private String district;
+
+    /**
+     * 籍贯
+     */
+    @ExcelProperty(value = "籍贯")
+    private String nativePlace;
+
+
+    /**
+     * QQ
+     */
+    @ExcelProperty(value = "QQ")
+    private String qq;
+
+    /**
+     * 微信
+     */
+    @ExcelProperty(value = "微信")
+    private String wechat;
+
+    /**
+     * 信息公开标志(0不公开 1好友公开 2全部公开)
+     */
+    @ExcelProperty(value = "公开标志")
+    private String amPublic;
+
+    /**
+     * 审核状态
+     */
+    @ExcelProperty(value = "审核状态")
+    private String auditStatus;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private String auditUser;
+
+    /**
+     * 审核时间
+     */
+    @ExcelProperty(value = "审核时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date auditTime;
+
+
+    /**
+     * 行业
+     */
+    @ExcelProperty(value = "行业")
+    private String industry;
+
+    /**
+     * 行业领域
+     */
+    @ExcelProperty(value = "领域")
+    private String industryArea;
+
+    /**
+     * 工作单位
+     */
+    @ExcelProperty(value = "工作单位")
+    private String workUnit;
+
+    /**
+     * 职位
+     */
+    @ExcelProperty(value = "职位")
+    private String position;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String address;
+
+    /**
+     * 工作单位介绍
+     */
+    @ExcelProperty(value = "工作单位介绍")
+    private String workUnitMore;
+
+    /**
+     * 行业说明
+     */
+    @ExcelProperty(value = "行业说明")
+    private String industryMore;
+
+    /**
+     * 自我介绍
+     */
+    @ExcelProperty(value = "自我介绍")
+    private String selfIntroduction;
+
+
+}

+ 108 - 0
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/listener/AmAlumnusImportListener.java

@@ -0,0 +1,108 @@
+package cn.xyh.amActivity.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.xyh.amActivity.domain.AmAlumnus;
+import cn.xyh.amActivity.domain.bo.AmAlumnusBo;
+import cn.xyh.amActivity.domain.vo.AmAlumnusImportVo;
+import cn.xyh.amActivity.service.IAmAlumnusService;
+import cn.xyh.common.excel.ExcelListener;
+import cn.xyh.common.excel.ExcelResult;
+import cn.xyh.common.exception.ServiceException;
+import cn.xyh.common.utils.StringUtils;
+import cn.xyh.common.utils.spring.SpringUtils;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 系统用户自定义导入
+ *
+ * @author Yue
+ */
+@Slf4j
+public class AmAlumnusImportListener extends AnalysisEventListener<AmAlumnusImportVo> implements ExcelListener<AmAlumnusImportVo> {
+
+    private final IAmAlumnusService amAlumnusService;
+
+
+    private final Boolean isUpdateSupport;
+
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public AmAlumnusImportListener(Boolean isUpdateSupport) {
+        amAlumnusService = SpringUtils.getBean(IAmAlumnusService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(AmAlumnusImportVo amVo, AnalysisContext context) {
+        try {
+            if (StringUtils.isEmpty(amVo.getPhonenumber())) {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、账号 " + amVo.getName() + " 导入失败:";
+                failureMsg.append(msg).append("手机号不能为空");
+            } else {
+                AmAlumnus amalumnus = amAlumnusService.selectVoByUserPhone(amVo.getPhonenumber());
+                if (ObjectUtil.isNull(amalumnus)) {
+                    AmAlumnusBo bo = BeanUtil.toBean(amVo, AmAlumnusBo.class);
+                    amAlumnusService.insertByBo(bo);
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、账号 ").append(bo.getName()).append(" 导入成功");
+                } else if (isUpdateSupport) {
+                    AmAlumnusBo bo = BeanUtil.toBean(amVo, AmAlumnusBo.class);
+                    bo.setAmId(amalumnus.getAmId());
+                    bo.setUserId(amalumnus.getUserId());
+                    amAlumnusService.updateByBo(bo);
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、账号 ").append(bo.getName()).append(" 更新成功");
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(amVo.getName()).append(" 已存在");
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、账号 " + amVo.getName() + " 导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+
+    }
+
+    @Override
+    public ExcelResult<AmAlumnusImportVo> getExcelResult() {
+        return new ExcelResult<AmAlumnusImportVo>() {
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<AmAlumnusImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 2 - 0
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/mapper/AmAlumnusMapper.java

@@ -23,6 +23,8 @@ public interface AmAlumnusMapper extends BaseMapperPlus<AmAlumnusMapper, AmAlumn
 
     AmAlumnus selectVoByUserId(Long userId);
 
+    AmAlumnus selectVoByUserPhone(String phonenumber);
+
     Page<AmAlumnusVo> selectAlumnusPage(@Param("page") Page<AmAlumnus> page, @Param(Constants.WRAPPER) Wrapper<AmAlumnus> queryWrapper);
 
     AmAlumnusCountVo queryAlumnusCount(Long amId);

+ 4 - 0
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/service/IAmAlumnusService.java

@@ -1,5 +1,6 @@
 package cn.xyh.amActivity.service;
 
+import cn.xyh.amActivity.domain.AmAlumnus;
 import cn.xyh.amActivity.domain.bo.AmAlumnusBo;
 import cn.xyh.amActivity.domain.vo.AmAlumnusCountVo;
 import cn.xyh.amActivity.domain.vo.AmAlumnusDetailVo;
@@ -78,4 +79,7 @@ public interface IAmAlumnusService {
 
     AmAlumnusCountVo queryAlumnusCount(Long amId);
 
+    AmAlumnus selectById(Long amId);
+
+    AmAlumnus selectVoByUserPhone(String phonenumber);
 }

+ 14 - 1
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/amActivity/service/impl/AmAlumnusServiceImpl.java

@@ -64,6 +64,16 @@ public class AmAlumnusServiceImpl implements IAmAlumnusService {
         return baseMapper.selectDetailById(amId);
     }
 
+    @Override
+    public AmAlumnus selectById(Long amId) {
+        return baseMapper.selectById(amId);
+    }
+
+    @Override
+    public AmAlumnus selectVoByUserPhone(String phonenumber) {
+        return baseMapper.selectVoByUserPhone(phonenumber);
+    }
+
     /**
      * 查询校友信息
      */
@@ -120,7 +130,9 @@ public class AmAlumnusServiceImpl implements IAmAlumnusService {
     public TableDataInfo<AmAlumnusVo> queryPageList(AmAlumnusBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<AmAlumnus> lqw = buildQueryWrapper(bo);
         String years = LoginHelper.getYears();
-        lqw.in(StringUtils.isNotEmpty(years), AmAlumnus::getGraduateYear, Arrays.asList(years.split(",")));
+        if (StringUtils.isNotEmpty(years)) {
+            lqw.in(AmAlumnus::getGraduateYear, Arrays.asList(years.split(",")));
+        }
         Page<AmAlumnusVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }
@@ -314,6 +326,7 @@ public class AmAlumnusServiceImpl implements IAmAlumnusService {
         return baseMapper.queryAlumnusCount(amId);
     }
 
+
     /**
      * 更新用户类型
      */

+ 17 - 0
SERVER/YanZhongXYH/xyh-system/src/main/resources/mapper/amActivity/AmAlumnusMapper.xml

@@ -118,6 +118,23 @@
         where am.user_id = #{userId}
     </select>
 
+
+    <select id="selectVoByUserPhone" resultMap="AmAlumnusResult">
+        SELECT am.am_id,
+               am.user_id,
+               am.`name`,
+               am.gender,
+               am.birthday,
+               am.type,
+               am.enrol_year,
+               am.graduate_year,
+               am.am_class,
+               am.audit_status
+        from am_alumnus as am
+                 LEFT JOIN sys_user AS u ON am.user_id = u.user_id
+        where u.phonenumber = #{phonenumber}
+    </select>
+
     <select id="selectDetailById" resultMap="AmAlumnusVoResult">
         SELECT am.am_id,
                am.user_id,