feat:事项

This commit is contained in:
苏竹红
2025-07-25 17:12:06 +08:00
parent b10f129271
commit ba90fca7fe
33 changed files with 957 additions and 786 deletions

View File

@@ -0,0 +1,62 @@
package com.cool.store.service;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.request.notice.BatchDeletedRequest;
import com.cool.store.request.notice.BatchPublishRequest;
import com.cool.store.request.notice.MessageTemplateAddRequest;
import com.cool.store.vo.notice.MessageTemplateDetailVO;
/**
* @Author suzhuhong
* @Date 2025/7/25 9:58
* @Version 1.0
*/
public interface MessageTemplateService {
/**
* 新增消息模版
* @param request
* @param user
* @return
*/
Boolean addMessageTemplate(MessageTemplateAddRequest request , LoginUserInfo user);
/**
* 编辑消息模版
* @param request
* @param user
* @return
*/
Boolean editMessageTemplate(MessageTemplateAddRequest request , LoginUserInfo user);
/**
* 获取详情
* @param id
* @return
*/
MessageTemplateDetailVO getMessageTemplateDetail(Long id);
/**
* 批量删除 未发布可以删除
* @param request
* @return
*/
Boolean batchDeleteMessageTemplate(BatchDeletedRequest request, LoginUserInfo user);
/**
* batch 批量发布
* @param request
* @param user
* @return
*/
Boolean batchPublishMessageTemplate(BatchPublishRequest request, LoginUserInfo user);
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.service;
import com.cool.store.dto.StoreDTO;
import com.cool.store.dto.store.AuthStoreUserDTO;
import com.cool.store.dto.store.StoreUserPositionDTO;
import com.cool.store.response.MiniShopsResponse;
import com.github.pagehelper.PageInfo;
@@ -27,4 +28,12 @@ public interface StoreService {
List<StoreUserPositionDTO> getStoreUser(List<String> storeCodeList);
List<AuthStoreUserDTO> authStoreUser(List<String> storeIdList, String positionType);
List<AuthStoreUserDTO> getStorePositionUserList(List<String> storeIds,
List<String> positionIds,
List<String> nodePersonList,
List<String> groupIdList,
List<String> regionIdList);
}

View File

@@ -0,0 +1,230 @@
package com.cool.store.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dao.MessageTemplateDAO;
import com.cool.store.dao.RegionDao;
import com.cool.store.dao.StoreMessageDAO;
import com.cool.store.dto.notice.CommonDTO;
import com.cool.store.dto.store.AuthStoreUserDTO;
import com.cool.store.dto.store.StoreAreaDTO;
import com.cool.store.entity.MessageTemplateDO;
import com.cool.store.entity.RegionDO;
import com.cool.store.entity.StoreGroupMappingDO;
import com.cool.store.entity.StoreMessageDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.notice.ProcessStatusEnum;
import com.cool.store.enums.notice.PublishStatusEnum;
import com.cool.store.enums.notice.ReadStatusEnum;
import com.cool.store.enums.notice.TypeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.StoreGroupMappingMapper;
import com.cool.store.mapper.StoreMapper;
import com.cool.store.request.notice.BatchDeletedRequest;
import com.cool.store.request.notice.BatchPublishRequest;
import com.cool.store.request.notice.MessageTemplateAddRequest;
import com.cool.store.service.MessageTemplateService;
import com.cool.store.service.StoreService;
import com.cool.store.vo.notice.MessageTemplateDetailVO;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author suzhuhong
* @Date 2025/7/25 9:59
* @Version 1.0
*/
@Service
@Slf4j
public class MessageTemplateServiceImpl implements MessageTemplateService {
@Resource
MessageTemplateDAO messageTemplateDAO;
@Resource
StoreMapper storeMapper;
@Resource
RegionDao RegionDao;
@Resource
StoreGroupMappingMapper storeGroupMappingMapper;
@Resource
StoreService storeService;
@Resource
StoreMessageDAO storeMessageDAO;
@Override
public Boolean addMessageTemplate(MessageTemplateAddRequest request, LoginUserInfo user) {
MessageTemplateDO messageTemplateDO = new MessageTemplateDO();
BeanUtils.copyProperties(request, messageTemplateDO);
messageTemplateDO.setCreateUserId(user.getUserId());
messageTemplateDAO.insert(messageTemplateDO);
return Boolean.TRUE;
}
@Override
public Boolean editMessageTemplate(MessageTemplateAddRequest request, LoginUserInfo user) {
if (request.getId()==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR);
}
MessageTemplateDO messageTemplateDO = messageTemplateDAO.getById(request.getId());
//只有待发布状态能编辑
if (messageTemplateDO.getPublishStatus()!=0){
throw new ServiceException(ErrorCodeEnum.MESSAGE_TEMPLATE_NOT_SUPPORT_EDIT);
}
BeanUtils.copyProperties(request, messageTemplateDO);
messageTemplateDO.setUpdaterUserId(user.getUserId());
messageTemplateDAO.update(messageTemplateDO);
return Boolean.TRUE;
}
@Override
public MessageTemplateDetailVO getMessageTemplateDetail(Long id) {
MessageTemplateDetailVO messageTemplateDetailVO = new MessageTemplateDetailVO();
MessageTemplateDO messageTemplateDO = messageTemplateDAO.getById(id);
if(messageTemplateDO==null){
return messageTemplateDetailVO;
}
BeanUtils.copyProperties(messageTemplateDO, messageTemplateDetailVO);
messageTemplateDetailVO.setUserInfoList(JSONObject.parseArray(messageTemplateDO.getHandlePersonInfo(), CommonDTO.class));
messageTemplateDetailVO.setStoreInfoList(JSONObject.parseArray(messageTemplateDO.getStoreInfo(), CommonDTO.class));
return messageTemplateDetailVO;
}
@Override
public Boolean batchDeleteMessageTemplate(BatchDeletedRequest request, LoginUserInfo user) {
List<MessageTemplateDO> list = messageTemplateDAO.getByIds(request.getIds());
//校验是否都是未发布状态
if (list.stream().anyMatch(x -> x.getPublishStatus()!= PublishStatusEnum.UNPUBLISHED.getCode())){
throw new ServiceException(ErrorCodeEnum.MESSAGE_TEMPLATE_NOT_SUPPORT_DELETED);
}
messageTemplateDAO.updateDeleteStatusBatch(request.getIds(),user.getUserId());
return Boolean.TRUE;
}
@Override
public Boolean batchPublishMessageTemplate(BatchPublishRequest request, LoginUserInfo user) {
if (CollectionUtils.isEmpty(request.getIds())||CollectionUtils.isEmpty(request.getStoreInfoList())||CollectionUtils.isEmpty(request.getUserInfoList())){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
List<StoreAreaDTO> storeAreaDTOS = getStoreRange(request.getStoreInfoList());
List<String> storeIds = storeAreaDTOS.stream().map(StoreAreaDTO::getStoreId).collect(Collectors.toList());
Map<String, List<String>> authUser = getAuthUser(request.getUserInfoList(), storeIds);
List<MessageTemplateDO> list = messageTemplateDAO.getByIds(request.getIds());
//过滤 只保留未发布的
list = list.stream().filter(x -> PublishStatusEnum.UNPUBLISHED.getCode().equals(x.getPublishStatus())).collect(Collectors.toList());
list.stream().forEach(x -> {
List<StoreMessageDO> result = new ArrayList<>();
storeAreaDTOS.forEach(y->{
if (CollectionUtils.isEmpty(authUser.get(y.getStoreId()))){
log.info("当前门店没有人员 门店名称:{}",y.getStoreName());
return;
}
StoreMessageDO storeMessageDO = new StoreMessageDO();
storeMessageDO.setStoreId(y.getStoreId());
storeMessageDO.setStoreCode(y.getStoreCode());
storeMessageDO.setMessageTemplateId(x.getId());
storeMessageDO.setReadStatus(ReadStatusEnum.UNREAD.getCode());
storeMessageDO.setReadTime(new Date());
storeMessageDO.setProcessStatus(ProcessStatusEnum.UNTREATED.getCode());
storeMessageDO.setProcessTime(new Date());
String userIdStr = authUser.get(y.getStoreId()).stream().collect(Collectors.joining(","));
storeMessageDO.setOperatorList(userIdStr);
result.add(storeMessageDO);
});
storeMessageDAO.batchInsert(result);
});
return Boolean.TRUE;
}
public Map<String, List<String>> getAuthUser(List<CommonDTO> personInfo, List<String> storeIds){
if (CollectionUtils.isEmpty(personInfo)){
return new HashMap<>();
}
List<String> personIds = personInfo.stream().filter(x -> TypeEnum.PERSON.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
List<String> positionIds = personInfo.stream().filter(x -> TypeEnum.POSITION.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
List<String> groupIdList = personInfo.stream().filter(x -> TypeEnum.USER_GROUP.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
List<String> regionIdList = personInfo.stream().filter(x -> TypeEnum.ORGANIZATION.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
//权限
List<AuthStoreUserDTO> authStoreUserList = storeService.getStorePositionUserList(storeIds, positionIds, personIds, groupIdList, regionIdList);
Map<String, List<String>> storeUserMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(authStoreUserList)) {
storeUserMap = authStoreUserList.stream().collect(Collectors.toMap(AuthStoreUserDTO::getStoreId,
AuthStoreUserDTO::getUserIdList, (a, b) -> a));
}
return storeUserMap;
}
/**
* 获取门店范围
* @param commonDTOS
* @return
*/
private List<StoreAreaDTO> getStoreRange( List<CommonDTO> commonDTOS){
List<String> regionIds = commonDTOS.stream().filter(x -> TypeEnum.REGION.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
List<RegionDO> regionDOsByRegionIds = new ArrayList<>();
Set<String> storeIdSet = new HashSet<>();
if (CollectionUtils.isNotEmpty(regionIds)){
regionDOsByRegionIds = RegionDao.getRegionByRegionIds(regionIds);
//区域全路径地址集合 ["/1/37139128281/","/1/37139128283/"]
List<String> regionFullRegionPathList = regionDOsByRegionIds.stream().map(RegionDO::getFullRegionPath).collect(Collectors.toList());
//根据regionFullRegionPathList查询区域下所有的门店(包括子区域门店)
List<StoreAreaDTO> storeAreaDTOS = storeMapper.listStoreByRegionPathList(regionFullRegionPathList);
storeIdSet = storeAreaDTOS.stream().map(StoreAreaDTO::getStoreId).collect(Collectors.toSet());
}
List<String> storeIdList = commonDTOS.stream().filter(x -> TypeEnum.STORE.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(storeIdList)){
//将寻找的门店添加到set中
storeIdSet.addAll(storeIdList);
}
List<String> groupList = commonDTOS.stream().filter(x -> TypeEnum.GROUP.equals(x.getType()))
.map(CommonDTO::getValue).collect(Collectors.toList());
//分组
if (CollectionUtils.isNotEmpty(groupList)) {
List<StoreGroupMappingDO> groupStoreList = storeGroupMappingMapper.getStoreGroupMappingByGroupIDs(groupList);
if (CollectionUtils.isNotEmpty(groupStoreList)) {
Set<String> groupStoreSet = groupStoreList.stream().map(StoreGroupMappingDO::getStoreId).collect(Collectors.toSet());
if(CollectionUtils.isNotEmpty(groupStoreSet)){
//将寻找的门店添加到set中
storeIdSet.addAll(groupStoreSet);
}
}
}
if(CollectionUtils.isEmpty(storeIdSet)){
return new ArrayList<>();
}
List<StoreAreaDTO> storeDTOList = storeMapper.getStoreAreaList(new ArrayList<>(storeIdSet));
if(CollectionUtils.isNotEmpty(storeDTOList)){
storeDTOList = storeDTOList.stream().filter(o -> "open".equals(o.getStoreStatus())).collect(Collectors.toList());
}
return storeDTOList;
}
}

View File

@@ -2,6 +2,7 @@ package com.cool.store.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.dto.store.AuthStoreUserDTO;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.EnterpriseUserRoleDao;
@@ -17,10 +18,7 @@ import com.cool.store.entity.SysRoleDO;
import com.cool.store.entity.UserAuthMappingDO;
import com.cool.store.enums.*;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.RegionMapper;
import com.cool.store.mapper.StoreMapper;
import com.cool.store.mapper.SysRoleMapper;
import com.cool.store.mapper.UserAuthMappingMapper;
import com.cool.store.mapper.*;
import com.cool.store.response.MiniShopsResponse;
import com.cool.store.service.StoreService;
import com.cool.store.service.UserAuthMappingService;
@@ -68,6 +66,10 @@ public class StoreServiceImpl implements StoreService {
StoreMapper storeMapper;
@Resource
UserAuthMappingMapper userAuthMappingMapper;
@Resource
EnterpriseUserMapper enterpriseUserMapper;
@Resource
EnterpriseUserGroupMappingMapper enterpriseUserGroupMappingMapper;
@Override
public PageInfo<StoreDTO> getStoreExtendFieldInfo(Integer pageSize, Integer pageNum) {
@@ -169,7 +171,54 @@ public class StoreServiceImpl implements StoreService {
return result;
}
private List<AuthStoreUserDTO> authStoreUser(List<String> storeIdList, String positionType) {
@Override
public List<AuthStoreUserDTO> getStorePositionUserList( List<String> storeIds,
List<String> positionIds,
List<String> nodePersonList,
List<String> groupIdList,
List<String> regionIdList) {
log.info("StoreServiceImpl getStorePositionUserList param storeIds:{},positionIds:{},nodePersonList:{},groupIdList:{},regionIdList:{}",
JSONObject.toJSONString(storeIds),
JSONObject.toJSONString(positionIds), JSONObject.toJSONString(nodePersonList),
JSONObject.toJSONString(groupIdList), JSONObject.toJSONString(regionIdList));
List<AuthStoreUserDTO> authStoreUsers = this.authStoreUser(storeIds, null);
if (CollUtil.isEmpty(authStoreUsers)) {
return new ArrayList<>();
}
List<String> allUserIds = Lists.newArrayList();
if (CollectionUtils.isNotEmpty(positionIds)) {
List<String> userIds = sysRoleMapper.getPositionUserIds(positionIds);
allUserIds.addAll(userIds);
}
if (CollectionUtils.isNotEmpty(groupIdList)) {
List<String> groupUserIdList = enterpriseUserGroupMappingMapper.getUserIdsByGroupIdList(groupIdList);
if (CollectionUtils.isNotEmpty(groupUserIdList)) {
allUserIds.addAll(groupUserIdList);
}
}
if (CollectionUtils.isNotEmpty(regionIdList)) {
List<String> regionUserIdList = enterpriseUserMapper.getUserIdsByRegionIdList(regionIdList);
if (CollectionUtils.isNotEmpty(regionUserIdList)) {
allUserIds.addAll(regionUserIdList);
}
}
if (CollectionUtils.isNotEmpty(nodePersonList)) {
allUserIds.addAll(nodePersonList);
}
List<String> finalAllUserIds = allUserIds;
authStoreUsers.forEach(f -> f.getUserIdList().retainAll(finalAllUserIds));
if (CollectionUtils.isNotEmpty(authStoreUsers)) {
authStoreUsers = authStoreUsers.stream().distinct().collect(Collectors.toList());
}
return authStoreUsers;
}
@Override
public List<AuthStoreUserDTO> authStoreUser(List<String> storeIdList, String positionType) {
List<AuthStoreUserDTO> result = new ArrayList<>();
if (CollectionUtils.isEmpty(storeIdList)) {
return result;