Browse Source

增加评审类型模版

tags/24080901
WendyYang 1 year ago
parent
commit
079b16f596
20 changed files with 761 additions and 27 deletions
  1. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/expert/entity/ExpertGovBusinessStrip.java
  2. +13
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/expert/service/IExpertGovBusinessStripService.java
  3. +48
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/controller/BelongOrgController.java
  4. +44
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/entity/BelongOrg.java
  5. +78
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/entity/GovBusinessStrip.java
  6. +20
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/enumeration/BelongTypeEnum.java
  7. +44
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/helper/GovBusinessStripHelper.java
  8. +219
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/BelongOrgManage.java
  9. +16
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/mapper/BelongOrgMapper.java
  10. +21
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/model/vo/GovBusinessStripVO.java
  11. +16
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/service/IBelongOrgService.java
  12. +20
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/service/impl/BelongOrgServiceImpl.java
  13. +3
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/domain/ExpertInviteAvoidRule.java
  14. +4
    -4
      pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/AvoidRuleDTO.java
  15. +35
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/enumeration/AvoidTypeEnum.java
  16. +75
    -5
      pmapi/src/main/java/com/ningdatech/pmapi/meeting/helper/ExpertRandomInviteAlgorithm.java
  17. +30
    -6
      pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/ExpertInviteManage.java
  18. +1
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/MeetingManage.java
  19. +68
    -6
      pmapi/src/test/java/com/ningdatech/pmapi/org/OrgTest.java
  20. +4
    -3
      pmapi/src/test/resources/application-dev.yml

+ 2
- 2
pmapi/src/main/java/com/ningdatech/pmapi/expert/entity/ExpertGovBusinessStrip.java View File

@@ -14,9 +14,9 @@ import java.io.Serializable;
* @author Liuxinxin * @author Liuxinxin
* @since 2023-04-17 * @since 2023-04-17
*/ */
@TableName("expert_gov_business_strip")
@Data @Data
@ApiModel(value = "ExpertGovBusinessStrip对象", description = "")
@TableName("expert_gov_business_strip")
@ApiModel(value = "ExpertGovBusinessStrip对象")
public class ExpertGovBusinessStrip implements Serializable { public class ExpertGovBusinessStrip implements Serializable {


private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;


+ 13
- 1
pmapi/src/main/java/com/ningdatech/pmapi/expert/service/IExpertGovBusinessStripService.java View File

@@ -1,11 +1,16 @@
package com.ningdatech.pmapi.expert.service; package com.ningdatech.pmapi.expert.service;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.pmapi.expert.entity.ExpertGovBusinessStrip; import com.ningdatech.pmapi.expert.entity.ExpertGovBusinessStrip;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;


import java.util.Collection;
import java.util.List;

/** /**
* <p> * <p>
* 服务类
* 服务类
* </p> * </p>
* *
* @author Liuxinxin * @author Liuxinxin
@@ -13,4 +18,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IExpertGovBusinessStripService extends IService<ExpertGovBusinessStrip> { public interface IExpertGovBusinessStripService extends IService<ExpertGovBusinessStrip> {


default List<ExpertGovBusinessStrip> listByUserIds(Collection<Long> userIds) {
LambdaQueryWrapper<ExpertGovBusinessStrip> query = Wrappers
.lambdaQuery(ExpertGovBusinessStrip.class)
.in(ExpertGovBusinessStrip::getExpertUserId, userIds);
return list(query);
}

} }

+ 48
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/controller/BelongOrgController.java View File

@@ -0,0 +1,48 @@
package com.ningdatech.pmapi.gov.controller;


import com.ningdatech.pmapi.gov.manage.BelongOrgManage;
import com.ningdatech.pmapi.gov.model.vo.GovBusinessStripVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
* <p>
* 前端控制器
* </p>
*
* @author liuxinxin
* @since 2023-04-18
*/
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@Api(value = "BelongOrgController", tags = "单位所属条线")
@RequestMapping("/api/v1/belong-org")
public class BelongOrgController {

private final BelongOrgManage belongOrgManage;

@GetMapping("/business-strip/list")
@ApiOperation("获取条线列表")
public List<GovBusinessStripVO> getGovBusinessStripList(@RequestParam(value = "businessStripName", required = false) String businessStripName) {
return belongOrgManage.getGovBusinessStripList(businessStripName);
}

@GetMapping("/business-strip/expert/analysis")
@ApiOperation("分析专家数据")
public void analysisExpertOrg() {
belongOrgManage.analysisExpertOrg();
}

}

+ 44
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/entity/BelongOrg.java View File

@@ -0,0 +1,44 @@
package com.ningdatech.pmapi.gov.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
* <p>
*
* </p>
*
* @author liuxinxin
* @since 2023-04-18
*/
@Data
@TableName("belong_org")
@ApiModel(value = "BelongOrg对象")
public class BelongOrg implements Serializable {

private static final long serialVersionUID = 1L;

@TableId(type = IdType.AUTO)
private Long id;

@ApiModelProperty("组织code")
private String orgCode;

@ApiModelProperty("组织名称")
private String orgName;

@ApiModelProperty("所属组织code")
private String belongCode;

@ApiModelProperty("所属组织名称")
private String belongName;

@ApiModelProperty("组织类型")
private String orgType;
}

+ 78
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/entity/GovBusinessStrip.java View File

@@ -0,0 +1,78 @@
package com.ningdatech.pmapi.gov.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;

import java.io.Serializable;

/**
* <p>
*
* </p>
*
* @author liuxinxin
* @since 2023-04-13
*/
@TableName("gov_business_strip")
@ApiModel(value = "GovBusinessStrip对象", description = "")
public class GovBusinessStrip implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;

private String businessStripCode;

private String businessStripName;

private String parentCode;

private String parentName;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}
public String getBusinessStripCode() {
return businessStripCode;
}

public void setBusinessStripCode(String businessStripCode) {
this.businessStripCode = businessStripCode;
}
public String getBusinessStripName() {
return businessStripName;
}

public void setBusinessStripName(String businessStripName) {
this.businessStripName = businessStripName;
}
public String getParentCode() {
return parentCode;
}

public void setParentCode(String parentCode) {
this.parentCode = parentCode;
}
public String getParentName() {
return parentName;
}

public void setParentName(String parentName) {
this.parentName = parentName;
}

@Override
public String toString() {
return "GovBusinessStrip{" +
"id=" + id +
", businessStripCode=" + businessStripCode +
", businessStripName=" + businessStripName +
", parentCode=" + parentCode +
", parentName=" + parentName +
"}";
}
}

