Merge #30 into master from cc_20260106_process_change

fix:加盟合同签约及建店资料修改

* cc_20260106_process_change: (6 commits squashed)

  - fix:加盟合同签约新增财务审批

  - fix:建店资料阶段逻辑修改

  - fix:加盟合同签约待办,财务查看待财务审批的待办

  - feat:城市规划

  - feat:行政区划接口;
    fix:城市规划修改

  - fix:加盟合同签约审批日志逻辑修改

Signed-off-by: 王非凡 <accounts_67eba0c5fee9c49c80c8e2b4@mail.teambition.com>
Reviewed-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/30
This commit is contained in:
王非凡
2026-01-19 09:11:34 +00:00
committed by 正新
parent eb9b8bdf00
commit c28515123a
41 changed files with 1259 additions and 92 deletions

View File

@@ -1,6 +1,8 @@
package com.cool.store.service;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.request.AuditApproveRequest;
import com.cool.store.request.BuildInformationRequest;
import com.cool.store.request.BuildSettlerRequest;
import com.cool.store.response.BuildInformationResponse;
@@ -14,10 +16,16 @@ public interface BuildInformationService {
BuildInformationResponse getBuildInformation(Long shopId);
Integer submitOrUpdate(BuildInformationRequest request);
Integer submitOrUpdate(BuildInformationRequest request, String userId, String userName);
Integer getJoinType(Long lineId);
Boolean updateBuildSettler(BuildSettlerRequest request,String userId);
/**
* 运营顾问审批
* @param request 审批Request
* @param user 用户
*/
Boolean operationsConsultantAudit(AuditApproveRequest request, LoginUserInfo user);
}

View File

@@ -16,6 +16,8 @@ public interface OperationLogService {
Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum,String userId, List<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark,OperationStatusEnum operationStatusEnum);
Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum,String userId, List<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark,OperationStatusEnum operationStatusEnum, int serial);
List<AuditInfoResponse> getAuditInfo(Long shopId,List<Integer> shopSubStageList);
Boolean batchUpdateProcessed( List<OperationLogDO> operationLogs,Long audit , String userId, String reason);

View File

