Merge branch 'master' into cc_20251028_decoration
# Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
This commit is contained in:
@@ -21,7 +21,7 @@ public interface BigRegionService {
|
||||
* @param keyword 关键字
|
||||
* @return
|
||||
*/
|
||||
List<BigRegionDTO> queryAllBigRegion(String keyword);
|
||||
List<BigRegionDTO> queryAllBigRegion(String keyword, Integer joinBrand);
|
||||
|
||||
/**
|
||||
* 根据门店所属大区和加盟模式查询新管家对应组织信息
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package com.cool.store.service;
|
||||
|
||||
import com.cool.store.dto.FoodTokenDTO;
|
||||
import com.cool.store.dto.GetAccessTokenDTO;
|
||||
import com.cool.store.dto.store.StoreUserPositionDTO;
|
||||
import com.cool.store.dto.recipe.RecipeSpLaunchDTO;
|
||||
import com.cool.store.dto.store.StoreUserUpdateDTO;
|
||||
import com.cool.store.request.recipe.RevenueDataRequest;
|
||||
import com.cool.store.response.caipin.StoreUserResponse;
|
||||
import com.cool.store.vo.recipe.RevenueDataVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -31,4 +32,17 @@ public interface ThirdFoodService {
|
||||
*/
|
||||
StoreUserResponse pushStoreUser(List<StoreUserUpdateDTO> storeUserUpdateDTOList);
|
||||
|
||||
/**
|
||||
* 查询门店营收实收数据
|
||||
* @param request 营收数据Request
|
||||
* @return 营收数据VO列表
|
||||
*/
|
||||
List<RevenueDataVO> getRevenueData(RevenueDataRequest request);
|
||||
|
||||
/**
|
||||
* 查询菜品服务包上新数据
|
||||
* @param request 请求request
|
||||
* @return 服务包菜品上新DTO
|
||||
*/
|
||||
RecipeSpLaunchDTO getRecipeServiceLaunch(RevenueDataRequest request);
|
||||
}
|
||||
|
||||
@@ -25,8 +25,8 @@ public class BigRegionServiceImpl implements BigRegionService {
|
||||
BigRegionDAO bigRegionDAO;
|
||||
|
||||
@Override
|
||||
public List<BigRegionDTO> queryAllBigRegion(String keyword){
|
||||
return bigRegionDAO.queryAllBigRegion(keyword);
|
||||
public List<BigRegionDTO> queryAllBigRegion(String keyword, Integer joinBrand){
|
||||
return bigRegionDAO.queryAllBigRegion(keyword, joinBrand);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -213,6 +213,7 @@ public class BuildInformationServiceImpl implements BuildInformationService {
|
||||
response.setReceivingMsBankAccount(orderSysInfoDO.getReceivingMsBankAccount());
|
||||
response.setReceivingMsBankBranch(orderSysInfoDO.getReceivingMsBankBranch());
|
||||
response.setBankUnionPayAccount(orderSysInfoDO.getBankUnionPayAccount());
|
||||
response.setOrderType(orderSysInfoDO.getOrderType());
|
||||
WarehouseInfoDO warehouseInfoDO = warehouseInfoMapper.getByCode(orderSysInfoDO.getDeclareGoodsLogisticsWarehouse());
|
||||
if (Objects.nonNull(warehouseInfoDO)) {
|
||||
response.setDeclareGoodsLogisticsWarehouseName(warehouseInfoDO.getWarehouseName());
|
||||
|
||||
@@ -1170,7 +1170,7 @@ public class DataHandlerServerImpl implements DataHandlerServer {
|
||||
shopInfoDO.setManagerRegionId(isCreateStoreDTO.getPid());
|
||||
updateList.add(shopInfoDO);
|
||||
}
|
||||
List<BigRegionDTO> bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null);
|
||||
List<BigRegionDTO> bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null, null);
|
||||
Map<Long, BigRegionDTO> bigRegionDTOMap = bigRegionDTOS.stream().collect(Collectors.toMap(BigRegionDTO::getRegionId, x -> x));
|
||||
//XX大区 正烧鸡
|
||||
List<Long> storeManageIds = bigRegionDTOS.stream().filter(x -> x.getStoreManageRegionId() != null).map(BigRegionDTO::getStoreManageRegionId).collect(Collectors.toList());
|
||||
|
||||
@@ -725,6 +725,7 @@ public class DeskServiceImpl implements DeskService {
|
||||
preparationCommonPendingVO.setShopManagerUserName(userNameMap.getOrDefault(shopInfoDO.getShopManagerUserId(), ""));
|
||||
preparationCommonPendingVO.setRegionNodeName(regionNameMap.getOrDefault(shopInfoDO.getRegionId(), ""));
|
||||
preparationCommonPendingVO.setUpdateTime(x.getUpdateTime());
|
||||
preparationCommonPendingVO.setFranchiseBrand(shopInfoDO.getFranchiseBrand());
|
||||
list.add(preparationCommonPendingVO);
|
||||
});
|
||||
result.setList(list);
|
||||
|
||||
@@ -75,6 +75,13 @@ public class FranchiseFeeServiceImpl implements FranchiseFeeService {
|
||||
if (!shopStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_70.getShopSubStageStatus())){
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_ALLOW_OPERATE);
|
||||
}
|
||||
ShopInfoDO shopInfoDO = shopInfoMapper.selectByPrimaryKey(request.getShopId());
|
||||
// 三明治前端没有改这块代码,还是会传这三个字段,因此后端这三个字段置空
|
||||
if (Integer.valueOf(shopInfoDO.getFranchiseBrand()).equals(FranchiseBrandEnum.ZXSMZ.getCode())) {
|
||||
request.setFirstYearManageFee("0");
|
||||
request.setFirstYearFee("0");
|
||||
request.setYearFranchiseFee("0");
|
||||
}
|
||||
FranchiseFeeDO franchiseFeeDO = request.toFranchiseFeeDO();
|
||||
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_71);
|
||||
if (request.getId() != null) {
|
||||
@@ -89,11 +96,11 @@ public class FranchiseFeeServiceImpl implements FranchiseFeeService {
|
||||
franchiseFeeDO.setCreateTime(new Date());
|
||||
franchiseFeeMapper.insertSelective(franchiseFeeDO);
|
||||
}
|
||||
ShopInfoDO shopInfoDO = shopInfoMapper.selectByPrimaryKey(request.getShopId());
|
||||
LineInfoDO lineInfoDO = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
|
||||
commonService.sendSms(lineInfoDO.getMobile(), SMSMsgEnum.PAY_FRANCHISE_FEES);
|
||||
//推送加盟费信息到新管家
|
||||
PushFranchiseFeeRequest feeRequest = new PushFranchiseFeeRequest(shopInfoDO.getId(), lineInfoDO.getUsername(), franchiseFeeDO);
|
||||
feeRequest.setJoinBrand(Integer.valueOf(shopInfoDO.getFranchiseBrand()));
|
||||
pushService.pushFranchiseFeeToXGJ(feeRequest);
|
||||
return true;
|
||||
}
|
||||
@@ -116,6 +123,7 @@ public class FranchiseFeeServiceImpl implements FranchiseFeeService {
|
||||
//推送加盟费信息到新管家
|
||||
franchiseFeeDO.setCreateTime(franchiseFeeDO1.getCreateTime());
|
||||
PushFranchiseFeeRequest feeRequest = new PushFranchiseFeeRequest(shopInfoDO.getId(), lineInfoDO.getUsername(), franchiseFeeDO);
|
||||
feeRequest.setJoinBrand(Integer.valueOf(shopInfoDO.getFranchiseBrand()));
|
||||
pushService.pushFranchiseFeeToXGJ(feeRequest);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -308,6 +308,10 @@ public class LinePayServiceImpl implements LinePayService {
|
||||
public Boolean pushPayInfo(Long shopId, LinePayDO linePayDO) {
|
||||
FranchiseFeeDO franchiseFeeDO = franchiseFeeMapper.selectByShopId(shopId);
|
||||
ReceiptRequest receiptRequest = new ReceiptRequest(shopId, franchiseFeeDO.getId().intValue(), linePayDO);
|
||||
ShopInfoDO shopInfoDO = shopInfoMapper.selectByPrimaryKey(shopId);
|
||||
if (Objects.nonNull(shopInfoDO)) {
|
||||
receiptRequest.setJoinBrand(Integer.valueOf(shopInfoDO.getFranchiseBrand()));
|
||||
}
|
||||
//推送缴费单数据到新管家
|
||||
pushService.pushReceiptToXGJ(receiptRequest);
|
||||
return Boolean.TRUE;
|
||||
|
||||
@@ -143,6 +143,7 @@ public class OrderSysInfoServiceImpl implements OrderSysInfoService {
|
||||
orderSysInfoDO.setReceivingMsBankAccount(request.getReceivingMsBankAccount());
|
||||
orderSysInfoDO.setReceivingMsBankBranch(request.getReceivingMsBankBranch());
|
||||
orderSysInfoDO.setBankUnionPayAccount(request.getBankUnionPayAccount());
|
||||
orderSysInfoDO.setOrderType(request.getOrderType());
|
||||
if (shopSubStageInfo.getShopSubStageStatus().equals(SHOP_SUB_STAGE_STATUS_152.getShopSubStageStatus())) {
|
||||
if (orderSysInfoDO.getReceivingCreateTime() == null) {
|
||||
orderSysInfoDO.setReceivingCreateTime(new Date());
|
||||
|
||||
@@ -519,6 +519,14 @@ public class PointServiceImpl implements PointService {
|
||||
if (AuditStatusEnum.REJECT.equals(auditStatus)) {
|
||||
return auditRejectDeal(pointInfo, request.getReason());
|
||||
}
|
||||
// 如果是三明治,将地址写入门店信息表
|
||||
ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(pointInfo.getShopId());
|
||||
if (Objects.nonNull(shopInfo) && Integer.valueOf(shopInfo.getFranchiseBrand()).equals(FranchiseBrandEnum.ZXSMZ.getCode())) {
|
||||
ShopInfoDO updateShopInfo = new ShopInfoDO();
|
||||
updateShopInfo.setId(pointInfo.getShopId());
|
||||
updateShopInfo.setDetailAddress(pointInfo.getAddress());
|
||||
shopInfoDAO.updateShopInfo(updateShopInfo);
|
||||
}
|
||||
//处理下一节点任务及更新point状态
|
||||
return dealNextAuditRecord(pointInfo, pointAuditRecordMap, pointTodo.getNodeNo());
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.dao.*;
|
||||
import com.cool.store.entity.LineInfoDO;
|
||||
import com.cool.store.entity.PosAndOrderInfoDO;
|
||||
@@ -16,6 +17,7 @@ import com.cool.store.response.PosAndOrderResponse;
|
||||
import com.cool.store.service.PosAndOrderInfoService;
|
||||
import com.cool.store.mapper.PosAndOrderInfoMapper;
|
||||
import com.cool.store.service.PreparationService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -30,6 +32,7 @@ import java.util.Objects;
|
||||
* @createDate 2024-10-09 14:39:11
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class PosAndOrderInfoServiceImpl implements PosAndOrderInfoService {
|
||||
@Resource
|
||||
private LineInfoDAO lineInfoDAO;
|
||||
@@ -46,6 +49,7 @@ public class PosAndOrderInfoServiceImpl implements PosAndOrderInfoService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Integer submitOrUpdate(PostAndOrderRequest request, String user) {
|
||||
log.info("PosAndOrderInfoService_submitOrUpdate:{}", JSONObject.toJSONString(request));
|
||||
PosAndOrderInfoDO posAndOrderInfoDO = posAndOrderInfoDAO.selectOneByShopId(request.getShopId(), request.getType());
|
||||
PosAndOrderInfoDO posAndOrderInfo = request.toDO();
|
||||
posAndOrderInfo.setCreateUser(user);
|
||||
|
||||
@@ -220,6 +220,7 @@ public class PreparationServiceImpl implements PreparationService {
|
||||
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus());
|
||||
if (flag3) {
|
||||
List<ShopSubStageStatusEnum> list = new ArrayList<>();
|
||||
list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_160);
|
||||
list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_170);
|
||||
list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_230);
|
||||
shopStageInfoDAO.batchUpdateShopStageStatus(shopId, list);
|
||||
@@ -238,7 +239,6 @@ public class PreparationServiceImpl implements PreparationService {
|
||||
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_3.getShopSubStage()).getShopSubStageStatus());
|
||||
if (flag1 && flag2) {
|
||||
List<ShopSubStageStatusEnum> list = new ArrayList<>();
|
||||
list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_160);
|
||||
list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_240);
|
||||
shopStageInfoDAO.batchUpdateShopStageStatus(shopId, list);
|
||||
}
|
||||
@@ -361,12 +361,10 @@ public class PreparationServiceImpl implements PreparationService {
|
||||
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_1.getShopSubStage()).getShopSubStageStatus());
|
||||
Boolean flag3 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_156.getShopSubStageStatus().
|
||||
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus());
|
||||
Boolean flag4 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_33.getShopSubStageStatus().
|
||||
equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_3.getShopSubStage()).getShopSubStageStatus());
|
||||
|
||||
log.info("selectSiteAndBuildStoreComplete flag2->{} flag3->{} flag4->{}",flag2,flag3, flag4);
|
||||
log.info("selectSiteAndBuildStoreComplete flag2->{} flag3->{} flag4->{}",flag2,flag3);
|
||||
//都完成了 状态修改
|
||||
if (flag2 && flag3 && flag4) {
|
||||
if (flag2 && flag3) {
|
||||
shopAccountDAO.updateStatusByShopIdAndSystemName(shopId, Arrays.asList(ShopAccountEnum.HUOMA.getSystemName()), OpenStatusEnum.OPENSTATUSENUM_2.getCode(),null,null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,6 +203,7 @@ public class PushServiceImpl implements PushService {
|
||||
//如果userRoleIds包含督导。大区总。分部负责人任何一个 使用当前门店的手机号
|
||||
if (userRoleIds.contains(UserRoleEnum.SUPERVISION.getCode()) ||
|
||||
userRoleIds.contains(UserRoleEnum.HEAD_OF_DIVISION.getCode()) ||
|
||||
userRoleIds.contains(UserRoleEnum.SERVICE_PACKAGE_DEDICATED.getCode()) ||
|
||||
userRoleIds.contains(UserRoleEnum.REGION_MANAGER.getCode())) {
|
||||
StoreDO store = storeDao.getByStoreNum(dto.getShopCode());
|
||||
if (store != null&&store.getTelephone()!=null){
|
||||
|
||||
@@ -59,6 +59,8 @@ public class ShopAccountServiceImpl implements ShopAccountService {
|
||||
ThirdXinGuanJiaService thirdXinGuanJiaService;
|
||||
@Resource
|
||||
private LineInfoDAO lineInfoDAO;
|
||||
@Resource
|
||||
private StoreDao storeDao;
|
||||
|
||||
@Override
|
||||
public List<ShopAccountDTO> getShopAccountByShopId(Long shopId) {
|
||||
@@ -311,7 +313,17 @@ public class ShopAccountServiceImpl implements ShopAccountService {
|
||||
//查询老店关联表数据
|
||||
OldShopDO oldShopDO = oldShopDAO.getByCode(shopCode);
|
||||
if (Objects.isNull(oldShopDO)) {
|
||||
throw new ServiceException(ErrorCodeEnum.GET_YLS_CODE_FAIL);
|
||||
StoreDO storeDO = storeDao.getByStoreNum(shopCode);
|
||||
if (Objects.isNull(storeDO)) {
|
||||
throw new ServiceException(ErrorCodeEnum.GET_YLS_CODE_FAIL);
|
||||
}
|
||||
oldShopDO = OldShopDO.builder()
|
||||
.shopCode(shopCode)
|
||||
.shopName(storeDO.getStoreName())
|
||||
.mobile(storeDO.getTelephone())
|
||||
.ylsShopCode("ZXA8_" + shopCode)
|
||||
.build();
|
||||
oldShopDAO.insertSelective(oldShopDO);
|
||||
}
|
||||
return oldShopDO.getYlsShopCode();
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ public class ShopServiceImpl implements ShopService {
|
||||
}
|
||||
shopInfoDAO.batchAddShop(addShopList);
|
||||
List<Long> shopIds = addShopList.stream().map(ShopInfoDO::getId).collect(Collectors.toList());
|
||||
Integer result = shopStageInfoDAO.initShopStageInfo(lineInfo.getId(), shopIds, true);
|
||||
Integer result = shopStageInfoDAO.initShopStageInfo(lineInfo.getId(), addShopList, true);
|
||||
//初始化平台账号
|
||||
HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByPartnerId(lineInfo.getPartnerId());
|
||||
shopAccountDAO.initShopAccount(hyPartnerUserInfoDO, shopIds);
|
||||
@@ -298,7 +298,7 @@ public class ShopServiceImpl implements ShopService {
|
||||
}
|
||||
shopInfoDAO.batchAddShop(addShopList);
|
||||
List<Long> shopIds = addShopList.stream().map(ShopInfoDO::getId).collect(Collectors.toList());
|
||||
shopStageInfoDAO.initShopStageInfo(lineInfo.getId(), shopIds, true);
|
||||
shopStageInfoDAO.initShopStageInfo(lineInfo.getId(), addShopList, true);
|
||||
return 1L;
|
||||
}
|
||||
|
||||
@@ -356,7 +356,7 @@ public class ShopServiceImpl implements ShopService {
|
||||
shopInfoDO.setCreateUserId(userId);
|
||||
Long shopId = shopInfoDAO.addShopInfo(shopInfoDO);
|
||||
if (lineInfo.getWorkflowSubStageStatus().equals(WorkflowSubStageStatusEnum.SIGN_INTENT_AGREEMENT_125.getCode())) {
|
||||
shopStageInfoDAO.initShopStageInfo(request.getLineId(), Collections.singletonList(shopId), true);
|
||||
shopStageInfoDAO.initShopStageInfo(request.getLineId(), Collections.singletonList(shopInfoDO), true);
|
||||
HashMap<String, String> map = new HashMap<>();
|
||||
map.put("partnerUsername", lineInfo.getUsername());
|
||||
map.put("partnerMobile", lineInfo.getMobile());
|
||||
@@ -381,7 +381,7 @@ public class ShopServiceImpl implements ShopService {
|
||||
MessageEnum.MESSAGE_21,
|
||||
map);
|
||||
} else {
|
||||
shopStageInfoDAO.initShopStageInfo(request.getLineId(), Collections.singletonList(shopId), false);
|
||||
shopStageInfoDAO.initShopStageInfo(request.getLineId(), Collections.singletonList(shopInfoDO), false);
|
||||
}
|
||||
//初始化平台账号
|
||||
HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByPartnerId(lineInfo.getPartnerId());
|
||||
|
||||
@@ -45,6 +45,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import static com.cool.store.enums.UserRoleEnum.*;
|
||||
import static com.cool.store.enums.point.ShopSubStageStatusEnum.*;
|
||||
import static com.cool.store.utils.CommonUtil.convertToBig;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
@@ -193,6 +194,10 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
|
||||
if (Objects.isNull(request.getShopId())) {
|
||||
throw new ServiceException(ErrorCodeEnum.SHOP_ID_NOT_EXIST);
|
||||
}
|
||||
//不要使用系统默认名称
|
||||
if (StringUtils.isNotEmpty(request.getShopName())&&request.getShopName().matches("^店铺.$")) {
|
||||
throw new ServiceException(ErrorCodeEnum.SYSTEM_NAME_NOT__SUPPORT);
|
||||
}
|
||||
SignFranchiseDO isExist = signFranchiseMapper.selectByShopId(request.getShopId());
|
||||
if (Objects.nonNull(isExist) && Objects.isNull(request.getId())) {
|
||||
throw new ServiceException(ErrorCodeEnum.DUPLICATE_SUBMISSION);
|
||||
@@ -588,11 +593,12 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
|
||||
|
||||
} else {
|
||||
if (Objects.nonNull(franchiseFeeDO)) {
|
||||
BigDecimal total = new BigDecimal(franchiseFeeDO.getYearFranchiseFee())
|
||||
.add(new BigDecimal(franchiseFeeDO.getLoanMargin()))
|
||||
.add(new BigDecimal(franchiseFeeDO.getFirstYearFee()))
|
||||
.add(new BigDecimal(franchiseFeeDO.getFirstYearManageFee()))
|
||||
.add(new BigDecimal(franchiseFeeDO.getPerformanceBond()));
|
||||
BigDecimal total = convertToBig(franchiseFeeDO.getYearFranchiseFee())
|
||||
.add(convertToBig(franchiseFeeDO.getLoanMargin()))
|
||||
.add(convertToBig(franchiseFeeDO.getFirstYearFee()))
|
||||
.add(convertToBig(franchiseFeeDO.getFirstYearManageFee()))
|
||||
.add(convertToBig(franchiseFeeDO.getPerformanceBond()))
|
||||
.add(convertToBig(franchiseFeeDO.getCashierFee()));
|
||||
addSignFranchiseResponse.setContractAmount(total.toString());
|
||||
}
|
||||
addSignFranchiseResponse.setMobile(lineInfoDO.getMobile());
|
||||
@@ -645,9 +651,9 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
|
||||
|
||||
if (Objects.nonNull(franchiseFeeDO)) {
|
||||
addSignFranchiseResponse.setYearFranchiseFee(franchiseFeeDO.getYearFranchiseFee());
|
||||
addSignFranchiseResponse.setBigYearFranchiseFee(Convert.digitToChinese(new BigDecimal(franchiseFeeDO.getYearFranchiseFee())));
|
||||
addSignFranchiseResponse.setBigYearFranchiseFee(Convert.digitToChinese(convertToBig(franchiseFeeDO.getYearFranchiseFee())));
|
||||
addSignFranchiseResponse.setLoanMargin(franchiseFeeDO.getLoanMargin());
|
||||
addSignFranchiseResponse.setBigLoanMargin(Convert.digitToChinese(new BigDecimal(franchiseFeeDO.getLoanMargin())));
|
||||
addSignFranchiseResponse.setBigLoanMargin(Convert.digitToChinese(convertToBig(franchiseFeeDO.getLoanMargin())));
|
||||
addSignFranchiseResponse.setFirstYearStartTime(franchiseFeeDO.getFirstYearStartTime());
|
||||
addSignFranchiseResponse.setFirstYearEndTime(franchiseFeeDO.getFirstYearEndTime());
|
||||
addSignFranchiseResponse.setFirstYearFee(franchiseFeeDO.getFirstYearFee());
|
||||
@@ -659,7 +665,9 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
|
||||
addSignFranchiseResponse.setThirdYearEndTime(franchiseFeeDO.getThirdYearEndTime());
|
||||
addSignFranchiseResponse.setThirdYearFee(franchiseFeeDO.getThirdYearFee());
|
||||
addSignFranchiseResponse.setPerformanceBond(franchiseFeeDO.getPerformanceBond());
|
||||
addSignFranchiseResponse.setBigPerformanceBond(Convert.digitToChinese(new BigDecimal(franchiseFeeDO.getPerformanceBond())));
|
||||
addSignFranchiseResponse.setBigPerformanceBond(Convert.digitToChinese(convertToBig(franchiseFeeDO.getPerformanceBond())));
|
||||
addSignFranchiseResponse.setCashierFee(franchiseFeeDO.getCashierFee());
|
||||
addSignFranchiseResponse.setBigCashierFee(Convert.digitToChinese(convertToBig(franchiseFeeDO.getCashierFee())));
|
||||
}
|
||||
return addSignFranchiseResponse;
|
||||
}
|
||||
|
||||
@@ -131,6 +131,7 @@ public class StoreServiceImpl implements StoreService {
|
||||
List<SysRoleDO> sysRoleDOS = roleIds.stream().filter(role -> "store_inside".equals(role.getPositionType())
|
||||
||UserRoleEnum.SUPERVISION.getCode().equals(role.getId())
|
||||
||UserRoleEnum.HEAD_OF_DIVISION.getCode().equals(role.getId())
|
||||
||UserRoleEnum.SERVICE_PACKAGE_DEDICATED.getCode().equals(role.getId())
|
||||
||UserRoleEnum.REGION_MANAGER.getCode().equals(role.getId())).collect(Collectors.toList());
|
||||
if (CollectionUtils.isNotEmpty(sysRoleDOS)){
|
||||
//获取用户管辖区域
|
||||
@@ -399,6 +400,7 @@ public class StoreServiceImpl implements StoreService {
|
||||
dto.setJoinMode(JoinModeEnum.getByCode(store.getJoinModel()));
|
||||
dto.setBrand(FranchiseBrandEnum.getDescByCode(store.getJoinBrand()));
|
||||
dto.setOrderMiniProgramName(store.getMiniProgramOrderStoreName());
|
||||
dto.setStatus(StoreStatusEnum.getName(store.getStoreStatus()));
|
||||
if (store.getRegionId() != null){
|
||||
dto.setManagerSupervisionName(regionMap.get(store.getRegionId()));
|
||||
}
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.dao.StoreDao;
|
||||
import com.cool.store.dto.FoodTokenDTO;
|
||||
import com.cool.store.dto.GetAccessTokenDTO;
|
||||
import com.cool.store.dto.store.StoreUserPositionDTO;
|
||||
import com.cool.store.dto.recipe.RecipeSpLaunchDTO;
|
||||
import com.cool.store.dto.recipe.RevenueDataDTO;
|
||||
import com.cool.store.dto.recipe.RevenueDataQueryDTO;
|
||||
import com.cool.store.dto.store.StoreUserUpdateDTO;
|
||||
import com.cool.store.entity.StoreDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.request.recipe.RevenueDataRequest;
|
||||
import com.cool.store.response.caipin.StoreUserResponse;
|
||||
import com.cool.store.response.oppty.OpportunityApiResponse;
|
||||
import com.cool.store.service.ThirdFoodService;
|
||||
import com.cool.store.utils.BeanUtil;
|
||||
import com.cool.store.utils.SignatureUtils;
|
||||
import com.cool.store.vo.recipe.RevenueDataVO;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.JavaType;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
@@ -24,9 +30,9 @@ import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
@@ -45,6 +51,8 @@ public class ThirdFoodServiceImpl implements ThirdFoodService {
|
||||
OkHttpClient okHttpClient;
|
||||
@Resource
|
||||
ObjectMapper objectMapper;
|
||||
@Resource
|
||||
private StoreDao storeDao;
|
||||
|
||||
|
||||
@Override
|
||||
@@ -60,6 +68,29 @@ public class ThirdFoodServiceImpl implements ThirdFoodService {
|
||||
return executeApiCall(url, dto, StoreUserResponse.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RevenueDataVO> getRevenueData(RevenueDataRequest request) {
|
||||
StoreDO storeDO = storeDao.getByStoreId(request.getStoreId());
|
||||
if (Objects.isNull(storeDO)) {
|
||||
throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
|
||||
}
|
||||
RevenueDataQueryDTO queryDTO = new RevenueDataQueryDTO(storeDO.getStoreNum(), request.getBusinessDateFrom(), request.getBusinessDateTo());
|
||||
String url = "/v1/store/business";
|
||||
List<RevenueDataDTO> list = executeApiCall(url, queryDTO, List.class);
|
||||
return BeanUtil.toList(list, RevenueDataVO.class, CopyOptions.create().setFieldMapping(Collections.singletonMap("storeCode", "storeNum")));
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecipeSpLaunchDTO getRecipeServiceLaunch(RevenueDataRequest request) {
|
||||
StoreDO storeDO = storeDao.getByStoreId(request.getStoreId());
|
||||
if (Objects.isNull(storeDO)) {
|
||||
throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
|
||||
}
|
||||
RevenueDataQueryDTO queryDTO = new RevenueDataQueryDTO(storeDO.getStoreNum(), request.getBusinessDateFrom(), request.getBusinessDateTo());
|
||||
String url = "/v1/store/business/spRecipeList";
|
||||
return executeApiCall(url, queryDTO, RecipeSpLaunchDTO.class);
|
||||
}
|
||||
|
||||
|
||||
private <T> T executeApiCall(String url, Object requestBody, Class<T> responseType) {
|
||||
// 1. 打印请求前日志
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.cool.store.service.impl.xinfa;
|
||||
|
||||
import com.cool.store.dto.huoma.*;
|
||||
import com.cool.store.enums.SpecialTagEnum;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
import com.cool.store.service.xinfa.XinFaBusinessService;
|
||||
import com.cool.store.service.xinfa.XinFaDeviceService;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
* @Date 2025/11/5 16:17
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Service
|
||||
public class XinFaBusinessServiceImpl implements XinFaBusinessService {
|
||||
@Resource
|
||||
XinFaDeviceService xinFaDeviceService;
|
||||
|
||||
@Override
|
||||
public List<StoreXinFaDeviceDetail> getStoreXinFaDeviceDetail(String storeNum) {
|
||||
return xinFaDeviceService.getStoreXinFaDeviceDetail(storeNum);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TagDetailDTO> getAccountAllTags(String storeNum,String deviceName) {
|
||||
//如果是广告机,不需要展示标签
|
||||
if (deviceName.contains("广告机")){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<TagDetailDTO> accountAllTags = xinFaDeviceService.getAccountAllTags(storeNum);
|
||||
if (accountAllTags != null){
|
||||
return accountAllTags.stream()
|
||||
.filter(tag -> tag.getName() != null &&
|
||||
SpecialTagEnum.getAllTagNames().contains(tag.getName()))
|
||||
.sorted(Comparator.comparing(tag -> SpecialTagEnum.getAllTagNames().indexOf(tag.getName())))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ProgramResponseDTO> getProgramList(ProgramReqDTO programReqDTO) {
|
||||
//如果没传tag 查所有 根据更新时间倒序排
|
||||
programReqDTO.setSort("desc");
|
||||
programReqDTO.setDate("updateTime");
|
||||
if (CollectionUtils.isEmpty(programReqDTO.getTagIds())){
|
||||
//设备名称包含 广告机 只查询电子价目表
|
||||
programReqDTO.setTagIds(xinFaDeviceService.getAccountSpecialTagIds(programReqDTO.getStoreCode(), SpecialTagEnum.getElectronicPriceTagName()));
|
||||
}
|
||||
List<ProgramResponseDTO> programList = xinFaDeviceService.getProgramList(programReqDTO);
|
||||
return programList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean publishProgram(PublishDTO publishDTO) {
|
||||
return xinFaDeviceService.publish(publishDTO);
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,14 @@ import com.cool.store.dto.wechat.WechatTemplateMessageDTO;
|
||||
import com.cool.store.dto.wechat.WechatUserInfoDTO;
|
||||
import com.cool.store.enums.wechat.WechatTemplateEnum;
|
||||
import com.cool.store.utils.OkHttpUtil;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.utils.poi.StringUtils;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -26,6 +28,8 @@ import java.util.Map;
|
||||
public class WechatTemplateService {
|
||||
|
||||
|
||||
private static final String ACCESS_TOKEN_KEY = "wechat_service_account_access_token";
|
||||
|
||||
@Autowired
|
||||
private WechatMpProperties wechatMpProperties;
|
||||
|
||||
@@ -36,9 +40,16 @@ public class WechatTemplateService {
|
||||
private OkHttpUtil okHttpUtil;
|
||||
@Autowired
|
||||
private ObjectMapper objectMapper;
|
||||
@Resource
|
||||
private RedisUtilPool redisUtilPool;
|
||||
|
||||
|
||||
public String getAccessToken() {
|
||||
String cachedToken = redisUtilPool.getString(ACCESS_TOKEN_KEY);
|
||||
if (StringUtils.isNotEmpty(cachedToken)) {
|
||||
log.info("从 Redis 获取 access_token: {}", cachedToken);
|
||||
return cachedToken;
|
||||
}
|
||||
String url = String.format("%s?grant_type=client_credential&appid=%s&secret=%s",
|
||||
wechatMpProperties.getAccessTokenUrl(),
|
||||
wechatMpProperties.getAppId(),
|
||||
@@ -49,7 +60,14 @@ public class WechatTemplateService {
|
||||
|
||||
if (StringUtils.isNotEmpty( result)){
|
||||
AccessTokenDTO responseDTO = objectMapper.readValue(result, AccessTokenDTO.class);
|
||||
return responseDTO.getAccess_token();
|
||||
String accessToken = responseDTO.getAccess_token();
|
||||
|
||||
// 将获取到的 token 存入 Redis,设置过期时间(微信 token 有效期 7200 秒,这里设置 7000 秒)
|
||||
if (StringUtils.isNotEmpty(accessToken)) {
|
||||
redisUtilPool.setString(ACCESS_TOKEN_KEY, accessToken, 7000);
|
||||
log.info("将 access_token 存入 Redis: {}", accessToken);
|
||||
}
|
||||
return accessToken;
|
||||
}
|
||||
return null;
|
||||
} catch (IOException e) {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.cool.store.service.xinfa;
|
||||
|
||||
import com.cool.store.dto.huoma.*;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
* @Date 2025/11/5 16:15
|
||||
* @Version 1.0
|
||||
*/
|
||||
public interface XinFaBusinessService {
|
||||
|
||||
|
||||
/**
|
||||
* 获取门店信发设备列表
|
||||
* @param storeNum
|
||||
* @return
|
||||
*/
|
||||
List<StoreXinFaDeviceDetail> getStoreXinFaDeviceDetail(String storeNum);
|
||||
|
||||
/**
|
||||
* 获取账号下有哪些标签
|
||||
* @param storeNum
|
||||
* @return
|
||||
*/
|
||||
List<TagDetailDTO> getAccountAllTags(String storeNum,String deviceName);
|
||||
|
||||
/**
|
||||
* 获取账号下有哪些节目、
|
||||
* 通过门店在哪个账号下 确定账号
|
||||
* @param programReqDTO
|
||||
* @return
|
||||
*/
|
||||
List<ProgramResponseDTO> getProgramList(ProgramReqDTO programReqDTO);
|
||||
|
||||
/**
|
||||
* 发布信发设备
|
||||
* @param publishDTO
|
||||
* @return
|
||||
*/
|
||||
Boolean publishProgram(PublishDTO publishDTO);
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,535 @@
|
||||
package com.cool.store.service.xinfa;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.dto.huoma.*;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.enums.SpecialTagEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.utils.poi.constant.Constants;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.*;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
* @Date 2025/11/4 15:47
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class XinFaDeviceService {
|
||||
|
||||
@Value("${huoMa.direct.stores.account}")
|
||||
private String huoMaDirectStoresAccount;
|
||||
@Value("${huoMa.direct.stores.password}")
|
||||
private String huoMaDirectStoresPassword;
|
||||
@Value("${huoMa.franchise.stores.account}")
|
||||
private String huoMaFranchiseStoresAccount;
|
||||
@Value("${huoMa.franchise.stores.password}")
|
||||
private String huoMaFranchiseStoresPassword;
|
||||
@Value("${huoMa.restaurant.stores.account}")
|
||||
private String huoMaRestaurantStoresAccount;
|
||||
@Value("${huoMa.restaurant.stores.password}")
|
||||
private String huoMaRestaurantStoresPassword;
|
||||
@Resource
|
||||
RedisUtilPool redisUtilPool;
|
||||
@Value("${huoMa.token.url}")
|
||||
private String huoMaTokenUrl;
|
||||
@Value("${huoMa.get.point.terminal.url}")
|
||||
private String huoMaGetPointTerminalUrl;
|
||||
@Value("${huoMa.id.url}")
|
||||
private String huoMaGetStoreIdUrl;
|
||||
@Value("${huoMa.store.device.detail.url}")
|
||||
private String huoMaGetStoreXinFaDeviceDetailUrl ;
|
||||
@Value("${huoMa.get.tag.url}")
|
||||
private String huoMaGetTagUrl;
|
||||
@Value("${huoMa.get.program.url}")
|
||||
private String huoMaGetProgramUrl;
|
||||
@Value("${huoMa.get.publish.url}")
|
||||
private String huoMaGetPublishUrl;
|
||||
|
||||
|
||||
private final Map<String, HuoMaAccountDTO> accountMap = new HashMap<>();
|
||||
|
||||
private final OkHttpClient httpClient = new OkHttpClient.Builder()
|
||||
.connectTimeout(10, TimeUnit.SECONDS)
|
||||
.readTimeout(30, TimeUnit.SECONDS)
|
||||
.writeTimeout(30, TimeUnit.SECONDS)
|
||||
.build();
|
||||
|
||||
@PostConstruct
|
||||
public void initAccountMap() {
|
||||
accountMap.put("restaurant", new HuoMaAccountDTO(huoMaRestaurantStoresAccount, huoMaRestaurantStoresPassword));
|
||||
accountMap.put("direct", new HuoMaAccountDTO(huoMaDirectStoresAccount, huoMaDirectStoresPassword));
|
||||
accountMap.put("franchise", new HuoMaAccountDTO(huoMaFranchiseStoresAccount, huoMaFranchiseStoresPassword));
|
||||
}
|
||||
|
||||
public String getStoreToken(String account, String password) {
|
||||
String key = MessageFormat.format(RedisConstant.HUO_MA_TOKEN, account);
|
||||
String accessToken = redisUtilPool.getString(key);
|
||||
if (accessToken != null) {
|
||||
return accessToken;
|
||||
}
|
||||
Map<String, String> requestBody = new HashMap<>();
|
||||
requestBody.put("account", account);
|
||||
requestBody.put("password", password);
|
||||
String responseBody = sendPostRequest(JSONObject.toJSONString(requestBody), huoMaTokenUrl);
|
||||
try{
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
String token = rootNode.path("data").path("token").asText();
|
||||
//缓存60秒
|
||||
redisUtilPool.setString(key, token,60*60);
|
||||
return token;
|
||||
}catch (Exception e){
|
||||
log.error("解析获取token失败,url:{},responseBody:{}",huoMaTokenUrl, responseBody);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public List<StoreEquipmentDTO> getStoreEquipmentDataByStoreNumList(List<String> storeNumList, String token) {
|
||||
Map<String,List<String>> requestBody = new HashMap<>();
|
||||
requestBody.put("codeList", storeNumList);
|
||||
String responseBody = sendPostRequestNoRetryByToken(JSONObject.toJSONString(requestBody), huoMaGetPointTerminalUrl,token);
|
||||
try{
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
return mapper.convertValue(rootNode.get("data"),
|
||||
mapper.getTypeFactory().constructCollectionType(List.class, StoreEquipmentDTO.class));
|
||||
}catch (Exception e){
|
||||
log.error("解析获取data失败,url:{},responseBody:{}",huoMaTokenUrl, responseBody);
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Integer getStoreIdByStoreNum(String storeNum, String token) {
|
||||
String houMaStoreId = redisUtilPool.hashGet(RedisConstant.HUO_MA_STORE_ID, storeNum);
|
||||
if (houMaStoreId != null) {
|
||||
try {
|
||||
return Integer.valueOf(houMaStoreId);
|
||||
} catch (NumberFormatException e) {
|
||||
// 如果缓存中的数据格式不正确,继续执行正常逻辑
|
||||
log.warn("Redis缓存中的门店ID格式不正确,storeNum: {}", storeNum);
|
||||
}
|
||||
}
|
||||
StoreRequestDTO requestBody = new StoreRequestDTO("point_report", 0, 10, storeNum);
|
||||
String responseBody = sendPostRequestNoRetryByToken(JSONObject.toJSONString(requestBody), huoMaGetStoreIdUrl,token);
|
||||
try{
|
||||
Integer storeId = extractIdsFromResponse(responseBody);
|
||||
redisUtilPool.hashSet(RedisConstant.HUO_MA_STORE_ID, storeNum, storeId.toString());
|
||||
return storeId;
|
||||
}catch (Exception e){
|
||||
log.error("解析获取data失败,url:{},responseBody:{}",huoMaTokenUrl, responseBody);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public List<StoreXinFaDeviceDetail> getStoreXinFaDeviceDetail(String storeNum) {
|
||||
String source = redisUtilPool.hashGet(RedisConstant.HUOMA_STORE_DEVICE_RESOURCE_KEY, storeNum);
|
||||
if (StringUtils.isNotBlank(source)) {
|
||||
HuoMaAccountDTO huoMaAccountDTO = accountMap.get(source);
|
||||
if (Objects.nonNull(huoMaAccountDTO)) {
|
||||
String token = getStoreToken(huoMaAccountDTO.getAccount(), huoMaAccountDTO.getPassword());
|
||||
List<StoreXinFaDeviceDetail> deviceDetailDetail = getStoreXinFaDeviceDetailDetail(storeNum, token);
|
||||
if (CollectionUtils.isNotEmpty(deviceDetailDetail)) {
|
||||
return deviceDetailDetail;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Map.Entry<String, HuoMaAccountDTO> entry : accountMap.entrySet()) {
|
||||
HuoMaAccountDTO huoMaAccountDTO = entry.getValue();
|
||||
if (!huoMaAccountDTO.getIsQuery()) {
|
||||
String token = getStoreToken(huoMaAccountDTO.getAccount(), huoMaAccountDTO.getPassword());
|
||||
List<StoreXinFaDeviceDetail> deviceDetailDetail = getStoreXinFaDeviceDetailDetail(storeNum, token);
|
||||
if (CollectionUtils.isNotEmpty(deviceDetailDetail)) {
|
||||
redisUtilPool.hashSet(RedisConstant.HUOMA_STORE_DEVICE_RESOURCE_KEY, storeNum, entry.getKey(), Constants.REFRESH_TOKEN_EXPIRE);
|
||||
return deviceDetailDetail;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
public List<StoreXinFaDeviceDetail> getStoreXinFaDeviceDetailDetail(String storeNum, String token) {
|
||||
Integer storeIdByStoreNum = getStoreIdByStoreNum(storeNum, token);
|
||||
return getStoreXinFaDeviceDetailByPointId(storeIdByStoreNum, token);
|
||||
}
|
||||
|
||||
|
||||
public List<TagDetailDTO> getAccountAllTags(String storeNum){
|
||||
String source = redisUtilPool.hashGet(RedisConstant.HUOMA_STORE_DEVICE_RESOURCE_KEY, storeNum);
|
||||
//获取标签 必须要知道门店属于哪个账号下 获取对应账号下的标签 如果获取不到 直接返回空
|
||||
if (StringUtils.isEmpty(source)){
|
||||
log.info("门店没有找到对应的账号,storeNum: {}", storeNum);
|
||||
return new ArrayList<>();
|
||||
}
|
||||
HuoMaAccountDTO huoMaAccountDTO = accountMap.get(source);
|
||||
if (Objects.nonNull(huoMaAccountDTO)){
|
||||
huoMaAccountDTO.setIsQuery(true);
|
||||
String token = getStoreToken(huoMaAccountDTO.getAccount(), huoMaAccountDTO.getPassword());
|
||||
TagDTO tagDTO = new TagDTO("DEFAULT", 0, 30,"program");
|
||||
String responseBody = null;
|
||||
try{
|
||||
responseBody = sendPostRequestNoRetryByToken(JSONObject.toJSONString(tagDTO), huoMaGetTagUrl,token);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
|
||||
// 直接转换整个数组
|
||||
return mapper.convertValue(
|
||||
rootNode.path("data").path("content"),
|
||||
mapper.getTypeFactory().constructCollectionType(List.class, TagDetailDTO.class)
|
||||
);
|
||||
}catch (Exception e){
|
||||
log.error("getAccountAllTags解析获取data失败,url:{},responseBody:{}",huoMaTokenUrl, responseBody);
|
||||
}
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取账号下指定标签的id 只需要一下四个
|
||||
* @param storeNum
|
||||
* @return
|
||||
*/
|
||||
public List<Integer> getAccountSpecialTagIds( String storeNum,List<String> tagList) {
|
||||
List<TagDetailDTO> accountAllTags = getAccountAllTags(storeNum);
|
||||
if (accountAllTags != null) {
|
||||
return accountAllTags.stream()
|
||||
.filter(tag -> tag.getName() != null &&
|
||||
tagList.contains(tag.getName()))
|
||||
.map(TagDetailDTO::getId)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
public List<ProgramResponseDTO> getProgramList(ProgramReqDTO programReqDTO) {
|
||||
if (StringUtils.isEmpty(programReqDTO.getStoreCode())){
|
||||
log.info("门店没有找到对应的账号,storeNum: {}", programReqDTO.getStoreCode());
|
||||
return new ArrayList<>();
|
||||
}
|
||||
//先查询门店是属于哪个账号下
|
||||
String source = redisUtilPool.hashGet(RedisConstant.HUOMA_STORE_DEVICE_RESOURCE_KEY, programReqDTO.getStoreCode());
|
||||
//获取标签 必须要知道门店属于哪个账号下 获取对应账号下的标签 如果获取不到 直接返回空
|
||||
if (StringUtils.isEmpty(source)){
|
||||
log.info("门店没有找到对应的账号,storeNum: {}", programReqDTO.getStoreCode());
|
||||
return new ArrayList<>();
|
||||
}
|
||||
HuoMaAccountDTO huoMaAccountDTO = accountMap.get(source);
|
||||
if (huoMaAccountDTO!=null){
|
||||
String token = getStoreToken(huoMaAccountDTO.getAccount(), huoMaAccountDTO.getPassword());
|
||||
String responseBody = null;
|
||||
try{
|
||||
responseBody = sendPostRequestNoRetryByToken(JSONObject.toJSONString(programReqDTO), huoMaGetProgramUrl,token);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
|
||||
// 直接转换整个数组
|
||||
return mapper.convertValue(
|
||||
rootNode.path("data").path("content"),
|
||||
mapper.getTypeFactory().constructCollectionType(List.class, ProgramResponseDTO.class)
|
||||
);
|
||||
}catch (Exception e){
|
||||
log.error("getProgramList 解析获取data失败,url:{},responseBody:{}",huoMaTokenUrl, responseBody);
|
||||
}
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public Boolean publish(PublishDTO publishDTO){
|
||||
if (StringUtils.isEmpty(publishDTO.getStoreCode())){
|
||||
log.info("门店没有找到对应的账号,发布失败,storeNum: {}", publishDTO.getStoreCode());
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
String source = redisUtilPool.hashGet(RedisConstant.HUOMA_STORE_DEVICE_RESOURCE_KEY, publishDTO.getStoreCode());
|
||||
//获取标签 必须要知道门店属于哪个账号下 获取对应账号下的标签 如果获取不到 直接返回空
|
||||
if (StringUtils.isEmpty(source)){
|
||||
log.info("门店没有找到对应的账号,storeNum: {}", publishDTO.getStoreCode());
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
HuoMaAccountDTO huoMaAccountDTO = accountMap.get(source);
|
||||
if (huoMaAccountDTO!=null){
|
||||
String token = getStoreToken(huoMaAccountDTO.getAccount(), huoMaAccountDTO.getPassword());
|
||||
String responseBody = null;
|
||||
try{
|
||||
responseBody = sendPostRequestNoRetryByToken(JSONObject.toJSONString(publishDTO), huoMaGetPublishUrl,token);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
int code = rootNode.get("code").asInt();
|
||||
if (code != 0) {
|
||||
throw new RuntimeException("发布失败");
|
||||
}
|
||||
// 直接转换整个数组
|
||||
log.info("发布成功 deviceId:{},storeCode:{}",JSONObject.toJSONString(publishDTO.getDeviceIdList()), publishDTO.getStoreCode() );
|
||||
return Boolean.TRUE;
|
||||
}catch (Exception e){
|
||||
log.error("发布失败, url:{}, responseBody:{}", huoMaTokenUrl, responseBody);
|
||||
}
|
||||
}
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public List<StoreXinFaDeviceDetail> getStoreXinFaDeviceDetailByPointId(Integer pointId, String token) {
|
||||
if (pointId != null){
|
||||
StoreXinFaDetailRequestDTO storeXinFaDetailRequestDTO = new StoreXinFaDetailRequestDTO(0, 10, pointId);
|
||||
String responseBody = null;
|
||||
try{
|
||||
responseBody = sendPostRequestNoRetryByToken(JSONObject.toJSONString(storeXinFaDetailRequestDTO), huoMaGetStoreXinFaDeviceDetailUrl,token);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
|
||||
// 直接转换整个数组
|
||||
return mapper.convertValue(
|
||||
rootNode.path("data").path("content"),
|
||||
mapper.getTypeFactory().constructCollectionType(List.class, StoreXinFaDeviceDetail.class)
|
||||
);
|
||||
}catch (Exception e){
|
||||
log.error("getStoreXinFaDeviceDetailByPointId解析获取data失败,url:{},responseBody:{}",huoMaTokenUrl, responseBody);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private Integer extractIdsFromResponse(String jsonResponse) throws IOException {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(jsonResponse);
|
||||
// 遍历dataList数组提取ID
|
||||
JsonNode dataList = rootNode.path("data").path("dataList");
|
||||
for (JsonNode item : dataList) {
|
||||
if (item.has("ID")) {
|
||||
//取出第一个id
|
||||
return item.get("ID").asInt();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String sendPostRequest(String requestBody, String requestUrl) {
|
||||
log.info("开始发送请求,url:{},requestBody:{}", requestUrl, requestBody);
|
||||
Request request = new Request.Builder()
|
||||
.url(requestUrl)
|
||||
.post(RequestBody.create(MediaType.parse("application/json"), requestBody))
|
||||
.build();
|
||||
return sendPost(requestUrl, request);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 不重试 请求接口
|
||||
* @param requestBody
|
||||
* @param requestUrl
|
||||
* @param token
|
||||
* @return
|
||||
*/
|
||||
private String sendPostRequestNoRetryByToken(String requestBody, String requestUrl, String token) {
|
||||
log.info("开始发送请求,url:{},requestBody:{}", requestUrl, requestBody);
|
||||
|
||||
try {
|
||||
Request request = new Request.Builder()
|
||||
.url(requestUrl)
|
||||
.post(RequestBody.create(MediaType.parse("application/json"), requestBody))
|
||||
.addHeader("token", token)
|
||||
.build();
|
||||
|
||||
String result = sendPost(requestUrl, request);
|
||||
|
||||
// 检查是否token失效
|
||||
if (isTokenExpired(result)) {
|
||||
log.warn("Token已失效,清除缓存并重新获取token");
|
||||
// 清除对应账号的token缓存并获取新token
|
||||
String newToken = clearAccountTokenCacheForToken(token);
|
||||
|
||||
if (newToken != null) {
|
||||
// 使用新token重新发起一次请求
|
||||
Request newRequest = new Request.Builder()
|
||||
.url(requestUrl)
|
||||
.post(RequestBody.create(MediaType.parse("application/json"), requestBody))
|
||||
.addHeader("token", newToken)
|
||||
.build();
|
||||
|
||||
result = sendPost(requestUrl, newRequest);
|
||||
} else {
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "Token失效且无法获取新token");
|
||||
}
|
||||
}
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
log.error("请求异常,错误: {}", e.getMessage());
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "请求失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 包含重试 适用于批量拉取数据 ,正常页面接口无需重试
|
||||
* @param requestBody
|
||||
* @param requestUrl
|
||||
* @param token
|
||||
* @return
|
||||
*/
|
||||
private String sendPostRequestByToken(String requestBody, String requestUrl, String token) {
|
||||
log.info("开始发送请求,url:{},requestBody:{}", requestUrl, requestBody);
|
||||
|
||||
int maxRetries = 3;
|
||||
for (int i = 0; i < maxRetries; i++) {
|
||||
try {
|
||||
Request request = new Request.Builder()
|
||||
.url(requestUrl)
|
||||
.post(RequestBody.create(MediaType.parse("application/json"), requestBody))
|
||||
.addHeader("token", token)
|
||||
.build();
|
||||
|
||||
String result = sendPost(requestUrl, request);
|
||||
|
||||
// 检查是否token失效
|
||||
if (isTokenExpired(result)) {
|
||||
log.warn("Token已失效,正在清除缓存并重试,第{}次", i + 1);
|
||||
// 直接清除对应账号的token缓存
|
||||
token = clearAccountTokenCacheForToken(token);
|
||||
|
||||
// 抛出异常触发重试
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "Token失效,需要重试");
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (ServiceException e) {
|
||||
log.warn("请求失败,第{}次重试,错误: {}", i + 1, e.getMessage());
|
||||
if (i == maxRetries - 1) {
|
||||
throw e;
|
||||
}
|
||||
try {
|
||||
Thread.sleep(1000 * (i + 1));
|
||||
} catch (InterruptedException ie) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "重试被中断");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("请求异常,第{}次重试,错误: {}", i + 1, e.getMessage());
|
||||
if (i == maxRetries - 1) {
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "请求重试失败: " + e.getMessage());
|
||||
}
|
||||
try {
|
||||
Thread.sleep(1000 * (20*i + 1));
|
||||
} catch (InterruptedException ie) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "重试被中断");
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "请求重试失败");
|
||||
}
|
||||
|
||||
private boolean isTokenExpired(String responseBody) {
|
||||
try {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode rootNode = mapper.readTree(responseBody);
|
||||
int code = rootNode.path("code").asInt(-1);
|
||||
String msg = rootNode.path("msg").asText("");
|
||||
|
||||
return code == 501;
|
||||
} catch (Exception e) {
|
||||
log.error("检查token失效状态时发生错误: {}", e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private String clearAccountTokenCacheForToken(String token) {
|
||||
try {
|
||||
// 遍历可能的账号,找到对应的缓存并删除
|
||||
String[] accounts = {
|
||||
huoMaDirectStoresAccount,
|
||||
huoMaFranchiseStoresAccount,
|
||||
huoMaRestaurantStoresAccount
|
||||
};
|
||||
|
||||
for (String account : accounts) {
|
||||
if (account != null) {
|
||||
String key = MessageFormat.format(RedisConstant.HUO_MA_TOKEN, account);
|
||||
String cachedToken = redisUtilPool.getString(key);
|
||||
if (token.equals(cachedToken)) {
|
||||
redisUtilPool.delKey(key);
|
||||
log.info("已清除账号 {} 的token缓存", account);
|
||||
|
||||
// 根据账号类型获取对应的密码并重新获取token
|
||||
String password = getPasswordForAccount(account);
|
||||
if (password != null) {
|
||||
String newToken = getStoreToken(account, password);
|
||||
if (newToken != null) {
|
||||
log.info("已为账号 {} 重新获取新的token", account);
|
||||
return newToken;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("清除token缓存或重新获取token失败: {}", e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private String getPasswordForAccount(String account) {
|
||||
if (account.equals(huoMaDirectStoresAccount)) {
|
||||
return huoMaDirectStoresPassword;
|
||||
} else if (account.equals(huoMaFranchiseStoresAccount)) {
|
||||
return huoMaFranchiseStoresPassword;
|
||||
} else if (account.equals(huoMaRestaurantStoresAccount)) {
|
||||
return huoMaRestaurantStoresPassword;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private String sendPost(String requestUrl, Request request) {
|
||||
try (Response response = httpClient.newCall(request).execute()) {
|
||||
log.info("发起请求 time:{}", System.currentTimeMillis());
|
||||
if (!response.isSuccessful()) {
|
||||
log.info("HTTP请求失败,msg: " + response.message());
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,
|
||||
"HTTP请求失败,状态码: " + response.code());
|
||||
}
|
||||
String responseBody = response.body().string();
|
||||
log.info("请求成功responseBody:{}", JSONObject.toJSONString(responseBody));
|
||||
return responseBody;
|
||||
} catch (SocketTimeoutException e) {
|
||||
log.error("API调用超时 - URL: {}, 错误: {}", requestUrl, e.getMessage(), e);
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用超时: " + e.getMessage());
|
||||
} catch (ServiceException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
log.error("API调用异常 - URL: {}, 错误: {}", requestUrl, e.getMessage(), e);
|
||||
throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -220,4 +220,6 @@ public class Constants
|
||||
|
||||
public static final String WANG_LEI_JOB_NUMBER = "19060164";
|
||||
|
||||
public static final int REFRESH_TOKEN_EXPIRE = 60*60*24*30;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user