+ 20
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/enumeration/BelongTypeEnum.java View File

@@ -0,0 +1,20 @@
package com.ningdatech.pmapi.gov.enumeration;

/**
* @author liuxinxin
* @date 2023/4/18 下午2:48
*/

public enum BelongTypeEnum {

/**
* 组织
*/
ORGANIZATION,

/**
* 条线
*/
GOV_BUSINESS_STRIP

}

+ 44
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/helper/GovBusinessStripHelper.java View File

@@ -0,0 +1,44 @@
package com.ningdatech.pmapi.gov.helper;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.pmapi.expert.entity.ExpertGovBusinessStrip;
import com.ningdatech.pmapi.gov.entity.BelongOrg;
import com.ningdatech.pmapi.gov.service.IBelongOrgService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
* @author liuxinxin
* @date 2023/4/21 下午2:07
*/

@Component
@RequiredArgsConstructor
public class GovBusinessStripHelper {

private final IBelongOrgService iBelongOrgService;

public List<ExpertGovBusinessStrip> assemblerBusinessStripInfoList(List<String> businessStripCodeList) {
List<ExpertGovBusinessStrip> businessStripInfoList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(businessStripCodeList)) {
Map<String, String> codeNameMap = iBelongOrgService.list(Wrappers
.lambdaQuery(BelongOrg.class).in(BelongOrg::getOrgCode, businessStripCodeList))
.stream().collect(Collectors.toMap(BelongOrg::getOrgCode, BelongOrg::getOrgName));

businessStripCodeList.forEach(r -> {
ExpertGovBusinessStrip businessStripInfo = new ExpertGovBusinessStrip();
businessStripInfo.setBusinessStripCode(r);
businessStripInfo.setBusinessStripName(codeNameMap.get(r));
businessStripInfoList.add(businessStripInfo);
});
}
return businessStripInfoList;
}

}

+ 219
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/BelongOrgManage.java View File

@@ -0,0 +1,219 @@
package com.ningdatech.pmapi.gov.manage;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.ningdatech.pmapi.expert.entity.ExpertGovBusinessStrip;
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo;
import com.ningdatech.pmapi.expert.service.IExpertGovBusinessStripService;
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService;
import com.ningdatech.pmapi.gov.entity.BelongOrg;
import com.ningdatech.pmapi.gov.enumeration.BelongTypeEnum;
import com.ningdatech.pmapi.gov.model.vo.GovBusinessStripVO;
import com.ningdatech.pmapi.gov.service.IBelongOrgService;
import com.ningdatech.pmapi.organization.model.entity.DingOrganization;
import com.ningdatech.pmapi.organization.service.IDingOrganizationService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;

/**
* @author liuxinxin
* @date 2023/4/18 下午2:27
*/

