diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index b49300433..7ac5e4a2b 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -258,6 +258,7 @@ public enum ErrorCodeEnum { BANK_EXIST(151007,"当前银行已存在,请直接选择!",null), EXPORT_LIMIT_5000(151008,"导出数据不能超过5000条,请增加筛选条件,减少导出数量",null), REGION_INTERSECTION_IS_NULL(151011,"所选所属大区/分公司,不在所选集团下",null), + CHECK_PAYER_ERROR(151012,"缴费人必须是签约人,请重新填写!",null), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ExtendFieldTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExtendFieldTypeEnum.java new file mode 100644 index 000000000..2042c8dd8 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExtendFieldTypeEnum.java @@ -0,0 +1,59 @@ +package com.cool.store.enums; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/5/13 9:57 + * @Version 1.0 + */ +public enum ExtendFieldTypeEnum { + + TEST_STORE_MANAGER_MOBILE("extend_field_1746670633436","店长手机号"), + TEST_SIGNATORY_NAME_1("extend_field_1746670645231","签约人1名称"), + TEST_SIGNATORY_MOBILE_1("extend_field_1746670652805","签约人2手机号"), + TEST_SIGNATORY_NAME_2("extend_field_1746670671614","签约人2名称"), + TEST_SIGNATORY_MOBILE_2("extend_field_1746670686307","签约人2手机号"), + TEST_ORDER_NAME("extend_field_1747103227333","订单小程序名称"), + ONLINE_STORE_MANAGER_MOBILE("extend_field_1746598536903","店长手机号"), + ONLINE_SIGNATORY_NAME_1("extend_field_1746598562255","签约人1名称"), + ONLINE_SIGNATORY_MOBILE_1("extend_field_1746598570479","签约人2手机号"), + ONLINE_SIGNATORY_NAME_2("extend_field_1746598584139","签约人2名称"), + ONLINE_SIGNATORY_MOBILE_2("extend_field_1746598594140","签约人2手机号"), + ONLINE_ORDER_NAME("extend_field_1746599049206","订单小程序名称"),; + + private String key; + + private String msg; + + ExtendFieldTypeEnum(String key,String msg){ + this.key = key; + this.msg = msg; + } + + public static Map configMap(){ + return Arrays.stream(ExtendFieldTypeEnum.values()) + .collect(Collectors.toMap( + ExtendFieldTypeEnum::getKey, + e -> e + )); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/SignatureUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/SignatureUtils.java index bf47a372a..0c542aa9d 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/SignatureUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/SignatureUtils.java @@ -1,14 +1,17 @@ package com.cool.store.utils; +import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSONObject; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; +import okhttp3.internal.http.HttpMethod; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; +import java.security.*; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; import java.util.*; /** @@ -18,6 +21,9 @@ import java.util.*; */ @Slf4j public class SignatureUtils { + + + private static final String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCML5dEU4e6BAopiSjxeA2ZNs3VeIXoWe8HpHHGhZP1xE+4vbPv3L4Z7XexeoPMiBcluyGKSRl5jwuvYvcF9A2nGPhxVugYOxpC+TuGVu3TE7a2E/+1iMFfdNCYgqMxfnTe2Svo+X5anc5AcpKar2+AYcdZ4emMQLwrJkEB9endpWPruqC7dCUmAwxByMi525fdipFEDsAIf9ozkBuqwyQa0/RwQ+fyOT87pJ58z7gLXcZxW8YaXNAS5hmdA6/0GqZQQyDTXxZ/nDPpeIIk8PC8VNrgllCxwDtyDMWfUg8+yTlHAjsCX7MGRM3Gd3QcfqrvlIK/Lvn/9qAWcY3KOU1JAgMBAAECggEADwvnokmN6qEW3yTt7FcMrJqFhslgJBONFKapoJuDSVCIFwXji5YHoHxMydOi1F/yDhZzD+bvMU0xfaJzbaPnmD0Vo4KmuD0VwUUDhtSLQ8ncpVfprRgv2zlMT2ZMMlqGnEm2jRPEZGEGO4QgqLI2V1MHZOYa3XcwSzhYp2d38dZvPxWnF9mDt26BbM5Eb3D4oAb+J8rOVsbXEbVTdVTsJmhLOUEK84r2fUCLqHALAOc/za28ToupYD/QRWT6K5nWKDclDWn2tnz3MQJrEYMVvGDVCryqltljd2XB4MXnBZxEYDZyonxxI5M1Avb9mHUyy2wMYSeTUocSnVjgCZPnFQKBgQC34xs/Q0lDTpRdS0a8odzey4jew/nfo8TqzAa2/vomRHkOAoXyqci71tCos5836hxprkhvj1KMauB/rFzCZYfr5a2UMM70p/vuYv5JhTMDStTVx9OPcydZDeK77OY39qPhkW4Tm10BBUodzVV0YhxbCfRmSRSF2FuZCSLdd5bmpQKBgQDDKTUYuA+s/cFt0QsKkRRBm/ONQnETCCXo87NP9RzspcydkULnmuRMLWP4zqHN5TccL0MyI7hyHZ7AwU3qoi4JXFo8k5rRcSdwaBy99B+ZKF159l7chVHE8p4tYSmxwoIOIbpfXA2nfp+zaknt6lb8DSeCw8lewsEZUwmU++bu1QKBgB5M5t16yeS0WxAwajyE828m3KvQYSkvxC/oZKbcxv1tRQFA+y9sOK5zDDjwOCkvg3UKidcQJ8sJhWqkTTifIFGHrB2CGWgJEiNK3pngv/In74A2iC7YC8DJ3/WVaK4KDyEJJLlIXX/gjkDw58bgr8l0j3gXTLFtYFKMRdl2bkAdAoGAHwhNZhnWfEZ5XHHyFIMPOoOGzb5z5nfUN1+Q8rTiHYsbpy5y+gr6JFbPX7/ToL7C7ZtiTvW5HYQyOypBrn6NXXWu75T0+DrK76fOcjIAWEU/3+XaHayhXPTLTCH4FEj+jyqzzPgBP9H1qPzMtqUdocShtLxXJ9dGBzXZ/zOy++UCgYAHgaZC5Jz8+p5Ka7YtPZXpDXt1gUh2bmzIcAOBlizE+ElWZN/skybumos3lP8JOXdB65jEuXI9V0rc6n/KpOLY2Xfy6CX78RpWVXPc30D10DxUVI9hyEU+Xg4t9rwOAVhZaOwjhaEqpdvDrjMmX0bBVwCI2QXt7GnjUPqibNyEbQ=="; /** * 生成 HmacSHA256 签名 @@ -37,6 +43,47 @@ public class SignatureUtils { } } + /** + * 正新菜品市场系统 验签 + * @param httpMethod + * @param uri + * @param requestBody + * @param timeStamp + * @param random + * @return + */ + public static String sign(String httpMethod, String uri, String requestBody, String timeStamp, String random) throws Exception { + log.info("timeStamp+random:{}",timeStamp + "/" + random); + String plainText = new StringJoiner("&") + .add("CRM") + .add(httpMethod.toUpperCase()) + .add(uri) + .add(requestBody) + .add(timeStamp) + .add(random) + .toString(); + // 签名算法 + Signature signature = Signature.getInstance("SHA256WithRSA"); + + PrivateKey privateKey = readPrivateKey(SignatureUtils.privateKey); + // 签名 + signature.initSign(privateKey); + signature.update(plainText.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(signature.sign()); + } + + + private static PrivateKey readPrivateKey(String key) throws Exception { + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + byte[] keys = Base64.getDecoder().decode(key); + try { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keys); + return keyFactory.generatePrivate(keySpec); + } catch (InvalidKeySpecException e) { + throw new IllegalStateException("私钥⽆效:", e); + } + } + /** * 生成待签名字符串(参数按字母排序 + appkey + timestamp) * @param params 请求参数Map(需提前过滤空值) diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java index 5db18dbcb..2cc239255 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java @@ -337,8 +337,8 @@ public class ShopStageInfoDAO { public List getSpecialShopStageInfo(List shopIds, Integer shopSubStage, List shopSubStageStatusList, String investmentUserId, - List authRegionIds) { - return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds); + List authRegionIds,Boolean ownShopFlag) { + return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds,ownShopFlag); } /** diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java index df21e9bd4..a62ab0101 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java @@ -63,5 +63,9 @@ public class StoreDao { return storeMapper.listByMobile(mobile); } + public List list() { + return storeMapper.list(); + } + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java index c19f2db5a..56887b60c 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java @@ -146,7 +146,9 @@ public interface ShopStageInfoMapper extends Mapper { List getSpecialShopStageInfo(@Param("shopIds") List shopIds, @Param("shopSubStage") Integer shopSubStage, @Param("shopSubStageStatusList") List shopSubStageStatusList, - @Param("investmentUserId") String investmentUserId, @Param("authRegionIds") List authRegionIds); + @Param("investmentUserId") String investmentUserId, + @Param("authRegionIds") List authRegionIds, + @Param("ownShopFlag") Boolean ownShopFlag); List getSubStageList(@Param("shopIds") List shopIds,@Param("shopSubStage") Integer shopSubStage); List getSubStages(@Param("shopIds") List shopIds,@Param("shopSubStage") Integer shopSubStage); diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java index e77c86a9a..f2bbfa057 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java @@ -31,4 +31,10 @@ public interface StoreMapper { */ List listByMobile(@Param("mobile") String mobile); + /** + * 分页查询门店数据 + * @return + */ + List list(); + } diff --git a/coolstore-partner-dao/src/main/resources/mapper/LineInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/LineInfoMapper.xml index 73e9901dc..ae1833483 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/LineInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/LineInfoMapper.xml @@ -353,7 +353,7 @@ #{code} - + order by update_time desc diff --git a/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml index 5754d3559..b87275a94 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml @@ -331,6 +331,14 @@ #{regionId} + + + and si.join_mode = 3 + + + and si.join_mode != 3 + + order by a.update_time desc diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index 49c2818e5..92149ff30 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -83,10 +83,16 @@ select * from store_${enterpriseId} + and is_delete = 'effective' and `extend_field` like concat('%', #{mobile}, '%') + + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/FoodTokenDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/FoodTokenDTO.java new file mode 100644 index 000000000..8097cb624 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/FoodTokenDTO.java @@ -0,0 +1,14 @@ +package com.cool.store.dto; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/13 17:02 + * @Version 1.0 + */ +@Data +public class FoodTokenDTO { + + private String mobile ; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreDTO.java new file mode 100644 index 000000000..184933008 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/13 10:56 + * @Version 1.0 + */ +@Data +public class StoreDTO { + + @ApiModelProperty("门店名称") + private String storeName; + @ApiModelProperty("门店CODE") + private String storeCode; + @ApiModelProperty("店长手机号") + private String managerPhone; + @ApiModelProperty("签约人1姓名") + private String signer1Name; + @ApiModelProperty("签约人2手机号") + private String signer1Phone; + @ApiModelProperty("签约人2姓名") + private String signer2Name; + @ApiModelProperty("签约人2手机号") + private String signer2Phone; + @ApiModelProperty("订单小程序名称") + private String orderMiniProgramName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/OpenApiStoreRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/OpenApiStoreRequest.java new file mode 100644 index 000000000..2d1926a38 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/OpenApiStoreRequest.java @@ -0,0 +1,18 @@ +package com.cool.store.request; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/13 11:08 + * @Version 1.0 + */ +@Data +public class OpenApiStoreRequest { + + private Integer pageSize; + + private Integer pageNum; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/MiniShopsResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/MiniShopsResponse.java index 48deb803d..54d08d99e 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/MiniShopsResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/MiniShopsResponse.java @@ -16,6 +16,8 @@ public class MiniShopsResponse { private String shopName; @ApiModelProperty("店铺编码") private String shopCode; + @ApiModelProperty("云流水编码") + private String ylsCode; @ApiModelProperty("店铺详细地址") private String detailAddress; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/BaseInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/BaseInfoVO.java index 7527bb988..f8493d904 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/BaseInfoVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/BaseInfoVO.java @@ -3,6 +3,7 @@ package com.cool.store.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; import java.util.List; /** @@ -45,6 +46,7 @@ public class BaseInfoVO { @ApiModelProperty("加盟模式") private Integer joinMode; + public BaseInfoVO(){} /** * 写一个构造方法 参数是BaseInfoVO diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/IntendPendingVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/IntendPendingVO.java index 7779e9c47..845181f41 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/IntendPendingVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/IntendPendingVO.java @@ -20,6 +20,8 @@ public class IntendPendingVO extends BaseInfoVO { @ApiModelProperty("加盟模式 1-社会加盟模式 2-强加盟模式") private Integer joinMode; + private Date updateTime; + public IntendPendingVO(){} public IntendPendingVO(BaseInfoVO baseInfoVO) { diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PayStagePendingVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PayStagePendingVO.java index 512be35dc..50b0508cf 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PayStagePendingVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PayStagePendingVO.java @@ -4,6 +4,8 @@ import com.cool.store.vo.BaseInfoVO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; + /** * @Author suzhuhong * @Date 2024/4/1 16:37 @@ -14,7 +16,7 @@ public class PayStagePendingVO extends BaseInfoVO { @ApiModelProperty("缴费时间 2024年04月23日 16:00") private String payTime; - + private Date updateTime; public PayStagePendingVO(){}; public PayStagePendingVO(BaseInfoVO baseInfoVO) { diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/SigningPendingVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/SigningPendingVO.java index d3c9bbf0c..110dc8636 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/SigningPendingVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/SigningPendingVO.java @@ -4,6 +4,8 @@ import com.cool.store.vo.BaseInfoVO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; + /** * @Author suzhuhong * @Date 2024/4/1 16:55 @@ -14,6 +16,7 @@ public class SigningPendingVO extends BaseInfoVO { @ApiModelProperty("提交时间 2024年04月23日 16:00") private String submitTime; + private Date updateTime; public SigningPendingVO(){}; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java new file mode 100644 index 000000000..42a09fb6c --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java @@ -0,0 +1,24 @@ +package com.cool.store.service; + +import com.cool.store.dto.StoreDTO; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/5/13 9:56 + * @Version 1.0 + */ +public interface StoreService { + + + /** + * 分页查询门店信息 包括扩展信息 + * @param pageSize + * @param pageNum + * @return + */ + PageInfo getStoreExtendFieldInfo(Integer pageSize,Integer pageNum); + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java new file mode 100644 index 000000000..c16a436e1 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java @@ -0,0 +1,22 @@ +package com.cool.store.service; + +import com.cool.store.dto.FoodTokenDTO; +import com.cool.store.dto.GetAccessTokenDTO; + +/** + * 正新菜品市场api对接-埃林哲-对接人徐哲 + * @Author suzhuhong + * @Date 2025/5/13 15:20 + * @Version 1.0 + */ +public interface ThirdFoodService { + + + /** + * 获取正新菜品市场token + * @param dto + * @return + */ + String getFoodToken(FoodTokenDTO dto); + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java index 40f4f2904..b15632c69 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java @@ -107,6 +107,7 @@ public class DeskServiceImpl implements DeskService { IntendPendingVO intendPendingVO = new IntendPendingVO(baseInfoVO); intendPendingVO.setJoinTime(new Date()); intendPendingVO.setJoinMode(x.getJoinMode()); + intendPendingVO.setUpdateTime(x.getUpdateTime()); list.add(intendPendingVO); }); @@ -133,7 +134,7 @@ public class DeskServiceImpl implements DeskService { if (linePayDO != null && linePayDO.getPayTime() != null) { payStagePendingVO.setPayTime(DateUtils.parseDateToStr(SPECIAL_DATE_START, linePayDO.getPayTime())); } - + payStagePendingVO.setUpdateTime(x.getUpdateTime()); list.add(payStagePendingVO); }); @@ -161,6 +162,7 @@ public class DeskServiceImpl implements DeskService { if (date != null) { signingPendingVO.setSubmitTime(DateUtils.parseDateToStr(SPECIAL_DATE_START, date)); } + signingPendingVO.setUpdateTime(x.getUpdateTime()); list.add(signingPendingVO); }); page.setList(list); @@ -197,6 +199,7 @@ public class DeskServiceImpl implements DeskService { baseInfoVO.setUserPortraitList(labelBaseInfoList); baseInfoVO.setJoinMode(lineInfoDO.getJoinMode()); baseInfoVO.setWantShopAreaName(wantShopAreaMap.get(lineInfoDO.getWantShopAreaId())); + return baseInfoVO; } @@ -252,16 +255,6 @@ public class DeskServiceImpl implements DeskService { subStageStatusList, Boolean.TRUE); } } - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map shopPayDoMap = linePayDAO.getLinePayByShopIds(shopIds, PayBusinessTypeEnum.FRANCHISE_FEE.getCode()); - for (PreparationCommonPendingVO vo : list) { - vo.setSubmitTime(DateUtils.parseDateToStr(SPECIAL_DATE_START, shopPayDoMap.getOrDefault(vo.getShopId(), new LinePayDO()).getCreateTime())); - } - pageInfo.setList(list); return pageInfo; } @@ -269,19 +262,6 @@ public class DeskServiceImpl implements DeskService { public PageInfo signingOfFranchiseContractPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, user, ShopSubStageEnum.SHOP_STAGE_8, Arrays.asList(SHOP_SUB_STAGE_STATUS_80.getShopSubStageStatus(), SHOP_SUB_STAGE_STATUS_85.getShopSubStageStatus(), SHOP_SUB_STAGE_STATUS_83.getShopSubStageStatus()), Boolean.TRUE); - - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List subStageList = shopStageInfoDAO.getSubStages(shopIds, ShopSubStageEnum.SHOP_STAGE_7.getShopSubStage()); - doThing(deskStageMap, subStageList); - for (PreparationCommonPendingVO vo : list) { - vo.setSubmitTime(deskStageMap.get(vo.getShopId()).get(0).getActualCompleteTime()); - } - pageInfo.setList(list); return pageInfo; } @@ -306,91 +286,32 @@ public class DeskServiceImpl implements DeskService { @Override public PageInfo xinFaListPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { - PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_23, + return commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_23, Collections.singletonList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_230.getShopSubStageStatus()), Boolean.FALSE); - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List subStageList = shopStageInfoDAO.getSubStages(shopIds, ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()); - doThing(deskStageMap, subStageList); - for (PreparationCommonPendingVO vo : list) { - if (deskStageMap.get(vo.getShopId()) != null) { - vo.setSubmitTime(deskStageMap.get(vo.getShopId()).get(0).getActualCompleteTime()); - } - } - pageInfo.setList(list); - return pageInfo; } @Override public PageInfo posListPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { - PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_16, + return commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_16, Collections.singletonList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_160.getShopSubStageStatus()), Boolean.FALSE); - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List subStageList = shopStageInfoDAO.getSubStages(shopIds, ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()); - doThing(deskStageMap, subStageList); - for (PreparationCommonPendingVO vo : list) { - if (deskStageMap.get(vo.getShopId()) != null) { - vo.setSubmitTime(deskStageMap.get(vo.getShopId()).get(0).getActualCompleteTime()); - } - } - pageInfo.setList(list); - return pageInfo; } @Override public PageInfo tentPassListPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { - PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_24, + return commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_24, Collections.singletonList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_240.getShopSubStageStatus()), Boolean.FALSE); - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List subStageList = shopStageInfoDAO.getSubStages(shopIds, ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()); - doThing(deskStageMap, subStageList); - for (PreparationCommonPendingVO vo : list) { - if (deskStageMap.get(vo.getShopId()) != null) { - vo.setSubmitTime(deskStageMap.get(vo.getShopId()).get(0).getActualCompleteTime()); - } - } - pageInfo.setList(list); - return pageInfo; } @Override public PageInfo orderSysPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { - PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_17, + return commonPendingVOPageInfo(pageNum, pageSize, null, ShopSubStageEnum.SHOP_STAGE_17, Collections.singletonList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_170.getShopSubStageStatus()), Boolean.FALSE); - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List subStageList = shopStageInfoDAO.getSubStages(shopIds, ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()); - doThing(deskStageMap, subStageList); - for (PreparationCommonPendingVO vo : list) { - if (deskStageMap.get(vo.getShopId()) != null) { - vo.setSubmitTime(deskStageMap.get(vo.getShopId()).get(0).getActualCompleteTime()); - } - } - pageInfo.setList(list); - return pageInfo; + } @Override @@ -467,67 +388,17 @@ public class DeskServiceImpl implements DeskService { @Override public PageInfo constructionPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { - PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, user, ShopSubStageEnum.SHOP_STAGE_11, + return commonPendingVOPageInfo(pageNum, pageSize, user, ShopSubStageEnum.SHOP_STAGE_11, Arrays.asList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_110.getShopSubStageStatus(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_111.getShopSubStageStatus()), Boolean.TRUE); - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().filter(o -> Objects.equals(o.getSubStageStatus(), SHOP_SUB_STAGE_STATUS_111.getShopSubStageStatus())).map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List shopIds1 = list.stream().filter(o -> Objects.equals(o.getSubStageStatus(), SHOP_SUB_STAGE_STATUS_110.getShopSubStageStatus())).map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - List subStageList = shopStageInfoDAO.getSubStages(shopIds1, ShopSubStageEnum.SHOP_STAGE_9.getShopSubStage()); - doThing(deskStageMap, subStageList); - //施工待提交阶段提交的表单用作施工中的提交时间 - Map constructionMap = new HashMap<>(); - List byIds = decorationDesignInfoDAO.getByIds(shopIds); - if (byIds != null) { - constructionMap = byIds.stream().collect(Collectors.toMap(DecorationDesignInfoDO::getShopId, DecorationDesignInfoDO::getConstructionCreateTime)); - } - for (PreparationCommonPendingVO vo : list) { - if (vo.getSubStageStatus().equals(SHOP_SUB_STAGE_STATUS_110.getShopSubStageStatus()) && deskStageMap.get(vo.getShopId()) != null) { - if (deskStageMap.get(vo.getShopId()) != null) { - vo.setSubmitTime(deskStageMap.get(vo.getShopId()).get(0).getActualCompleteTime()); - } - } else if (vo.getSubStageStatus().equals(SHOP_SUB_STAGE_STATUS_111.getShopSubStageStatus())) { - vo.setSubmitTime(DateUtils.parseDateToStr(SPECIAL_DATE_START, constructionMap.get(vo.getShopId()))); - } - - } - pageInfo.setList(list); - return pageInfo; } @Override public PageInfo fitmentPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { - PageInfo pageInfo = commonPendingVOPageInfo(pageNum, pageSize, user, ShopSubStageEnum.SHOP_STAGE_12, + return commonPendingVOPageInfo(pageNum, pageSize, user, ShopSubStageEnum.SHOP_STAGE_12, Collections.singletonList(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_122.getShopSubStageStatus()), Boolean.FALSE); - List list = pageInfo.getList(); - if (CollectionUtils.isEmpty(list)) { - return pageInfo; - } - List shopIds = list.stream().map(PreparationCommonPendingVO::getShopId).collect(Collectors.toList()); - Map> deskStageMap = new HashMap<>(); - List acceptanceInfoDOList = acceptanceInfoDAO.selectByShopIds(shopIds); - for (AcceptanceInfoDO acceptanceInfoDO : acceptanceInfoDOList) { - DeskStageDTO dto = new DeskStageDTO(); - dto.setActualCompleteTime(DateUtils.parseDateToStr(DateUtils.SPECIAL_DATE_START, acceptanceInfoDO.getCreateTime())); - dto.setShopSubStageStatus(SHOP_SUB_STAGE_STATUS_122.getShopSubStageStatus()); - deskStageMap.put(acceptanceInfoDO.getShopId(), Collections.singletonList(dto)); - } - for (PreparationCommonPendingVO vo : list) { - for (DeskStageDTO deskStageDTO : deskStageMap.get(vo.getShopId())) { - if (vo.getSubStageStatus().equals(deskStageDTO.getShopSubStageStatus())) { - vo.setSubmitTime(deskStageDTO.getActualCompleteTime()); - break; - } - } - } - pageInfo.setList(list); - return pageInfo; } @Override @@ -558,11 +429,20 @@ public class DeskServiceImpl implements DeskService { @Override public PageInfo buildInformationPendingList(Integer pageNum, Integer pageSize, LoginUserInfo user) { List userRoleIds = enterpriseUserRoleMapper.getUserRoleIds(user.getUserId()); + //如果不是财务角色或者即是财务又是自有店财务 则不需要标识 + Boolean ownShopFlag = null; + if (userRoleIds.contains(UserRoleEnum.FINANCE.getCode())&&userRoleIds.contains(UserRoleEnum.OWN_SHOP_OFFICE.getCode())){ + ownShopFlag = null; + }else if(userRoleIds.contains(UserRoleEnum.FINANCE.getCode())){ + ownShopFlag = Boolean.FALSE; + }else if (userRoleIds.contains(UserRoleEnum.OWN_SHOP_OFFICE.getCode())){ + ownShopFlag = Boolean.TRUE; + } List subStageStatusList = new ArrayList<>(); if (userRoleIds.contains(UserRoleEnum.LOGISTICS.getCode())) { subStageStatusList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_151.getShopSubStageStatus()); } - if (userRoleIds.contains(UserRoleEnum.FINANCE.getCode())) { + if (userRoleIds.contains(UserRoleEnum.FINANCE.getCode())||userRoleIds.contains(UserRoleEnum.OWN_SHOP_OFFICE.getCode())) { subStageStatusList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_152.getShopSubStageStatus()); } if (userRoleIds.contains(UserRoleEnum.HEAD_OF_DIVISION.getCode()) || userRoleIds.contains(UserRoleEnum.REGIONAL_MANAGER.getCode())) { @@ -582,7 +462,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 commonPendingVOPageInfo(pageNum, pageSize, isAdmin ? null : user, ShopSubStageEnum.SHOP_STAGE_15, subStageStatusList, isAdmin ? Boolean.FALSE : Boolean.TRUE); + return commonPendingVOPage(pageNum, pageSize, isAdmin ? null : user, ShopSubStageEnum.SHOP_STAGE_15, subStageStatusList, isAdmin ? Boolean.FALSE : Boolean.TRUE,ownShopFlag); } @Override @@ -628,13 +508,27 @@ public class DeskServiceImpl implements DeskService { preparationCommonPendingVO.setPartnerPhone(lineInfoDO.getMobile()); preparationCommonPendingVO.setRegionNodeName(regionNameMap.getOrDefault(preparationCommonPendingVO.getRegionId(), "")); preparationCommonPendingVO.setInvestmentManager(userNameMap.getOrDefault(preparationCommonPendingVO.getInvestmentManager(), "")); - preparationCommonPendingVO.setSubmitTime(DateUtils.parseDateToStr(SPECIAL_DATE_START, preparationCommonPendingVO.getUpdateTime())); } return new PageInfo<>(list); } return new PageInfo<>(); } + + /** + * 通用查询 + * @param pageNum + * @param pageSize + * @param user + * @param shopSubStageEnum + * @param subStageStatusList + * @param filterFlag + * @return + */ + private PageInfo commonPendingVOPageInfo(Integer pageNum, Integer pageSize, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag){ + return this.commonPendingVOPage(pageNum,pageSize,user,shopSubStageEnum,subStageStatusList,filterFlag,null); + } + /** * 通用查询 * @@ -645,7 +539,7 @@ public class DeskServiceImpl implements DeskService { * @param subStageStatusList * @return */ - private PageInfo commonPendingVOPageInfo(Integer pageNum, Integer pageSize, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag) { + private PageInfo commonPendingVOPage(Integer pageNum, Integer pageSize, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag,Boolean ownShopFlag) { //user.getJobNumber() List authRegionIds = new ArrayList<>(); if (filterFlag) { @@ -655,7 +549,7 @@ public class DeskServiceImpl implements DeskService { } PageHelper.startPage(pageNum, pageSize); List specialShopStageInfo = shopStageInfoDAO.getSpecialShopStageInfo(null, shopSubStageEnum.getShopSubStage(), - subStageStatusList, user == null ? null : user.getUserId(), authRegionIds); + subStageStatusList, user == null ? null : user.getUserId(), authRegionIds,ownShopFlag); PageInfo result = new PageInfo<>(specialShopStageInfo); List shopIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getShopId).collect(Collectors.toList()); List lineIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getLineId).collect(Collectors.toList()); @@ -709,6 +603,7 @@ public class DeskServiceImpl implements DeskService { preparationCommonPendingVO.setPartnerPhone(planLineDTO.getMobile()); preparationCommonPendingVO.setShopManagerUserName(userNameMap.getOrDefault(shopInfoDO.getShopManagerUserId(), "")); preparationCommonPendingVO.setRegionNodeName(regionNameMap.getOrDefault(shopInfoDO.getRegionId(), "")); + preparationCommonPendingVO.setUpdateTime(x.getUpdateTime()); list.add(preparationCommonPendingVO); }); result.setList(list); @@ -779,6 +674,7 @@ public class DeskServiceImpl implements DeskService { preparationCommonPendingVO.setSubStage(x.getShopSubStage()); preparationCommonPendingVO.setSubStageStatus(x.getShopSubStageStatus()); preparationCommonPendingVO.setSubmitTime(DateUtils.parseDateToStr(SPECIAL_DATE_START, x.getCreateTime())); + preparationCommonPendingVO.setUpdateTime(x.getUpdateTime()); preparationCommonPendingVO.setStoreName(shopInfoDO.getShopName()); PlanLineDTO planLineDTO = lineMap.getOrDefault(shopInfoDO.getLineId(), new PlanLineDTO()); preparationCommonPendingVO.setPartnerName(planLineDTO.getUsername()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java index 49aaa5eb3..46f3ba957 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java @@ -143,6 +143,10 @@ public class LinePayServiceImpl implements LinePayService { if (request.getLineId() != null) { lineInfo = lineInfoDAO.getLineInfo(request.getLineId()); } + //缴纳加盟费检验缴费人必须是签约人 + if(PayBusinessTypeEnum.FRANCHISE_FEE.getCode().equals(request.getPayBusinessType()) && !lineInfo.getUsername().trim().equals(request.getPayUserName().trim())){ + throw new ServiceException(ErrorCodeEnum.CHECK_PAYER_ERROR); + } LinePayDO linePayDO = linePayDAO.getByLineIdAndPayTypeAndShopId(request.getLineId(), request.getPayBusinessType(), request.getShopId()); linePayDO = checkAndFill(linePayDO, request, partnerUser); Long payId = linePayDO.getId(); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java index f325f172e..eb3bebe31 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java @@ -589,7 +589,21 @@ public class ShopServiceImpl implements ShopService { @Override public List getShopListSuccessOpen(Long lineId) { - return shopInfoDAO.getShopListSuccessOpen(eid, lineId); + LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(lineId); + List storeDOS = storeDao.listByMobile(lineInfoDO.getMobile()); + if (CollectionUtils.isEmpty(storeDOS)){ + return new ArrayList<>(); + } + List responses = new ArrayList<>(); + for (StoreDO storeDO : storeDOS){ + MiniShopsResponse response = new MiniShopsResponse(); + response.setShopName(storeDO.getStoreName()); + response.setShopCode(storeDO.getStoreNum()); + response.setYlsCode("ZXA8_"+storeDO.getStoreNum()); + response.setDetailAddress(storeDO.getStoreAddress()); + responses.add(response); + } + return responses; } @Override @@ -778,7 +792,7 @@ public class ShopServiceImpl implements ShopService { return getUserById(measureDO.getMeasureUserId()); case SHOP_SUB_STAGE_STATUS_90: - return getUserById(decoration.getDesignLeaderId()); + return getUserById(measureDO.getDesignUserId()); case SHOP_SUB_STAGE_STATUS_901: return getUserById(decoration.getDesignUserId()); @@ -841,7 +855,7 @@ public class ShopServiceImpl implements ShopService { /** * 获取招商经理信息 - * @param lineInfo + * @param * @return */ private List getUserFromInvestmentManager(String userId) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java index 243fdac54..1e57113f9 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java @@ -383,7 +383,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu SignFranchiseDO signFranchiseDO = signFranchiseMapper.selectByShopId(shopId); log.info("加盟合同审批时签约类型:{}",SignTypeEnum.getDescByCode(signFranchiseDO.getSignType())); Boolean sendNotice = Boolean.TRUE; - if (SignTypeEnum.OLD_NEW_OPEN.getCode().equals(signFranchiseDO.getSignType())){ + if (SignTypeEnum.OLD_NEW_OPEN.getCode().equals(signFranchiseDO.getSignType())||SignTypeEnum.DIRECT_SALES_TO_JOINING.getCode().equals(signFranchiseDO.getSignType())){ //老店新开时装修与开业直接完成 shopStageInfoDAO.batchUpdateByShopIdsAndSubStageStatus(Arrays.asList(shopId),Arrays.asList( 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 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java new file mode 100644 index 000000000..81ee792d2 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java @@ -0,0 +1,116 @@ +package com.cool.store.service.impl; + +import com.cool.store.dao.StoreDao; +import com.cool.store.dto.StoreDTO; +import com.cool.store.entity.StoreDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.ExtendFieldTypeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.service.StoreService; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/5/13 9:56 + * @Version 1.0 + */ +@Service +@Slf4j +public class StoreServiceImpl implements StoreService { + + @Resource + StoreDao storeDao; + + @Override + public PageInfo getStoreExtendFieldInfo(Integer pageSize, Integer pageNum) { + if (pageSize>200){ + throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE,"单次最多获取200条门店数据"); + } + PageHelper.startPage(pageNum,pageSize); + List list = storeDao.list(); + PageInfo info = new PageInfo<>(list); + if (CollectionUtils.isEmpty(list)){ + return info; + } + List storeDTOS = processStores(list); + info.setList(storeDTOS); + return info; + } + + + public static List processStores(List stores) { + ObjectMapper objectMapper = new ObjectMapper(); + + // 创建配置映射:key -> 枚举项 + Map configMap = ExtendFieldTypeEnum.configMap(); + + // 处理每个门店 + return stores.stream().map(store -> { + StoreDTO dto = new StoreDTO(); + dto.setStoreName(store.getStoreName()); + dto.setStoreCode(store.getStoreNum()); + + try { + // 解析门店的扩展字段 + Map extendFields = objectMapper.readValue( + store.getExtendField(), + new TypeReference>() {} + ); + + // 匹配并设置DTO字段 + for (Map.Entry entry : extendFields.entrySet()) { + ExtendFieldTypeEnum fieldEnum = configMap.get(entry.getKey()); + if (fieldEnum != null) { + switch (fieldEnum) { + case TEST_STORE_MANAGER_MOBILE: + case ONLINE_STORE_MANAGER_MOBILE: + dto.setManagerPhone(entry.getValue()); + break; + case TEST_SIGNATORY_NAME_1: + case ONLINE_SIGNATORY_NAME_1: + dto.setSigner1Name(entry.getValue()); + break; + case TEST_SIGNATORY_MOBILE_1: + case ONLINE_SIGNATORY_MOBILE_1: + dto.setSigner1Phone(entry.getValue()); + break; + case TEST_SIGNATORY_NAME_2: + case ONLINE_SIGNATORY_NAME_2: + dto.setSigner2Name(entry.getValue()); + break; + case TEST_SIGNATORY_MOBILE_2: + case ONLINE_SIGNATORY_MOBILE_2: + dto.setSigner2Phone(entry.getValue()); + break; + case TEST_ORDER_NAME: + case ONLINE_ORDER_NAME: + dto.setOrderMiniProgramName(entry.getValue()); + break; + } + } + } + } catch (Exception e) { + // 处理JSON解析异常 + log.error("解析门店扩展字段失败: {} " + store.getStoreNum()); + e.printStackTrace(); + } + return dto; + }).collect(Collectors.toList()); + } + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java new file mode 100644 index 000000000..e812a1ea6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java @@ -0,0 +1,148 @@ +package com.cool.store.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.FoodTokenDTO; +import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.response.oppty.OpportunityApiResponse; +import com.cool.store.service.ThirdFoodService; +import com.cool.store.utils.SignatureUtils; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.net.URI; +import java.util.Map; + +/** + * @Author suzhuhong + * @Date 2025/5/13 15:21 + * @Version 1.0 + */ +@Service +@Slf4j +public class ThirdFoodServiceImpl implements ThirdFoodService { + + @Value("${zx.food.url}") + private String apiUrl; + + + @Resource + OkHttpClient okHttpClient; + @Resource + ObjectMapper objectMapper; + + + @Override + public String getFoodToken(FoodTokenDTO dto) { + // 1. 发送POST请求 + String url = apiUrl + "/interface/v1/user/getToken"; + return executeApiCall(url, dto, String.class); + } + + + private T executeApiCall(String url, Object requestBody, Class responseType) { + // 1. 打印请求前日志 + //logRequest(url, requestBody); + + try { + Request request = buildRequest(requestBody, url); + + try (Response response = okHttpClient.newCall(request).execute()) { + // 2. 获取原始响应内容 + String responseBody = response.body().string(); + + // 3. 打印响应日志 + logResponse(url, response.code(), responseBody); + + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "HTTP请求失败,状态码: " + response.code()); + } + + // 4. 解析响应 + JavaType javaType = objectMapper.getTypeFactory() + .constructParametricType(OpportunityApiResponse.class, responseType); + + OpportunityApiResponse apiResponse = objectMapper.readValue(responseBody, javaType); + + if (apiResponse.getCode() != 200) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, apiResponse.getMsg()); + } + return apiResponse.getData(); + } + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("API调用异常 - URL: {}, 错误: {}", url, e.getMessage(), e); + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage()); + } + } + + + private Request buildRequest(Object requestBody, String url) { + String timestamp = String.valueOf(System.currentTimeMillis()); + String random = RandomUtil.randomString(20); + + String signString = null; + try { + signString = SignatureUtils.sign("POST","/v1/user/getToken", objectMapper.writeValueAsString(requestBody),timestamp,random); + } catch (Exception e) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_SIGN_ERROR,"加密失败"); + } + + log.info("签名生成 - 签名结果: {}", signString); + + RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json"), + JSONObject.toJSONString(requestBody) + ); + + return new Request.Builder() + .url(url) + .post(body) + .addHeader("X-ZhengXin-Sign", signString) + .addHeader("X-ZhengXin-SignTime", timestamp) + .addHeader("X-ZhengXin-SignRandom", random) + .addHeader("X-ZhengXin-appId", "CRM") + .build(); + } + + private void logResponse(String url, int statusCode, String responseBody) { + if (log.isInfoEnabled()) { + try { + // 尝试美化JSON输出 + Object json = objectMapper.readValue(responseBody, Object.class); + String prettyResponse = objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(json); + + log.info("\n======= 响应开始 =======\n" + + "API地址: {}\n" + + "HTTP状态码: {}\n" + + "响应内容: {}\n" + + "======= 响应结束 =======", + url, + statusCode, + prettyResponse); + } catch (Exception e) { + // 非JSON响应或解析失败时直接输出原始内容 + log.info("\n======= 响应开始 =======\n" + + "API地址: {}\n" + + "HTTP状态码: {}\n" + + "原始响应: {}\n" + + "======= 响应结束 =======", + url, + statusCode, + responseBody); + } + } + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java index ec781964a..aa6f81a42 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java @@ -1,7 +1,9 @@ package com.cool.store.config; +import com.alibaba.fastjson.JSON; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; +import com.cool.store.response.ResponseResult; import com.cool.store.utils.OpenSignatureUtil; import com.cool.store.utils.StringUtil; import com.cool.store.utils.UUIDUtils; @@ -11,10 +13,12 @@ import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.util.Map; @@ -48,44 +52,63 @@ public class OpenApiValidateFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; String uri = request.getRequestURI(); - if(!uri.startsWith("/zxjp/open/v1/getYlsToken")){ + if(!uri.startsWith("/zxjp/open/v1")){ filterChain.doFilter(servletRequest, response); return; } MDC.put(CommonConstants.REQUEST_ID, UUIDUtils.get32UUID()); - + //statusRefresh 放开不需要验签 + if(uri.startsWith("/zxjp/open/v1/statusRefresh")){ + filterChain.doFilter(servletRequest, response); + return; + } + HttpServletResponse res = (HttpServletResponse) response; // 1. 验证时间戳 try { String timestampStr = request.getHeader("timestamp"); if (timestampStr == null) { log.info("timestampStr is null {}","缺少timestamp参数"); - throw new ServiceException(ErrorCodeEnum.SIGN_FAIL); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"缺少timestamp参数"))); + return; } long timestamp = Long.parseLong(timestampStr)/1000; long currentTime = System.currentTimeMillis()/1000; long timeDiff = Math.abs(currentTime - timestamp); try { - - if (timeDiff > 600) { log.info("OpenApiValidateFilter==>{}","请求已过期,服务器时间:" + currentTime + " 请求时间:" + timestamp); - throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"请求已过期,请保证timestamp时间在10分钟之内"); + throw new ServiceException(ErrorCodeEnum.SIGN_FAIL,"请求已过期,请保证timestamp时间在10分钟之内"); } } catch (NumberFormatException e) { log.info("OpenApiValidateFilter==>{}","非法timestamp格式"); - throw new ServiceException(ErrorCodeEnum.SIGN_FAIL); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"非法timestamp格式"))); + return; } // 2. 验证签名 String appKey = request.getHeader("appkey"); if (appKey == null || !coolAppKey.equals(appKey)) { log.info("OpenApiValidateFilter==>{}","无效的appKey"); - throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"无效的appKey"); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"无效的appKey"))); + return; } String clientSign = request.getHeader("sign"); if (clientSign == null) { - throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"签名校验失败"); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"签名为空"))); + return; } // 1. 读取请求体 StringBuilder requestBody = new StringBuilder(); @@ -112,7 +135,11 @@ public class OpenApiValidateFilter implements Filter { log.info("{}",serverSign); if (!serverSign.equalsIgnoreCase(clientSign)) { - throw new ServiceException(ErrorCodeEnum.SIGN_FAIL); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"签名校验失败"))); + return; } filterChain.doFilter(request, response); } finally { diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java index e782ad263..784d85df0 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java @@ -4,11 +4,15 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.dto.AskBotTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; import com.cool.store.dto.StatusRefreshDTO; +import com.cool.store.dto.StoreDTO; +import com.cool.store.request.OpenApiStoreRequest; import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.OpenApiService; import com.cool.store.service.PushService; import com.cool.store.service.ShopAccountService; +import com.cool.store.service.StoreService; +import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -34,6 +38,8 @@ public class OpenApiController { PushService pushService; @Resource ShopAccountService shopAccountService; + @Resource + StoreService storeService; @PostMapping("/statusRefresh") public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ @@ -49,4 +55,11 @@ public class OpenApiController { } + @ApiOperation("获取门店信息") + @PostMapping("/getStoreList") + public ApiResponse> getStoreList(@RequestBody @Validated OpenApiStoreRequest dto) { + return ApiResponse.success(storeService.getStoreExtendFieldInfo(dto.getPageSize(),dto.getPageNum())); + } + + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java index 7b47e3e7d..8778e7a33 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java @@ -1,6 +1,7 @@ package com.cool.store.controller.webb; import com.cool.store.dao.*; +import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; import com.cool.store.dto.ModifyPasswordDTO; import com.cool.store.entity.*; @@ -295,6 +296,12 @@ public class PCTestController { public ResponseResult> getAuthRegionIdAndSubRegionIdByUserId(@RequestParam(value = "userId", required = true) String userId) { return ResponseResult.success(userAuthMappingService.getAuthRegionIdAndSubRegionIdByUserId(userId)); } - + @Resource + ThirdFoodService thirdFoodService; + @ApiOperation("获取菜品市场token") + @PostMapping("/getFoodToken") + public ResponseResult getFoodToken(@RequestBody @Validated FoodTokenDTO dto) { + return ResponseResult.success(thirdFoodService.getFoodToken(dto)); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java index 0811548aa..c2a3def10 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java @@ -1,5 +1,6 @@ package com.cool.store.controller.webc; +import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; import com.cool.store.dto.ModifyPasswordDTO; import com.cool.store.dto.ShopAccount.ShopAccountDTO; @@ -7,6 +8,7 @@ import com.cool.store.request.GetPasswordDTO; import com.cool.store.response.ResponseResult; import com.cool.store.service.PushService; import com.cool.store.service.ShopAccountService; +import com.cool.store.service.ThirdFoodService; import com.cool.store.service.ThirdXinGuanJiaService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -36,6 +38,9 @@ public class MiniShopAccountController { @Resource ThirdXinGuanJiaService thirdXinGuanJiaService; + @Resource + ThirdFoodService thirdFoodService; + @ApiOperation("根据门店shopId查询平台账号") @GetMapping("/getShopAccountByShopId") @@ -68,6 +73,12 @@ public class MiniShopAccountController { return ResponseResult.success(pushService.getXzgToken(dto)); } + @ApiOperation("获取菜品市场token") + @PostMapping("/getFoodToken") + public ResponseResult getFoodToken(@RequestBody @Validated FoodTokenDTO dto) { + return ResponseResult.success(thirdFoodService.getFoodToken(dto)); + } + @ApiOperation("获取加密子串") @PostMapping("/getEncryptedSubstring") public ResponseResult getEncryptedSubstring(@RequestBody GetPasswordDTO dto) { diff --git a/coolstore-partner-web/src/main/resources/application-online.properties b/coolstore-partner-web/src/main/resources/application-online.properties index 93a39ac1b..2df7c5b1b 100644 --- a/coolstore-partner-web/src/main/resources/application-online.properties +++ b/coolstore-partner-web/src/main/resources/application-online.properties @@ -118,6 +118,8 @@ zx.big.data.appSecret=35b8b9a400b4430fa022190be0913cd6 xzg.api.auth.url=http://webapi.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinshipin.com + cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c diff --git a/coolstore-partner-web/src/main/resources/application-test.properties b/coolstore-partner-web/src/main/resources/application-test.properties index 7636ac99c..ef4d1eb1e 100644 --- a/coolstore-partner-web/src/main/resources/application-test.properties +++ b/coolstore-partner-web/src/main/resources/application-test.properties @@ -121,6 +121,8 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com + cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c