@@ -32,6 +32,8 @@ public interface SignFranchiseService {
*/
Boolean auditApprove(AuditApproveRequest request, LoginUserInfo user);
Boolean financeAuditApprove(AuditApproveRequest request, LoginUserInfo user);
/**
* 加盟合同退回后重新缴费
* @param shopId

View File

@@ -0,0 +1,24 @@
package com.cool.store.service.ad;
import com.cool.store.vo.ad.AdDistrictVO;
import java.util.List;
/**
* <p>
* 行政区划 服务类
* </p>
*
* @author wangff
* @since 2025/10/14
*/
public interface AdDistrictService {
/**
* 行政区划列表
* @param pid 父级id默认1
* @return 行政区划VO列表
*/
List<AdDistrictVO> cityList(Long pid);
}

View File

@@ -0,0 +1,35 @@
package com.cool.store.service.ad.impl;
import com.cool.store.dao.ad.AdDistrictDAO;
import com.cool.store.entity.ad.AdDistrictDO;
import com.cool.store.service.ad.AdDistrictService;
import com.cool.store.utils.BeanUtil;
import com.cool.store.vo.ad.AdDistrictVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
/**
* <p>
* 行政区划 服务实现类
* </p>
*
* @author wangff
* @since 2025/10/14
*/
@Service
@RequiredArgsConstructor
public class AdDistrictServiceImpl implements AdDistrictService {
private final AdDistrictDAO adDistrictDAO;
@Override
public List<AdDistrictVO> cityList(Long pid) {
if (Objects.isNull(pid)) {
pid = 1L;
}
List<AdDistrictDO> list = adDistrictDAO.getList(pid);
return BeanUtil.toList(list, AdDistrictVO.class);
}
}

View File

@@ -1,8 +1,11 @@
package com.cool.store.service.impl;
import cn.hutool.core.collection.CollStreamUtil;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants;
import com.cool.store.constants.RedisConstant;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dao.*;
import com.cool.store.entity.*;
import com.cool.store.enums.*;
@@ -10,17 +13,15 @@ import com.cool.store.enums.point.ShopSubStageEnum;
import com.cool.store.enums.point.ShopSubStageStatusEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.WarehouseInfoMapper;
import com.cool.store.request.AuditApproveRequest;
import com.cool.store.request.BuildInformationRequest;
import com.cool.store.request.BuildSettlerRequest;
import com.cool.store.response.BuildInformationResponse;
import com.cool.store.service.BuildInformationService;
import com.cool.store.mapper.BuildInformationMapper;
import com.cool.store.service.EnumInfoService;
import com.cool.store.service.PreparationService;
import com.cool.store.service.UserAuthMappingService;
import com.cool.store.service.*;
import com.cool.store.utils.RedisConstantUtil;
import com.cool.store.utils.RedisUtilPool;
import com.cool.store.utils.poi.StringUtils;
import com.cool.store.utils.poi.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.jetbrains.annotations.NotNull;
@@ -31,7 +32,9 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.cool.store.enums.point.ShopSubStageStatusEnum.*;
import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5;
/**
* @author EDY
@@ -75,11 +78,19 @@ public class BuildInformationServiceImpl implements BuildInformationService {
private BigRegionDAO bigRegionDAO;
@Resource
private AcceptanceInfoDAO acceptanceInfoDAO;
@Resource
private OperationLogService operationLogService;
@Resource
private EnterpriseUserDAO enterpriseUserDAO;
@Resource
private ShopAuditInfoDAO shopAuditInfoDAO;
@Resource
private OperationLogDAO operationLogDAO;
@Override
@Transactional(rollbackFor = Exception.class)
public Integer submitOrUpdate(BuildInformationRequest request) {
public Integer submitOrUpdate(BuildInformationRequest request, String userId, String userName) {
log.info("提交/修改建店资料开始,shopId:{}", JSONObject.toJSONString(request));
String lockKey = redisConstantUtil.submitBuildKey(request.getShopId());
String lockValue = UUID.randomUUID().toString();
@@ -123,21 +134,18 @@ public class BuildInformationServiceImpl implements BuildInformationService {
buildInformationDO.setSettlerIdCardFront(qualificationsInfoDO.getFrontOfIdCard());
buildInformationDO.setSettlerIdCardReverse(qualificationsInfoDO.getBackOfIdCard());
}
// 存在运营顾问审批不通过重新编辑的情况,所以这里判断一下是否存在未处理的审批记录,不存在则添加审批记录
insertOperations(shopInfoDO, userId, userName);
if (Objects.isNull(informationDO)) {
buildInformationDO.setCreateTime(new Date());
buildInformationDO.setUpdateTime(new Date());
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_151);
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5);
HashMap<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> logisticsList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.LOGISTICS, shopInfoDO.getRegionId());
List<String> logistics = new ArrayList<>();
if (Objects.nonNull(logisticsList)) {
logistics.addAll(logisticsList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()));
}
commonService.sendQWMessage(logistics,
MessageEnum.MESSAGE_52,
commonService.sendQWMessage(Collections.singletonList(shopInfoDO.getOperationsConsultant()),
MessageEnum.MESSAGE_54,
map);
return buildInformationDAO.insertSelective(buildInformationDO);
} else {
@@ -158,6 +166,19 @@ public class BuildInformationServiceImpl implements BuildInformationService {
}
}
platformBuildDAO.batchUpdate(platformBuildDOS);
// 运营顾问审批驳回后,走的编辑逻辑,因此判断是否为加盟商驳回后第一次编辑,推进阶段到运营顾问审批
ShopStageInfoDO currentStage = shopStageInfoDAO.getByShopIdAndSubStage(shopInfoDO.getId(), ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage());
if (SHOP_SUB_STAGE_STATUS_150.getShopSubStageStatus().equals(currentStage.getShopSubStageStatus())) {
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_150_5);
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5);
HashMap<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
commonService.sendQWMessage(Collections.singletonList(shopInfoDO.getOperationsConsultant()),
MessageEnum.MESSAGE_54,
map);
}
return buildInformationDAO.updateByShopIdSelective(buildInformationDO);
}
}else{
@@ -173,6 +194,19 @@ public class BuildInformationServiceImpl implements BuildInformationService {
}
}
private void insertOperations(ShopInfoDO shopInfoDO, String userId, String userName) {
List<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(shopInfoDO.getId(), SHOP_SUB_STAGE_STATUS_150_5, OperationTypeEnum.OPERATION_TYPE_1.getCode());
if (CollectionUtils.isEmpty(operationLogs)) {
EnterpriseUserDO operationsConsultant = enterpriseUserDAO.getUserInfoById(shopInfoDO.getOperationsConsultant());
// 审批记录
operationLogService.addOperationLog(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150, userId, userName,
OperationTypeEnum.OPERATION_TYPE_0, "建店资料提交审批", OperationStatusEnum.PROCESSED);
operationLogService.addOperationLog(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5,
shopInfoDO.getOperationsConsultant(), Collections.singletonList(operationsConsultant),
OperationTypeEnum.OPERATION_TYPE_1, "建店资料运营顾问审核", OperationStatusEnum.NOT_PROCESSED);
}
}
@Override
public BuildInformationResponse getBuildInformation(Long shopId) {
BuildInformationResponse response = new BuildInformationResponse();
@@ -221,6 +255,16 @@ public class BuildInformationServiceImpl implements BuildInformationService {
}
response.setDeclareGoodsType(orderSysInfoDO.getDeclareGoodsType());
}
if (StringUtils.isBlank(response.getReceivingFirmName())) {
String bankInfoStr = redisUtilPool.getString(RedisConstant.BUILD_RECEIVE_BANK_INFO);
if (StringUtils.isNotBlank(bankInfoStr)) {
JSONObject bankInfo = JSONObject.parseObject(bankInfoStr);
response.setReceivingFirmName(bankInfo.getString("receivingFirmName"));
response.setReceivingMsBankAccount(bankInfo.getString("receivingMsBankAccount"));
response.setReceivingMsBankBranch(bankInfo.getString("receivingMsBankBranch"));
response.setBankUnionPayAccount(bankInfo.getString("bankUnionPayAccount"));
}
}
if (StringUtils.isBlank(response.getXgjVicePresident())) {
List<EnterpriseUserDO> userList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.VICE_PRESIDENT_IN_CHARGE, shopInfo.getRegionId());
if (CollectionUtils.isNotEmpty(userList)) {
@@ -370,6 +414,50 @@ public class BuildInformationServiceImpl implements BuildInformationService {
return true;
}
@Override
@Transactional
public Boolean operationsConsultantAudit(AuditApproveRequest request, LoginUserInfo user) {
ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId());
if (shopInfo.getShopDecorationAttributes() == null){
throw new ServiceException(ErrorCodeEnum.SHOP_DECORATION_ATTRIBUTES_IS_NULL);
}
ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_15);
if (!shopSubStageInfo.getShopSubStageStatus().equals(SHOP_SUB_STAGE_STATUS_150_5.getShopSubStageStatus())) {
throw new ServiceException(ErrorCodeEnum.WORK_FLOW_STAGE_PASS_ERROR);
}
if (Constants.ZERO_INTEGER.equals(request.getAuditResult())) {
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_150);
} else {
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_151);
ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(request.getShopId());
LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfoDO.getLineId());
HashMap<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> logisticsList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.LOGISTICS, shopInfoDO.getRegionId());
List<String> logistics = CollStreamUtil.toList(logisticsList, EnterpriseUserDO::getUserId);
commonService.sendQWMessage(logistics, MessageEnum.MESSAGE_52, map);
}
ShopAuditInfoDO shopAuditInfoDO = new ShopAuditInfoDO();
shopAuditInfoDO.setShopId(request.getShopId());
shopAuditInfoDO.setAuditType(AuditTypeEnum.BUILDINFORMATION.getCode());
shopAuditInfoDO.setSubmittedUserId(user.getUserId());
shopAuditInfoDO.setSubmittedUserName(user.getName());
shopAuditInfoDO.setResultType(request.getAuditResult() ^ 1);
if (AuditResultTypeEnum.PASS.getCode().equals(shopAuditInfoDO.getResultType())) {
shopAuditInfoDO.setPassReason(request.getCause());
} else {
shopAuditInfoDO.setRejectReason(request.getCause());
}
Long auditId = shopAuditInfoDAO.addAuditInfo(shopAuditInfoDO);
//更新操作记录
List<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), SHOP_SUB_STAGE_STATUS_150_5, OperationTypeEnum.OPERATION_TYPE_1.getCode());
operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause());
return true;
}
}

View File

@@ -309,6 +309,9 @@ public class DeskServiceImpl implements DeskService {
if (userRoleIds.contains(UserRoleEnum.BRANCH_OFFICE.getCode()) || userRoleIds.contains(UserRoleEnum.REGION_OFFICE.getCode()) || isAdmin) {
subStageStatusList.add(SHOP_SUB_STAGE_STATUS_83.getShopSubStageStatus());
}
if (userRoleIds.contains(UserRoleEnum.FINANCE.getCode())) {
subStageStatusList.add(SHOP_SUB_STAGE_STATUS_83_5.getShopSubStageStatus());
}
PageInfo<PreparationCommonPendingVO> pageInfo = commonPendingVOPageInfo(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_8,
subStageStatusList, Boolean.TRUE);
return pageInfo;
@@ -515,8 +518,8 @@ public class DeskServiceImpl implements DeskService {
public PageInfo<PreparationCommonPendingVO> buildInformationPendingList(DeskRequest deskRequest, LoginUserInfo user) {
List<Long> userRoleIds = enterpriseUserRoleMapper.getUserRoleIds(user.getUserId());
if (userRoleIds.contains(UserRoleEnum.SUPERVISION.getCode())) {
return commonPendingVOPageInfo(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_15,
Collections.singletonList(SHOP_SUB_STAGE_STATUS_150.getShopSubStageStatus()), Boolean.FALSE);
return commonPendingVOPageInfoByOperationsConsultant(deskRequest, user.getUserId(), ShopSubStageEnum.SHOP_STAGE_15,
Arrays.asList(SHOP_SUB_STAGE_STATUS_150.getShopSubStageStatus(), SHOP_SUB_STAGE_STATUS_150_5.getShopSubStageStatus()), Boolean.FALSE);
}
//如果不是财务角色或者即是财务又是自有店财务 则不需要标识
Boolean ownShopFlag = null;
@@ -551,7 +554,7 @@ public class DeskServiceImpl implements DeskService {
subStageStatusList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_154.getShopSubStageStatus());
subStageStatusList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_155.getShopSubStageStatus());
}
return commonPendingVOPage(deskRequest, isAdmin ? null : user, ShopSubStageEnum.SHOP_STAGE_15, subStageStatusList, isAdmin ? Boolean.FALSE : Boolean.TRUE, ownShopFlag);
return commonPendingVOPage(deskRequest, isAdmin ? null : user, ShopSubStageEnum.SHOP_STAGE_15, subStageStatusList, isAdmin ? Boolean.FALSE : Boolean.TRUE, ownShopFlag, null);
}
@Override
@@ -815,7 +818,11 @@ public class DeskServiceImpl implements DeskService {
* @return
*/
private PageInfo<PreparationCommonPendingVO> commonPendingVOPageInfo(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag) {
return this.commonPendingVOPage(deskRequest, user, shopSubStageEnum, subStageStatusList, filterFlag, null);
return this.commonPendingVOPage(deskRequest, user, shopSubStageEnum, subStageStatusList, filterFlag, null, null);
}
private PageInfo<PreparationCommonPendingVO> commonPendingVOPageInfoByOperationsConsultant(DeskRequest deskRequest, String operationsConsultantUserId, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag) {
return this.commonPendingVOPage(deskRequest, null, shopSubStageEnum, subStageStatusList, filterFlag, null, operationsConsultantUserId);
}
/**
@@ -826,7 +833,8 @@ public class DeskServiceImpl implements DeskService {
* @param subStageStatusList
* @return
*/
private PageInfo<PreparationCommonPendingVO> commonPendingVOPage(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag, Boolean ownShopFlag) {
private PageInfo<PreparationCommonPendingVO> commonPendingVOPage(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag, Boolean ownShopFlag,
String operationsConsultantUserId) {
//user.getJobNumber()
List<String> authRegionIds = new ArrayList<>();
if (filterFlag) {
@@ -836,7 +844,7 @@ public class DeskServiceImpl implements DeskService {
}
PageHelper.startPage(deskRequest.getPageNum(), deskRequest.getPageSize());
List<ShopStageInfoDO> specialShopStageInfo = shopStageInfoDAO.getSpecialShopStageInfo(null, shopSubStageEnum.getShopSubStage(),
subStageStatusList, user == null ? null : user.getUserId(), authRegionIds, ownShopFlag, deskRequest);
subStageStatusList, user == null ? null : user.getUserId(), authRegionIds, ownShopFlag, deskRequest, operationsConsultantUserId);
PageInfo result = new PageInfo<>(specialShopStageInfo);
List<Long> shopIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getShopId).collect(Collectors.toList());
List<Long> lineIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getLineId).collect(Collectors.toList());

View File

@@ -59,10 +59,16 @@ public class OperationLogServiceImpl implements OperationLogService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum, String userId, List<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark, OperationStatusEnum operationStatusEnum) {
return addOperationLog(shopId, shopSubStageStatusEnum, userId, operationUserList, operationTypeEnum, remark, operationStatusEnum, 1);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum, String userId, List<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark, OperationStatusEnum operationStatusEnum, int serial) {
List<OperationLogDO> operationLogDOList = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND, 1);
calendar.add(Calendar.SECOND, serial);
Date date = calendar.getTime();
if(CollectionUtils.isEmpty(operationUserList)){
operationUserList = new ArrayList<>();

View File

@@ -107,26 +107,9 @@ public class OrderSysInfoServiceImpl implements OrderSysInfoService {
if (shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_151.getShopSubStageStatus())) {
orderSysInfoDO.setOrderCreateTime(new Date());
orderSysInfoDO.setOrderCreateUser(curUserId);
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_152);
ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(request.getShopId());
LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfoDO.getLineId());
HashMap<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
//自有店财务
UserRoleEnum finance = UserRoleEnum.FINANCE;
if (JoinModeEnum.OWN_STORE.getCode()==(shopInfo.getJoinMode())) {
finance = UserRoleEnum.OWN_SHOP_OFFICE;
}
List<EnterpriseUserDO> itList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(finance, shopInfoDO.getRegionId());
List<String> itUsers = new ArrayList<>();
if (Objects.nonNull(itList)) {
itUsers.addAll(itList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()));
}
commonService.sendQWMessage(itUsers,
MessageEnum.MESSAGE_53,
map);
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_156);
stageCompletion(request.getShopId());
syncMainSysServer.syncStore(request.getShopId());
return orderSysInfoDAO.updateByShopId(orderSysInfoDO);
} else {
orderSysInfoDO.setOrderUpdateTime(new Date());

View File

@@ -872,6 +872,9 @@ public class ShopServiceImpl implements ShopService {
case SHOP_SUB_STAGE_STATUS_83:
return getUsersByRolesAndRegion(Arrays.asList(REGION_OFFICE, BRANCH_OFFICE), shopInfo.getRegionId());
case SHOP_SUB_STAGE_STATUS_83_5:
return getUsersByRolesAndRegion(Collections.singletonList(FINANCE), shopInfo.getRegionId());
case SHOP_SUB_STAGE_STATUS_85_1:
return getUsersByRole(FINANCE);

View File

@@ -242,6 +242,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83);
//发送通知
List<EnterpriseUserDO> auditFranchiseFeeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Arrays.asList(BRANCH_OFFICE, REGION_OFFICE), shopInfoDO.getRegionId());
List<EnterpriseUserDO> financeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Collections.singletonList(FINANCE), shopInfoDO.getRegionId());
List<String> auditFranchiseFeeUserList = auditFranchiseFeeUsers.stream().distinct().map(EnterpriseUserDO::getUserId).collect(Collectors.toList());
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
HashMap<String, String> map = new HashMap<>();
@@ -255,8 +256,10 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
OperationTypeEnum.OPERATION_TYPE_0, "加盟签约合同提交", OperationStatusEnum.PROCESSED);
operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83,
user.getUserId(), auditFranchiseFeeUsers,
OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED);
OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED, 1);
operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83_5,
user.getUserId(), financeUsers,
OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同财务审批", OperationStatusEnum.NOT_PROCESSED, 2);
} else {
//修改签约人信息
signFranchiseMapper.updateByPrimaryKeySelective(signFranchiseDO);
@@ -318,6 +321,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83);
//发送通知
List<EnterpriseUserDO> userIds = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Arrays.asList(BRANCH_OFFICE, REGION_OFFICE), shopInfoDO.getRegionId());
List<EnterpriseUserDO> financeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Collections.singletonList(FINANCE), shopInfoDO.getRegionId());
List<String> auditFranchiseFeeUserList = userIds.stream().distinct().map(EnterpriseUserDO::getUserId).collect(Collectors.toList());
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
HashMap<String, String> map = new HashMap<>();
@@ -332,8 +336,10 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
OperationTypeEnum.OPERATION_TYPE_0, "加盟签约合同重新提交提交", OperationStatusEnum.PROCESSED);
operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83,
user.getUserId(), userIds,
OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED);
OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED, 1);
operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83_5,
user.getUserId(), financeUsers,
OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同财务审批", OperationStatusEnum.NOT_PROCESSED, 2);
return Boolean.TRUE;
}
@@ -447,6 +453,99 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
//流水
String lockValue = UUID.randomUUID().toString();
boolean acquired = false;
try {
//10s过期
acquired = redisUtilPool.setNxExpire(lockKey, lockValue, CommonConstants.TEN_SECONDS);
if (Boolean.TRUE.equals(acquired)) {
ShopInfoDO shopInfoDO = shopInfoMapper.selectByPrimaryKey(shopId);
ShopAuditInfoDO shopAuditInfoDO = new ShopAuditInfoDO();
shopAuditInfoDO.setShopId(shopId);
shopAuditInfoDO.setAuditType(AuditTypeEnum.SIGN_FRANCHISE.getCode());
shopAuditInfoDO.setSubmittedUserId(user.getUserId());
shopAuditInfoDO.setSubmittedUserName(user.getName());
//驳回
if (Constants.ZERO_INTEGER.equals(request.getAuditResult())) {
auditReject(request, shopAuditInfoDO, shopInfoDO);
} else if (Constants.ONE_INTEGER.equals(request.getAuditResult())) {
shopAuditInfoDO.setResultType(Constants.ZERO_INTEGER);
shopAuditInfoDO.setPassReason(request.getCause());
//更新状态为加盟商
LineInfoDO lineInfoDO = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
shopStageInfoDAO.updateShopStageInfo(shopId, SHOP_SUB_STAGE_STATUS_83_5);
Boolean sendNotice = Boolean.TRUE;
if (sendNotice) {
HashMap<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.FINANCE, shopInfoDO.getRegionId());
List<String> finances = new ArrayList<>();
if (Objects.nonNull(userDOList)) {
finances.addAll(userDOList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()));
}
commonService.sendQWMessage(finances,
MessageEnum.MESSAGE_19_1,
map);
}
}
shopAuditInfoMapper.insertSelective(shopAuditInfoDO);
Long auditId = shopAuditInfoDO.getId();
signFranchiseDAO.updateAuditByShopId(auditId, shopId);
//审批记录表记录
List<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, OperationTypeEnum.OPERATION_TYPE_1.getCode());
operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause());
return true;
} else {
throw new ServiceException(ErrorCodeEnum.DUPLICATE_SUBMISSION);
}
} finally {
if (Boolean.TRUE.equals(acquired)) {
String currentValue = redisUtilPool.getString(lockKey);
if (lockValue.equals(currentValue)) {
redisUtilPool.delKey(lockKey);
}
}
}
}
/**
* 分部内勤/财务审批拒绝
*/
private void auditReject(AuditApproveRequest request, ShopAuditInfoDO shopAuditInfoDO, ShopInfoDO shopInfoDO) {
shopAuditInfoDO.setResultType(Constants.ONE_INTEGER);
shopAuditInfoDO.setRejectReason(request.getCause());
Map<String, String> requestMap = new HashMap<>();
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_85);
Set<String> auditFranchiseFeeUsers = new HashSet<>();
List<EnterpriseUserDO> branchUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.JOIN_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(branchUser)) {
Set<String> branchUserIds = branchUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet());
auditFranchiseFeeUsers.addAll(branchUserIds);
}
List<EnterpriseUserDO> regionUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(REGION_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(regionUser)) {
Set<String> regionUserIds = regionUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet());
auditFranchiseFeeUsers.addAll(regionUserIds);
}
requestMap.put("storeName", shopInfoDO.getShopName());
requestMap.put("partnerName", lineInfo.getUsername());
requestMap.put("partnerMobile", lineInfo.getMobile());
requestMap.put("lineId", String.valueOf(lineInfo.getId()));
requestMap.put("shopId", String.valueOf(shopInfoDO.getId()));
commonService.sendMessage(new ArrayList<>(auditFranchiseFeeUsers), MessageEnum.MESSAGE_20, requestMap);
}
@Override
@Transactional
public Boolean financeAuditApprove(AuditApproveRequest request, LoginUserInfo user) {
log.info("SignFranchiseServiceImpl financeAuditApprove request{}", JSONObject.toJSONString(request));
Long shopId = request.getShopId();
String lockKey = "financeAuditApprove:" + request.getShopId();
//流水
String lockValue = UUID.randomUUID().toString();
boolean acquired = false;
try {
//10s过期
acquired = redisUtilPool.setNxExpire(lockKey, lockValue, CommonConstants.TEN_SECONDS);
@@ -460,30 +559,9 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
//驳回
ContractCallbackDTO contractCallbackDTO = null;
if (Constants.ZERO_INTEGER.equals(request.getAuditResult())) {
shopAuditInfoDO.setResultType(Constants.ONE_INTEGER);
shopAuditInfoDO.setRejectReason(request.getCause());
Map<String, String> requestMap = new HashMap<>();
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
shopStageInfoDAO.updateShopStageInfo(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_85);
Set<String> auditFranchiseFeeUsers = new HashSet<>();
List<EnterpriseUserDO> branchUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.JOIN_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(branchUser)) {
Set<String> branchUserIds = branchUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet());
auditFranchiseFeeUsers.addAll(branchUserIds);
}
List<EnterpriseUserDO> regionUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(REGION_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(regionUser)) {
Set<String> regionUserIds = regionUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet());
auditFranchiseFeeUsers.addAll(regionUserIds);
}
requestMap.put("storeName", shopInfoDO.getShopName());
requestMap.put("partnerName", lineInfo.getUsername());
requestMap.put("partnerMobile", lineInfo.getMobile());
requestMap.put("lineId", String.valueOf(lineInfo.getId()));
requestMap.put("shopId", String.valueOf(shopInfoDO.getId()));
commonService.sendMessage(new ArrayList<>(auditFranchiseFeeUsers), MessageEnum.MESSAGE_20, requestMap);
auditReject(request, shopAuditInfoDO, shopInfoDO);
} else if (Constants.ONE_INTEGER.equals(request.getAuditResult())) {
log.info("合同审核,装修属性:{},加盟模式:{}",ShopDecorationAttributesEnum.getDescByCode(shopInfoDO.getShopDecorationAttributes()),
log.info("合同审核,装修属性:{},加盟模式:{}", ShopDecorationAttributesEnum.getDescByCode(shopInfoDO.getShopDecorationAttributes()),
JoinModeEnum.getByCode(shopInfoDO.getJoinMode()));
if (shopInfoDO.getShopDecorationAttributes().equals(ShopDecorationAttributesEnum.OLD_NEW_OPEN.getCode())) {
//老店新开时装修与开业直接完成
@@ -491,7 +569,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
SHOP_SUB_STAGE_STATUS_863, SHOP_SUB_STAGE_STATUS_91, SHOP_SUB_STAGE_STATUS_112, SHOP_SUB_STAGE_STATUS_123, SHOP_SUB_STAGE_STATUS_143,
SHOP_SUB_STAGE_STATUS_276
));
}else{
} else {
//,加盟公司自有店->加盟公司建店 不推送数据 再crm中完成
//v2.0.0 先确认装修团队
TeamAreaMappingDO city = teamAreaMappingDAO.getByCityId(shopInfoDO.getWantShopAreaId());
@@ -512,7 +590,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
shopDecorationAssignDO.setShopId(shopId);
shopDecorationAssignDAO.insert(shopDecorationAssignDO);
//新增一个延迟队列 四个小时之后确定是否手动分配 没有手动分配 直接自动分配 红圈通推送和下一个流程开始改为分配团队之后 触发
simpleMessageService.send(String.valueOf(shopDecorationAssignDO.getId()), RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN,System.currentTimeMillis() + 4*60*60 * 1000);
simpleMessageService.send(String.valueOf(shopDecorationAssignDO.getId()), RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN, System.currentTimeMillis() + 4 * 60 * 60 * 1000);
}
shopAuditInfoDO.setResultType(Constants.ZERO_INTEGER);
shopAuditInfoDO.setPassReason(request.getCause());
@@ -523,15 +601,15 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
lineInfoMapper.insertOrUpdate(lineInfoDO);
shopStageInfoDAO.updateShopStageInfo(shopId, SHOP_SUB_STAGE_STATUS_84);
//初始化数据 如果是正新鸡排 需要手动分配 其他品牌直接开始 且将招商经理给到运营经理
if (FranchiseBrandEnum.ZXJP.getCode()==Integer.valueOf(shopInfoDO.getFranchiseBrand())){
log.info("zxjp_assign shopId:{}",shopId);
if (FranchiseBrandEnum.ZXJP.getCode() == Integer.valueOf(shopInfoDO.getFranchiseBrand())) {
log.info("zxjp_assign shopId:{}", shopId);
//新增分配信息
OperationsConsultantAssignDO operationsConsultantAssignDO = new OperationsConsultantAssignDO();
operationsConsultantAssignDO.setShopId(shopId);
operationsConsultantAssignDO.setAssignStatus(0);
operationsConsultantAssignDO.setRegionId(shopInfoDO.getRegionId());
operationsConsultantAssignDAO.addOperationsConsultantAssign(operationsConsultantAssignDO);
}else {
} else {
//其他品牌直接开始 且将招商经理给到运营经理
shopInfoDO.setOperationsConsultant(shopInfoDO.getInvestmentManager());
shopInfoDAO.updateShopInfo(shopInfoDO);
@@ -548,15 +626,6 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.FINANCE, shopInfoDO.getRegionId());
List<String> finances = new ArrayList<>();
if (Objects.nonNull(userDOList)) {
finances.addAll(userDOList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()));
}
// List<String> liGuiNeiQinList = enterpriseUserRoleDao.selectUserIdsByRoleIdList(Arrays.asList(UserRoleEnum.CONSTRUCTION_CUSTOMER.getCode()));
// commonService.sendQWMessage(liGuiNeiQinList,
// MessageEnum.MESSAGE_57,
// map);
commonService.sendQWMessage(Collections.singletonList(shopInfoDO.getInvestmentManager()),
MessageEnum.MESSAGE_26,
map);
@@ -564,13 +633,13 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
}
shopAuditInfoMapper.insertSelective(shopAuditInfoDO);
Long auditId = shopAuditInfoDO.getId();
if (contractCallbackDTO!=null&&StringUtils.isNotEmpty(contractCallbackDTO.getStoreCode())){
if (contractCallbackDTO != null && StringUtils.isNotEmpty(contractCallbackDTO.getStoreCode())) {
shopInfoDO.setShopCode(contractCallbackDTO.getStoreCode());
shopInfoMapper.updateByPrimaryKeySelective(shopInfoDO);
}
signFranchiseDAO.updateAuditByShopId(auditId, shopId,contractCallbackDTO);
signFranchiseDAO.updateAuditByShopId(auditId, shopId, contractCallbackDTO);
//审批记录表记录
List<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, OperationTypeEnum.OPERATION_TYPE_1.getCode());
List<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83_5, OperationTypeEnum.OPERATION_TYPE_1.getCode());
operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause());
return true;
} else {

View File

@@ -0,0 +1,58 @@
package com.cool.store.service.plan;
import com.cool.store.request.plan.CityPlanningUpdateRequest;
import com.cool.store.request.plan.CityPlanningQueryRequest;
import com.cool.store.vo.plan.CityPlanningStatisticsVO;
import com.cool.store.vo.plan.CityPlanningVO;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* 城市规划服务接口
*/
public interface CityPlanningService {
/**
* 新增城市规划
* @param request 新增请求
* @return 是否成功
*/
Boolean add(CityPlanningUpdateRequest request);
/**
* 编辑城市规划
* @param request 编辑请求
* @return 是否成功
*/
Boolean update(CityPlanningUpdateRequest request);
/**
* 分页查询
* @param request 查询请求
* @return 分页结果
*/
PageInfo<CityPlanningVO> queryPage(CityPlanningQueryRequest request);
/**
* 批量删除
* @param ids id列表
* @return 是否成功
*/
Boolean deleteByIds(List<Long> ids);
/**
* 规划进度
* @param request 查询请求
* @return 分页结果
*/
PageInfo<CityPlanningVO> cityPlanningSchedule(CityPlanningQueryRequest request);
/**
* 规划进度总计
* @param request 查询请求
* @return 规划进度统计VO
*/
CityPlanningStatisticsVO cityPlanningStatistics(CityPlanningQueryRequest request);
}

View File

@@ -0,0 +1,161 @@
package com.cool.store.service.plan.impl;
import cn.hutool.core.collection.CollStreamUtil;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.dao.StoreDao;
import com.cool.store.dao.ad.AdDistrictDAO;
import com.cool.store.dao.plan.CityPlanningDAO;
import com.cool.store.entity.plan.CityPlanningDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.request.plan.CityPlanningUpdateRequest;
import com.cool.store.request.plan.CityPlanningQueryRequest;
import com.cool.store.service.plan.CityPlanningService;
import com.cool.store.utils.BeanUtil;
import com.cool.store.vo.plan.CityPlanningStatisticsVO;
import com.cool.store.vo.plan.CityPlanningVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 城市规划服务实现类
*/
@Service
@RequiredArgsConstructor
public class CityPlanningServiceImpl implements CityPlanningService {
private final CityPlanningDAO cityPlanningDAO;
private final AdDistrictDAO adDistrictDAO;
private final StoreDao storeDao;
private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
@Override
public Boolean add(CityPlanningUpdateRequest request) {
// 校验同年份同季度同省市不能存在2个规划
if (cityPlanningDAO.existsByYearAndQuarterAndRegion(
request.getYear(), request.getQuarter(),
request.getProvinceCode(), request.getCityCode(), null)) {
throw new ServiceException(ErrorCodeEnum.CITY_PLANNING_EXISTS);
}
CityPlanningDO cityPlanningDO = BeanUtil.toBean(request, CityPlanningDO.class);
cityPlanningDO.setPlanNo(generatePlanNo(request));
cityPlanningDO.setCreateUserId(CurrentUserHolder.getUserId());
return cityPlanningDAO.insertSelective(cityPlanningDO);
}
@Override
public Boolean update(CityPlanningUpdateRequest request) {
// 先查询是否存在
CityPlanningDO existing = cityPlanningDAO.getById(request.getId());
if (existing == null) {
throw new ServiceException("规划不存在");
}
// 校验同年份同季度同省市不能存在2个规划排除自身
if (cityPlanningDAO.existsByYearAndQuarterAndRegion(
request.getYear(), request.getQuarter(),
request.getProvinceCode(), request.getCityCode(), request.getId())) {
throw new ServiceException("同年份同季度同省市已存在其他规划,不能修改");
}
CityPlanningDO cityPlanningDO = BeanUtil.toBean(request, CityPlanningDO.class);
return cityPlanningDAO.updateSelective(cityPlanningDO);
}
@Override
public PageInfo<CityPlanningVO> queryPage(CityPlanningQueryRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<CityPlanningDO> list = cityPlanningDAO.queryByCondition(request);
PageInfo<CityPlanningDO> page = new PageInfo<>(list);
PageInfo<CityPlanningVO> result = BeanUtil.toPage(page, CityPlanningVO.class);
List<String> adCodes = list.stream()
.flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode()))
.distinct()
.collect(Collectors.toList());
Map<String, String> adMap = adDistrictDAO.getNameByCodes(adCodes);
result.getList().forEach(v -> {
v.setProvince(adMap.get(v.getProvinceCode()));
v.setCity(adMap.get(v.getCityCode()));
});
return result;
}
@Override
public Boolean deleteByIds(List<Long> ids) {
return cityPlanningDAO.deleteByIds(ids);
}
@Override
public PageInfo<CityPlanningVO> cityPlanningSchedule(CityPlanningQueryRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<CityPlanningDO> list = cityPlanningDAO.queryByCondition(request);
PageInfo<CityPlanningDO> page = new PageInfo<>(list);
PageInfo<CityPlanningVO> result = BeanUtil.toPage(page, CityPlanningVO.class);
List<String> adCodes = list.stream()
.flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode()))
.distinct()
.collect(Collectors.toList());
Map<String, String> adMap = adDistrictDAO.getNameByCodes(adCodes);
Set<Integer> years = CollStreamUtil.toSet(list, CityPlanningDO::getYear);
Map<Integer, Map<Integer, Map<String, Map<String, Integer>>>> storeNumMap = storeDao.storeNumStatisticsByAd(new ArrayList<>(years), new ArrayList<>(adMap.values()));
result.getList().forEach(v -> {
v.setProvince(adMap.get(v.getProvinceCode()));
v.setCity(adMap.get(v.getCityCode()));
Integer completeNum = storeNumMap.getOrDefault(v.getYear(), Collections.emptyMap())
.getOrDefault(v.getQuarter(), Collections.emptyMap())
.getOrDefault(v.getProvince(), Collections.emptyMap())
.getOrDefault(v.getCity(), 0);
v.setCompleteNum(completeNum);
BigDecimal rate = v.getTarget() != 0 ? BigDecimal.valueOf(completeNum)
.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(v.getTarget()), 1, RoundingMode.HALF_UP) : BigDecimal.ZERO;
v.setCompleteRate(rate);
});
return result;
}
@Override
public CityPlanningStatisticsVO cityPlanningStatistics(CityPlanningQueryRequest request) {
List<CityPlanningDO> list = cityPlanningDAO.queryByCondition(request);
List<String> adCodes = list.stream()
.flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode()))
.distinct()
.collect(Collectors.toList());
Map<String, String> adMap = adDistrictDAO.getNameByCodes(adCodes);
Set<Integer> years = CollStreamUtil.toSet(list, CityPlanningDO::getYear);
Map<Integer, Map<Integer, Map<String, Map<String, Integer>>>> storeNumMap = storeDao.storeNumStatisticsByAd(new ArrayList<>(years), new ArrayList<>(adMap.values()));
int completeNum = 0, totalTarget = 0;
for (CityPlanningDO v : list) {
String province = adMap.get(v.getProvinceCode());
String city = adMap.get(v.getCityCode());
completeNum += storeNumMap.getOrDefault(v.getYear(), Collections.emptyMap())
.getOrDefault(v.getQuarter(), Collections.emptyMap())
.getOrDefault(province, Collections.emptyMap())
.getOrDefault(city, 0);
totalTarget += v.getTarget();
}
BigDecimal rate = totalTarget != 0 ? BigDecimal.valueOf(completeNum)
.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(totalTarget), 1, RoundingMode.HALF_UP) : BigDecimal.ZERO;
return new CityPlanningStatisticsVO(totalTarget, completeNum, rate);
}
/**
* 生成规划编码
* 格式CP + 年份 + 季度 + 序号
*/
private String generatePlanNo(CityPlanningUpdateRequest request) {
return "GH" + request.getYear() + request.getQuarter() + request.getCityCode() + ((int) (Math.random() * 900) + 100);
}
}