@Component
@RequiredArgsConstructor
public class BelongOrgManage {

private final IBelongOrgService iBelongOrgService;
private final IExpertUserFullInfoService expertUserFullInfoService;
private final IDingOrganizationService dingOrganizationService;
private final IExpertGovBusinessStripService expertGovBusinessStripService;


public void generateBusinessStripOrg() {
// 条线Set
Set<String> businessStripSet = new HashSet<>();

// 组织 Set
Set<String> orgSet = new HashSet<>();

try {
//创建工作簿对象
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(Files.newInputStream(Paths.get("/Users/liuxinxin/Desktop/gov_business_strip_inport.xlsx")));
//获取工作簿下sheet的个数
int sheetNum = xssfWorkbook.getNumberOfSheets();
System.out.println("该excel文件中总共有:" + sheetNum + "个sheet");
//遍历工作簿中的所有数据
for (int i = 0; i < sheetNum; i++) {
//读取第i个工作表
System.out.println("读取第" + (i + 1) + "个sheet");
XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
//获取最后一行的num,即总行数。此处从0开始
int maxRow = sheet.getLastRowNum();

// 条线code
// 条线名称
String businessStripOrgCode = sheet.getRow(1).getCell(0) + "";
String businessStripOrgName = sheet.getRow(1).getCell(1) + "";
String uniqKey = businessStripOrgCode + "####" + businessStripOrgName;
businessStripSet.add(uniqKey);

for (int row = 1; row <= maxRow; row++) {
//获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***

String cell2 = getCellStr(sheet, row, 2);
String cell3 = getCellStr(sheet, row, 3);
if (StringUtils.isNotBlank(cell2) && StringUtils.isNotBlank(cell3)) {
String orgUniqKey = uniqKey + "&&&" + cell2 + "####" + cell3;
orgSet.add(orgUniqKey);
}

String cell4 = getCellStr(sheet, row, 4);
String cell5 = getCellStr(sheet, row, 5);

if (StringUtils.isNotBlank(cell4) && StringUtils.isNotBlank(cell5)) {
String orgUniqKey = uniqKey + "&&&" + cell4 + "####" + cell5;
orgSet.add(orgUniqKey);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
List<BelongOrg> orgList = orgSet.stream().map(BelongOrgManage::buildBelongOrg).collect(Collectors.toList());
List<BelongOrg> belongOrgList = businessStripSet.stream().map(BelongOrgManage::buildBusinessStrip).collect(Collectors.toList());

iBelongOrgService.saveBatch(orgList);
iBelongOrgService.saveBatch(belongOrgList);
}

public static BelongOrg buildBusinessStrip(String businessStripStr) {
String[] split = businessStripStr.split("&&&");
String busStrip = split[0];
String[] split1 = busStrip.split("####");
String belongOrgCode = split1[0];
String belongOrgName = split1[1];

BelongOrg belongOrg = new BelongOrg();
belongOrg.setOrgCode(belongOrgCode);
belongOrg.setOrgName(belongOrgName);
belongOrg.setBelongCode(belongOrgCode);
belongOrg.setBelongName(belongOrgName);
belongOrg.setOrgType(BelongTypeEnum.GOV_BUSINESS_STRIP.name());
return belongOrg;
}

public static BelongOrg buildBelongOrg(String orgStr) {
String[] split = orgStr.split("&&&");
String busStrip = split[0];
String[] split1 = busStrip.split("####");
String belongOrgCode = split1[0];
String belongOrgName = split1[1];

String org = split[1];
String[] split2 = org.split("####");
String orgCode = split2[0];
String orgName = split2[1];

BelongOrg belongOrg = new BelongOrg();
belongOrg.setOrgCode(orgCode);
belongOrg.setOrgName(orgName);
belongOrg.setBelongCode(belongOrgCode);
belongOrg.setBelongName(belongOrgName);
belongOrg.setOrgType(BelongTypeEnum.ORGANIZATION.name());
return belongOrg;
}

public static String getCellStr(XSSFSheet sheet, int row, int col) {
if (Objects.isNull(sheet)) {
return null;
}
XSSFRow row1 = sheet.getRow(row);
if (Objects.isNull(row1)) {
return null;
}
XSSFCell cell = row1.getCell(col);
if (Objects.isNull(cell)) {
return null;
}
return cell + "".trim();
}


public List<GovBusinessStripVO> getGovBusinessStripList(String businessStripName) {
LambdaQueryWrapper<BelongOrg> query = Wrappers.lambdaQuery(BelongOrg.class)
.like(StrUtil.isNotBlank(businessStripName), BelongOrg::getBelongName, businessStripName)
.eq(BelongOrg::getOrgType, BelongTypeEnum.GOV_BUSINESS_STRIP.name());
List<BelongOrg> belongOrgs = iBelongOrgService.list(query);
return belongOrgs.stream().map(r -> {
GovBusinessStripVO govBusinessStripVO = new GovBusinessStripVO();
govBusinessStripVO.setBusinessStripCode(r.getOrgCode());
govBusinessStripVO.setBusinessStripName(r.getOrgName());
return govBusinessStripVO;
}).collect(Collectors.toList());
}

@Transactional(rollbackFor = Exception.class)
public void analysisExpertOrg() {
List<ExpertUserFullInfo> expertUserFullInfoList = expertUserFullInfoService.list();
for (ExpertUserFullInfo userFullInfo : expertUserFullInfoList) {
String company = userFullInfo.getCompany();

if (StringUtils.isNotBlank(company)) {
// 获取专家信息
List<DingOrganization> dingOrganizationList = dingOrganizationService
.list(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getOrganizationName, company.trim()));

if (CollectionUtils.isNotEmpty(dingOrganizationList)) {
// 获取专家组织code
DingOrganization dingOrganization = dingOrganizationList.get(0);
String organizationCode = dingOrganization.getOrganizationCode();

List<BelongOrg> belongOrgList = iBelongOrgService
.list(Wrappers.lambdaQuery(BelongOrg.class)
.eq(BelongOrg::getOrgCode, organizationCode.trim()));
if (CollectionUtils.isNotEmpty(belongOrgList)) {
// 获取专家条线code
Set<String> belongOrgSet = new HashSet<>();
List<BelongOrg> saveList = new ArrayList<>();
for (BelongOrg belongOrg : belongOrgList) {
if (belongOrgSet.add(belongOrg.getBelongCode())) {
saveList.add(belongOrg);
}
}
expertGovBusinessStripService.remove(Wrappers.lambdaQuery(ExpertGovBusinessStrip.class)
.eq(ExpertGovBusinessStrip::getExpertUserId, userFullInfo.getUserId()));

List<ExpertGovBusinessStrip> expertBusinessStripSaveRecordList = saveList.stream().map(r -> {
ExpertGovBusinessStrip expertBusinessStrip = new ExpertGovBusinessStrip();
expertBusinessStrip.setExpertUserId(userFullInfo.getUserId());
expertBusinessStrip.setBusinessStripCode(r.getBelongCode());
expertBusinessStrip.setBusinessStripName(r.getBelongName());
return expertBusinessStrip;
}).collect(Collectors.toList());
expertGovBusinessStripService.saveBatch(expertBusinessStripSaveRecordList);
}
}
}

}
}

}

+ 16
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/mapper/BelongOrgMapper.java View File

@@ -0,0 +1,16 @@
package com.ningdatech.pmapi.gov.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ningdatech.pmapi.gov.entity.BelongOrg;

/**
* <p>
* Mapper 接口
* </p>
*
* @author liuxinxin
* @since 2023-04-18
*/
public interface BelongOrgMapper extends BaseMapper<BelongOrg> {

}

+ 21
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/model/vo/GovBusinessStripVO.java View File

@@ -0,0 +1,21 @@
package com.ningdatech.pmapi.gov.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* @author Liuxinxin
* @since 2023-03-08
*/
@Data
@ApiModel(value = "条线VO", description = "")
public class GovBusinessStripVO {

@ApiModelProperty("条线code")
private String businessStripCode;

@ApiModelProperty("条线名称")
private String businessStripName;

}

+ 16
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/service/IBelongOrgService.java View File

@@ -0,0 +1,16 @@
package com.ningdatech.pmapi.gov.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.gov.entity.BelongOrg;

/**
* <p>
* 服务类
* </p>
*
* @author liuxinxin
* @since 2023-04-18
*/
public interface IBelongOrgService extends IService<BelongOrg> {

}

+ 20
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/service/impl/BelongOrgServiceImpl.java View File

@@ -0,0 +1,20 @@
package com.ningdatech.pmapi.gov.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.pmapi.gov.entity.BelongOrg;
import com.ningdatech.pmapi.gov.mapper.BelongOrgMapper;
import com.ningdatech.pmapi.gov.service.IBelongOrgService;
import org.springframework.stereotype.Service;

/**
* <p>
* 服务实现类
* </p>
*
* @author liuxinxin
* @since 2023-04-18
*/
@Service
public class BelongOrgServiceImpl extends ServiceImpl<BelongOrgMapper, BelongOrg> implements IBelongOrgService {

}

+ 3
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/domain/ExpertInviteAvoidRule.java View File

@@ -39,6 +39,9 @@ public class ExpertInviteAvoidRule implements Serializable {
@ApiModelProperty("回避条线ID") @ApiModelProperty("回避条线ID")
private String avoidOrgIds; private String avoidOrgIds;


@ApiModelProperty("回避类型")
private Integer avoidType;

@ApiModelProperty("每周参与次数") @ApiModelProperty("每周参与次数")
private Integer weekInviteCount; private Integer weekInviteCount;




+ 4
- 4
pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/AvoidRuleDTO.java View File

@@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;


import javax.validation.constraints.NotEmpty;
import java.util.List; import java.util.List;


/** /**
@@ -19,19 +18,20 @@ import java.util.List;
@ApiModel("回避信息") @ApiModel("回避信息")
public class AvoidRuleDTO { public class AvoidRuleDTO {



@ApiModelProperty("回避类型:1 回避同单位、2 回避同条线、3 不回避")
private Integer avoidType;

@ApiModelProperty("回避单位") @ApiModelProperty("回避单位")
@NotEmpty(message = "回避单位不能为空", groups = {AbstractInviteRule.RuleSave.class})
private List<String> avoidUnitIdList; private List<String> avoidUnitIdList;


@ApiModelProperty("回避条线") @ApiModelProperty("回避条线")
@NotEmpty(message = "回避条线不能为空", groups = {AbstractInviteRule.RuleSave.class})
private List<String> avoidOrgIdList; private List<String> avoidOrgIdList;


@ApiModelProperty("每周邀请次数") @ApiModelProperty("每周邀请次数")
private Integer weekInviteCount; private Integer weekInviteCount;


@ApiModelProperty("回避专家") @ApiModelProperty("回避专家")
@NotEmpty(message = "回避专家不能为空", groups = {AbstractInviteRule.RuleSave.class})
private List<Long> expertIds; private List<Long> expertIds;


} }

+ 35
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/enumeration/AvoidTypeEnum.java View File

@@ -0,0 +1,35 @@
package com.ningdatech.pmapi.meeting.entity.enumeration;

import com.ningdatech.basic.exception.BizException;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
* <p>
* AvoidTypeEnum
* </p>
*
* @author WendyYang
* @since 2023/8/17
**/
@Getter
@AllArgsConstructor
public enum AvoidTypeEnum {

CURR_UNIT(1, "同单位"),
CURR_STRIP(2, "同条线"),
NONE(3, "不回避");

private final Integer code;
private final String remark;

public static AvoidTypeEnum getByCode(int code) {
return Arrays.stream(values())
.filter(w -> w.getCode().equals(code))
.findFirst()
.orElseThrow(() -> BizException.wrap("回避类型无效"));
}

}

+ 75
- 5
pmapi/src/main/java/com/ningdatech/pmapi/meeting/helper/ExpertRandomInviteAlgorithm.java View File

@@ -1,15 +1,14 @@
package com.ningdatech.pmapi.meeting.helper; package com.ningdatech.pmapi.meeting.helper;


import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.pmapi.expert.entity.ExpertGovBusinessStrip;
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo;
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.RandomUtils;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;


/** /**
@@ -74,6 +73,77 @@ public class ExpertRandomInviteAlgorithm {
} }
} }


public static List<ExpertUserFullInfo> inviteGroupByStrip(Map<String, List<ExpertGovBusinessStrip>> expertStripGroup,
List<ExpertUserFullInfo> userFullInfoList,
List<List<MeetingExpert>> expertsByRecentMeeting,
Integer count) {
if (MapUtils.isEmpty(expertStripGroup)) {
return Collections.emptyList();
}
Map<Long, ExpertUserFullInfo> userMap = CollUtils.listToMap(userFullInfoList, ExpertUserFullInfo::getUserId);
if (expertsByRecentMeeting.isEmpty()) {
return expertStripGroup.values().stream()
.map(w -> {
ExpertUserFullInfo euf;
while (true) {
ExpertGovBusinessStrip ele = RandomUtil.randomEle(w);
euf = userMap.remove(ele.getExpertUserId());
if (euf != null || w.isEmpty() || userMap.isEmpty()) {
break;
}
w.remove(ele);
}
return euf;
}).filter(Objects::nonNull)
.limit(count)
.collect(Collectors.toList());
} else {
List<ExpertUserFullInfo> lockedUsers = new ArrayList<>();
List<String> strips = new ArrayList<>(expertStripGroup.keySet());
for (int i = 0; i < count; i++) {
String strip = strips.get(RandomUtils.nextInt(0, strips.size()));
List<ExpertGovBusinessStrip> expertsByStrip = expertStripGroup.get(strip);
for (int j = 0; j < expertsByRecentMeeting.size(); j++) {
List<MeetingExpert> experts = expertsByRecentMeeting.get(j);
List<ExpertUserFullInfo> notInvitedUsers = expertsByStrip.stream()
.map(w -> userMap.get(w.getExpertUserId()))
.filter(w -> w != null && expertMatchNone(experts, w))
.collect(Collectors.toList());
if (!notInvitedUsers.isEmpty()) {
ExpertUserFullInfo usf = RandomUtil.randomEle(notInvitedUsers);
// 防止一个专家多条线
userMap.remove(usf.getUserId());
lockedUsers.add(usf);
break;
} else if (j == (expertsByRecentMeeting.size() - 1)) {
ExpertUserFullInfo euf;
ExpertGovBusinessStrip egs = RandomUtil.randomEle(expertsByStrip);
while (true) {
euf = userMap.remove(egs.getExpertUserId());
if (euf != null || expertsByStrip.isEmpty() || userMap.isEmpty()) {
break;
}
expertsByStrip.remove(egs);
}
if (euf != null) {
lockedUsers.add(euf);
}
}
if (userMap.isEmpty()) {
return lockedUsers;
}
}
if (lockedUsers.size() < count) {
strips.remove(strip);
if (strips.isEmpty()) {
break;
}
}
}
return lockedUsers;
}
}

/** /**
* 随机抽取专家 * 随机抽取专家
* *
@@ -103,7 +173,7 @@ public class ExpertRandomInviteAlgorithm {
userFullInfos.removeAll(notInvitedUsers); userFullInfos.removeAll(notInvitedUsers);
} }
} }
if (userFullInfos.size() == 0) {
if (userFullInfos.isEmpty()) {
return result; return result;
} }
int restCnt = Math.min(count - result.size(), userFullInfos.size()); int restCnt = Math.min(count - result.size(), userFullInfos.size());


+ 30
- 6
pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/ExpertInviteManage.java View File

@@ -8,8 +8,10 @@ import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.pmapi.common.util.BizUtils; import com.ningdatech.pmapi.common.util.BizUtils;
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum;
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany;
import com.ningdatech.pmapi.expert.entity.ExpertGovBusinessStrip;
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo;
import com.ningdatech.pmapi.expert.service.IExpertAvoidCompanyService; import com.ningdatech.pmapi.expert.service.IExpertAvoidCompanyService;
import com.ningdatech.pmapi.expert.service.IExpertGovBusinessStripService;
import com.ningdatech.pmapi.expert.service.IExpertIntentionWorkRegionService; import com.ningdatech.pmapi.expert.service.IExpertIntentionWorkRegionService;
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService;
import com.ningdatech.pmapi.meeting.builder.ExpertInviteBuilder; import com.ningdatech.pmapi.meeting.builder.ExpertInviteBuilder;
@@ -17,8 +19,10 @@ import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule;
import com.ningdatech.pmapi.meeting.entity.domain.Meeting; import com.ningdatech.pmapi.meeting.entity.domain.Meeting;
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert;
import com.ningdatech.pmapi.meeting.entity.dto.*; import com.ningdatech.pmapi.meeting.entity.dto.*;
import com.ningdatech.pmapi.meeting.entity.enumeration.AvoidTypeEnum;
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum; import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum;
import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper;
import com.ningdatech.pmapi.meeting.helper.ExpertRandomInviteAlgorithm;
import com.ningdatech.pmapi.meeting.helper.MeetingCallOrMsgHelper; import com.ningdatech.pmapi.meeting.helper.MeetingCallOrMsgHelper;
import com.ningdatech.pmapi.meeting.service.IExpertInviteRuleService; import com.ningdatech.pmapi.meeting.service.IExpertInviteRuleService;
import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; import com.ningdatech.pmapi.meeting.service.IMeetingExpertService;
@@ -41,7 +45,7 @@ import java.util.stream.Collectors;


import static com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum.*; import static com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum.*;
import static com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper.getExpertInviteRule; import static com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper.getExpertInviteRule;
import static com.ningdatech.pmapi.meeting.helper.ExpertRandomInviteAlgorithm.inviteGroupByCompany;
import static com.ningdatech.pmapi.meeting.helper.ExpertRandomInviteAlgorithm.*;


/** /**
* <p> * <p>
@@ -66,6 +70,7 @@ public class ExpertInviteManage {
private final IMeetingService meetingService; private final IMeetingService meetingService;
private final IExpertAvoidCompanyService expertAvoidCompanyService; private final IExpertAvoidCompanyService expertAvoidCompanyService;
private final MeetingCallOrMsgHelper meetingCallOrMsgHelper; private final MeetingCallOrMsgHelper meetingCallOrMsgHelper;
private final IExpertGovBusinessStripService expertGovBusinessStripService;


@Value("#{randomInviteProperties.recentMeetingCount}") @Value("#{randomInviteProperties.recentMeetingCount}")
private Integer recentMeetingCount; private Integer recentMeetingCount;
@@ -364,10 +369,29 @@ public class ExpertInviteManage {
if (userInfoList.isEmpty()) { if (userInfoList.isEmpty()) {
return result; return result;
} }
Map<String, List<ExpertUserFullInfo>> userGroupByUnit = CollUtils.group(userInfoList, ExpertUserFullInfo::getCompanyUniqCode);
result.setTotal(userGroupByUnit.size());

result.setExperts(inviteGroupByCompany(userGroupByUnit, expertsByRecentMeeting(), randomRule.getCount()));
AvoidTypeEnum avoidType = avoidRule.getAvoidType() == null ? AvoidTypeEnum.CURR_UNIT : AvoidTypeEnum.getByCode(avoidRule.getAvoidType());
switch (avoidType) {
case NONE:
result.setExperts(inviteWithoutCompany(userInfoList, expertsByRecentMeeting(), randomRule.getCount()));
result.setTotal(userInfoList.size());
break;
case CURR_UNIT:
Map<String, List<ExpertUserFullInfo>> unitGroup = CollUtils.group(userInfoList, ExpertUserFullInfo::getCompanyUniqCode);
result.setExperts(inviteGroupByCompany(unitGroup, expertsByRecentMeeting(), randomRule.getCount()));
result.setTotal(unitGroup.size());
break;
case CURR_STRIP:
List<Long> userIds = CollUtils.fieldList(userInfoList, ExpertUserFullInfo::getUserId);
List<ExpertGovBusinessStrip> expertStrips = expertGovBusinessStripService.listByUserIds(userIds);
if (!expertStrips.isEmpty()) {
Map<String, List<ExpertGovBusinessStrip>> stripGroup = CollUtils.group(expertStrips, ExpertGovBusinessStrip::getBusinessStripCode);
result.setExperts(inviteGroupByStrip(stripGroup, userInfoList, expertsByRecentMeeting(), randomRule.getCount()));
result.setTotal(stripGroup.size());
} else {
result.setTotal(0);
}
break;
}
return result; return result;
} }


@@ -525,7 +549,7 @@ public class ExpertInviteManage {
AvoidRuleDTO avoidRule) { AvoidRuleDTO avoidRule) {
List<MeetingExpert> expertInserts = new ArrayList<>(); List<MeetingExpert> expertInserts = new ArrayList<>();
// 处理随机抽取规则 // 处理随机抽取规则
if (CollectionUtils.isNotEmpty(randomRules)) {
if (CollUtil.isNotEmpty(randomRules)) {
List<ExpertInviteRule> randoms = new ArrayList<>(); List<ExpertInviteRule> randoms = new ArrayList<>();
List<ExpertChooseDTO> expertsByRandom = new ArrayList<>(); List<ExpertChooseDTO> expertsByRandom = new ArrayList<>();
List<Long> chooseExpertIds = new ArrayList<>(); List<Long> chooseExpertIds = new ArrayList<>();


+ 1
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/MeetingManage.java View File

@@ -253,6 +253,7 @@ public class MeetingManage {
avoidRule.setAvoidOrgIds(CollUtils.joinByComma(avoidInfo.getAvoidOrgIdList())); avoidRule.setAvoidOrgIds(CollUtils.joinByComma(avoidInfo.getAvoidOrgIdList()));
avoidRule.setAvoidUnitIds(CollUtils.joinByComma(avoidInfo.getAvoidUnitIdList())); avoidRule.setAvoidUnitIds(CollUtils.joinByComma(avoidInfo.getAvoidUnitIdList()));
avoidRule.setAvoidExpertIds(CollUtils.joinByComma(avoidInfo.getExpertIds())); avoidRule.setAvoidExpertIds(CollUtils.joinByComma(avoidInfo.getExpertIds()));
avoidRule.setAvoidType(avoidInfo.getAvoidType());
inviteAvoidRuleService.save(avoidRule); inviteAvoidRuleService.save(avoidRule);
} else { } else {
// 指定邀请 // 指定邀请


+ 68
- 6
pmapi/src/test/java/com/ningdatech/pmapi/org/OrgTest.java View File

@@ -1,13 +1,23 @@
package com.ningdatech.pmapi.org; package com.ningdatech.pmapi.org;


import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.util.SpringUtils;
import com.ningdatech.pmapi.AppTests; import com.ningdatech.pmapi.AppTests;
import com.ningdatech.pmapi.gov.entity.BelongOrg;
import com.ningdatech.pmapi.gov.enumeration.BelongTypeEnum;
import com.ningdatech.pmapi.gov.service.IBelongOrgService;
import com.ningdatech.pmapi.organization.model.entity.DingOrganization; import com.ningdatech.pmapi.organization.model.entity.DingOrganization;
import com.ningdatech.pmapi.organization.service.IDingOrganizationService; import com.ningdatech.pmapi.organization.service.IDingOrganizationService;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;

import java.util.*;


/** /**
* @Classname RegionTest * @Classname RegionTest
@@ -19,16 +29,18 @@ public class OrgTest extends AppTests {


@Autowired @Autowired
private IDingOrganizationService organizationService; private IDingOrganizationService organizationService;
@Autowired
private IBelongOrgService belongOrgService;


@Test @Test
public void test(){
public void test() {
List<DingOrganization> orgs = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class) List<DingOrganization> orgs = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getDivisionCode, "331199")); .eq(DingOrganization::getDivisionCode, "331199"));


for(DingOrganization org : orgs){
for (DingOrganization org : orgs) {
List<DingOrganization> inners = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class) List<DingOrganization> inners = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getParentCode, org.getOrganizationCode())); .eq(DingOrganization::getParentCode, org.getOrganizationCode()));
for(DingOrganization inner : inners){
for (DingOrganization inner : inners) {
mergeRegionCode(inner); mergeRegionCode(inner);
} }
} }
@@ -40,12 +52,62 @@ public class OrgTest extends AppTests {


List<DingOrganization> is = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class) List<DingOrganization> is = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getParentCode, inner.getOrganizationCode())); .eq(DingOrganization::getParentCode, inner.getOrganizationCode()));
if(CollUtil.isEmpty(is)){
if (CollUtil.isEmpty(is)) {
return; return;
} }
for(DingOrganization i : is){
for (DingOrganization i : is) {
mergeRegionCode(i); mergeRegionCode(i);
} }
} }


@Test
public void businessStrip() {
String path = "/Users/wendy/Desktop/省市县条线单位梳理202303016.xlsx";
ExcelReader reader = ExcelUtil.getReader(path);
Set<String> orgCodes = new HashSet<>();
List<BelongOrg> belongOrgs = new ArrayList<>();
for (int i = 0; i < reader.getSheetCount(); i++) {
reader.setSheet(i);
List<Map<String, Object>> maps = reader.readAll();
for (Map<String, Object> map : maps) {
String cityName = MapUtil.getStr(map, "市级组织名称");
if (cityName == null || !cityName.contains("丽水")) {
continue;
}
String cityCode = MapUtil.getStr(map, "市级组织机构代码");
if (StrUtil.isBlank(cityCode)) {
continue;
}
String countyName = MapUtil.getStr(map, "区县组织名称");
if (StrUtil.isBlank(countyName)) {
continue;
}
String countyCode = MapUtil.getStr(map, "区县组织机构代码");
if (StrUtil.isBlank(countyCode)) {
continue;
}
System.out.printf("市级:%s -> %s 区县:%s -> %s\n", cityName, cityCode, countyName, countyCode);
BelongOrg county = new BelongOrg();
county.setBelongCode(cityCode);
county.setBelongName(cityName);
county.setOrgCode(countyCode);
county.setOrgName(countyName);
county.setOrgType(BelongTypeEnum.ORGANIZATION.name());
belongOrgs.add(county);
if (!orgCodes.add(cityCode)) {
continue;
}
BelongOrg city = new BelongOrg();
city.setBelongCode(cityCode);
city.setBelongName(cityName);
city.setOrgCode(cityCode);
city.setOrgName(cityName);
city.setOrgType(BelongTypeEnum.GOV_BUSINESS_STRIP.name());
belongOrgs.add(city);
}
belongOrgs.forEach(System.out::println);
}
belongOrgService.saveBatch(belongOrgs);
}

} }

+ 4
- 3
pmapi/src/test/resources/application-dev.yml View File

@@ -182,7 +182,7 @@ organization:
- GO_ff70e47bae684fdba0d64f4acab85661 - GO_ff70e47bae684fdba0d64f4acab85661


yxt: yxt:
# wsdl-url: http://115.239.137.23:9501/ws/v1?wsdl
# wsdl-url: http://115.239.137.23:9501/ws/v1?wsdl
wsdl-url: classpath:/wsdl.xml wsdl-url: classpath:/wsdl.xml
#账号 #账号
user-code: hzndkj user-code: hzndkj
@@ -194,7 +194,7 @@ yxt:


#省局联审 请求信息 #省局联审 请求信息
provincial: provincial:
# host: http://zj.ningdatech.com/prometheus-zhejiang_foreign
# host: http://zj.ningdatech.com/prometheus-zhejiang_foreign
host: http://223.4.72.75/prometheus-zhejiang_foreign host: http://223.4.72.75/prometheus-zhejiang_foreign
pushUrl: /api/v1/foreign/importantPro pushUrl: /api/v1/foreign/importantPro
detailUrl: /api/v1/foreign/importantProView detailUrl: /api/v1/foreign/importantProView
@@ -208,7 +208,7 @@ irs:
is-search-app: false is-search-app: false
digital-resource-indicators: digital-resource-indicators:
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/99E2bic31KdXzaa7.htm url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/99E2bic31KdXzaa7.htm
interfaceName: 99E2bic31KdXzaa7
interface-name: 99E2bic31KdXzaa7
app-key: A331101453557202109017383 app-key: A331101453557202109017383
app-secret: 496f0f2a19994f76b4fd9dae087366c7 app-secret: 496f0f2a19994f76b4fd9dae087366c7
seal-platform: seal-platform:
@@ -253,5 +253,6 @@ hostname: iZbp13nwyvib53j4j1p2xoZ
login: login:
phone-verify-code: phone-verify-code:
skip: true skip: true
url: http://lspm.ningdatech.com/login





Loading…
Cancel
Save