feat:通知接口

This commit is contained in:
苏竹红
2025-08-27 11:24:00 +08:00
parent 0ef79bf5fb
commit d5b1960996
13 changed files with 296 additions and 12 deletions

View File

@@ -298,6 +298,7 @@ public enum ErrorCodeEnum {
MESSAGE_TEMPLATE_NOT_SUPPORT_DELETED(1610002,"只有未发布的消息能删除,请确认!",null), MESSAGE_TEMPLATE_NOT_SUPPORT_DELETED(1610002,"只有未发布的消息能删除,请确认!",null),
STORE_MESSAGE_REVOKE(1610003,"当前门店消息已撤销,请务重复操作",null), STORE_MESSAGE_REVOKE(1610003,"当前门店消息已撤销,请务重复操作",null),
STORE_MESSAGE_HANDLED(1610004,"当前门店消息已处理,无法撤销!",null), STORE_MESSAGE_HANDLED(1610004,"当前门店消息已处理,无法撤销!",null),
MATTER_STORE_OR_USER_IS_NULL(1610005,"当前事项门店或者人员为空,发布失败,请确认!",null),
; ;

View File

@@ -10,6 +10,10 @@ public enum MatterTypeEnum {
QUESTION(0,"门店违规工单"), QUESTION(0,"门店违规工单"),
LICENSE(1,"证照过期提醒"), LICENSE(1,"证照过期提醒"),
NOTICE(2,"通知消息"), NOTICE(2,"通知消息"),
LOGISTICS(3,"物流"),
SERVICE_PACKAGE(4,"服务包"),
RESTOCK(5,"补货"),
INVENTORY(6,"盘点"),
; ;
MatterTypeEnum(Integer code, String message) { MatterTypeEnum(Integer code, String message) {

View File

@@ -10,10 +10,13 @@ import java.util.List;
*/ */
public enum ModuleCodeEnum { public enum ModuleCodeEnum {
STORE_WORK(0,"店务", Arrays.asList(MatterTypeEnum.QUESTION,MatterTypeEnum.LICENSE,MatterTypeEnum.NOTICE)), STORE_WORK(0,"店务日清/培训", Arrays.asList(MatterTypeEnum.QUESTION,MatterTypeEnum.LICENSE)),
PRODUCT_UPDATE(1,"营销政策/产品上新",Arrays.asList(MatterTypeEnum.NOTICE)), PRODUCT_UPDATE(1,"营销政策/产品上新",Arrays.asList(MatterTypeEnum.SERVICE_PACKAGE)),
INVENTORY_MODULE(2,"库存模块",Arrays.asList(MatterTypeEnum.NOTICE)), INVENTORY_MODULE(2,"原料订货与库存管理",Arrays.asList(MatterTypeEnum.RESTOCK,MatterTypeEnum.INVENTORY,MatterTypeEnum.LOGISTICS)),
DISH(3,"菜品",Arrays.asList(MatterTypeEnum.NOTICE)), DISH(3,"菜品",Arrays.asList(MatterTypeEnum.NOTICE)),
FRANCHISE(4,"加盟",Arrays.asList(MatterTypeEnum.NOTICE)),
//其他(投诉与客户服务、临时通知)
OTHER(5,"其他",Arrays.asList(MatterTypeEnum.NOTICE)),
; ;
ModuleCodeEnum(Integer code, String message,List<MatterTypeEnum> matterTypeEnums) { ModuleCodeEnum(Integer code, String message,List<MatterTypeEnum> matterTypeEnums) {

View File

@@ -0,0 +1,85 @@
package com.cool.store.enums.notice;
/**
* @Author suzhuhong
* @Date 2025/8/26 15:43
* @Version 1.0
*/
public enum SceneEnum {
SUBMIT_ORDER(0, "提交订单", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/j_l6em.jpg", MatterTypeEnum.LOGISTICS),
ASSIGNED_PICKING(5, "已分配拣货", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/YLjBkv.jpg", MatterTypeEnum.LOGISTICS),
PICKING_COMPLETED(10, "拣货完成", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/gG9Y-h.jpg", MatterTypeEnum.LOGISTICS),
SHIPPED(15, "已出库", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/Ehz8_n.jpg", MatterTypeEnum.LOGISTICS),
DELIVERY_IN_PROGRESS(20, "配送中", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/I6bAmA.jpg", MatterTypeEnum.LOGISTICS),
ORDER_SIGNING_AND_ACCEPTANCE(25, "订单签收", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/0z7jkU.jpg", MatterTypeEnum.LOGISTICS),
SERVICE_PACKAGE(30, "服务包", "", MatterTypeEnum.LOGISTICS),
RESTOCK(35, "补货", "", MatterTypeEnum.LOGISTICS),
INVENTORY(40, "盘点", "", MatterTypeEnum.LOGISTICS),
;
private Integer sceneCode;
private String sceneName;
private String scenePicture;
private MatterTypeEnum matterTypeEnum;
public Integer getSceneCode() {
return sceneCode;
}
public void setSceneCode(Integer sceneCode) {
this.sceneCode = sceneCode;
}
public String getSceneName() {
return sceneName;
}
public void setSceneName(String sceneName) {
this.sceneName = sceneName;
}
public String getScenePicture() {
return scenePicture;
}
public void setScenePicture(String scenePicture) {
this.scenePicture = scenePicture;
}
public MatterTypeEnum getMatterTypeEnum() {
return matterTypeEnum;
}
public void setMatterTypeEnum(MatterTypeEnum matterTypeEnum) {
this.matterTypeEnum = matterTypeEnum;
}
SceneEnum(Integer sceneCode, String sceneName, String scenePicture, MatterTypeEnum matterTypeEnum) {
this.sceneCode = sceneCode;
this.sceneName = sceneName;
this.scenePicture = scenePicture;
this.matterTypeEnum = matterTypeEnum;
}
/**
* 通过code获取枚举
* @param code
* @return
*/
public static SceneEnum getByCode(Integer code) {
for (SceneEnum value : values()) {
if (value.sceneCode.equals(code)) {
return value;
}
}
return null;
}
}

View File

@@ -56,6 +56,13 @@ public class EnterpriseUserDAO {
return enterpriseUserMapper.getUserInfoByUserIds(userIdList); return enterpriseUserMapper.getUserInfoByUserIds(userIdList);
} }
public List<EnterpriseUserDO> getUserInfoByUserMobileList(List<String> mobileList) {
if (CollectionUtils.isEmpty(mobileList)) {
return Lists.newArrayList();
}
return enterpriseUserMapper.getUserInfoByUserMobileList(mobileList);
}
public List<EnterpriseUserDO> searchUserByRegionIdsAndKeyword(List<String> regionIds, String keyword, List<String> leaderRegionIds) { public List<EnterpriseUserDO> searchUserByRegionIdsAndKeyword(List<String> regionIds, String keyword, List<String> leaderRegionIds) {
if (CollectionUtils.isEmpty(regionIds)) { if (CollectionUtils.isEmpty(regionIds)) {
return Lists.newArrayList(); return Lists.newArrayList();

View File

@@ -32,6 +32,8 @@ public interface EnterpriseUserMapper {
*/ */
List<EnterpriseUserDO> getUserInfoByUserIds( @Param("userIdList") List<String> userIdList); List<EnterpriseUserDO> getUserInfoByUserIds( @Param("userIdList") List<String> userIdList);
List<EnterpriseUserDO> getUserInfoByUserMobileList( @Param("mobileList") List<String> mobileList);
/** /**
* 根据关键字搜索部门下的用户 * 根据关键字搜索部门下的用户
* @param regionIds * @param regionIds

View File

@@ -83,6 +83,21 @@
</where> </where>
</select> </select>
<select id="getUserInfoByUserMobileList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>,
<include refid="Blob_Column_List"/>
from
enterprise_user_${enterpriseId}
<where>
<if test="mobileList !=null and mobileList.size>0">
<foreach collection="mobileList" item="mobile" open="and mobile in (" close=")" separator=",">
#{mobile}
</foreach>
</if>
</where>
</select>
<select id="searchUserByRegionIdsAndKeyword" resultMap="BaseResultMap"> <select id="searchUserByRegionIdsAndKeyword" resultMap="BaseResultMap">
select select
user_id, name, mobile user_id, name, mobile

View File

@@ -151,5 +151,10 @@ public class MessageTemplateDO {
@Column(name = "store_info") @Column(name = "store_info")
private String storeInfo; private String storeInfo;
@Column(name = "jump_type")
private Integer jumpType;
@Column(name = "jump_url")
private String jumpUrl;
} }

View File

@@ -0,0 +1,61 @@
package com.cool.store.request.notice;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
* @Author suzhuhong
* @Date 2025/8/26 16:10
* @Version 1.0
*/
@Data
public class ThirdMatterRequest {
@ApiModelProperty("0-提交订单 5-已分配拣货 10-拣货完成 15-已出库 20-配送中 25-订单签收 30-服务包发布 35-补货 40-盘点通知 ")
@NotNull(message = "场景不能为空")
private Integer sceneCode;
@ApiModelProperty("事项配置ID CRM配置好部分信息 找CRM提供")
@NotNull(message = "事项配置ID不能为空")
private Long matterConfigId;
@ApiModelProperty("事项标题")
@NotBlank(message = "事项标题不能为空")
private String matterTitle;
@ApiModelProperty("处理类型(1:仅阅读 2:需要处理)")
@NotNull(message = "处理类型不能为空")
private Integer processType;
@ApiModelProperty("提醒类型(1:持续提醒 2:阶段提醒)")
@NotNull(message = "提醒类型不能为空")
private Integer remindType;
@ApiModelProperty("阶段提醒时 需要设置时间范围 开始时间")
private Date remindStartTime;
@ApiModelProperty("阶段提醒时 需要设置时间范围 结束时间")
private Date remindEndTime;
@ApiModelProperty("截止时间")
private Date deadline;
@ApiModelProperty("今日必办标识 0非必办 1必办")
@NotNull(message = "今日必办标识不能为空")
private Integer todayTask;
@ApiModelProperty("消息图片URL 物流crm自动匹配 无需传递")
private String messageImage;
@ApiModelProperty("门店范围 如果不传 默认取matterConfigId对应的门店范围 如果都没有 任务处于待发布状态")
List<String> shopCodeList;
@ApiModelProperty("手机号列表 如果不传 默认取matterConfigId配置的人员信息 如果都没有 任务处于待发布状态")
List<String> mobileList;
}

View File

@@ -3,6 +3,7 @@ package com.cool.store.service;
import com.cool.store.context.LoginUserInfo; import com.cool.store.context.LoginUserInfo;
import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.dto.notice.NoticeDTO;
import com.cool.store.request.notice.*; import com.cool.store.request.notice.*;
import com.cool.store.response.bigdata.ApiResponse;
import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.PartnerUserInfoVO;
import com.cool.store.vo.notice.*; import com.cool.store.vo.notice.*;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@@ -51,11 +52,17 @@ public interface MessageTemplateService {
/** /**
* batch 批量发布 * batch 批量发布
* @param request * @param request
* @param user * @param userId
* @return * @return
*/ */
Boolean batchPublishMessageTemplate(BatchPublishRequest request, LoginUserInfo user); Boolean batchPublishMessageTemplate(BatchPublishRequest request, String userId);
/**
* thirdMatterHandle 第三方接口处理
* @param thirdMatterRequest
* @return
*/
ApiResponse<Boolean> thirdMatterHandle(ThirdMatterRequest thirdMatterRequest);
/** /**
* 获取列表 * 获取列表

View File

@@ -4,10 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cool.store.context.LoginUserInfo; import com.cool.store.context.LoginUserInfo;
import com.cool.store.context.PartnerUserHolder; import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.dao.*;
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.notice.CommonDTO;
import com.cool.store.dto.notice.MessageTemplateCountDTO; import com.cool.store.dto.notice.MessageTemplateCountDTO;
import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.dto.notice.NoticeDTO;
@@ -20,6 +17,7 @@ import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.StoreGroupMappingMapper; import com.cool.store.mapper.StoreGroupMappingMapper;
import com.cool.store.mapper.StoreMapper; import com.cool.store.mapper.StoreMapper;
import com.cool.store.request.notice.*; import com.cool.store.request.notice.*;
import com.cool.store.response.bigdata.ApiResponse;
import com.cool.store.service.MessageTemplateService; import com.cool.store.service.MessageTemplateService;
import com.cool.store.service.StoreService; import com.cool.store.service.StoreService;
import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.CoolDateUtils;
@@ -65,6 +63,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
StoreMessageDAO storeMessageDAO; StoreMessageDAO storeMessageDAO;
@Resource @Resource
EnterpriseUserDAO enterpriseUserDAO; EnterpriseUserDAO enterpriseUserDAO;
@Resource
MatterConfigDAO matterConfigDAO;
@@ -135,7 +135,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
@Override @Override
public Boolean batchPublishMessageTemplate(BatchPublishRequest request, LoginUserInfo user) { public Boolean batchPublishMessageTemplate(BatchPublishRequest request, String userId) {
if (CollectionUtils.isEmpty(request.getIds())||CollectionUtils.isEmpty(request.getStoreInfoList())||CollectionUtils.isEmpty(request.getUserInfoList())){ if (CollectionUtils.isEmpty(request.getIds())||CollectionUtils.isEmpty(request.getStoreInfoList())||CollectionUtils.isEmpty(request.getUserInfoList())){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
} }
@@ -180,11 +180,94 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
messageTemplateDAO.batchUpdateStoreInfoAndUserInfo(updateIds, messageTemplateDAO.batchUpdateStoreInfoAndUserInfo(updateIds,
JSONObject.toJSONString(request.getStoreInfoList()), JSONObject.toJSONString(request.getStoreInfoList()),
JSONObject.toJSONString(request.getUserInfoList()), JSONObject.toJSONString(request.getUserInfoList()),
user.getUserId()); userId);
return Boolean.TRUE; return Boolean.TRUE;
} }
@Override
public ApiResponse<Boolean> thirdMatterHandle(ThirdMatterRequest thirdMatterRequest) {
//第三方事项处理
MatterConfigDO matterConfig = matterConfigDAO.getById(thirdMatterRequest.getMatterConfigId());
//封装事项模版
MessageTemplateDO messageTemplateDO = new MessageTemplateDO();
messageTemplateDO.setMessageCode(getMessageTemplateCode());
messageTemplateDO.setModuleCode(matterConfig.getModuleCode());
messageTemplateDO.setMatterType(matterConfig.getMatterType());
messageTemplateDO.setMessageTitle(thirdMatterRequest.getMatterTitle());
messageTemplateDO.setSystemSource(matterConfig.getSystemSource());
messageTemplateDO.setProcessType(thirdMatterRequest.getProcessType());
messageTemplateDO.setRemindType(thirdMatterRequest.getRemindType());
if (RemindTypeEnum.STAGE_REMINDER.getCode().equals(thirdMatterRequest.getRemindType())){
messageTemplateDO.setRemindStartTime(thirdMatterRequest.getRemindStartTime());
messageTemplateDO.setRemindEndTime(thirdMatterRequest.getRemindEndTime());
}
messageTemplateDO.setDeadline(thirdMatterRequest.getDeadline());
messageTemplateDO.setTodayTask(thirdMatterRequest.getTodayTask());
messageTemplateDO.setMessageImage(thirdMatterRequest.getMessageImage());
messageTemplateDO.setPublishStatus(PublishStatusEnum.PUBLISHED.getCode());
messageTemplateDO.setJumpType(matterConfig.getJumpType());
messageTemplateDO.setJumpUrl(matterConfig.getJumpUrl());
if (MatterTypeEnum.LOGISTICS.getCode().equals(matterConfig.getMatterType())){
SceneEnum scene = SceneEnum.getByCode(thirdMatterRequest.getSceneCode());
messageTemplateDO.setMessageImage(scene.getScenePicture());
}
//如果是盘点 截止日期去当天
if (MatterTypeEnum.INVENTORY.getCode().equals(matterConfig.getMatterType())){
messageTemplateDO.setDeadline(new Date());
}
String storeInfo = matterConfig.getDefaultStoreInfo();
String userInfo = matterConfig.getDefaultHandlePersonInfo();
//门店
if (CollectionUtils.isNotEmpty(thirdMatterRequest.getShopCodeList())){
log.info("shopCodeList:{}",JSONObject.toJSONString(thirdMatterRequest.getShopCodeList()));
List<StoreDO> storeNumByStoreCodes = storeMapper.getStoreNumByStoreCodes(thirdMatterRequest.getShopCodeList());
if (CollectionUtils.isEmpty(storeNumByStoreCodes)){
//组装成门店信息
List<CommonDTO> storeList = new ArrayList<>();
storeNumByStoreCodes.forEach(x -> {
CommonDTO store = new CommonDTO("store", x.getStoreNum(), x.getStoreName());
storeList.add(store);
});
storeInfo = JSONObject.toJSONString(storeList);
}
}
//人员
List<EnterpriseUserDO> userInfoByUserMobileList = enterpriseUserDAO.getUserInfoByUserMobileList(thirdMatterRequest.getMobileList());
if (CollectionUtils.isEmpty(userInfoByUserMobileList)){
//组装人员信息
List<CommonDTO> userList = new ArrayList<>();
userInfoByUserMobileList.forEach(x -> {
CommonDTO user = new CommonDTO("user", x.getUserId(), x.getName());
userList.add(user);
});
userInfo = JSONObject.toJSONString(userList);
}
Boolean publishFlag = Boolean.TRUE;
//校验是否发布
if (StringUtils.isEmpty(userInfo)|| StringUtils.isEmpty(storeInfo)){
publishFlag = Boolean.FALSE;
messageTemplateDO.setPublishStatus(PublishStatusEnum.UNPUBLISHED.getCode());
}
int messageId = messageTemplateDAO.insert(messageTemplateDO);
//调用发布
if (publishFlag){
//开始计算人员门店
BatchPublishRequest batchPublishRequest = new BatchPublishRequest();
batchPublishRequest.setIds(Arrays.asList(Long.valueOf(messageId)));
batchPublishRequest.setStoreInfoList(JSONObject.parseArray(storeInfo, CommonDTO.class));
batchPublishRequest.setUserInfoList(JSONObject.parseArray(userInfo, CommonDTO.class));
try {
batchPublishMessageTemplate(batchPublishRequest,"");
} catch (ServiceException e) {
return new ApiResponse(e.getErrorCode(), e.getErrorMessage(), null);
}
return ApiResponse.success(Boolean.TRUE);
}
return ApiResponse.error(ErrorCodeEnum.MATTER_STORE_OR_USER_IS_NULL);
}
@Override @Override
public PageInfo<NoticeDTO> getMessageTemplateList(MessageTemplateQueryRequest request) { public PageInfo<NoticeDTO> getMessageTemplateList(MessageTemplateQueryRequest request) {

View File

@@ -59,7 +59,7 @@ public class MessageTemplateController {
@PostMapping("/batchPublish") @PostMapping("/batchPublish")
@ApiOperation("批量发布") @ApiOperation("批量发布")
public ResponseResult<Boolean> batchPublishMessageTemplate(@RequestBody BatchPublishRequest request) { public ResponseResult<Boolean> batchPublishMessageTemplate(@RequestBody BatchPublishRequest request) {
return ResponseResult.success(messageTemplateService.batchPublishMessageTemplate(request, CurrentUserHolder.getUser())); return ResponseResult.success(messageTemplateService.batchPublishMessageTemplate(request, CurrentUserHolder.getUser().getUserId()));
} }
@PostMapping("/getMessageTemplateList") @PostMapping("/getMessageTemplateList")

View File

@@ -6,6 +6,7 @@ import com.cool.store.dto.store.StoreUserPositionDTO;
import com.cool.store.request.OpenApiStoreRequest; import com.cool.store.request.OpenApiStoreRequest;
import com.cool.store.request.StoreCodeDTO; import com.cool.store.request.StoreCodeDTO;
import com.cool.store.request.*; import com.cool.store.request.*;
import com.cool.store.request.notice.ThirdMatterRequest;
import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest;
import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest;
import com.cool.store.response.ResponseResult; import com.cool.store.response.ResponseResult;
@@ -44,6 +45,8 @@ public class OpenApiController {
ShopAccountService shopAccountService; ShopAccountService shopAccountService;
@Resource @Resource
StoreService storeService; StoreService storeService;
@Resource
MessageTemplateService messageTemplateService;
@PostMapping("/statusRefresh") @PostMapping("/statusRefresh")
public ApiResponse<Boolean> statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ public ApiResponse<Boolean> statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){
@@ -151,4 +154,12 @@ public class OpenApiController {
return ApiResponse.success(decorationDesignInfoService.decorationAcceptance(request)); return ApiResponse.success(decorationDesignInfoService.decorationAcceptance(request));
} }
@ApiOperation("事项处理")
@PostMapping("/matterHandle")
public ApiResponse<Boolean> thirdMatterHandle(@RequestBody @Validated ThirdMatterRequest request) {
log.info("thirdMatterHandle request{}", JSONObject.toJSONString(request));
return messageTemplateService.thirdMatterHandle(request);
}
} }