Merge #32 into master from cc_20260113_open

开业日期报备

* cc_20260113_open: (15 commits squashed)

  - feat:阶段调整

  - feat:开业阶段调整

  - feat:开业日期报备

  - feat:开业日期报备代办

  - feat:文本通知

  - feat:数据处理

  - fix:bug

  - feat:通知功能

  - Merge branch 'master' into cc_20260113_open
    
    # Conflicts:
    #	coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java

  - feat:开业代办新增代办预计开业时间

  - feat:开业时间查询

  - feat:开业

  - feat:PC计划开业时间

  - Merge branch 'master' into cc_20260113_open
    
    # Conflicts:
    #	coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java

  - Merge branch 'master' into cc_20260113_open
    
    # Conflicts:
    #	coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopController.java

Signed-off-by: 正新 <accounts_6964c7bcd2a2c377c5bbd01b@mail.teambition.com>
Merged-by: 正新 <accounts_6964c7bcd2a2c377c5bbd01b@mail.teambition.com>

CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/32
This commit is contained in:
正新
2026-01-23 06:49:50 +00:00
parent 41ae24478d
commit 10dca9bf9b
31 changed files with 630 additions and 14 deletions

View File

@@ -302,7 +302,8 @@ public enum ErrorCodeEnum {
PRODUCTS_SALES_COMPLETED(1511034,"含有销售完成的产品,无法批量报销",null),
STORE_IS_EXIST(1511035,"该门店已存在",null),
FEE_NOT_CONSISTENT(1511036,"合同金额与缴费账单金额不一致,请确定!",null),
OPERATIONS_CONSULTANT_ASSIGNED(1511037,"OPERATIONS_CONSULTANT_ASSIGNED",null),
OPERATIONS_CONSULTANT_ASSIGNED(1511037,"运营顾问已分配",null),
NO_OPERATIONS_CONSULTANT(1511037,"你不是当前门店运营顾问!请确认!",null),
MESSAGE_TEMPLATE_NOT_SUPPORT_EDIT(1610001,"当前消息已发布,不支持编辑!",null),

View File

@@ -90,6 +90,13 @@ public enum MessageEnum {
MESSAGE_61("您有一个门店京东外卖初审已通过,请查收","门店名称:${storeName}\n加盟商姓名${partnerUsername}\n加盟商手机号码${partnerMobile}\n"),
MESSAGE_62("您有一个门店设计阶段设计图待提交,请查收","门店名称:${storeName}\n加盟商姓名${partnerUsername}\n加盟商手机号码${partnerMobile}\n"),
MESSAGE_63("您有一个门店开业日期报备待确认,请查收","##### 加盟商姓名:${partnerUsername}\n门店名称${storeName}\n计划开业时间${planOpenDate}\n门店地址${shopAddress}\n请及时跟进开业筹备支持工作"),
MESSAGE_100("您有一个门店开业日期报备待确认,请查收","##### 您管辖的${storeName}已提交开业日期报备,计划开业日期为${planOpenDate},门店地址:${shopAddress},请及时跟进开业筹备支持工作。"),
;
private String title;

View File

@@ -44,6 +44,8 @@ public enum ShopSubStageEnum {
SHOP_STAGE_6(ShopStageEnum.SHOP_STAGE_2, 260, "开通门店平安钱包", 1),
SHOP_STAGE_27(ShopStageEnum.SHOP_STAGE_2, 270, "开业验收", 1),
SHOP_STAGE_30(ShopStageEnum.SHOP_STAGE_2, 300, "开业日期报备", 1),
;
@@ -141,6 +143,7 @@ public enum ShopSubStageEnum {
case SHOP_STAGE_24:
case SHOP_STAGE_25:
case SHOP_STAGE_27:
case SHOP_STAGE_30:
return ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_00;
default:
return null;

View File

@@ -166,6 +166,11 @@ public enum ShopSubStageStatusEnum {
SHOP_SUB_STAGE_STATUS_274(ShopSubStageEnum.SHOP_STAGE_27, 2740,"待整改", Boolean.FALSE),
SHOP_SUB_STAGE_STATUS_276(ShopSubStageEnum.SHOP_STAGE_27, 2760,"已完成", Boolean.TRUE),
//开业日期报备
SHOP_SUB_STAGE_STATUS_300(ShopSubStageEnum.SHOP_STAGE_30, 3000, "待填写", Boolean.FALSE),
SHOP_SUB_STAGE_STATUS_310(ShopSubStageEnum.SHOP_STAGE_30, 3010, "待开业确认", Boolean.FALSE),
SHOP_SUB_STAGE_STATUS_320(ShopSubStageEnum.SHOP_STAGE_30, 3020,"已完成", Boolean.TRUE),
;
private ShopSubStageEnum shopSubStageEnum;

View File

@@ -354,6 +354,12 @@ public class ShopStageInfoDAO {
return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds,ownShopFlag, deskRequest, operationsConsultantUserId);
}
public List<ShopStageInfoDO> getOperationsConsultantStageInfo(List<Long> shopIds, Integer shopSubStage,
List<Integer> shopSubStageStatusList,
String investmentUserId, DeskRequest deskRequest) {
return shopStageInfoMapper.getOperationsConsultantStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, deskRequest);
}
/**
* @Auther: wangshuo
* @Date: 2024/5/9

View File

@@ -170,8 +170,9 @@ public class StoreDao {
* @param storeId 门店id
* @param storeStatus 门店营业状态
*/
public void updateStoreStatus(String storeId, String storeStatus) {
storeMapper.updateStoreStatus(storeId,storeStatus);
public void updateStoreStatus(String storeId, String storeStatus,Date actualOpenDate) {
if (Objects.isNull(storeId)||Objects.isNull(storeStatus)||Objects.isNull(actualOpenDate))
storeMapper.updateStoreStatus(storeId,storeStatus,actualOpenDate);
}
/**

View File

@@ -152,6 +152,25 @@ public interface ShopStageInfoMapper extends Mapper<ShopStageInfoDO> {
@Param("ownShopFlag") Boolean ownShopFlag,
@Param("request") DeskRequest deskRequest,
@Param("operationsConsultantUserId") String operationsConsultantUserId);
/**
* 获取运营顾问指定流程的代办数据
* @param shopIds
* @param shopSubStage
* @param shopSubStageStatusList
* @param operationsConsultant
* @param deskRequest
* @return
*/
List<ShopStageInfoDO> getOperationsConsultantStageInfo(@Param("shopIds") List<Long> shopIds,
@Param("shopSubStage") Integer shopSubStage,
@Param("shopSubStageStatusList") List<Integer> shopSubStageStatusList,
@Param("operationsConsultant") String operationsConsultant,
@Param("request") DeskRequest deskRequest);
List<ShopStageInfoDO> getSubStageList(@Param("shopIds") List<Long> shopIds,@Param("shopSubStage") Integer shopSubStage);
List<ShopStageInfoDO> getSubStages(@Param("shopIds") List<Long> shopIds,@Param("shopSubStage") Integer shopSubStage);

View File

@@ -93,7 +93,9 @@ public interface StoreMapper {
* @param storeId 门店id
* @param storeStatus 门店营业状态
*/
void updateStoreStatus(@Param("storeId") String storeId, @Param("storeStatus") String storeStatus);
void updateStoreStatus(@Param("storeId") String storeId,
@Param("storeStatus") String storeStatus,
@Param("actualOpenDate") Date actualOpenDate);
/**
* 门店状态改为闭店

View File

@@ -41,6 +41,8 @@
<result column="store_id" jdbcType="VARCHAR" property="storeId"/>
<result column="invest_region_id" jdbcType="BIGINT" property="investRegionId"/>
<result column="operations_consultant" jdbcType="VARCHAR" property="operationsConsultant"/>
<result column="plan_open_date" jdbcType="DATE" property="planOpenDate"/>
<result column="actual_open_date" jdbcType="DATE" property="actualOpenDate"/>
</resultMap>
<sql id="allColumn">
@@ -49,7 +51,8 @@
shop_code, store_num, shop_manager_user_id, supervisor_user_id,
plan_open_time, cur_progress, shop_type, shop_stage, deleted, create_time, update_time,
join_mode,detail_address,franchise_brand,development_manager,want_shop_area_id,investment_manager,shop_status,create_user_id,update_user_id,store_type
, province,province_code,city,city_code,district,district_code,manager_region_id,shop_decoration_attributes,hqt_shop_id,store_id, invest_region_id, operations_consultant
, province,province_code,city,city_code,district,district_code,manager_region_id,shop_decoration_attributes,hqt_shop_id,store_id, invest_region_id, operations_consultant,
plan_open_date,actual_open_date
</sql>
<insert id="batchAddShop" useGeneratedKeys="true" keyProperty="id" keyColumn="id">

View File

@@ -396,6 +396,81 @@
</where>
</select>
<select id="getOperationsConsultantStageInfo" resultMap="BaseResultMap">
select
*
from xfsg_shop_stage_info a
left join xfsg_shop_info si on a.shop_id = si.id
<if test="request.signTypes != null and request.signTypes.size() >0">
left join xfsg_sign_franchise sign on a.shop_id = sign.shop_id
</if>
<where>
si.deleted = 0 and a.is_terminated = 0 and si.shop_status !=2
<if test="shopIds != null and shopIds.size() > 0">
and a.shop_id in
<foreach collection="shopIds" item="shopId" index="index" open="(" separator="," close=")">
#{shopId}
</foreach>
</if>
<if test="shopSubStage!=null">
and a.shop_sub_stage = #{shopSubStage}
<if test = "shopSubStage == 86 or shopSubStage == 90 or shopSubStage == 110 or shopSubStage == 120">
and (si.hqt_shop_id is null or si.hqt_shop_id = '')
</if>
</if>
<if test="shopSubStageStatusList != null and shopSubStageStatusList.size() > 0">
and a.shop_sub_stage_status in
<foreach collection="shopSubStageStatusList" item="stageStatus" index="index" open="(" separator=","
close=")">
#{stageStatus}
</foreach>
</if>
<if test="request.stageStatus !=null and request.stageStatus.size() >0">
and a.shop_sub_stage_status in
<foreach collection="request.stageStatus" item="item" index="index" open="(" separator=","
close=")">
#{item}
</foreach>
</if>
<if test="operationsConsultant!=null and operationsConsultant!=''">
and si.operations_consultant = #{operationsConsultant}
</if>
<if test="request.shopKeyword !=null and request.shopKeyword !=''">
and (si.shop_name like concat('%',#{request.shopKeyword},'%') or si.shop_code like concat('%',#{request.shopKeyword},'%'))
</if>
<if test="request.regionIds !=null and request.regionIds.size()>0">
and si.region_id in
<foreach collection="request.regionIds" item="regionId" index="index" open="(" separator="," close=")">
#{regionId}
</foreach>
</if>
<if test="request.storeTypes !=null and request.storeTypes.size()>0">
and si.store_type in
<foreach collection="request.storeTypes" item="storeType" index="index" open="(" separator="," close=")">
#{storeType}
</foreach>
</if>
<if test="request.signTypes !=null and request.signTypes.size()>0">
and sign.sign_type in
<foreach collection="request.signTypes" item="signType" index="index" open="(" separator="," close=")">
#{signType}
</foreach>
</if>
<if test="request.supervisorId != null and request.supervisorId!= ''">
and si.investment_manager = #{request.supervisorId}
</if>
<if test="request.joinModes !=null and request.joinModes.size()>0">
and si.join_mode in
<foreach collection="request.joinModes" item="joinMode" index="index" open="(" separator="," close=")">
#{joinMode}
</foreach>
</if>
order by a.update_time desc
</where>
</select>
<select id="getSubStageList" resultType="com.cool.store.entity.ShopStageInfoDO">
select *
from xfsg_shop_stage_info

View File

@@ -297,7 +297,8 @@
<update id="updateStoreStatus">
UPDATE store_${enterpriseId}
SET store_status = #{storeStatus}
SET store_status = #{storeStatus},
actual_open_date = #{actualOpenDate}
WHERE store_id = #{storeId} AND is_delete = 'effective'
</update>

View File

@@ -0,0 +1,26 @@
package com.cool.store.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @Auther zx_szh
* @Date 2026/1/13 15:28
* @Version 1.0
*/
@Data
public class OpenInfoDTO {
@ApiModelProperty("门店ID")
private Long shopId;
@ApiModelProperty("计划开业时间")
private String planOpenDate;
@ApiModelProperty("实际开业时间")
private String actualOpenDate;
}

View File

@@ -0,0 +1,69 @@
package com.cool.store.dto.message;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
/**
* @Auther zx_szh
* @Date 2026/1/13 18:40
* @Version 1.0
*/
@Data
public class SendTextMessageDTO {
/**
* 钉钉的企业唯一ID
*/
private String corpId;
/**
* 发送的人员ID集合
*/
private String userIds;
/**
* 内容
*/
private String content;
/**
* 微应用:micro_app; E应用-e_app; 钉钉:DINGDING; 企业微信:qw
*/
private String appType;
private JSONObject oaJson;
private String messageType;
/**
* 标题
*/
private String title;
/**
* 发送消息业务id标识
*/
private String outBusinessId;
public SendTextMessageDTO() {
}
@Override
public String toString() {
return "SendTextMessageDTO{" +
"corpId='" + corpId + '\'' +
", userIds='" + userIds + '\'' +
", content='" + content + '\'' +
", appType='" + appType + '\'' +
", oaJson=" + oaJson +
", messageType='" + messageType + '\'' +
", title='" + title + '\'' +
", outBusinessId='" + outBusinessId + '\'' +
'}';
}
}

View File

@@ -167,4 +167,10 @@ public class ShopInfoDO {
@Column(name = "operations_consultant")
private String operationsConsultant;
@Column(name = "plan_open_date")
private Date planOpenDate;
@Column(name = "actual_open_date")
private Date actualOpenDate;
}

View File

@@ -0,0 +1,24 @@
package com.cool.store.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @Auther zx_szh
* @Date 2026/1/13 13:48
* @Version 1.0
*/
@Data
public class OpenDateReportRequest {
@ApiModelProperty("门店ID")
private Long shopId;
@ApiModelProperty("开业日期")
private Date openDate;
}

View File

@@ -65,4 +65,7 @@ public class PreparationCommonPendingVO {
@ApiModelProperty("招商所属大区名称")
private String investRegionName;
@ApiModelProperty("预计开业时间")
private String planOpenDate;
}

View File

@@ -22,4 +22,11 @@ public interface DataHandleService {
*/
Integer dataHandleServiceV25();
/**
* 开业日期筹备阶段批量新增
* @param shopId
* @return
*/
Boolean openStageBatchInsert(Long shopId);
}

View File

@@ -178,6 +178,16 @@ public interface DeskService {
*/
PageInfo<PreparationCommonPendingVO> openingAcceptance(DeskRequest deskRequest, LoginUserInfo user );
/**
* 开业确认代办
* @param deskRequest
* @param user
* @return
*/
PageInfo<PreparationCommonPendingVO> openingConfirmPendingList(DeskRequest deskRequest, LoginUserInfo user );
/**
* 测量阶段

View File

@@ -109,5 +109,13 @@ public interface PreparationService {
*/
Boolean buildStoreComplete(Long shopId);
/**
* 开始开业日期报备
* 培训登记与开业门店验收 完成都调用 都完成 开启开始开业日期报备
* @param shopId
* @return
*/
Boolean theOpeningDateIsReported(Long shopId);
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.service;
import com.cool.store.dto.OpenInfoDTO;
import com.cool.store.dto.UserDTO;
import com.cool.store.entity.LineInfoDO;
import com.cool.store.entity.ShopInfoDO;
@@ -144,4 +145,26 @@ public interface ShopService {
Boolean checkShopCodeRepeat(String shopCode,Long shopId);
Boolean isShowButton(Long shopId);
/**
* 提交开业报备
* @param openDateReportRequest
* @return
*/
Boolean submitOpenDateReport(OpenDateReportRequest openDateReportRequest);
/**
* 确认开业
* @param request
* @return
*/
Boolean confirmOpen(OpenDateReportRequest request,String userId);
/**
* 获取开业信息
* @param shopId
* @return
*/
OpenInfoDTO getShopOpenInfo(Long shopId);
}

View File

@@ -7,6 +7,7 @@ import com.aliyun.sdk.service.dysmsapi20170525.models.*;
import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dto.message.SendMessageDTO;
import com.cool.store.dto.message.SendTextMessageDTO;
import com.cool.store.enums.*;
import com.cool.store.mq.producer.SimpleMessageService;
import com.cool.store.request.AuditResultRequest;
@@ -22,6 +23,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -230,5 +232,39 @@ public class CommonService {
}
}
/**
* 企微发送文本消息通知
* @param userIdList 消息接收人列表
* @param message 消息标题
* @param requestMap 消息内容
*/
public void sendTextMessage(List<String> userIdList, MessageEnum message, Map<String, String> requestMap) {
log.info("message:{}, request:{}, userIds:{}", message.getTitle(), JSONObject.toJSONString(requestMap), JSONObject.toJSONString(userIdList));
if(CollectionUtils.isEmpty(userIdList)){
log.info("消息接收人列表为空");
return;
}
userIdList = userIdList.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
if(CollectionUtils.isEmpty(userIdList)){
log.info("消息接收人列表为空(已过滤空值)");
return;
}
try {
String outBusinessId = UUIDUtils.get8UUID();
SendTextMessageDTO messageDTO = new SendTextMessageDTO();
messageDTO.setCorpId(dingCorpId);
messageDTO.setUserIds(String.join(Constants.COMMA, userIdList));
messageDTO.setOutBusinessId(outBusinessId);
messageDTO.setAppType("qw_self_dkf");
messageDTO.setMessageType("text");
messageDTO.setTitle(message.getTitle());
messageDTO.setContent(message.getContent(requestMap));
simpleMessageService.send(JSONObject.toJSONString(messageDTO), RocketMqTagEnum.STORE_DING_QUEUE);
log.info("文本消息发送成功, outBusinessId:{}", outBusinessId);
} catch (Exception e) {
log.error("文本消息发送失败, title:{}, userIdList:{}", message.getTitle(), JSONObject.toJSONString(userIdList), e);
}
}
}

View File

@@ -17,6 +17,8 @@ import org.apache.commons.collections4.ListUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.unit.DataUnit;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.Page;
import javax.annotation.Resource;
import java.lang.reflect.Array;
@@ -84,6 +86,107 @@ public class DataHandleServiceImpl implements DataHandleService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean openStageBatchInsert(Long shopId) {
int pageSize = 100;
int pageNum = 1;
LocalDate selectStartDate = LocalDate.now();
while (true) {
// 使用PageHelper分页查询每页100条
PageHelper.startPage(pageNum, pageSize);
List<ShopInfoDO> shopInfoDOS = shopInfoDAO.selectByIdOrSelectAll(shopId);
// 如果没有数据了,退出循环
if (CollectionUtils.isEmpty(shopInfoDOS)) {
break;
}
List<ShopStageInfoDO> addShopStageList = new ArrayList<>();
for (ShopInfoDO shopInfo : shopInfoDOS) {
Long currentShopId = shopInfo.getId();
Long lineId = shopInfo.getLineId();
// 查询门店的所有阶段数据
List<ShopStageInfoDO> shopStageInfoList = shopStageInfoDAO.getShopStageInfo(currentShopId, null);
if (CollectionUtils.isEmpty(shopStageInfoList)) {
continue;
}
// 将阶段数据转换为Map方便查找
Map<Integer, ShopStageInfoDO> infoDOMap = shopStageInfoList.stream()
.collect(Collectors.toMap(
ShopStageInfoDO::getShopSubStage,
v -> v,
(k1, k2) -> k1
));
// 3. 检查是否已经有开业日期筹备阶段数据,如果有则跳过
ShopStageInfoDO openStageInfo = infoDOMap.get(ShopSubStageEnum.SHOP_STAGE_30.getShopSubStage());
if (Objects.nonNull(openStageInfo)) {
continue;
}
// 2. 判断培训阶段与开业验收阶段是否都完成
ShopStageInfoDO trainingStage = infoDOMap.get(ShopSubStageEnum.SHOP_STAGE_5.getShopSubStage());
ShopStageInfoDO acceptanceStage = infoDOMap.get(ShopSubStageEnum.SHOP_STAGE_27.getShopSubStage());
// 判断培训阶段是否完成
boolean trainingCompleted = false;
if (Objects.nonNull(trainingStage)) {
Integer trainingStatus = trainingStage.getShopSubStageStatus();
trainingCompleted = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_51.getShopSubStageStatus().equals(trainingStatus);
}
// 判断开业验收阶段是否完成
boolean acceptanceCompleted = false;
if (Objects.nonNull(acceptanceStage)) {
Integer acceptanceStatus = acceptanceStage.getShopSubStageStatus();
acceptanceCompleted = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_276.getShopSubStageStatus().equals(acceptanceStatus);
}
// 创建开业日期筹备阶段数据
ShopStageInfoDO newOpenStage = new ShopStageInfoDO();
newOpenStage.setLineId(lineId);
newOpenStage.setShopId(currentShopId);
ShopStageEnum shopStageEnum = ShopSubStageEnum.SHOP_STAGE_30.getShopStageEnum();
newOpenStage.setShopStage(shopStageEnum.getShopStage());
newOpenStage.setShopSubStage(ShopSubStageEnum.SHOP_STAGE_30.getShopSubStage());
// 如果培训阶段和开业验收阶段都完成,则开业日期筹备阶段为已完成,否则为未开始
ShopSubStageStatusEnum initStatus;
if (trainingCompleted && acceptanceCompleted) {
initStatus = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_320; // 已完成
} else {
initStatus = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_00; // 待填写(未开始)
}
newOpenStage.setShopSubStageStatus(initStatus.getShopSubStageStatus());
newOpenStage.setRemark(ShopSubStageEnum.SHOP_STAGE_30.getShopSubStageName() + CommonConstants.PATH_BAR + initStatus.getShopSubStageStatusName());
newOpenStage.setIsTerminated(initStatus.isTerminated());
newOpenStage.setPlanCompleteTime(ShopSubStageEnum.SHOP_STAGE_30.getPlanCompleteTime(selectStartDate));
addShopStageList.add(newOpenStage);
}
// 批量插入当前页的数据
if (CollectionUtils.isNotEmpty(addShopStageList)) {
shopStageInfoDAO.batchInsert(addShopStageList);
}
// 判断是否还有下一页
Page<ShopInfoDO> page = (Page<ShopInfoDO>) shopInfoDOS;
if (page.getPageNum() >= page.getPages()) {
break;
}
pageNum++;
}
return Boolean.TRUE;
}
public void licenseHandle(ShopStageInfoDO shopStageInfoDO){
if (Objects.isNull(shopStageInfoDO)){
@@ -198,4 +301,8 @@ public class DataHandleServiceImpl implements DataHandleService {
}
return shopStageInfoDAO.batchInsert(addShopStageList);
}
}

View File

@@ -560,11 +560,12 @@ public class DeskServiceImpl implements DeskService {
@Override
public PageInfo<PreparationCommonPendingVO> openingAcceptance(DeskRequest deskRequest, LoginUserInfo user) {
List<Long> userRoleIds = enterpriseUserRoleMapper.getUserRoleIds(user.getUserId());
//如果是督导
//如果运营顾问 查询直接返回
List<Integer> stageList = new ArrayList<>();
Boolean flag = Boolean.FALSE;
if (userRoleIds.contains(UserRoleEnum.QW_SUPERVISION.getCode()) || userRoleIds.contains(UserRoleEnum.SUPERVISION.getCode())) {
stageList.addAll(Arrays.asList(SHOP_SUB_STAGE_STATUS_270.getShopSubStageStatus(),SHOP_SUB_STAGE_STATUS_274.getShopSubStageStatus()));
return operationCustomQueryList(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_27, stageList);
}
if (userRoleIds.contains(UserRoleEnum.OPERATION_GENERAL_CONSULTANT.getCode()) ) {
stageList.add(SHOP_SUB_STAGE_STATUS_272.getShopSubStageStatus());
@@ -576,6 +577,11 @@ public class DeskServiceImpl implements DeskService {
return commonPendingVOPageInfo(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_27, stageList, flag);
}
@Override
public PageInfo<PreparationCommonPendingVO> openingConfirmPendingList(DeskRequest deskRequest, LoginUserInfo user) {
return operationCustomQueryList(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_30, Arrays.asList(SHOP_SUB_STAGE_STATUS_310.getShopSubStageStatus()));
}
@Override
public PageInfo<PreparationCommonPendingVO> measurePendingList(DeskRequest deskRequest, LoginUserInfo user) {
List<Long> userRoleIds = enterpriseUserRoleMapper.getUserRoleIds(user.getUserId());
@@ -825,6 +831,26 @@ public class DeskServiceImpl implements DeskService {
return this.commonPendingVOPage(deskRequest, null, shopSubStageEnum, subStageStatusList, filterFlag, null, operationsConsultantUserId);
}
/**
* 运营顾问对于的代办
* @param deskRequest
* @param user
* @param shopSubStageEnum
* @param subStageStatusList
* @return
*/
private PageInfo<PreparationCommonPendingVO> operationCustomQueryList(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList) {
PageHelper.startPage(deskRequest.getPageNum(), deskRequest.getPageSize());
List<ShopStageInfoDO> specialShopStageInfo = shopStageInfoDAO.getOperationsConsultantStageInfo(null, shopSubStageEnum.getShopSubStage(),
subStageStatusList, user.getUserId(), deskRequest);
PageInfo result = new PageInfo<>(specialShopStageInfo);
List<PreparationCommonPendingVO> list = convert(specialShopStageInfo, subStageStatusList);
result.setList(list);
return result;
}
/**
* 通用查询
*
@@ -846,6 +872,13 @@ public class DeskServiceImpl implements DeskService {
List<ShopStageInfoDO> specialShopStageInfo = shopStageInfoDAO.getSpecialShopStageInfo(null, shopSubStageEnum.getShopSubStage(),
subStageStatusList, user == null ? null : user.getUserId(), authRegionIds, ownShopFlag, deskRequest, operationsConsultantUserId);
PageInfo result = new PageInfo<>(specialShopStageInfo);
List<PreparationCommonPendingVO> list = convert(specialShopStageInfo, subStageStatusList);
result.setList(list);
return result;
}
private List<PreparationCommonPendingVO> convert(List<ShopStageInfoDO> specialShopStageInfo,List<Integer> subStageStatusList){
List<Long> shopIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getShopId).collect(Collectors.toList());
List<Long> lineIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getLineId).collect(Collectors.toList());
List<ShopInfoDO> shopInfoList = shopInfoDAO.getShopListByIds(shopIds);
@@ -911,12 +944,16 @@ public class DeskServiceImpl implements DeskService {
preparationCommonPendingVO.setFranchiseBrand(shopInfoDO.getFranchiseBrand());
preparationCommonPendingVO.setInvestRegionId(shopInfoDO.getInvestRegionId());
preparationCommonPendingVO.setInvestRegionName(regionNameMap.get(shopInfoDO.getInvestRegionId()));
if (shopInfoDO!=null&&shopInfoDO.getPlanOpenDate()!=null){
preparationCommonPendingVO.setPlanOpenDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,shopInfoDO.getPlanOpenDate()));
}
list.add(preparationCommonPendingVO);
});
result.setList(list);
return result;
return list;
}
private void doThing(Map<Long, List<DeskStageDTO>> deskStageMap, List<ShopStageInfoDO> subStageList) {
for (ShopStageInfoDO shopStageInfoDO : subStageList) {
List<DeskStageDTO> deskStageDTOS = deskStageMap.get(shopStageInfoDO.getShopId());

View File

@@ -391,8 +391,25 @@ public class PreparationServiceImpl implements PreparationService {
return Boolean.TRUE;
}
@Override
public Boolean theOpeningDateIsReported(Long shopId) {
List<ShopStageInfoDO> shopStageInfo = shopStageInfoDAO.getShopStageInfo(shopId, null);
if (CollectionUtils.isNotEmpty(shopStageInfo)) {
Map<Integer, ShopStageInfoDO> shopStageInfoDOMap = shopStageInfo.stream().collect(Collectors.toMap(ShopStageInfoDO::getShopSubStage, data -> data));
Boolean openFlag = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_276.getShopSubStageStatus().
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_27.getShopSubStage()).getShopSubStageStatus());
Boolean trainingFlag = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_51.getShopSubStageStatus().
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_5.getShopSubStage()).getShopSubStageStatus());
log.info("theOpeningDateIsReported openFlag->{},TrainingFlag->{}",openFlag,trainingFlag);
//建店完成了 状态修改
if (openFlag && trainingFlag) {
shopStageInfoDAO.batchUpdateShopStageStatus(shopId, Arrays.asList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_300));
}
}
return Boolean.TRUE;
}
}

View File

@@ -3,6 +3,7 @@ package com.cool.store.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.*;
import com.cool.store.dto.OpenInfoDTO;
import com.cool.store.dto.Preparation.PreparationDTO;
import com.cool.store.dto.Preparation.ScheduleDTO;
import com.cool.store.dto.ShopNameAndCodeDTO;
@@ -14,6 +15,7 @@ import com.cool.store.enums.point.ShopStatusEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.EnterpriseUserRoleMapper;
import com.cool.store.mapper.RegionMapper;
import com.cool.store.mapper.StoreMapper;
import com.cool.store.request.*;
import com.cool.store.response.BranchShopDetailResponse;
import com.cool.store.response.BranchShopResponse;
@@ -989,6 +991,82 @@ public class ShopServiceImpl implements ShopService {
return true;
}
@Override
public Boolean submitOpenDateReport(OpenDateReportRequest request) {
if (Objects.isNull(request.getShopId())||Objects.isNull(request.getOpenDate())){
throw new ServiceException(PARAMS_VALIDATE_ERROR);
}
//查询门店
ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId());
if (Objects.isNull(shopInfo)){
throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
}
shopInfo.setPlanOpenDate(request.getOpenDate());
shopInfoDAO.updateShopInfo(shopInfo);
//阶段状态变为待确定
shopStageInfoDAO.updateShopStageInfo(request.getShopId(),ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_310);
LineInfoDO lineInfo = lineInfoDAO.getLineInfo(shopInfo.getLineId());
HashMap<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfo.getUsername());
map.put("storeName", shopInfo.getShopName());
map.put("planOpenDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,shopInfo.getPlanOpenDate()));
map.put("shopAddress", shopInfo.getDetailAddress());
commonService.sendQWMessage(Collections.singletonList(shopInfo.getOperationsConsultant()),
MessageEnum.MESSAGE_63, map);
//新增
List<EnterpriseUserDO> sendUsers = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.OPERATION_GENERAL_CONSULTANT, shopInfo.getRegionId());
if (CollectionUtils.isNotEmpty(sendUsers)){
List<String> userIdList = sendUsers.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList());
commonService.sendTextMessage(userIdList,MessageEnum.MESSAGE_100,map);
}
return Boolean.TRUE;
}
@Override
public Boolean confirmOpen(OpenDateReportRequest request,String userId) {
log.info("confirmOpen_request:{}",JSONObject.toJSONString(request));
if (Objects.isNull(request.getShopId())||Objects.isNull(request.getOpenDate())){
throw new ServiceException(PARAMS_VALIDATE_ERROR);
}
//查询门店
ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId());
if (Objects.isNull(shopInfo)){
throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
}
//只能运营顾问操作
if (StringUtils.isNotEmpty(shopInfo.getOperationsConsultant())&&!shopInfo.getOperationsConsultant().equals(userId)){
throw new ServiceException(ErrorCodeEnum.NO_OPERATIONS_CONSULTANT);
}
shopInfo.setActualOpenDate(request.getOpenDate());
shopInfoDAO.updateShopInfo(shopInfo);
//阶段状态变为带确定
shopStageInfoDAO.updateShopStageInfo(request.getShopId(),ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_320);
//更新门店为开业状态 且使用开业日期
StoreDO store = storeDao.getByStoreNum(shopInfo.getShopCode());
if (store!=null){
storeDao.updateStoreStatus(store.getStoreId(),"open",request.getOpenDate());
}
return Boolean.TRUE;
}
@Override
public OpenInfoDTO getShopOpenInfo(Long shopId) {
if (Objects.isNull(shopId)){
throw new ServiceException(PARAMS_VALIDATE_ERROR);
}
ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId);
if (Objects.isNull(shopInfo)){
throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
}
OpenInfoDTO openInfoDTO = new OpenInfoDTO();
openInfoDTO.setShopId(shopId);
openInfoDTO.setPlanOpenDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,shopInfo.getPlanOpenDate()));
openInfoDTO.setActualOpenDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,shopInfo.getActualOpenDate()));
return openInfoDTO;
}
/**
* 获取招商经理信息
* @param

View File

@@ -181,9 +181,8 @@ public class TempUserDetailServiceImpl implements TempUserDetailService {
}
//不能放到下面
shopStageInfoDAO.updateShopStageInfo(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_51);
//状态结束
preparationService.whetherToOpenForAcceptance(shopId);
preparationService.updateShopStatus(shopId);
//状态结束 开业日期报备
preparationService.theOpeningDateIsReported(shopId);
//培训完成,将订货状态为等待培训中的切为待授权
ShopStageInfoDO shopStage = shopStageInfoDAO.getByShopIdAndSubStage(shopId, ShopSubStageEnum.SHOP_STAGE_17.getShopSubStage());
if (shopStage!=null&&shopStage.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_171.getShopSubStageStatus())){

View File

@@ -145,9 +145,9 @@ public class OpeningAcceptanceServiceImpl implements OpeningAcceptanceService {
Long auditId = shopAuditInfoDO.getId();
List<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_272, OperationTypeEnum.OPERATION_TYPE_1.getCode());
operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause());
//开业验收完成之后 看门店整个流程是否完成
//开业验收完成之后 开业日期报备打开
if (status == AcceptanceStatusEnum.ACCEPTED.getCode()){
preparationService.updateShopStatus(request.getShopId());
preparationService.theOpeningDateIsReported(request.getShopId());
}
return Boolean.TRUE;
}

View File

@@ -215,6 +215,13 @@ public class DeskController {
return ResponseResult.success(deskService.openingAcceptance( deskRequest, userInfo ));
}
@ApiOperation("待处理-开业日期报备代办")
@PostMapping("/openingConfirmPendingList")
public ResponseResult<PageInfo<PreparationCommonPendingVO>> openingConfirmPendingList(@RequestBody DeskRequest deskRequest) {
LoginUserInfo userInfo = CurrentUserHolder.getUser();
return ResponseResult.success(deskService.openingConfirmPendingList( deskRequest, userInfo ));
}
@ApiOperation("待处理-测量阶段")
@PostMapping("/measurePendingList")
public ResponseResult<PageInfo<PreparationCommonPendingVO>> measurePendingList(@RequestBody DeskRequest deskRequest) {

View File

@@ -2,6 +2,7 @@ package com.cool.store.controller.webb;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.dto.BatchStatusRefreshDTO;
import com.cool.store.dto.OpenInfoDTO;
import com.cool.store.dto.TransferLogDTO;
import com.cool.store.dto.UserDTO;
import com.cool.store.request.*;
@@ -177,4 +178,22 @@ public class PCShopController {
public ResponseResult<Boolean> isShowButton(@RequestParam("shopId")Long shopId) {
return ResponseResult.success(shopService.isShowButton(shopId));
}
@ApiOperation("确定实际开业时间")
@PostMapping("/confirmActualOpenDate")
public ResponseResult<Boolean> confirmActualOpenDate(@RequestBody @Validated OpenDateReportRequest request) {
return ResponseResult.success(shopService.confirmOpen( request,CurrentUserHolder.getUserId()));
}
@ApiOperation("PC开业时间详情")
@GetMapping("/getShopOpenInfo")
public ResponseResult<OpenInfoDTO> getShopOpenInfo(@RequestParam("shopId")Long shopId) {
return ResponseResult.success(shopService.getShopOpenInfo(shopId));
}
@ApiOperation("PC提交计划开业时间")
@PostMapping("/submitPlanOpenDate")
public ResponseResult<Boolean> getRecommendedOrMyPointList(@RequestBody @Validated OpenDateReportRequest request) {
return ResponseResult.success(shopService.submitOpenDateReport( request));
}
}

View File

@@ -225,6 +225,11 @@ public class PCTestController {
return ResponseResult.success(dataHandleService.dataHandleService(shopId));
}
@GetMapping("/openStageBatchInsert")
public ResponseResult<Boolean> openStageBatchInsert(@RequestParam("shopId")Long shopId){
return ResponseResult.success(dataHandleService.openStageBatchInsert(shopId));
}
@GetMapping("/dataHandleServiceV25")
public ResponseResult<Integer> dataHandleServiceV25(){
return ResponseResult.success(dataHandleService.dataHandleServiceV25());

View File

@@ -1,6 +1,7 @@
package com.cool.store.controller.webc;
import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dto.OpenInfoDTO;
import com.cool.store.request.*;
import com.cool.store.response.BranchShopDetailResponse;
import com.cool.store.response.MiniShopsResponse;
@@ -158,4 +159,15 @@ public class MiniShopController {
return ResponseResult.success(pointService.getPointFinancialInfo( pointId));
}
@ApiOperation("提交计划开业时间")
@PostMapping("/submitPlanOpenDate")
public ResponseResult<Boolean> getRecommendedOrMyPointList(@RequestBody @Validated OpenDateReportRequest request) {
return ResponseResult.success(shopService.submitOpenDateReport( request));
}
@ApiOperation("Mini开业时间详情")
@GetMapping("/getShopOpenInfo")
public ResponseResult<OpenInfoDTO> getShopOpenInfo(@RequestParam("shopId")Long shopId) {
return ResponseResult.success(shopService.getShopOpenInfo(shopId));
}
}