mitao
2025-03-17 38f1a806a4e1d8e1560f07a5a26b51cf6a4692be
springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/impl/PartyMemberServiceImpl.java
@@ -1,6 +1,7 @@
package com.panzhihua.sangeshenbian.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.idev.excel.EasyExcel;
@@ -8,14 +9,21 @@
import cn.idev.excel.FastExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.panzhihua.common.exceptions.ServiceException;
import com.panzhihua.common.model.vos.LoginUserInfoVO;
import com.panzhihua.common.exceptions.ServiceException;
import com.panzhihua.common.model.vos.sangeshenbian.SystemUserVo;
import com.panzhihua.sangeshenbian.dao.PartyMemberMapper;
import com.panzhihua.sangeshenbian.enums.AuditStatusEnum;
import com.panzhihua.sangeshenbian.enums.FreezeStatusEnum;
import com.panzhihua.sangeshenbian.enums.ReportTypeEnum;
import com.panzhihua.sangeshenbian.enums.AuditStatusEnum;
import com.panzhihua.sangeshenbian.model.entity.BcRegion;
import com.panzhihua.sangeshenbian.model.entity.ComAct;
import com.panzhihua.sangeshenbian.model.entity.ComStreet;
import com.panzhihua.sangeshenbian.model.entity.PartyMember;
import com.panzhihua.sangeshenbian.dao.PartyMemberMapper;
import com.panzhihua.sangeshenbian.model.entity.SystemUser;
import com.panzhihua.sangeshenbian.model.excel.PartyMemberExcel;
import com.panzhihua.sangeshenbian.warpper.PartyMemberImportFailedVO;
import com.panzhihua.sangeshenbian.model.excel.PartyMemberTemplate;
@@ -23,12 +31,15 @@
import com.panzhihua.sangeshenbian.service.IComActService;
import com.panzhihua.sangeshenbian.service.IComStreetService;
import com.panzhihua.sangeshenbian.service.IPartyMemberService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.panzhihua.sangeshenbian.service.ISystemUserService;
import com.panzhihua.sangeshenbian.warpper.PartyMemberApplicationRequest;
import com.panzhihua.sangeshenbian.warpper.PartyMemberDTO;
import com.panzhihua.sangeshenbian.warpper.PartyMemberQuery;
import com.panzhihua.sangeshenbian.warpper.PendingPartyMemberApplicationVO;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -39,6 +50,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * <p>
@@ -52,6 +64,7 @@
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class PartyMemberServiceImpl extends ServiceImpl<PartyMemberMapper, PartyMember> implements IPartyMemberService {
    private final HttpServletResponse response;
    private final ISystemUserService systemUserService;
    private final IBcRegionService bcRegionService;
    private final IComStreetService comStreetService;
    private final IComActService comActService;
@@ -76,10 +89,23 @@
        PartyMember partyMember = BeanUtil.copyProperties(dto, PartyMember.class);
        String idNumber = dto.getIdNumber();
        partyMember.setGender(getGender(idNumber));
        BcRegion districtByCode = bcRegionService.getDistrictByCode(dto.getDistrictsCode());
        if (Objects.nonNull(districtByCode)){
            partyMember.setDistricts(districtByCode.getRegionName());
        }
        ComStreet street = comStreetService.getById(dto.getStreetId());
        if (Objects.nonNull(street)){
            partyMember.setStreet(street.getName());
        }
        ComAct act = comActService.getById(dto.getCommunityId());
        if (Objects.nonNull(act)){
            partyMember.setCommunity(act.getName());
        }
        if (Objects.isNull(dto.getId())) {
            //添加
            partyMember.setCreateBy(Long.parseLong(loginUserInfo.getId().toString()));
            partyMember.setAuditStatus(AuditStatusEnum.APPROVED.getCode());
            partyMember.setFreezeStatus(FreezeStatusEnum.NORMAL.getCode());
            partyMember.setSource(1);
            save(partyMember);
        } else {
@@ -141,38 +167,38 @@
        if (CollUtil.isEmpty(list)) {
            throw new ServiceException("导入数据为空");
        }
        // 存储验证失败的记录
        List<PartyMemberImportFailedVO> failedList = new ArrayList<>();
        // 存储验证成功的记录
        List<PartyMember> validPartyMembers = new ArrayList<>();
        // 手机号正则表达式
        String phoneRegex = "^1[3-9]\\d{9}$";
        // 身份证号正则表达式
        String idCardRegex = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)";
        // 批量验证数据
        for (PartyMemberTemplate template : list) {
            PartyMemberImportFailedVO failedVO = new PartyMemberImportFailedVO();
            boolean isValid = true;
            StringBuilder errorMsg = new StringBuilder();
            // 复制数据到失败记录对象
            BeanUtil.copyProperties(template, failedVO);
            // 1. 验证手机号
            if (StrUtil.isBlank(template.getPhone()) || !template.getPhone().matches(phoneRegex)) {
                isValid = false;
                errorMsg.append("手机号格式不正确; ");
            }
            // 2. 验证身份证号
            if (StrUtil.isBlank(template.getIdNumber()) || !template.getIdNumber().matches(idCardRegex)) {
                isValid = false;
                errorMsg.append("身份证号格式不正确; ");
            }
            // 3. 验证账号是否已存在
            if (StrUtil.isNotBlank(template.getPhone())) {
                LambdaQueryWrapper<PartyMember> queryWrapper = new LambdaQueryWrapper<>();
@@ -183,7 +209,7 @@
                    errorMsg.append("账号已存在");
                }
            }
            // 4. 验证所在社区
            String districtName = null;
            String streetName = null;
@@ -201,12 +227,12 @@
                    districtName = addressParts[0];
                    streetName = addressParts[1];
                    communityName = addressParts[2];
                    // 验证区县、街道、社区信息
                    // 验证区县是否存在
                    BcRegion district = bcRegionService.getDistrictByName(districtName);
                    if (Objects.isNull(district)) {
                        isValid = false;
                        errorMsg.append("区县不存在; ");
@@ -234,7 +260,7 @@
                isValid = false;
                errorMsg.append("社区信息不能为空; ");
            }
            // 如果验证失败,添加到失败列表,否则添加到成功列表
            if (!isValid) {
                failedVO.setFailReason(errorMsg.toString());
@@ -242,7 +268,7 @@
            } else {
                PartyMember partyMember = new PartyMember();
                BeanUtil.copyProperties(template, partyMember);
                // 设置创建人和更新人
                partyMember.setCreateBy(Long.parseLong(loginUserInfo.getId().toString()));
                partyMember.setUpdateBy(Long.parseLong(loginUserInfo.getId().toString()));
@@ -267,16 +293,33 @@
                validPartyMembers.add(partyMember);
            }
        }
        // 处理验证成功的数据
        if (!validPartyMembers.isEmpty()) {
            // 批量保存
            saveBatch(validPartyMembers);
        }
        // 返回验证失败的数据
        return failedList;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void applyForMembership(PartyMemberApplicationRequest dto, LoginUserInfoVO loginUserInfo) {
        PartyMember partyMember = BeanUtil.copyProperties(dto, PartyMember.class);
        String idNumber = dto.getIdNumber();
        partyMember.setPhone(loginUserInfo.getPhone());
        partyMember.setGender(getGender(idNumber));
        partyMember.setCreateBy(loginUserInfo.getUserId());
        partyMember.setUpdateBy(loginUserInfo.getUserId());
        partyMember.setAuditStatus(AuditStatusEnum.PENDING.getCode());
        partyMember.setCreateTime(DateUtil.date());
        partyMember.setUpdateTime(DateUtil.date());
        partyMember.setSource(0);
        saveOrUpdate(partyMember);
    }
    /**
     * 审核
@@ -291,6 +334,36 @@
        updateById(partyMember);
    }
    @Override
    public Page<PendingPartyMemberApplicationVO> preAuditList(Page<PendingPartyMemberApplicationVO> page,
                                                              LoginUserInfoVO loginUserInfo) {
        SystemUser adminUser = systemUserService.getOne(new LambdaQueryWrapper<SystemUser>()
                .eq(SystemUser::getPhone, loginUserInfo.getPhone())
                .eq(SystemUser::getIsAdmin, 1)
                .ne(SystemUser::getStatus, 3)
                .last("LIMIT 1"));
        if (adminUser == null){
            throw new ServiceException("无权审核");
        }
        int accountLevel = adminUser.getAccountLevel();
        Long communityId = null;
        String streetId = null;
        String districtsCode = null;
        if (accountLevel == ReportTypeEnum.COMMUNITY.getCode()) {
            communityId = adminUser.getCommunityId();
        } else if (accountLevel == ReportTypeEnum.STREET.getCode()) {
            streetId = adminUser.getStreetId();
        } else if (accountLevel == ReportTypeEnum.DISTRICT.getCode()) {
            districtsCode = adminUser.getDistrictsCode();
        } else if(accountLevel != ReportTypeEnum.PARTY.getCode()){
            throw new ServiceException("无权审核:未知等级");
        }
        String phone = loginUserInfo.getPhone();
        return this.baseMapper.queryPreAuditPage(page, phone, accountLevel, districtsCode, streetId, communityId);
    }
    /**
     * 根据身份证号获取性别
     * @param idNumber
@@ -301,8 +374,8 @@
        int genderDigit = Character.getNumericValue(genderChar);
        return (genderDigit % 2 == 0) ? 0 : 1;
    }
    /**
     * 根据电话号码查询有效的党员数据
     * @param phone
@@ -313,4 +386,11 @@
        PartyMember one = this.getOne(new LambdaQueryWrapper<PartyMember>().eq(PartyMember::getPhone, phone)
                .eq(PartyMember::getAuditStatus, 1).eq(PartyMember::getFreezeStatus, 0).eq(PartyMember::getDelFlag, 0));
      return one;
   }}
   }
    @Override
    public Boolean verifyPartyMemberByPhone(String phone) {
        Optional<PartyMember> partyMember = this.lambdaQuery().eq(PartyMember::getPhone, phone).oneOpt();
        return partyMember.isPresent();
    }
}