diff --git a/coolstore-partner-common/pom.xml b/coolstore-partner-common/pom.xml index a6081765b..c499b9524 100644 --- a/coolstore-partner-common/pom.xml +++ b/coolstore-partner-common/pom.xml @@ -103,6 +103,10 @@ openpdf 1.3.30 + + org.bouncycastle + bcprov-jdk15on + org.icepdf.os diff --git a/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java b/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java new file mode 100644 index 000000000..6b1b91fac --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java @@ -0,0 +1,14 @@ +package com.cool.store.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 平台库数据源 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface PlatformDB { +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index c54ae5efa..8081b0051 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -26,6 +26,11 @@ public class CommonConstants { public static final int NORMAL_LOCK_TIMES = 60 * 1000; + /** + * 短期token过期时间,单位秒 + */ + public static final int SHORT_TERM_TOKEN_EXPIRE = 60 * 5; + public static final int AN_HOUR_SECONDS = 3600; //十秒 public static final int TEN_SECONDS = 10000; @@ -55,6 +60,11 @@ public class CommonConstants { public static final String ZXJP_MINI_PROGRAM_LOGIN_FLAG = "zxjp_mini_program_login_flag:{0}"; + /** + * 小程序短期token key + */ + public static final String ZXJP_MIN_PROGRAM_SHORT_TERM_LOGIN_FLAG = "zxjp_mini_program_short_term_login_flag:{0}"; + public static final String ROOT_DEPT_ID_STR = "1"; public static final Integer DEAL_RECORD_MAX_SIZE = 1000; @@ -201,5 +211,29 @@ public class CommonConstants { public static final String WX_SELF_AUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect"; + /** + * 密码最大错误次数 + */ + public static final int MAX_ERROR_PASSWORD_COUNT = 5; + /** + * 用户密码 + */ + public static final String USER_AUTH_KEY = "user_auth_key"; + + /** + * accessToken有效期,单位秒 + */ + public static final int ACTION_TOKEN_EXPIRE = 24 * 60 * 60; + + /** + * refreshToken有效期,单位秒 + */ + public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; + + public static final int BATCH_SIZE = 200; + + public static final Integer INDEX_ZERO = 0; + public static final Integer INDEX_ONE = 1; + public static final Integer INDEX_TWO = 2; } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java index 29f07024f..e20a622be 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java @@ -283,4 +283,25 @@ public class RedisConstant { public static final String SUBMIT_BUILD_KEY = "submit_build_key_"; public static final String GET_AI_MODULE = "get_ai_module_"; + + public static final String HUOMA_STORE_DEVICE_RESOURCE_KEY = "huoma_store_device_resource"; + + public static final String HUO_MA_STORE_ID = "huo_ma_store_id"; + + public static final String HUO_MA_TOKEN= "huo_ma_token:{0}"; + + /** + * 钱包开通失败/打标失败原因 wallet_open_fail:storeId:1/2 1平安/2网商 + */ + public static final String WALLET_OPEN_FAIL = "wallet_open_fail:{0}:{1}"; + + /** + * 打标接口创建网商账户失败标识 wallet_online_bank_tag_fail:storeId + */ + public static final String WALLET_ONLINE_BANK_TAG_FAIL = "wallet_online_bank_tag_fail:{0}"; + + /** + * 网商账户是否已激活 + */ + public static final String WALLET_ONLINE_BANK_ACTIVATED = "wallet_online_bank_activated:{0}"; } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java new file mode 100644 index 000000000..dd0b32ff0 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java @@ -0,0 +1,25 @@ +package com.cool.store.datasource; + +/** + *

+ * 数据源上下文 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +public class DataSourceContextHolder { + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static void setDataSourceType(String dataSourceType) { + contextHolder.set(dataSourceType); + } + + public static String getDataSourceType() { + return contextHolder.get(); + } + + public static void clearDataSourceType() { + contextHolder.remove(); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java new file mode 100644 index 000000000..66bf25663 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java @@ -0,0 +1,53 @@ +package com.cool.store.datasource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.AbstractDataSource; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +/** + *

+ * 动态数据源 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Component +@Primary +public class DynamicDataSource extends AbstractDataSource { + + @Autowired + private DataSource defaultDataSource; + + @Autowired + private DataSource platformDataSource; + + @Override + public Connection getConnection() throws SQLException { + DataSource currentDB = getCurrentDB(); + return currentDB.getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + DataSource currentDB = getCurrentDB(); + Connection connection = currentDB.getConnection(username, password); + connection.setCatalog(DataSourceContextHolder.getDataSourceType()); + return connection; + } + + protected DataSource getCurrentDB() { + String dbName = DataSourceContextHolder.getDataSourceType(); + if (StringUtils.isBlank(dbName)) { + return defaultDataSource; + } + return platformDataSource; + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/BusinessModelEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/BusinessModelEnum.java index 7fdeec748..992738fbe 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/BusinessModelEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/BusinessModelEnum.java @@ -9,7 +9,8 @@ package com.cool.store.enums; public enum BusinessModelEnum { NULL(0, "无"), DIRECT_SALES(1, "直营"), - JOIN_SALES(2, "加盟"); + JOIN_SALES(2, "加盟"), + JOINT_STORE(3, "联营"); private Integer code; private String desc; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/Decoration/DecorationDescStatus.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/Decoration/DecorationDescStatus.java new file mode 100644 index 000000000..ca91fe397 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/Decoration/DecorationDescStatus.java @@ -0,0 +1,37 @@ +package com.cool.store.enums.Decoration; + +/** + * @Author suzhuhong + * @Date 2025/11/3 9:40 + * @Version 1.0 + */ +public enum DecorationDescStatus { + + TO_BE_ASSIGNED(0, "待分配"), + ASSIGNED(1, "已分配"), + ; + + + + + private Integer code; + + private String descStatus; + + DecorationDescStatus(Integer code, String descStatus) { + this.code = code; + this.descStatus = descStatus; + } + + public Integer getCode() { + return code; + } + + public String getDescStatus() { + return descStatus; + } + + + + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/Decoration/DecorationUseSystemEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/Decoration/DecorationUseSystemEnum.java new file mode 100644 index 000000000..807068d63 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/Decoration/DecorationUseSystemEnum.java @@ -0,0 +1,32 @@ +package com.cool.store.enums.Decoration; + +/** + * @Author suzhuhong + * @Date 2025/10/30 14:35 + * @Version 1.0 + */ +public enum DecorationUseSystemEnum { + + CRM(1,"CRM"), + HQT(2,"红圈通"); + + + private Integer code; + + private String userSystemName; + + + DecorationUseSystemEnum(Integer code, String userSystemName) { + this.code = code; + this.userSystemName = userSystemName; + } + + public Integer getCode() { + return code; + } + + public String getUserSystemName() { + return userSystemName; + } + +} 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 8865c48f5..96e9a456c 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 @@ -40,6 +40,7 @@ public enum ErrorCodeEnum { LOGIN_ERROR(400004, "登录失败", null), ENTERPRISE_INIT(400006, "企业正在初始化,请稍后访问!",null), NOT_AUTH(400007, "暂无权限,请联系管理员!", null), + REFRESH_TOKEN_INVALID(400008, "refresh token invalid", null), USER_FREEZE(1021019,"账号被冻结,请联系管理员",null), ENTERPRISE_NOT_EXIST(1021020,"企业不存在",null), USER_NOT_EXIST(1021021,"用户不存在",null), @@ -62,6 +63,11 @@ public enum ErrorCodeEnum { DATA_CONVERT_ERROR(400002, "日期转换异常!", null), PARENT_NODE_NOT_EXIST(400002, "父节点不存在", null), LOGIN_ERROR_MOBILE_ERROR(418, "登录失败 获取手机号失败!!", null), + PASSWORD_ERROR_MAX_COUNT(1021084, "密码错误{0}次,今日账号已锁定",null), + PASSWORD_MISSING(1021085, "密码不能为空!",null), + IMPROVE_USER_INFO(1021086,"请联系管理员,完善用户信息!",null), + PASSWORD_ERROR(1021087, "密码输入错误",null), + PASSWORD_ERROR_MULTI(1021088, "密码错误{0}次,请使用验证码登录",null), //红圈通 HQT_SHOP_DECORATION_ATTRIBUTES(1022000, "获取红圈通装修属性错误", null), HQT_PARAMS_ERROR(1022001, "构建红圈通请求参数错误", null), @@ -206,7 +212,9 @@ public enum ErrorCodeEnum { INVOICING_EXIST(109016, "当前门店发票信息已存在!", null), - SHOP_STATUS_NOT_SUPPORT_HANDLER(109016, "当前门店状态为:{0},不能进行结束跟进操作", null), + SHOP_STATUS_NOT_SUPPORT_HANDLER(109017, "当前门店状态为:{0},不能进行结束跟进操作", null), + + SYSTEM_NAME_NOT__SUPPORT(109018, "请不要使用系统默认店名!", null), INSERT_OPENING_OPERATION_PLAN_AUDIT_FALSE(103001,"插入运营方案审核信息失败",null), @@ -299,10 +307,24 @@ public enum ErrorCodeEnum { MESSAGE_TEMPLATE_NOT_SUPPORT_DELETED(1610002,"只有未发布的消息能删除,请确认!",null), STORE_MESSAGE_REVOKE(1610003,"当前门店消息已撤销,请务重复操作",null), STORE_MESSAGE_HANDLED(1610004,"当前门店消息已处理,无法撤销!",null), + MATTER_STORE_OR_USER_IS_NULL(1610005,"当前事项门店或者人员为空,发布失败,请确认!",null), + CONFIG_NOT_EXIST(1610006,"配置不存在或被禁用,请确认!",null), + MESSAGE_NOT_EXIST(1610007,"消息模板不存在或已被删除",null), + MESSAGE_NOT_HANDLED(1610008,"当前消息无需处理,请确认消息处理类型!",null), + MESSAGE_PUBLISH(1610009,"您选择通知任务正在发布中,请稍后重试!",null), + NOT_FLAGSHIP_STORE(1610010,"非直营店,无法跳过缴费阶段!",null), + NOT_FLAGSHIP_STORE_NOT_EXIST(1610011,"当前阶段加盟类型不能变更!",null), + JOIN_MODE_NOT_ALLOW_OPERATE(1610012,"加盟部人员只能新建加盟店或联营店,请确认!",null), + STORE_NOT_FIND(1610013,"门店不存在",null), + SHOP_NAME_INVALID(1610014, "门店名称包含禁止关键词",null), + //装修 + TEAM_USED(1612001,"该装修团队有门店使用,无法删除,请确认!",null), - NOT_FLAGSHIP_STORE(16100005,"非直营店,无法跳过缴费阶段!",null), - NOT_FLAGSHIP_STORE_NOT_EXIST(16100006,"当前阶段加盟类型不能变更!",null), + WALLET_OPEN_ACCOUNT_FAIL(1620001,"钱包开通失败",null), + WALLET_WITH_DRAWER_FAIL(1620002,"提现失败",null), + WALLET_API_ERROR(1620003,"{0}",null), + ; CURRENT_BRAND_SORT_NUMBER_EXIST(16100007,"当前品牌已存在该排序数字!",null), CONTRACT_CONFIG_NOT_EXIST(16100008,"合同配置不存在!",null),; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java index 4fca7bf91..65faf4608 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java @@ -38,4 +38,19 @@ public enum JoinModeEnum { } return null; } + /** + * 是否是加盟部加盟店或者联营店 如果不是 返回false + */ + public static boolean isFranchise(Integer code) { + return code == FRANCHISE_DEPARTMENT.code || code == AFFILIATES.code; + } + + public static JoinModeEnum getModelByCode(Integer code) { + for (JoinModeEnum e : JoinModeEnum.values()) { + if (e.getCode() == code) { + return e; + } + } + return null; + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java new file mode 100644 index 000000000..f7b95f109 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 登录类型 枚举类 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Getter +@AllArgsConstructor +public enum LoginTypeEnum { + + PASSWORD("账号密码", "passwordLoginServiceImpl"), + + ; + + private final String message; + + private final String clazzName; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java index 3305b8d0d..8ef4d447e 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java @@ -10,7 +10,8 @@ public enum ResponseCodeEnum { /** * 成功返回 */ - SUCCESS(200000, "SUCCESS"); + SUCCESS(200000, "SUCCESS"), + SUCCESS_WALLET(200, "SUCCESS"); /** * 返回码 diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java index ca1849ed2..68ebaf10f 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java @@ -32,6 +32,10 @@ public enum RocketMqGroupEnum { */ FEI_SHU_EVENT_LISTENER("fei_shu_event_listener", new ArrayList<>(Arrays.asList(RocketMqTagEnum.USER_EVENT, RocketMqTagEnum.AUTH_SCOPE_CHANGE, RocketMqTagEnum.DEPT_EVENT))), + + STORE_USER_UPDATE("store_user_update", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_USER_UPDATE))), + SHOP_DECORATION_ASSIGN("shop_decoration_assign", new ArrayList<>(Arrays.asList(RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN))) + ; private final String group; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java index 6d01d8557..b8b2bba54 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java @@ -18,6 +18,8 @@ public enum RocketMqTagEnum { ZXJP_CREATE_STORE("zxjp_create_store", "正新鸡排招商创建门店"), PARTNER_LICENSE_SYNC_QUEUE("partner_license_sync_queue", "招商证照信息同步"), BUSINESS_SYNC("business_sync", "工商食安信息同步"), + STORE_USER_UPDATE("store_user_update", "门店信息人员变更同步菜品"), + DELAY_SHOP_DECORATION_ASSIGN("shop_decoration_assign","门店装修分配"); ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/SMSMsgEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/SMSMsgEnum.java index caa21e924..79df8a643 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/SMSMsgEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/SMSMsgEnum.java @@ -7,11 +7,11 @@ package com.cool.store.enums; */ public enum SMSMsgEnum { - PAY_FRANCHISE_FEES("缴纳加盟费/保证金", "", "SMS_474655067"), - SIGN_CONTRACT("合同签署", "", "SMS_474450102"), - DESIGN_STAGE("设计阶段", "", "SMS_474490087"), - CONSTRUCTION_STAGE("施工阶段", "", "SMS_474525082"), - PLATFORM_BUILD_STORE("平台建店", "", "SMS_474645064"), + PAY_FRANCHISE_FEES("缴纳加盟费/保证金", "", "SMS_498895215"), + SIGN_CONTRACT("合同签署", "", "SMS_498840165"), + DESIGN_STAGE("设计阶段", "", "SMS_498750214"), + CONSTRUCTION_STAGE("施工阶段", "", "SMS_498870170"), + PLATFORM_BUILD_STORE("平台建店", "", "SMS_498730163"), ; private String title; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/SpecialTagEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/SpecialTagEnum.java new file mode 100644 index 000000000..d022a0728 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/SpecialTagEnum.java @@ -0,0 +1,58 @@ +package com.cool.store.enums; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/11/5 16:03 + * @Version 1.0 + */ +public enum SpecialTagEnum { + + ELECTRONIC_PRICE_LIST("电子价目牌"), + ACTIVITY_CAROUSEL("活动轮播"), + ACTIVITY_PACKAGE("活动套餐"), + PROMOTIONAL_VIDEO("宣传视频"); + + private final String tagName; + + SpecialTagEnum(String tagName) { + this.tagName = tagName; + } + + public String getTagName() { + return tagName; + } + + /** + * 根据标签名称获取枚举值 + */ + public static SpecialTagEnum fromTagName(String tagName) { + for (SpecialTagEnum tag : values()) { + if (tag.getTagName().equals(tagName)) { + return tag; + } + } + return null; + } + + /** + * 获取所有标签名称列表 + */ + public static List getAllTagNames() { + return Arrays.stream(values()) + .map(SpecialTagEnum::getTagName) + .collect(Collectors.toList()); + } + + /** + * 获取电子价目牌标签名称 + * @return + */ + public static List getElectronicPriceTagName() { + return Arrays.asList(ELECTRONIC_PRICE_LIST.getTagName()); + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/StoreStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/StoreStatusEnum.java new file mode 100644 index 000000000..6ae889d05 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/StoreStatusEnum.java @@ -0,0 +1,77 @@ +package com.cool.store.enums; + +/** + * Created by Administrator on 2020/1/20. + */ +public enum StoreStatusEnum { + + //营业 + OPEN("open","在营"), + //闭店 + CLOSED("closed","闭店解约"), + //未开业 + NOT_OPEN("not_open","未开业"), + //迁址 + CHANGE_ADDRESS("change_address","迁址"), + //退单 + CHARGEBACK("chargeback","退单"), + //暂停营业 + CLOSE_UP("close_up","暂停营业"); + ; + + + private final String value; + + private final String name; + + StoreStatusEnum(String value, String name) { + this.value = value; + this.name = name; + } + + public String getValue() { + return value; + } + + public String getName() { + return name; + } + + public static StoreStatusEnum parse(String value) { + for (StoreStatusEnum storeStatusEnum : StoreStatusEnum.values()) { + if (storeStatusEnum.getValue().equals(value)) { + return storeStatusEnum; + } + } + return null; + } + + public static String getName(String value) { + for (StoreStatusEnum storeStatusEnum : StoreStatusEnum.values()) { + if (storeStatusEnum.getValue().equals(value)) { + return storeStatusEnum.name; + } + } + return null; + } + + public static String getCode(String flag) { + switch (flag) { + case "营业": + case "在营": + return "open"; + case "闭店": + case "闭店解约": + return "closed"; + case "未开业": + return "not_open"; + case "迁址": + return "change_address"; + case "退单": + return "chargeback"; + case "暂停营业": + return "close_up"; + } + return "open"; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java index d269455cb..400fd85b7 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java @@ -69,7 +69,8 @@ public enum UserRoleEnum { JING_DONG_OPERATIONS_CUSTOMER(500000000L,"京东运营大区客服"), JING_DONG_HEADQUARTERS_BUILD_CUSTOMER(510000000L,"京东总部建店客服"), - FRANCHISEES(530000000L,"加盟商") + FRANCHISEES(530000000L,"加盟商"), + SERVICE_PACKAGE_DEDICATED(1762761165005L,"服务包专用"), ; private Long code; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java index 9d94dde40..20dc79ba2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java @@ -10,6 +10,11 @@ public enum MatterTypeEnum { QUESTION(0,"门店违规工单"), LICENSE(1,"证照过期提醒"), NOTICE(2,"通知消息"), + LOGISTICS(3,"物流"), + SERVICE_PACKAGE(4,"服务包"), + RESTOCK(5,"补货"), + INVENTORY(6,"盘点"), + REALTIME(7, "即时消息"), ; MatterTypeEnum(Integer code, String message) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java index 22b696bcf..dde508c17 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java @@ -10,10 +10,13 @@ import java.util.List; */ public enum ModuleCodeEnum { - STORE_WORK(0,"店务", Arrays.asList(MatterTypeEnum.QUESTION,MatterTypeEnum.LICENSE,MatterTypeEnum.NOTICE)), - PRODUCT_UPDATE(1,"营销政策/产品上新",Arrays.asList(MatterTypeEnum.NOTICE)), - INVENTORY_MODULE(2,"库存模块",Arrays.asList(MatterTypeEnum.NOTICE)), + STORE_WORK(0,"店务/培训", Arrays.asList(MatterTypeEnum.QUESTION,MatterTypeEnum.LICENSE)), + PRODUCT_UPDATE(1,"营销/上新",Arrays.asList(MatterTypeEnum.SERVICE_PACKAGE)), + INVENTORY_MODULE(2,"订货/库存",Arrays.asList(MatterTypeEnum.RESTOCK,MatterTypeEnum.INVENTORY,MatterTypeEnum.LOGISTICS)), DISH(3,"菜品",Arrays.asList(MatterTypeEnum.NOTICE)), + FRANCHISE(4,"加盟",Arrays.asList(MatterTypeEnum.NOTICE)), + //其他(投诉与客户服务、临时通知) + OTHER(5,"其他",Arrays.asList(MatterTypeEnum.NOTICE, MatterTypeEnum.REALTIME)), ; ModuleCodeEnum(Integer code, String message,List matterTypeEnums) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/RemindTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/RemindTypeEnum.java index 86edff063..435e7078a 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/RemindTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/RemindTypeEnum.java @@ -7,8 +7,8 @@ package com.cool.store.enums.notice; */ public enum RemindTypeEnum { - CONTINUOUS_REMINDER(0,"持续提醒"), - STAGE_REMINDER(1,"阶段提醒"), + CONTINUOUS_REMINDER(1,"持续提醒"), + STAGE_REMINDER(2,"阶段提醒"), ; RemindTypeEnum(Integer code, String message) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java new file mode 100644 index 000000000..abeb053f0 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java @@ -0,0 +1,86 @@ +package com.cool.store.enums.notice; + +/** + * @Author suzhuhong + * @Date 2025/8/26 15:43 + * @Version 1.0 + */ +public enum SceneEnum { + + SUBMIT_ORDER(0, "提交订单", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/j_l6em.jpg", MatterTypeEnum.LOGISTICS), + ASSIGNED_PICKING(5, "已分配拣货", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/YLjBkv.jpg", MatterTypeEnum.LOGISTICS), + PICKING_COMPLETED(10, "拣货完成", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/gG9Y-h.jpg", MatterTypeEnum.LOGISTICS), + SHIPPED(15, "已出库", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/Ehz8_n.jpg", MatterTypeEnum.LOGISTICS), + DELIVERY_IN_PROGRESS(20, "配送中", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/I6bAmA.jpg", MatterTypeEnum.LOGISTICS), + ORDER_SIGNING_AND_ACCEPTANCE(25, "订单签收", "https://oss-cool.coolstore.cn/eid/214ac5a3a517472a87268e02a2e6410a/2508/0z7jkU.jpg", MatterTypeEnum.LOGISTICS), + + SERVICE_PACKAGE(30, "服务包", "", MatterTypeEnum.LOGISTICS), + RESTOCK(35, "补货", "", MatterTypeEnum.LOGISTICS), + INVENTORY(40, "盘点", "", MatterTypeEnum.LOGISTICS), + + REALTIME(45, "即时消息", "", MatterTypeEnum.REALTIME), + ; + + private Integer sceneCode; + + private String sceneName; + + private String scenePicture; + + private MatterTypeEnum matterTypeEnum; + + + public Integer getSceneCode() { + return sceneCode; + } + + public void setSceneCode(Integer sceneCode) { + this.sceneCode = sceneCode; + } + + public String getSceneName() { + return sceneName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public String getScenePicture() { + return scenePicture; + } + + public void setScenePicture(String scenePicture) { + this.scenePicture = scenePicture; + } + + public MatterTypeEnum getMatterTypeEnum() { + return matterTypeEnum; + } + + public void setMatterTypeEnum(MatterTypeEnum matterTypeEnum) { + this.matterTypeEnum = matterTypeEnum; + } + + SceneEnum(Integer sceneCode, String sceneName, String scenePicture, MatterTypeEnum matterTypeEnum) { + this.sceneCode = sceneCode; + this.sceneName = sceneName; + this.scenePicture = scenePicture; + this.matterTypeEnum = matterTypeEnum; + } + + /** + * 通过code获取枚举 + * @param code + * @return + */ + public static SceneEnum getByCode(Integer code) { + for (SceneEnum value : values()) { + if (value.sceneCode.equals(code)) { + return value; + } + } + return null; + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java index 6f5da97fb..772f87c11 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java @@ -18,6 +18,7 @@ public enum ShopSubStageEnum { SHOP_STAGE_3(ShopStageEnum.SHOP_STAGE_2, 30, "营业执照办理", 23), SHOP_STAGE_4(ShopStageEnum.SHOP_STAGE_2, 40, "食安许可证", 55), SHOP_STAGE_5(ShopStageEnum.SHOP_STAGE_2, 50, "员工招聘", 23), + SHOP_STAGE_6(ShopStageEnum.SHOP_STAGE_2, 260, "开通门店平安钱包", 1), SHOP_STAGE_7(ShopStageEnum.SHOP_STAGE_2, 70, "缴纳加盟费/保证金", 1), SHOP_STAGE_8(ShopStageEnum.SHOP_STAGE_2, 80, "加盟合同签约", 4), SHOP_STAGE_8_5(ShopStageEnum.SHOP_STAGE_2, 85, "发票回传", 5), @@ -110,6 +111,8 @@ public enum ShopSubStageEnum { return ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_10; case SHOP_STAGE_5: return ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_50; +// case SHOP_STAGE_6: +// return ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_60; case SHOP_STAGE_7: return ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_70; case SHOP_STAGE_2: diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java index 75f06fbe0..462f2d14a 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java @@ -36,6 +36,10 @@ public enum ShopSubStageStatusEnum { SHOP_SUB_STAGE_STATUS_50(ShopSubStageEnum.SHOP_STAGE_5, 500, "登记中", Boolean.FALSE), SHOP_SUB_STAGE_STATUS_51(ShopSubStageEnum.SHOP_STAGE_5, 510, "已完成", Boolean.TRUE), + //开通门店平安钱包 + SHOP_SUB_STAGE_STATUS_60(ShopSubStageEnum.SHOP_STAGE_6, 2600, "未开通", Boolean.FALSE), + SHOP_SUB_STAGE_STATUS_61(ShopSubStageEnum.SHOP_STAGE_6, 2610, "已完成", Boolean.TRUE), + //缴纳加盟费/保证金 SHOP_SUB_STAGE_STATUS_70(ShopSubStageEnum.SHOP_STAGE_7, 700, "待内勤发布账单", Boolean.FALSE), SHOP_SUB_STAGE_STATUS_71(ShopSubStageEnum.SHOP_STAGE_7, 710, "待加盟商缴费", Boolean.FALSE), diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/BankAccountTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/BankAccountTypeEnum.java new file mode 100644 index 000000000..5b97d20f1 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/BankAccountTypeEnum.java @@ -0,0 +1,26 @@ +package com.cool.store.enums.wallet; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 银行卡业务类型 枚举类 + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Getter +@AllArgsConstructor +public enum BankAccountTypeEnum { + + PUBLIC(1, "对公"), + + PRIVATE(2, "对私"), + ; + + private final Integer type; + + private final String desc; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/BankBusinessTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/BankBusinessTypeEnum.java new file mode 100644 index 000000000..d3678ee12 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/BankBusinessTypeEnum.java @@ -0,0 +1,28 @@ +package com.cool.store.enums.wallet; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 银行开户类型 枚举类 + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Getter +@AllArgsConstructor +public enum BankBusinessTypeEnum { + + ENTERPRISE(1, "企业"), + + INDIVIDUAL(2, "个体工商户"), + + PERSONAL(3, "个人(小微商户)"), + ; + + private final Integer type; + + private final String desc; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/PingAnAccountStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/PingAnAccountStatusEnum.java new file mode 100644 index 000000000..7d0203753 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/PingAnAccountStatusEnum.java @@ -0,0 +1,27 @@ +package com.cool.store.enums.wallet; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 平安钱包账户开通状态 + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Getter +@AllArgsConstructor +public enum PingAnAccountStatusEnum { + + UNCOMMITTED(1, "待提交"), + UNAUTHORIZED(2, "待鉴权"), + AUTHENTICATING(3, "鉴权中"), + OPEN(4, "开通"), + ; + + private final Integer status; + + private final String desc; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/YztStoreModel.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/YztStoreModel.java new file mode 100644 index 000000000..b31c55d26 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/YztStoreModel.java @@ -0,0 +1,47 @@ +package com.cool.store.enums.wallet; + +import com.cool.store.enums.JoinModeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + *

+ * 营帐通门店模式 + *

+ * + * @author wangff + * @since 2025/11/19 + */ +@Getter +@AllArgsConstructor +public enum YztStoreModel { + // 1.社会加盟 2.强管 3.强加盟 (门店模式) + + SOCIAL_JOIN(1, "社会加盟", Arrays.asList(JoinModeEnum.FRANCHISE_DEPARTMENT, JoinModeEnum.FRANCHISE_COMPANIES)), + STRONG_MANAGEMENT(2, "强管", Collections.singletonList(JoinModeEnum.FLAGSHIP_STORE)), + STRONG_JOIN(3, "强加盟", Collections.singletonList(JoinModeEnum.AFFILIATES)), + ; + + private final Integer model; + + private final String desc; + + /** + * 对应crm加盟模式枚举类 + */ + private final List joinModelList; + + public static Integer getYztStoreModel(Integer joinModel) { + JoinModeEnum joinModelEnum = JoinModeEnum.getModelByCode(joinModel); + for (YztStoreModel e : YztStoreModel.values()) { + if (e.joinModelList.contains(joinModelEnum)) { + return e.model; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WalletTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WalletTypeEnum.java new file mode 100644 index 000000000..74159ab59 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WalletTypeEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums.wechat; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 钱包类型 + *

+ * + * @author wangff + * @since 2025/11/20 + */ +@Getter +@AllArgsConstructor +public enum WalletTypeEnum { + + PING_AN(1, "平安银行"), + ONLINE_BANK(2, "网商银行"), + ; + + private final Integer type; + + private final String desc; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WechatTemplateDetailEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WechatTemplateDetailEnum.java new file mode 100644 index 000000000..1e8484d73 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WechatTemplateDetailEnum.java @@ -0,0 +1,53 @@ +package com.cool.store.enums.wechat; + +/** + * @Author suzhuhong + * @Date 2025/10/16 15:19 + * @Version 1.0 + */ +public enum WechatTemplateDetailEnum { + + CHARACTER_STRING2("编号","character_string2"), + THING10("项目名称","thing10"), + TIME14("完成时间","time14"), + THING25("客户名称","thing25"), + THING60("位置","thing60"), + + + THING6("工单标题","thing6"), + TIME33("创建时间","time33"), + CHARACTER_STRING14("工单编号","character_string14"), + + + ; + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + private String name; + + private String code; + + WechatTemplateDetailEnum(String name, String code) { + this.name = name; + this.code = code; + } + + + + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WechatTemplateEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WechatTemplateEnum.java new file mode 100644 index 000000000..2ce643e36 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wechat/WechatTemplateEnum.java @@ -0,0 +1,79 @@ +package com.cool.store.enums.wechat; + +import com.fasterxml.jackson.annotation.JsonValue; + +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.List; + +import static com.cool.store.enums.wechat.WechatTemplateDetailEnum.*; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:39 + * @Version 1.0 + */ +public enum WechatTemplateEnum { + + QUESTION_NOTICE("QUESTION_NOTICE", "T3sp5gBItHKD8oCeEiQMjn7JXpngFiz3dDcaArk84xY", "收到工单通知", + Arrays.asList(CHARACTER_STRING2,THING10,TIME14,THING25,THING60)), + + NEW_QUESTION_NOTICE("new_question_notice", "35rmoQ5wEHvUgCgSIJ2CpOb1DOJgWOiy8J7DXT_e4_Y", "新工单提醒", + Arrays.asList(THING6,TIME33,CHARACTER_STRING14)), + + ; + + + private final String code; + private final String templateId; + private final String title; + private final List contentList; + + WechatTemplateEnum(String code, String templateId, String title, List contentList) { + this.code = code; + this.templateId = templateId; + this.title = title; + this.contentList = contentList; + } + + @JsonValue + public String getCode() { + return code; + } + + public String getTemplateId() { + return templateId; + } + + public String getTitle() { + return title; + } + + public List getContentList() { + return contentList; + } + + /** + * 根据code获取枚举 + */ + public static WechatTemplateEnum getByCode(String code) { + for (WechatTemplateEnum template : values()) { + if (template.getCode().equals(code)) { + return template; + } + } + return null; + } + + /** + * 根据模板ID获取枚举 + */ + public static WechatTemplateEnum getByTemplateId(String templateId) { + for (WechatTemplateEnum template : values()) { + if (template.getTemplateId().equals(templateId)) { + return template; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java new file mode 100644 index 000000000..403e20fd0 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java @@ -0,0 +1,80 @@ +package com.cool.store.executor; + + +import com.cool.store.utils.ThreadMdcUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + + +/** + * @author zhangchenbiao + * @FileName: MdcTaskExecutor + * @Description: + * @date 2021-11-02 21:00 + */ +public class MdcTaskExecutor extends ThreadPoolTaskExecutor { + private Logger log = LoggerFactory.getLogger(MdcTaskExecutor.class); + + @Override + public Future submit(Callable task) { + Map context = MDC.getCopyOfContextMap(); + return super.submit(() -> { + T result; + if (context != null) { + //将父线程的MDC内容传给子线程 + MDC.setContextMap(context); + } + //直接给子线程设置MDC + ThreadMdcUtil.setTraceIdIfAbsent(); + try { + //执行任务 + result = task.call(); + } finally { + log.info("ThreadMonitor:{}info:ExecutedTasks->{},totalTask->{}, RunningTasks->{}, PendingTasks->{},corePoolSize-{},currentPoolSize->{},LargestPoolSize->{}", + this.getThreadNamePrefix(),this.getThreadPoolExecutor().getCompletedTaskCount(),this.getThreadPoolExecutor().getTaskCount(), + this.getActiveCount(),this.getThreadPoolExecutor().getQueue().size(),this.getCorePoolSize(), + this.getPoolSize(),this.getThreadPoolExecutor().getLargestPoolSize()); + try { + MDC.clear(); + } catch (Exception e) { + log.warn("MDC clear exception", e); + } + } + return result; + }); + } + + @Override + public void execute(Runnable task) { + log.info("mdc thread pool task executor execute"); + Map context = MDC.getCopyOfContextMap(); + super.execute(() -> { + if (context != null) { + //将父线程的MDC内容传给子线程 + MDC.setContextMap(context); + } + //直接给子线程设置MDC + ThreadMdcUtil.setTraceIdIfAbsent(); + try { + //执行任务 + task.run(); + } finally { + log.info("ThreadMonitor:{}info:ExecutedTasks->{},totalTask->{}, RunningTasks->{}, PendingTasks->{},corePoolSize-{},currentPoolSize->{},LargestPoolSize->{}", + this.getThreadNamePrefix(),this.getThreadPoolExecutor().getCompletedTaskCount(),this.getThreadPoolExecutor().getTaskCount(), + this.getActiveCount(),this.getThreadPoolExecutor().getQueue().size(),this.getCorePoolSize(), + this.getPoolSize(),this.getThreadPoolExecutor().getLargestPoolSize()); + try { + MDC.clear(); + } catch (Exception e) { + log.warn("MDC clear exception", e); + } + } + }); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTask.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTask.java new file mode 100644 index 000000000..e060e32a6 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTask.java @@ -0,0 +1,42 @@ +package com.cool.store.executor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @Author suzhuhong + * @Date 2025/10/15 17:29 + * @Version 1.0 + */ +@Configuration +public class ThreadPoolTask { + + @Bean + public TaskExecutor noticeThreadPool() { + int cores = Runtime.getRuntime().availableProcessors(); + + ThreadPoolTaskExecutor executor = new MdcTaskExecutor(); + // 核心线程数目 + executor.setCorePoolSize(cores*2); + // 指定最大线程数 + executor.setMaxPoolSize(100); + // 队列中最大的数目 + executor.setQueueCapacity(10000); + // 线程名称前缀 + executor.setThreadNamePrefix("noticeThreadPool_"); + // 对拒绝task的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 线程空闲后的最大存活时间 + executor.setKeepAliveSeconds(60); + // 加载 + executor.initialize(); + return executor; + } + + + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java new file mode 100644 index 000000000..75bc5a1b2 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java @@ -0,0 +1,45 @@ +package com.cool.store.executor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + *

+ * 线程池配置类 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Configuration +public class ThreadPoolTaskConfig { + + /** + * 通用线程池 + */ + @Bean + public TaskExecutor generalThreadPool() { + int cores = Runtime.getRuntime().availableProcessors(); + + ThreadPoolTaskExecutor executor = new MdcTaskExecutor(); + // 核心线程数目 + executor.setCorePoolSize(cores*2); + // 指定最大线程数 + executor.setMaxPoolSize(200); + // 队列中最大的数目 + executor.setQueueCapacity(5000); + // 线程名称前缀 + executor.setThreadNamePrefix("generalThreadPool_"); + // 对拒绝task的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 线程空闲后的最大存活时间 + executor.setKeepAliveSeconds(60); + // 加载 + executor.initialize(); + return executor; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java new file mode 100644 index 000000000..4d6936f79 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java @@ -0,0 +1,54 @@ +package com.cool.store.utils; + +import cn.hutool.core.bean.copier.CopyOptions; +import com.github.pagehelper.PageInfo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + *

+ * bean转换工具 + *

+ * + * @author wangff + * @since 2025/3/6 + */ +public class BeanUtil extends cn.hutool.core.bean.BeanUtil { + + public static List toList(List list, Class clazz) { + if (list == null || list.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(list.size()); + for (T t : list) { + R r = toBean(t, clazz); + result.add(r); + } + return result; + } + + public static List toList(List list, Class clazz, CopyOptions copyOptions) { + if (list == null || list.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(list.size()); + for (T t : list) { + R r = toBean(t, clazz, copyOptions); + result.add(r); + } + return result; + } + + public static PageInfo toPage(PageInfo page, Class clazz) { + PageInfo newPage = new PageInfo<>(); + newPage.setPages(page.getPages()); + newPage.setTotal(page.getTotal()); + newPage.setPageNum(page.getPageNum()); + newPage.setPageSize(page.getPageSize()); + List list = toList(page.getList(), clazz); + newPage.setList(list); + return newPage; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BrowserVersionUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BrowserVersionUtils.java new file mode 100644 index 000000000..663a1cd9a --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BrowserVersionUtils.java @@ -0,0 +1,62 @@ +package com.cool.store.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Author suzhuhong + * @Date 2025/11/4 17:34 + * @Version 1.0 + */ +public class BrowserVersionUtils { + + + /** + * 检测是否为旧版Chrome浏览器(版本小于60) + * @param userAgent 浏览器User-Agent字符串 + * @return true-是旧版Chrome,false-不是旧版Chrome + */ + public static boolean isOldChromeBrowser(String userAgent) { + if (userAgent == null || userAgent.isEmpty()) { + return false; + } + + // 检查是否是Chrome浏览器 + if (!userAgent.contains("Chrome")) { + return false; // 不是Chrome浏览器 + } + + // 提取Chrome版本号 + Integer chromeVersion = extractChromeVersion(userAgent); + + if (chromeVersion == null) { + return false; // 无法提取版本号 + } + + // 判断版本是否小于60 + return chromeVersion < 60; + } + + /** + * 从User-Agent中提取Chrome主版本号 + * @param userAgent 浏览器User-Agent字符串 + * @return Chrome主版本号,如果无法提取返回null + */ + public static Integer extractChromeVersion(String userAgent) { + // 正则表达式匹配 Chrome/版本号 模式 + Pattern pattern = Pattern.compile("Chrome/(\\d+)"); + Matcher matcher = pattern.matcher(userAgent); + + if (matcher.find()) { + try { + return Integer.parseInt(matcher.group(1)); + } catch (NumberFormatException e) { + System.err.println("版本号格式错误: " + matcher.group(1)); + return null; + } + } + + return null; + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/CommonUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/CommonUtil.java new file mode 100644 index 000000000..07bf9d41a --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/CommonUtil.java @@ -0,0 +1,25 @@ +package com.cool.store.utils; + +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; + +/** + *

+ * 公共工具 + *

+ * + * @author wangff + * @since 2025/10/29 + */ +public class CommonUtil { + public static BigDecimal convertToBig(String value) { + if (StringUtils.isBlank(value)) { + return BigDecimal.ZERO; + } + try { + return new BigDecimal(value); + } catch (Exception ignored) {} + return BigDecimal.ZERO; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java index 6180a4163..0507da90c 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java @@ -35,6 +35,7 @@ public class CoolDateUtils { public static final String DATE_FORMAT_SEC_6 = "yyyy.MM.dd"; public static final String DATE_FORMAT_SEC_7 = "yyyy/MM/dd HH:mm"; public static final String DATE_FORMAT_SEC_8 = "yyyyMMdd"; + public static final String DATE_FORMAT_SEC_9 = "yyyyMMddHHmmssSSS"; private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -70,7 +71,7 @@ public class CoolDateUtils { } public static void main(String[] args) { - // 创建一个Date对象 + //创建一个Date对象 Date date = new Date(); // 将Date对象转换为LocalDate对象 @@ -146,6 +147,13 @@ public class CoolDateUtils { return LocalDate.now().format(DATE_FORMATTER); } + public static final String getTodayMillis(){ + DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT_SEC_9); + return LocalDateTime.now().format(DATE_FORMATTER); + } + + + /** * 获取当前日期字符串 (yyyy-MM-dd) */ diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/KeyFormatUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/KeyFormatUtil.java new file mode 100644 index 000000000..c0a1e190b --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/KeyFormatUtil.java @@ -0,0 +1,82 @@ +package com.cool.store.utils; + +/** + * @Author suzhuhong + * @Date 2025/11/13 12:15 + * @Version 1.0 + */ +public class KeyFormatUtil { + + /** + * 将单行密钥转换为标准PEM多行格式 + */ + public static String convertToPEMFormat(String singleLineKey, String keyType) { + if (singleLineKey == null || singleLineKey.trim().isEmpty()) { + throw new IllegalArgumentException("密钥不能为空"); + } + + // 清理密钥,移除可能存在的头尾标记和空白 + String cleanedKey = cleanKey(singleLineKey); + + // 定义头尾标记 + String header = getKeyHeader(keyType); + String footer = getKeyFooter(keyType); + + // 构建多行格式 + StringBuilder pemKey = new StringBuilder(); + pemKey.append(header).append("\n"); + + // 每64个字符换行 + for (int i = 0; i < cleanedKey.length(); i += 64) { + int end = Math.min(i + 64, cleanedKey.length()); + pemKey.append(cleanedKey.substring(i, end)).append("\n"); + } + + pemKey.append(footer); + return pemKey.toString(); + } + + /** + * 清理密钥字符串 + */ + public static String cleanKey(String key) { + return key.replaceAll("-----BEGIN.*-----", "") + .replaceAll("-----END.*-----", "") + .replaceAll("\\s", "") // 移除所有空白字符 + .trim(); + } + + private static String getKeyHeader(String keyType) { + switch (keyType.toUpperCase()) { + case "PRIVATE": + case "PRIVATE_KEY": + return "-----BEGIN PRIVATE KEY-----"; + case "PUBLIC": + case "PUBLIC_KEY": + return "-----BEGIN PUBLIC KEY-----"; + case "RSA_PRIVATE": + return "-----BEGIN RSA PRIVATE KEY-----"; + case "RSA_PUBLIC": + return "-----BEGIN RSA PUBLIC KEY-----"; + default: + throw new IllegalArgumentException("不支持的密钥类型: " + keyType); + } + } + + private static String getKeyFooter(String keyType) { + switch (keyType.toUpperCase()) { + case "PRIVATE": + case "PRIVATE_KEY": + return "-----END PRIVATE KEY-----"; + case "PUBLIC": + case "PUBLIC_KEY": + return "-----END PUBLIC KEY-----"; + case "RSA_PRIVATE": + return "-----END RSA PRIVATE KEY-----"; + case "RSA_PUBLIC": + return "-----END RSA PUBLIC KEY-----"; + default: + throw new IllegalArgumentException("不支持的密钥类型: " + keyType); + } + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/MDCUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/MDCUtils.java new file mode 100644 index 000000000..0a38c2c56 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/MDCUtils.java @@ -0,0 +1,37 @@ +package com.cool.store.utils; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.MDC; + +import java.util.UUID; + +/** + * @Author suzhuhong + * @Date 2025/10/15 17:32 + * @Version 1.0 + */ +public class MDCUtils { + public MDCUtils() { + } + + public static void putIfAbsent(String key, String value) { + String k = MDC.get(key); + if (StringUtils.isBlank(value)) { + value = UUID.randomUUID().toString().replace("-", ""); + } + + if (StringUtils.isBlank(k)) { + MDC.put(key, value); + } + + } + + public static void put(String key, String value) { + MDC.put(key, value); + } + + public static void put(String key) { + MDC.put(key, UUID.randomUUID().toString().replace("-", "")); + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/OkHttpUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/OkHttpUtil.java new file mode 100644 index 000000000..a39959958 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/OkHttpUtil.java @@ -0,0 +1,197 @@ +package com.cool.store.utils; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.io.IOException; +import java.util.Map; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:21 + * @Version 1.0 + * OkHttp工具类 + */ +@Slf4j +@Component +public class OkHttpUtil { + + @Autowired + private OkHttpClient okHttpClient; + + @Autowired + private ObjectMapper objectMapper; + + private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + + /** + * GET请求 + */ + public String doGet(String url) throws IOException { + return doGet(url, null); + } + + /** + * GET请求 - 带请求头 + */ + public String doGet(String url, Map headers) throws IOException { + Request.Builder builder = new Request.Builder().url(url); + + // 添加请求头 + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + Request request = builder.build(); + + try (Response response = okHttpClient.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new IOException("Unexpected code: " + response); + } + ResponseBody body = response.body(); + return body != null ? body.string() : null; + } + } + + /** + * POST请求 - JSON数据 + */ + public String doPostJson(String url, Object data) throws IOException { + return doPostJson(url, data, null); + } + + /** + * POST请求 - JSON数据,带请求头 + */ + public String doPostJson(String url, Object data, Map headers) throws IOException { + //打印日志 + logRequest(url, data); + + String json = objectMapper.writeValueAsString(data); + RequestBody requestBody = RequestBody.create( JSON,json); + Request.Builder builder = new Request.Builder() + .url(url) + .post(requestBody); + + // 添加请求头 + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + Request request = builder.build(); + + try (Response response = okHttpClient.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "HTTP请求失败,状态码: " + response.code()); + } + ResponseBody body = response.body(); + + String responseBody = body != null ? body.string() : null; + + logResponse(url, response.code(), responseBody); + return responseBody; + } + } + + /** + * 异步GET请求 + */ + public void doGetAsync(String url, Callback callback) { + doGetAsync(url, null, callback); + } + + /** + * 异步GET请求 - 带请求头 + */ + public void doGetAsync(String url, Map headers, Callback callback) { + Request.Builder builder = new Request.Builder().url(url); + + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + Request request = builder.build(); + okHttpClient.newCall(request).enqueue(callback); + } + + /** + * 异步POST请求 + */ + public void doPostAsync(String url, Object data, Callback callback) { + doPostAsync(url, data, null, callback); + } + + /** + * 异步POST请求 - 带请求头 + */ + public void doPostAsync(String url, Object data, Map headers, Callback callback) { + try { + String json = objectMapper.writeValueAsString(data); + RequestBody requestBody = RequestBody.create( JSON,json); + + Request.Builder builder = new Request.Builder() + .url(url) + .post(requestBody); + + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + Request request = builder.build(); + okHttpClient.newCall(request).enqueue(callback); + } catch (IOException e) { + callback.onFailure(null, e); + } + } + + private void logRequest(String url, Object requestBody) { + if (log.isInfoEnabled()) { + try { + log.info("\n======= 请求开始 =======\n" + + "API地址: {}\n" + + "请求参数: {}\n" + + "======= 请求结束 =======", + url, + objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(requestBody)); + } catch (JsonProcessingException e) { + log.warn("日志JSON序列化失败", e); + } + } + } + + 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-common/src/main/java/com/cool/store/utils/OpenSignatureUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/OpenSignatureUtil.java index 2fd0cabd1..730bebac0 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/OpenSignatureUtil.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/OpenSignatureUtil.java @@ -5,9 +5,10 @@ import lombok.extern.slf4j.Slf4j; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; import java.util.*; import java.util.stream.Collectors; @@ -110,4 +111,5 @@ public class OpenSignatureUtil { } return result.toString(); } + } \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/RsaSignUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/RsaSignUtil.java new file mode 100644 index 000000000..71d67b0ea --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/RsaSignUtil.java @@ -0,0 +1,348 @@ +package com.cool.store.utils; + +import java.net.URLEncoder; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.asn1.pkcs.RSAPrivateKey; +import sun.security.util.DerInputStream; +import sun.security.util.DerValue; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.Signature; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.*; +import java.util.*; +/** + * RSA签名工具类 + * @Author suzhuhong + * @Date 2025/11/12 22:57 + * @Version 1.0 + */ +@Slf4j +public class RsaSignUtil { + + + /** + * 加签方法 + */ + public static String generateSign(Map params, String privateKeyPEM) { + // 移除可能存在的sign字段 + params.remove("sign"); + String afterSort = objectToSortedString(params); + log.info("排序后的参数:{}", afterSort); + String formattedPrivateKey = KeyFormatUtil.convertToPEMFormat(privateKeyPEM, "RSA_PRIVATE"); + return rsaPrivateKeySign(afterSort, privateKeyPEM, "SHA256withRSA"); + } + + /** + * 验签方法 + */ + public static boolean verifySign(Map params, String publicKeyPEM) { + String sign = String.valueOf(params.get("sign")); + params.remove("sign"); + String afterSort = objectToSortedString(params); + log.info("排序后的参数:{}", afterSort); + return rsaPublicKeyVerify(afterSort, sign, publicKeyPEM, "SHA256withRSA"); + } + + /** + * 查询签名验证 - 主入口方法 + */ + public static boolean querySignCrm(String publicKey, Map params) { + return verifySign(params, publicKey); + } + + /** + * 将对象转换为排序后的字符串 + */ + public static String objectToSortedString(Map obj) { + return convertToSortedString(obj, ""); + } + + /** + * 递归将参数转换为排序字符串 + */ + private static String convertToSortedString(Map params, String prefix) { + // 按键排序 + List keys = new ArrayList<>(params.keySet()); + Collections.sort(keys); + + List parts = new ArrayList<>(); + + for (String key : keys) { + Object value = params.get(key); + if (value == null || "".equals(value) || + (value instanceof Number && ((Number) value).doubleValue() == 0)) { + continue; + } + + String currentKey = key; + if (!prefix.isEmpty()) { + currentKey = prefix + "[" + key + "]"; + } + + if (value instanceof Map) { + @SuppressWarnings("unchecked") + Map nestedMap = (Map) value; + String nestedString = convertToSortedString(nestedMap, currentKey); + if (!nestedString.isEmpty()) { + parts.add(nestedString); + } + } else if (value instanceof List) { + List list = (List) value; + List elemStrs = new ArrayList<>(); + + for (Object element : list) { + String elementStr; + if (element instanceof Map) { + @SuppressWarnings("unchecked") + Map elementMap = (Map) element; + String inner = convertToSortedString(elementMap, ""); + elementStr = "{" + inner + "}"; + } else if (element instanceof Double) { + elementStr = String.format("%.0f", (Double) element); + } else if (element instanceof Float) { + elementStr = String.format("%.0f", (Float) element); + } else { + elementStr = String.valueOf(element); + } + elemStrs.add(elementStr); + } + + // 对元素字符串排序 + Collections.sort(elemStrs); + + // URL编码并添加到parts + for (String es : elemStrs) { + String encodedValue = urlEncode(es); + parts.add(currentKey + "[]=" + encodedValue); + } + } else if (value instanceof Double) { + String strValue = String.format("%.0f", (Double) value); + parts.add(currentKey + "=" + urlEncode(strValue)); + } else if (value instanceof Float) { + String strValue = String.format("%.0f", (Float) value); + parts.add(currentKey + "=" + urlEncode(strValue)); + } else { + String strValue = String.valueOf(value); + parts.add(currentKey + "=" + urlEncode(strValue)); + } + } + + return String.join("&", parts); + } + + /** + * URL编码(替换+为%20) + */ + private static String urlEncode(String value) { + try { + return URLEncoder.encode(value, StandardCharsets.UTF_8.name()) + .replace("+", "%20"); + } catch (Exception e) { + return value; + } + } + + /** + * RSA私钥加签 + */ + public static String rsaPrivateKeySign(String text, String privateKeyPEM, String algorithm) { + try { + // 1. 解析私钥 + log.debug("Received private key PEM: {}", privateKeyPEM); + PrivateKey privateKey = parsePrivateKey(privateKeyPEM); + if (privateKey == null) { + throw new RuntimeException("解析私钥失败"); + } + + // 2. 创建签名实例 + Signature signature = Signature.getInstance(algorithm); + signature.initSign(privateKey); + signature.update(text.getBytes(StandardCharsets.UTF_8)); + + // 3. 生成签名并Base64编码 + byte[] digitalSignature = signature.sign(); + return Base64.getEncoder().encodeToString(digitalSignature); + + } catch (Exception e) { + throw new RuntimeException("加签失败: " + e.getMessage(), e); + } + } + + /** + * RSA公钥验签 + */ + public static boolean rsaPublicKeyVerify(String text, String signBase64, + String publicKeyPEM, String algorithm) { + try { + // 1. 解码Base64签名 + byte[] signature = Base64.getDecoder().decode(signBase64); + + // 2. 解析公钥 + PublicKey publicKey = parsePublicKey(publicKeyPEM); + if (publicKey == null) { + return false; + } + + // 3. 验证签名 + Signature sig = Signature.getInstance(algorithm); + sig.initVerify(publicKey); + sig.update(text.getBytes(StandardCharsets.UTF_8)); + + return sig.verify(signature); + } catch (Exception e) { + return false; + } + } + + /** + * 解析PEM格式私钥(兼容PKCS#1和PKCS#8格式) + */ + private static PrivateKey parsePrivateKey(String privateKeyPEM) { + try { + String pemContent = privateKeyPEM + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + .replace("-----BEGIN RSA PRIVATE KEY-----", "") + .replace("-----END RSA PRIVATE KEY-----", "") + .replaceAll("\\s", ""); + + byte[] keyBytes = Base64.getDecoder().decode(pemContent); + + // 尝试PKCS#8格式 + try { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePrivate(keySpec); + } catch (Exception e) { + // 使用Bouncy Castle处理PKCS#1 + RSAPrivateKey rsaPrivKey = RSAPrivateKey.getInstance(keyBytes); + return KeyFactory.getInstance("RSA").generatePrivate( + new RSAPrivateKeySpec(rsaPrivKey.getModulus(), rsaPrivKey.getPrivateExponent())); + } + } catch (Exception e) { + throw new RuntimeException("解析私钥失败: " + e.getMessage(), e); + } + } + + /** + * 解析PKCS#1格式私钥 + */ + private static PrivateKey parsePKCS1PrivateKey(byte[] keyBytes) { + try { + int length = keyBytes.length; + byte[] pkcs8Header = new byte[] { + 0x30, (byte) 0x82, + (byte) ((length + 26) >> 8), (byte) (length + 26), // 总长度 + 0x02, 0x01, 0x00, + 0x30, 0x0D, 0x06, 0x09, 0x2A, (byte) 0x86, 0x48, (byte) 0x86, (byte) 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x04, (byte) 0x82, + (byte) (length >> 8), (byte) length // BIT STRING 长度 + }; + + byte[] pkcs8Key = new byte[pkcs8Header.length + keyBytes.length]; + System.arraycopy(pkcs8Header, 0, pkcs8Key, 0, pkcs8Header.length); + System.arraycopy(keyBytes, 0, pkcs8Key, pkcs8Header.length, keyBytes.length); + + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8Key); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePrivate(keySpec); + } catch (Exception e) { + throw new RuntimeException("解析PKCS#1私钥失败: " + e.getMessage(), e); + } + } + + /** + * 解析PEM格式公钥(兼容PKCS#1和PKCS#8格式) + */ + private static PublicKey parsePublicKey(String publicKeyPEM) { + try { + // 移除PEM头尾标记和空白字符 + String pemContent = publicKeyPEM + .replace("-----BEGIN PUBLIC KEY-----", "") + .replace("-----END PUBLIC KEY-----", "") + .replace("-----BEGIN RSA PUBLIC KEY-----", "") + .replace("-----END RSA PUBLIC KEY-----", "") + .replaceAll("\\s", ""); + + byte[] keyBytes = Base64.getDecoder().decode(pemContent); + + // 先尝试PKCS#8格式 + try { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(keySpec); + } catch (Exception e) { + // 如果PKCS#8失败,尝试PKCS#1格式 + return parsePKCS1PublicKey(keyBytes); + } + } catch (Exception e) { + return null; + } + } + + /** + * 解析PKCS#1格式公钥 + */ + private static PublicKey parsePKCS1PublicKey(byte[] keyBytes) { + try { + // PKCS#1 RSA公钥转换为PKCS#8格式 + byte[] pkcs8Prefix = new byte[] { + 0x30, (byte) 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, (byte) 0x86, + 0x48, (byte) 0x86, (byte) 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + (byte) 0x82, 0x01, 0x0f, 0x00 + }; + + byte[] pkcs8Key = new byte[pkcs8Prefix.length + keyBytes.length]; + System.arraycopy(pkcs8Prefix, 0, pkcs8Key, 0, pkcs8Prefix.length); + System.arraycopy(keyBytes, 0, pkcs8Key, pkcs8Prefix.length, keyBytes.length); + + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pkcs8Key); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(keySpec); + } catch (Exception e) { + return null; + } + } + + + /** + * 针对 /zxjp/open/v1/wallet/** 接口的专用验签方法 + * @param params 包含签名参数的Map + * @param privateKeyPEM 用于生成签名的私钥 + * @return 验签是否通过 + */ + public static boolean verifyWalletSign(Map params, String privateKeyPEM) { + try { + // 1. 获取请求中的签名 + String requestSign = String.valueOf(params.get("sign")); + if (requestSign == null || requestSign.isEmpty()) { + log.warn("请求中缺少签名参数"); + return false; + } + + // 2. 移除签名参数,生成待签名字符串 + Map paramsToSign = new HashMap<>(params); + paramsToSign.remove("sign"); + + // 3. 使用相同的私钥生成签名 + String generatedSign = generateSign(paramsToSign, privateKeyPEM); + + // 4. 对比签名 + boolean isVerified = Objects.equals(requestSign, generatedSign); + + if (!isVerified) { + log.warn("签名验证失败,请求签名: {}, 生成签名: {}", requestSign, generatedSign); + } + + return isVerified; + } catch (Exception e) { + log.error("验签过程中发生异常", e); + return false; + } + } + +} \ No newline at end of file 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 0c542aa9d..17708e109 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 @@ -62,6 +62,8 @@ public class SignatureUtils { .add(timeStamp) .add(random) .toString(); + + log.info("plainText:{}",plainText); // 签名算法 Signature signature = Signature.getInstance("SHA256WithRSA"); diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java new file mode 100644 index 000000000..183f34d94 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java @@ -0,0 +1,34 @@ +package com.cool.store.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + *

+ * Spring上下文工具 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Component +public class SpringContextUtil implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + /** + * 获取bean + * @param name beanName + * @param clazz bean类型 + * @return bean + */ + public static T getBean(String name, Class clazz) { + return applicationContext.getBean(name, clazz); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/ThreadMdcUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/ThreadMdcUtil.java new file mode 100644 index 000000000..b90fe93c1 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/ThreadMdcUtil.java @@ -0,0 +1,55 @@ +package com.cool.store.utils; + +import com.cool.store.constants.CommonConstants; +import org.slf4j.MDC; + +import java.util.Map; +import java.util.concurrent.Callable; + +/** + * 线程MDC包装类 + * + * @author hetiantian + * @version 1.0 + * @Date 2020/03/18 15:18 + */ +public class ThreadMdcUtil { + public static void setTraceIdIfAbsent() { + MDCUtils.putIfAbsent(CommonConstants.REQUEST_ID, UUIDUtils.get32UUID()); + } + + public static Callable wrap(final Callable callable, final Map context) { + return () -> { + if (context == null) { + MDC.clear(); + } else { + MDC.setContextMap(context); + } + setTraceIdIfAbsent(); + try { + return callable.call(); + } finally { + MDC.clear(); + } + }; + } + + public static Runnable wrap(final Runnable runnable, final Map context) { + return new Runnable() { + @Override + public void run() { + if (context == null) { + MDC.clear(); + } else { + MDC.setContextMap(context); + } + setTraceIdIfAbsent(); + try { + runnable.run(); + } finally { + MDC.clear(); + } + } + }; + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java index a7313979f..9987cdbed 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java @@ -3,6 +3,7 @@ package com.cool.store.dao; import com.cool.store.dto.region.BigRegionDTO; import com.cool.store.entity.BigRegionDO; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.FranchiseBrandEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.BigRegionMapper; import com.cool.store.request.QueryBigRegionRequest; @@ -12,6 +13,7 @@ import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -25,8 +27,8 @@ public class BigRegionDAO { @Resource BigRegionMapper bigRegionMapper; - public List queryAllBigRegion(String keyword){ - return bigRegionMapper.queryAllBigRegion(keyword); + public List queryAllBigRegion(String keyword, Integer joinBrand){ + return bigRegionMapper.queryAllBigRegion(keyword, joinBrand); } public BigRegionDO queryOrgInfoByBigRegionAndJoinMode(Long regionId, Integer joinMode){ diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java index 6a25575c2..32cc9f21e 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java @@ -4,8 +4,8 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dto.UserDTO; import com.cool.store.dto.openPreparation.UserNameDTO; import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; import com.cool.store.mapper.EnterpriseUserMapper; -import com.cool.store.response.oppty.UserResponse; import com.cool.store.utils.StringUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; @@ -56,6 +56,13 @@ public class EnterpriseUserDAO { return enterpriseUserMapper.getUserInfoByUserIds(userIdList); } + public List getUserInfoByUserMobileList(List mobileList) { + if (CollectionUtils.isEmpty(mobileList)) { + return Lists.newArrayList(); + } + return enterpriseUserMapper.getUserInfoByUserMobileList(mobileList); + } + public List searchUserByRegionIdsAndKeyword(List regionIds, String keyword, List leaderRegionIds) { if (CollectionUtils.isEmpty(regionIds)) { return Lists.newArrayList(); @@ -168,4 +175,13 @@ public class EnterpriseUserDAO { } return enterpriseUserMapper.searchUserByUserIdsAndKeyword(userIdList, keyword); } + + /** + * 从平台库根据唯一id获取用户登录信息 + * @param unionid 唯一id + * @return 用户登录信息 + */ + public UserLoginDO getUserLoginByUnionid(String unionid) { + return enterpriseUserMapper.getUserLoginByUnionid(unionid); + } } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerUserInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerUserInfoDAO.java index f54825b8c..5dd700af4 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerUserInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerUserInfoDAO.java @@ -1,5 +1,6 @@ package com.cool.store.dao; +import com.cool.store.dto.wechat.ServiceAccountOpenIdDTO; import com.cool.store.entity.HyPartnerUserInfoDO; import com.cool.store.mapper.HyPartnerUserInfoMapper; import com.google.common.collect.Lists; @@ -112,4 +113,11 @@ public class HyPartnerUserInfoDAO { return hyPartnerUserInfoMapper.selectPasswordIsNull(); } + + public List selectLastBindRecord(List mobileList){ + if (CollectionUtils.isEmpty(mobileList)){ + return Lists.newArrayList(); + } + return hyPartnerUserInfoMapper.selectLastBindRecord(mobileList); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/MessageTemplateDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/MessageTemplateDAO.java index 904343a6d..e19a60678 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/MessageTemplateDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/MessageTemplateDAO.java @@ -71,6 +71,13 @@ public class MessageTemplateDAO { return messageTemplateMapper.batchUpdatePublishStatus(ids); } + public MessageTemplateDO getByKeyword(String keyword) { + if (keyword == null){ + return null; + } + return messageTemplateMapper.getByKeyword(keyword); + } + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/OldShopDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/OldShopDAO.java index 27a6dc3eb..facb70050 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/OldShopDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/OldShopDAO.java @@ -40,4 +40,8 @@ public class OldShopDAO { List list = oldShopMapper.selectByExample(example); return list.isEmpty() ? null : list.get(0); } + + public void insertSelective(OldShopDO oldShopDO) { + oldShopMapper.insertSelective(oldShopDO); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PartnerUserWechatBindDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PartnerUserWechatBindDAO.java index 388e59e80..9134b3efb 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PartnerUserWechatBindDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PartnerUserWechatBindDAO.java @@ -31,6 +31,27 @@ public class PartnerUserWechatBindDAO { return partnerUserWechatBindMapper.insert(partnerUserWechatBindDO); } + /** + * 更新 + * @param partnerUserWechatBindDO + * @return + */ + public Integer update(PartnerUserWechatBindDO partnerUserWechatBindDO) { + if (partnerUserWechatBindDO == null) { + return 0; + } + return partnerUserWechatBindMapper.update(partnerUserWechatBindDO); + } + + /** + * 更新所有的unionId对应的服务号ID + * @param unionId 开发平台的用户ID + * @param serviceAccountOpenId 服务号ID + * @return + */ + public Integer updateByUnionId(String unionId,String serviceAccountOpenId) { + return partnerUserWechatBindMapper.updateByUnionId(unionId,serviceAccountOpenId); + } public PartnerUserWechatBindDO getByOpenIdAndPartnerId(String partnerId, String openId) { if (StringUtil.isEmpty(partnerId)|| StringUtil.isEmpty(openId)){ diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopInfoDAO.java index 439afb1ee..4269282ed 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopInfoDAO.java @@ -17,6 +17,7 @@ import com.cool.store.mapper.ShopInfoMapper; import com.cool.store.request.*; import com.cool.store.response.MiniShopsResponse; import com.cool.store.response.PlatformBuildListResponse; +import com.cool.store.utils.UUIDUtils; import com.cool.store.vo.shop.StageShopCountVO; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; @@ -30,10 +31,7 @@ import org.springframework.stereotype.Repository; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -54,6 +52,10 @@ public class ShopInfoDAO { if(CollectionUtils.isEmpty(shopInfoList)){ return CommonConstants.ZERO; } + for (ShopInfoDO shopInfo : shopInfoList) { + validateShopName(shopInfo.getShopName()); + shopInfo.setStoreId(UUIDUtils.get32UUID()); + } return shopInfoMapper.batchAddShop(shopInfoList); } @@ -70,6 +72,24 @@ public class ShopInfoDAO { return shopInfo; } + public ShopInfoDO getShopInfoByStoreId(String storeId) { + ShopInfoDO shopInfoDO = new ShopInfoDO(); + shopInfoDO.setStoreId(storeId); + shopInfoDO.setDeleted(false); + return shopInfoMapper.selectOne(shopInfoDO); + } + + public List getShopInfoByStoreIds(List storeIds) { + if (CollectionUtils.isEmpty(storeIds)) { + return Collections.emptyList(); + } + Example example = new Example(ShopInfoDO.class); + example.createCriteria() + .andIn("storeId", storeIds) + .andEqualTo("deleted", false); + return shopInfoMapper.selectByExample(example); + } + public List getShopList(Long lineId){ if(Objects.isNull(lineId)){ return new ArrayList<>(); @@ -95,6 +115,8 @@ public class ShopInfoDAO { * @return */ public Long addShopInfo(ShopInfoDO shopInfo){ + validateShopName(shopInfo.getShopName()); + shopInfo.setStoreId(UUIDUtils.get32UUID()); shopInfoMapper.insertSelective(shopInfo); return shopInfo.getId(); } @@ -104,6 +126,7 @@ public class ShopInfoDAO { log.info("店铺为空 或者店铺id为空"); throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); } + validateShopName(shopInfo.getShopName()); return shopInfoMapper.updateByPrimaryKeySelective(shopInfo); } @@ -359,4 +382,14 @@ public class ShopInfoDAO { public List getPushHqtShopList(){ return shopInfoMapper.getPushHqtShopList(); } + + /** + * 校验名称 不能包含旗舰二字 + * @param shopName + */ + private void validateShopName(String shopName) { + if (StringUtils.isNotBlank(shopName) && shopName.contains("旗舰")) { + throw new ServiceException(ErrorCodeEnum.SHOP_NAME_INVALID); + } + } } 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 09f3c4a5f..9672ac615 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 @@ -4,7 +4,9 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dto.BuildStageDTO; import com.cool.store.dto.PlatformBuildStageDTO; import com.cool.store.dto.Preparation.ScheduleDTO; +import com.cool.store.entity.ShopInfoDO; import com.cool.store.entity.ShopStageInfoDO; +import com.cool.store.enums.FranchiseBrandEnum; import com.cool.store.enums.point.ShopStageEnum; import com.cool.store.enums.point.ShopSubStageEnum; import com.cool.store.enums.point.ShopSubStageStatusEnum; @@ -40,17 +42,26 @@ public class ShopStageInfoDAO { /** * 初始化店铺阶段信息 * @param lineId - * @param shopIds + * @param shopInfoList * @return flag =true:表示意向加盟节点完成正常初始化。false:表示意向加盟节点未完成新建分店阶段都为未开始-100。 */ - public Integer initShopStageInfo(Long lineId, List shopIds, Boolean flag) { - if (CollectionUtils.isEmpty(shopIds)) { + public Integer initShopStageInfo(Long lineId, List shopInfoList, Boolean flag) { + if (CollectionUtils.isEmpty(shopInfoList)) { return CommonConstants.ZERO; } List addShopStageList = new ArrayList<>(); LocalDate selectStartDate = LocalDate.now(); - for (Long shopId : shopIds) { + for (ShopInfoDO shopInfoDO : shopInfoList) { + Long shopId = shopInfoDO.getId(); for (ShopSubStageEnum shopSubStageEnum : ShopSubStageEnum.values()) { + if (ShopSubStageEnum.SHOP_STAGE_24.equals(shopSubStageEnum) && String.valueOf(FranchiseBrandEnum.ZXSMZ.getCode()).equals(shopInfoDO.getFranchiseBrand())) { + // 三明治跳过营帐通开通 + continue; + } + // TODO: 临时跳过 + if (shopSubStageEnum.equals(ShopSubStageEnum.SHOP_STAGE_6)) { + continue; + } ShopStageInfoDO shopStageInfo = new ShopStageInfoDO(); shopStageInfo.setLineId(lineId); shopStageInfo.setShopId(shopId); 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 086cd178b..65c3575c0 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 @@ -1,5 +1,6 @@ package com.cool.store.dao; +import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.StoreDO; import com.cool.store.mapper.StoreMapper; import com.cool.store.response.MiniShopsResponse; @@ -72,8 +73,8 @@ public class StoreDao { } - public List list() { - return storeMapper.list(); + public List list(Integer isIot) { + return storeMapper.list(isIot); } public List getStoreNumByStoreCodes(List storeCodeIds) { @@ -83,4 +84,22 @@ public class StoreDao { return storeMapper.getStoreNumByStoreCodes(storeCodeIds); } + /** + * 新增或编辑最新订货时间 + * @param dtoList 门店最新订货时间DTO列表 + * @return int + */ + public void batchInsertOrUpdateOrderTime(List dtoList) { + if (CollectionUtils.isEmpty(dtoList)) { + return ; + } + storeMapper.batchInsertOrUpdateOrderTime(dtoList); + } + + /** + * 查询所有门店id和门店编码 + */ + public List getAllStoreIdAndNum(List storeStatus) { + return storeMapper.getAllStoreIdAndNum(storeStatus); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreMessageDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreMessageDAO.java index 888cec788..6162e7f78 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreMessageDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreMessageDAO.java @@ -87,4 +87,11 @@ public class StoreMessageDAO { public MessageDetailVO getMessageDetail(Long id){ return storeMessageMapper.getMessageDetail(id); } + + public Integer batchUpdateHandle(Long id, List storeCodeList){ + if (id==null||CollectionUtils.isEmpty(storeCodeList)){ + return 0; + } + return storeMessageMapper.batchUpdateHandle(id,storeCodeList); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/DecorationTeamConfigDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/DecorationTeamConfigDAO.java new file mode 100644 index 000000000..d5111062d --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/DecorationTeamConfigDAO.java @@ -0,0 +1,42 @@ +package com.cool.store.dao.decoration; + +import com.cool.store.dto.decoration.DecorationTeamDTO; +import com.cool.store.entity.decoration.DecorationTeamConfigDO; +import com.cool.store.mapper.decoration.DecorationTeamConfigMapper; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/10/29 15:07 + * @Version 1.0 + */ +@Repository +public class DecorationTeamConfigDAO { + + @Resource + private DecorationTeamConfigMapper decorationTeamConfigMapper; + + public void addTeam(DecorationTeamConfigDO decorationTeamConfigDO){ + decorationTeamConfigMapper.insertSelective(decorationTeamConfigDO); + } + + public void updateTeam(DecorationTeamConfigDO decorationTeamConfigDO){ + decorationTeamConfigMapper.updateByPrimaryKeySelective(decorationTeamConfigDO); + } + + public DecorationTeamConfigDO getById(Long id){ + if (id == null){ + return null; + } + return decorationTeamConfigMapper.selectByPrimaryKey(id); + } + + public List listByCondition(){ + return decorationTeamConfigMapper.listByCondition(); + } + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/ShopDecorationAssignDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/ShopDecorationAssignDAO.java new file mode 100644 index 000000000..8b75e8fbd --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/ShopDecorationAssignDAO.java @@ -0,0 +1,71 @@ +package com.cool.store.dao.decoration; + +import com.cool.store.dao.HyOpenAreaInfoDAO; +import com.cool.store.dto.decoration.DecorationListDTO; +import com.cool.store.entity.HyOpenAreaInfoDO; +import com.cool.store.entity.decoration.ShopDecorationAssignDO; +import com.cool.store.mapper.decoration.ShopDecorationAssignMapper; +import com.cool.store.request.decoration.DecorationListRequest; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/10/29 15:07 + * @Version 1.0 + */ +@Repository +public class ShopDecorationAssignDAO { + + @Resource + private ShopDecorationAssignMapper shopDecorationAssignMapper; + @Resource + HyOpenAreaInfoDAO hyOpenAreaInfoDAO; + + + public Integer insert(ShopDecorationAssignDO shopDecorationAssignDO) { + if (shopDecorationAssignDO == null){ + return 0; + } + return shopDecorationAssignMapper.insert(shopDecorationAssignDO); + } + + public ShopDecorationAssignDO getById(Long id) { + if (id == null){ + return null; + } + return shopDecorationAssignMapper.selectByPrimaryKey(id); + } + + public Integer update(ShopDecorationAssignDO shopDecorationAssignDO) { + if (shopDecorationAssignDO == null){ + return 0; + } + return shopDecorationAssignMapper.updateByPrimaryKey(shopDecorationAssignDO); + } + + public Integer countByTeamId(Long teamId) { + if (teamId == null){ + return 0; + } + return shopDecorationAssignMapper.countByTeamId(teamId); + } + + public List listByCondition(DecorationListRequest request) { + if (request == null){ + return null; + } + if (request.getWantShopAreaId()!=null){ + HyOpenAreaInfoDO hyOpenAreaInfoDO = hyOpenAreaInfoDAO.selectById(request.getWantShopAreaId()); + List hyOpenAreaInfoDOList = hyOpenAreaInfoDAO.queryByKeyword(hyOpenAreaInfoDO.getAreaPath(), null, null, false); + List wantShopAreaIds = hyOpenAreaInfoDOList.stream().map(HyOpenAreaInfoDO::getId).collect(Collectors.toList()); + request.setWantShopAreaIds(wantShopAreaIds); + } + return shopDecorationAssignMapper.listByCondition(request); + } + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/TeamAreaMappingDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/TeamAreaMappingDAO.java new file mode 100644 index 000000000..3a6313a9b --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/decoration/TeamAreaMappingDAO.java @@ -0,0 +1,73 @@ +package com.cool.store.dao.decoration; + +import com.aliyun.openservices.shade.com.google.common.collect.Maps; +import com.cool.store.dto.decoration.TeamAreaMappingDTO; +import com.cool.store.entity.decoration.TeamAreaMappingDO; +import com.cool.store.mapper.decoration.TeamAreaMappingMapper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/10/29 15:08 + * @Version 1.0 + */ +@Repository +public class TeamAreaMappingDAO { + + @Resource + private TeamAreaMappingMapper teamAreaMappingMapper; + + public void batchInsert(Long teamId,List cityId){ + if (teamId == null || CollectionUtils.isEmpty(cityId)){ + return; + } + List list = new ArrayList<>(); + cityId.forEach(x->{ + TeamAreaMappingDO teamAreaMappingDO = new TeamAreaMappingDO(); + teamAreaMappingDO.setTeamId(teamId); + teamAreaMappingDO.setOpenCityId(x); + list.add(teamAreaMappingDO); + }); + teamAreaMappingMapper.batchInsert(list); + } + + public int deletedByTeamId(Long teamId){ + if (teamId == null){ + return 0; + } + return teamAreaMappingMapper.deletedByTeamId(teamId); + } + + public int deletedIds(List ids){ + if (CollectionUtils.isEmpty(ids)){ + return 0; + } + return teamAreaMappingMapper.deletedIds(ids); + } + + public TeamAreaMappingDO getByCityId(Long cityId){ + return teamAreaMappingMapper.getByCityId(cityId); + } + + + public Map> listByTeamIdList(List teamIdList){ + if (CollectionUtils.isEmpty(teamIdList)){ + return Maps.newHashMap(); + } + List teamAreaMappingDTOS = teamAreaMappingMapper.listByTeamIdList(teamIdList); + Map> map = teamAreaMappingDTOS.stream().collect(Collectors.groupingBy(TeamAreaMappingDTO::getTeamId)); + return map; + } + + + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java new file mode 100644 index 000000000..75a361452 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java @@ -0,0 +1,37 @@ +package com.cool.store.dao.store; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.store.StoreMasterSignerInfoDO; +import com.cool.store.mapper.store.StoreMasterSignerInfoMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + *

+ * 门店签约信息DAO + *

+ * + * @author wangff + * @since 2025/9/23 + */ +@Repository +@RequiredArgsConstructor +public class StoreMasterSignerInfoDAO { + private final StoreMasterSignerInfoMapper storeMasterSignerInfoMapper; + + /** + * 获取门店签约信息Map + */ + public Map getSignerMapByStoreIds(List storeIds) { + if (CollectionUtils.isEmpty(storeIds)) { + return Collections.emptyMap(); + } + List list = storeMasterSignerInfoMapper.selectByStoreIds(storeIds); + return CollStreamUtil.toMap(list, StoreMasterSignerInfoDO::getStoreId, v -> v); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/OpenBankInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/OpenBankInfoDAO.java new file mode 100644 index 000000000..e558c2b53 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/OpenBankInfoDAO.java @@ -0,0 +1,52 @@ +package com.cool.store.dao.wallet; + +import com.cool.store.entity.wallet.OpenBankInfoDO; +import com.cool.store.mapper.wallet.OpenBankInfoMapper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * @Author suzhuhong + * @Date 2025/11/20 10:37 + * @Version 1.0 + */ +@Repository +public class OpenBankInfoDAO { + + + @Resource + private OpenBankInfoMapper openBankInfoMapper; + + public int insertSelective(OpenBankInfoDO openBankInfoDO){ + return openBankInfoMapper.insertSelective(openBankInfoDO); + } + + public int updateByStoreCode(OpenBankInfoDO openBankInfoDO){ + return openBankInfoMapper.updateByStoreCode(openBankInfoDO); + } + + public OpenBankInfoDO getOpenBankInfo(String storeCode){ + return openBankInfoMapper.getOpenBankInfo(storeCode); + } + + public OpenBankInfoDO getOpenBankInfoByStoreId(String storeId) { + return openBankInfoMapper.selectOne(OpenBankInfoDO.builder().storeId(storeId).build()); + } + + public int insertOrUpdateByStoreId(OpenBankInfoDO openBankInfoDO) { + if (StringUtils.isBlank(openBankInfoDO.getStoreId())) { + return 0; + } + if (Objects.isNull(getOpenBankInfo(openBankInfoDO.getStoreId()))) { + return openBankInfoMapper.insertSelective(openBankInfoDO); + } else { + Example example = new Example(OpenBankInfoDO.class); + example.createCriteria().andEqualTo("storeId", openBankInfoDO.getStoreId()); + return openBankInfoMapper.updateByExampleSelective(openBankInfoDO, example); + } + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/TempOpenWalletInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/TempOpenWalletInfoDAO.java new file mode 100644 index 000000000..2b3a440a9 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/TempOpenWalletInfoDAO.java @@ -0,0 +1,35 @@ +package com.cool.store.dao.wallet; + +import com.cool.store.entity.wallet.TempOpenWalletInfoDO; +import com.cool.store.mapper.wallet.TempOpenWalletInfoMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; + +/** + * @Author suzhuhong + * @Date 2025/11/20 10:03 + * @Version 1.0 + */ +@Repository +@RequiredArgsConstructor +public class TempOpenWalletInfoDAO { + + @Resource + private TempOpenWalletInfoMapper tempOpenWalletInfoMapper; + + /** + * 根据门店编号查询临时开通钱包信息 + * @param StoreCode + * @return + */ + public TempOpenWalletInfoDO getTempOpenWalletInfoByStoreCode(String StoreCode) { + if (StoreCode == null){ + return null; + } + return tempOpenWalletInfoMapper.getTempOpenWalletInfoByStoreCode(StoreCode); + } + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/WalletPaymentOrderDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/WalletPaymentOrderDAO.java new file mode 100644 index 000000000..2610acaa7 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/wallet/WalletPaymentOrderDAO.java @@ -0,0 +1,51 @@ +package com.cool.store.dao.wallet; + +import com.cool.store.entity.wallet.WalletPaymentOrderDO; +import com.cool.store.mapper.wallet.WalletPaymentOrderMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; + +/** + *

+ * 钱包大额支付DAO + *

+ * + * @author wangff + * @since 2025/11/18 + */ +@Repository +@RequiredArgsConstructor +public class WalletPaymentOrderDAO { + private final WalletPaymentOrderMapper walletPaymentOrderMapper; + + public void insertSelective(WalletPaymentOrderDO walletPaymentOrderDO) { + walletPaymentOrderMapper.insertSelective(walletPaymentOrderDO); + } + + /** + * 更新订单状态 + */ + public void updateOrderByPaymentId(String storeId, String paymentId, Integer orderStatus) { + Example example = new Example(WalletPaymentOrderDO.class); + example.createCriteria() + .andEqualTo("storeId", storeId) + .andEqualTo("paymentId", paymentId); + walletPaymentOrderMapper.updateByExampleSelective(WalletPaymentOrderDO.builder().orderStatus(orderStatus).build(), example); + } + + /** + * 查询未支付的充值订单 + */ + public List getNonPaymentList(String storeId) { + Example example = new Example(WalletPaymentOrderDO.class); + example.createCriteria() + .andEqualTo("storeId", storeId) + .andEqualTo("orderStatus", 3) + .andEqualTo("type", 0); + example.setOrderByClause("create_time DESC"); + return walletPaymentOrderMapper.selectByExample(example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java index e1b8c5d37..3a29d94d6 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java @@ -15,7 +15,7 @@ public interface BigRegionMapper extends Mapper { * @param keyword * @return */ - List queryAllBigRegion(String keyword); + List queryAllBigRegion(@Param("keyword") String keyword, @Param("joinBrand") Integer joinBrand); /** * 根据所属大区与加盟模式查询新管家信息 diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java index 84f81fe74..ae0c77f3d 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java @@ -1,8 +1,10 @@ package com.cool.store.mapper; +import com.cool.store.annotation.PlatformDB; import com.cool.store.dto.UserDTO; import com.cool.store.dto.openPreparation.UserNameDTO; import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -32,6 +34,8 @@ public interface EnterpriseUserMapper { */ List getUserInfoByUserIds( @Param("userIdList") List userIdList); + List getUserInfoByUserMobileList( @Param("mobileList") List mobileList); + /** * 根据关键字搜索部门下的用户 * @param regionIds @@ -101,4 +105,12 @@ public interface EnterpriseUserMapper { List searchUserByUserIdsAndKeyword( @Param("userIdList") List userIdList, @Param("keyword") String keyword); List getUserIdsByRegionIdList( @Param("regionIdList") List regionIdList); + + /** + * 从平台库根据唯一id获取用户登录信息 + * @param unionid 唯一id + * @return 用户登录信息 + */ + @PlatformDB + UserLoginDO getUserLoginByUnionid(@Param("unionid") String unionid); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserInfoMapper.java index 4ac2fcb53..c25bedbdb 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserInfoMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserInfoMapper.java @@ -1,5 +1,6 @@ package com.cool.store.mapper; +import com.cool.store.dto.wechat.ServiceAccountOpenIdDTO; import com.cool.store.entity.HyPartnerUserInfoDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -55,4 +56,6 @@ public interface HyPartnerUserInfoMapper extends tk.mybatis.mapper.common.Mappe List selectPasswordIsNull(); + List selectLastBindRecord(@Param("mobileList") List mobileList); + } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/MessageTemplateMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/MessageTemplateMapper.java index d038d22cf..c416bec72 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/MessageTemplateMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/MessageTemplateMapper.java @@ -3,6 +3,7 @@ package com.cool.store.mapper; import com.cool.store.dto.notice.CommonDTO; import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.entity.MessageTemplateDO; +import com.cool.store.entity.StoreMessageDO; import com.cool.store.request.notice.MessageTemplateQueryRequest; import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.common.Mapper; @@ -25,6 +26,11 @@ public interface MessageTemplateMapper extends Mapper { int batchUpdatePublishStatus(@Param("ids") List ids); - + /** + * 根据关键词查询 + * @param keyword + * @return + */ + MessageTemplateDO getByKeyword(@Param("keyword") String keyword); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PartnerUserWechatBindMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PartnerUserWechatBindMapper.java index a94d56629..d69cb7fba 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PartnerUserWechatBindMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PartnerUserWechatBindMapper.java @@ -18,6 +18,22 @@ public interface PartnerUserWechatBindMapper { */ Integer insert(PartnerUserWechatBindDO partnerUserWechatBindDO); + /** + * 更新数据 + * @param partnerUserWechatBindDO + * @return + */ + Integer update(PartnerUserWechatBindDO partnerUserWechatBindDO); + + + /** + * 更新所有的unionId对应的服务号ID + * @param unionId 开发平台的用户ID + * @param serviceAccountOpenId 服务号ID + * @return + */ + Integer updateByUnionId(String unionId,String serviceAccountOpenId); + /** * 根据partnerId与openId查询 * @param partnerId 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 16b33d5ab..25adad05a 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 @@ -1,6 +1,7 @@ package com.cool.store.mapper; import com.cool.store.dto.store.StoreAreaDTO; +import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.StoreDO; import com.cool.store.response.MiniShopsResponse; import org.apache.ibatis.annotations.Mapper; @@ -39,7 +40,7 @@ public interface StoreMapper { * 分页查询门店数据 * @return */ - List list(); + List list(@Param("isIot") Integer isIot); List getStoreAreaList( @Param("storeIds") List storeIds); @@ -47,4 +48,15 @@ public interface StoreMapper { List listStoreByRegionPathList(@Param("regionPathList") List regionPathList); + /** + * 批量新增或编辑最新订货时间 + * @param dtoList 门店最新订货时间DTO列表 + * @return int + */ + int batchInsertOrUpdateOrderTime(@Param("dtoList") List dtoList); + + /** + * 查询所有门店id和门店编码 + */ + List getAllStoreIdAndNum(@Param("storeStatus") List storeStatus); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMessageMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMessageMapper.java index 54a01ecf9..96e983250 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMessageMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMessageMapper.java @@ -35,4 +35,11 @@ public interface StoreMessageMapper extends Mapper { MessageDetailVO getMessageDetail(Long id); + /** + * 批量更新处理 + * @param id + * @param storeCodeList + */ + int batchUpdateHandle(@Param("id") Long id, @Param("storeCodeList") List storeCodeList); + } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/DecorationTeamConfigMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/DecorationTeamConfigMapper.java new file mode 100644 index 000000000..2cff39b62 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/DecorationTeamConfigMapper.java @@ -0,0 +1,20 @@ +package com.cool.store.mapper.decoration; + +import com.cool.store.dto.decoration.DecorationTeamDTO; +import com.cool.store.entity.decoration.DecorationTeamConfigDO; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface DecorationTeamConfigMapper extends Mapper { + + + /** + * 查询团队 + * @return + */ + List listByCondition(); + + + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/ShopDecorationAssignMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/ShopDecorationAssignMapper.java new file mode 100644 index 000000000..d1bac2437 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/ShopDecorationAssignMapper.java @@ -0,0 +1,30 @@ +package com.cool.store.mapper.decoration; + +import com.cool.store.dto.decoration.DecorationListDTO; +import com.cool.store.entity.decoration.ShopDecorationAssignDO; +import com.cool.store.request.decoration.DecorationListRequest; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface ShopDecorationAssignMapper extends Mapper { + + + /** + * 查询团队被门店使用次数 + * @param teamId + * @return + */ + Integer countByTeamId(Long teamId); + + /** + * 查询分配装修团队列表 + * @param request + * @return + */ + List listByCondition(DecorationListRequest request); + + + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/TeamAreaMappingMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/TeamAreaMappingMapper.java new file mode 100644 index 000000000..b4cf228be --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/decoration/TeamAreaMappingMapper.java @@ -0,0 +1,48 @@ +package com.cool.store.mapper.decoration; + +import com.cool.store.dto.decoration.TeamAreaMappingDTO; +import com.cool.store.entity.decoration.TeamAreaMappingDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface TeamAreaMappingMapper extends Mapper { + + /** + * 批量插入 + * @param list + * @return + */ + Integer batchInsert(@Param("list") List list); + /** + * 根据团队id删除 更新团队id时候删除 + * @param teamId + * @return + */ + Integer deletedByTeamId(@Param("teamId") Long teamId); + + /** + * 根据ids删除 + * @param ids + * @return + */ + Integer deletedIds(@Param("ids") List ids); + + /** + * 根据城市id查询 + * @param cityId + * @return + */ + TeamAreaMappingDO getByCityId(@Param("cityId") Long cityId); + + /** + * 根据团队id批量查询 + * @param teamIdList + * @return + */ + List listByTeamIdList(@Param("teamIdList") List teamIdList); + + + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java new file mode 100644 index 000000000..67e2231e3 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java @@ -0,0 +1,19 @@ +package com.cool.store.mapper.store; + + +import com.cool.store.entity.store.StoreMasterSignerInfoDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author zhangchenbiao + * @date 2025-09-23 11:32 + */ +public interface StoreMasterSignerInfoMapper { + + /** + * 根据门店id查询签约信息 + */ + List selectByStoreIds(@Param("storeIds") List storeIds); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/OpenBankInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/OpenBankInfoMapper.java new file mode 100644 index 000000000..fd70937e1 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/OpenBankInfoMapper.java @@ -0,0 +1,26 @@ +package com.cool.store.mapper.wallet; + +import com.cool.store.entity.wallet.OpenBankInfoDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +public interface OpenBankInfoMapper extends Mapper { + + + /** + * 查询门店开户信息 + * @param storeCode + * @return + */ + OpenBankInfoDO getOpenBankInfo(@Param("storeCode") String storeCode); + + /** + * 根据门店编码更新 + * @param openBankInfoDO + * @return + */ + Integer updateByStoreCode(@Param("dto") OpenBankInfoDO openBankInfoDO); + + + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/TempOpenWalletInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/TempOpenWalletInfoMapper.java new file mode 100644 index 000000000..558e5fb1e --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/TempOpenWalletInfoMapper.java @@ -0,0 +1,18 @@ +package com.cool.store.mapper.wallet; + +import com.cool.store.entity.wallet.TempOpenWalletInfoDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +public interface TempOpenWalletInfoMapper extends Mapper { + + /** + * 根据StoreCode查询临时开放钱包信息 + * @param StoreCode + * @return + */ + TempOpenWalletInfoDO getTempOpenWalletInfoByStoreCode(@Param("storeCode") String StoreCode); + + + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletPaymentOrderMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletPaymentOrderMapper.java new file mode 100644 index 000000000..774abb085 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletPaymentOrderMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.wallet; + +import com.cool.store.entity.wallet.WalletPaymentOrderDO; +import tk.mybatis.mapper.common.Mapper; + +public interface WalletPaymentOrderMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml index 318359df6..2bc693f67 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml @@ -38,6 +38,9 @@ and region_name like CONCAT('%',#{keyword},'%') + + and join_brand = #{joinBrand} + diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml index 20fffcf0a..5a019939f 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml @@ -30,7 +30,7 @@ - id, user_id, name, remark, mobile, email, main_admin, is_admin, unionid, + id, user_id, name, remark, mobile, email, main_admin, is_admin, unionid,departments, avatar, jobnumber, is_leader, is_leader_in_depts, face_url, user_status, create_time, third_oa_unique_flag @@ -82,6 +82,21 @@ + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml index 7f7b18652..6b4606782 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml @@ -195,4 +195,23 @@ + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/MessageTemplateMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/MessageTemplateMapper.xml index d550593d8..75df2796f 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/MessageTemplateMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/MessageTemplateMapper.xml @@ -75,7 +75,11 @@ publish_time as publishTime, publisher_user_id as publishUserId, create_user_id as createUserId, - create_time as createTime + create_time as createTime, + handle_person_info as handlePersonInfo, + jump_type as jumpType, + jump_url as jumpUrl, + store_info as storeInfo FROM zxjp_message_template WHERE deleted = 0 @@ -127,4 +131,14 @@ + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/PartnerUserWechatBindMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/PartnerUserWechatBindMapper.xml index c638c9338..b77174957 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/PartnerUserWechatBindMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/PartnerUserWechatBindMapper.xml @@ -8,6 +8,8 @@ + + @@ -17,15 +19,33 @@ open_id, bind_time, partner_id, + union_id, create_time ) VALUES ( #{openId, jdbcType=VARCHAR}, #{bindTime, jdbcType=TIMESTAMP}, #{partnerId, jdbcType=VARCHAR}, + #{unionId, jdbcType=VARCHAR}, #{createTime, jdbcType=TIMESTAMP} ) + + UPDATE xfsg_partner_user_wechat_bind + + + union_id = #{unionId, jdbcType=VARCHAR}, + + + where id = #{id} + + + + UPDATE xfsg_partner_user_wechat_bind + set service_account_open_id = #{serviceAccountOpenId} + where union_id = #{unionId} + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml index 20bb1dbd7..9183d5312 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml @@ -38,6 +38,7 @@ + @@ -46,17 +47,17 @@ shop_code, store_num, shop_manager_user_id, supervisor_user_id, plan_open_time, cur_progress, shop_type, shop_stage, deleted, create_time, update_time, join_mode,detail_address,franchise_brand,development_manager,want_shop_area_id,investment_manager,shop_status,create_user_id,update_user_id,store_type - , province,province_code,city,city_code,district,district_code,manager_region_id,shop_decoration_attributes,hqt_shop_id + , province,province_code,city,city_code,district,district_code,manager_region_id,shop_decoration_attributes,hqt_shop_id,store_id insert into xfsg_shop_info(region_id, line_id, partner_id, shop_name, store_num,supervisor_user_id,create_time,join_mode,franchise_brand, - development_manager,want_shop_area_id,investment_manager) values + development_manager,want_shop_area_id,investment_manager,store_id) values (#{shop.regionId}, #{shop.lineId}, #{shop.partnerId}, #{shop.shopName}, #{shop.storeNum},#{shop.supervisorUserId},#{shop.createTime},#{shop.joinMode},#{shop.franchiseBrand},#{shop.developmentManager}, - #{shop.wantShopAreaId},#{shop.investmentManager}) + #{shop.wantShopAreaId},#{shop.investmentManager},#{shop.storeId}) @@ -278,7 +279,11 @@ from xfsg_shop_info a left join store_${enterpriseId} b on a.shop_code = b.store_num - where b.store_id is not null and a.id in + where a.shop_code is not null + and a.shop_code !='' + and b.store_id is not null + and b.is_delete = 'effective' + and a.id in #{shopId} @@ -305,7 +310,8 @@ a.franchise_brand as franchiseBrand, a.shop_status as shopStatus, a.detail_address as shopAddress, - a.manager_region_id as managerRegionId + a.manager_region_id as managerRegionId, + a.store_id as storeId from xfsg_shop_info a left join xfsg_line_info b on a.line_id = b.id left join xfsg_sign_franchise c on a.id = c.shop_id diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index 506a50d72..654e68817 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -44,6 +44,12 @@ + + + + + + + + + + INSERT INTO store_extend_info_${enterpriseId} + + store_id, + latest_order_time + + VALUES + + + #{dto.storeId}, + #{dto.latestOrderTime} + + + ON DUPLICATE KEY UPDATE + + store_id = VALUES(store_id), + latest_order_time = VALUES(latest_order_time), + update_time = now(), + + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml index ff44f4388..59ccfff2e 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml @@ -25,7 +25,7 @@ - + INSERT INTO zxjp_store_message ( store_id, store_code, @@ -160,9 +160,12 @@ a.process_status as processStatus, a.create_time as createTime, b.module_code as moduleCode, + b.matter_type as matterType, b.message_title as messageTitle, b.message_image as messageImage, - b.today_task as todayTask + b.today_task as todayTask, + b.jump_type as jumpType, + b.jump_url as jumpUrl from zxjp_store_message a left join zxjp_message_template b on a.message_template_id = b.id @@ -205,7 +208,8 @@ b.deadline as deadline, b.publisher_user_id as publishUserId, b.message_content as messageContent, - b.process_type as processType + b.process_type as processType, + b.handle_keyword as handleKeyword from zxjp_store_message a left join zxjp_message_template b on a.message_template_id = b.id @@ -213,6 +217,24 @@ a.id = #{id} + + UPDATE zxjp_store_message + SET + process_status = 1, + process_time = NOW(), + read_status = 1, + read_time = NOW(), + update_time = NOW() + + + AND message_template_id = #{id} + + and store_code IN + + #{item} + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml index 754787c3e..c27321ab5 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml @@ -397,7 +397,7 @@ and eu.active = true -- and sr.source = 'create' - and sr.position_type = #{positionType} + and (sr.position_type = #{positionType} or sr.id in (180000000,120000000,40000000,1762761165005)) and eu.user_status = '1' diff --git a/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml index ded24a4de..c9feb2c04 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml @@ -55,7 +55,7 @@ - and b.position_type =#{positionType} + and (b.position_type =#{positionType} or b.id in (180000000,120000000,40000000,1762761165005)) and b.role_auth !=#{notRoleAuth} diff --git a/coolstore-partner-dao/src/main/resources/mapper/decoration/DecorationTeamConfigMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/decoration/DecorationTeamConfigMapper.xml new file mode 100644 index 000000000..733a5c109 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/decoration/DecorationTeamConfigMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/decoration/ShopDecorationAssignMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/decoration/ShopDecorationAssignMapper.xml new file mode 100644 index 000000000..ef36ac7e5 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/decoration/ShopDecorationAssignMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/decoration/TeamAreaMappingMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/decoration/TeamAreaMappingMapper.xml new file mode 100644 index 000000000..8c82fd7f2 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/decoration/TeamAreaMappingMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + INSERT INTO zxjp_team_area_mapping ( + team_id, + open_city_id + ) VALUES + + ( + #{item.teamId}, + #{item.openCityId} + ) + + + + + + DELETE FROM zxjp_team_area_mapping + WHERE team_id = #{teamId} + + + + + DELETE FROM zxjp_team_area_mapping + WHERE id IN + + #{id} + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/store/storeMasterSignerInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/store/storeMasterSignerInfoMapper.xml new file mode 100644 index 000000000..7ed5ca403 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/store/storeMasterSignerInfoMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + id, store_id, signer1_name, signer1_mobile, signer1_id_card_no, signer1_id_card_front, + signer1_id_card_back, signer2_name, signer2_mobile, signer2_id_card_no, signer2_id_card_front, + signer2_id_card_back, create_time, update_time + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/wallet/OpenBankInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/wallet/OpenBankInfoMapper.xml new file mode 100644 index 000000000..8dc80689b --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/wallet/OpenBankInfoMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE zxjp_open_bank_info + + + store_id = #{dto.storeId}, + + + signer_name = #{dto.signerName}, + + + signer_id_card = #{dto.signerIdCard}, + + + signer_phone = #{dto.signerPhone}, + + + signer_id_card_front = #{dto.signerIdCardFront}, + + + signer_id_card_back = #{dto.signerIdCardBack}, + + + business_license_name = #{dto.businessLicenseName}, + + + business_license_code = #{dto.businessLicenseCode}, + + + business_license_photo = #{dto.businessLicensePhoto}, + + + legal_is_signer = #{dto.legalIsSigner}, + + + legal_name = #{dto.legalName}, + + + legal_id_card = #{dto.legalIdCard}, + + + legal_id_card_expire_time = #{dto.legalIdCardExpireTime}, + + + legal_phone = #{dto.legalPhone}, + + + legal_id_card_front = #{dto.legalIdCardFront}, + + + legal_id_card_back = #{dto.legalIdCardBack}, + + + settlement_card = #{dto.settlementCard}, + + + bank_branch_name = #{dto.bankBranchName}, + + + bank_branch_code = #{dto.bankBranchCode}, + + + bank_reserved_phone = #{dto.bankReservedPhone}, + + + source = #{dto.source}, + + + WHERE store_code = #{dto.storeCode} + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/wallet/TempOpenWalletInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/wallet/TempOpenWalletInfoMapper.xml new file mode 100644 index 000000000..f68b95773 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/wallet/TempOpenWalletInfoMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletPaymentOrderMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletPaymentOrderMapper.xml new file mode 100644 index 000000000..ea5ed9ece --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletPaymentOrderMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/Preparation/PreparationDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/Preparation/PreparationDTO.java index 7375fbb64..96a6d4e04 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/Preparation/PreparationDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/Preparation/PreparationDTO.java @@ -55,5 +55,7 @@ public class PreparationDTO { private Long managerRegionId; + private String storeId; + } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/ShopSignerInfoDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/ShopSignerInfoDTO.java new file mode 100644 index 000000000..2d8163262 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/ShopSignerInfoDTO.java @@ -0,0 +1,26 @@ +package com.cool.store.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/3 15:22 + * @Version 1.0 + */ +@Data +public class ShopSignerInfoDTO { + + @ApiModelProperty("签约人1姓名") + private String partnershipSignatoryFirst; + + @ApiModelProperty("签约人1手机号") + private String partnershipSignatoryFirstMobile; + + @ApiModelProperty("签约人2姓名") + private String partnershipSignatorySecond; + + @ApiModelProperty("签约人2手机号") + private String partnershipSignatorySecondMobile; + +} 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 index 0c88ae388..5a13799fa 100644 --- 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 @@ -43,4 +43,22 @@ public class StoreDTO { private String longitude; private String latitude; + + @ApiModelProperty("订货人") + private String addresseeName; + @ApiModelProperty("手机号") + private String addresseeMobile; + @ApiModelProperty("收件省市区") + private String addresseeArea; + @ApiModelProperty("订货地址") + private String addresseeAddress; + @ApiModelProperty("管理督导-crm系统的regionId") + private String managerSupervisionName; + @ApiModelProperty("所属大区/分部") + private String branchName; + + @ApiModelProperty("门店状态") + private String storeStatus; + @ApiModelProperty("门店状态名称") + private String status; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreNameDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreNameDTO.java new file mode 100644 index 000000000..daf196280 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreNameDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 门店名称DTO + *

+ * + * @author wangff + * @since 2025/9/16 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StoreNameDTO { + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店编码") + private String storeNum; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/DecorationListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/DecorationListDTO.java new file mode 100644 index 000000000..65570aad8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/DecorationListDTO.java @@ -0,0 +1,55 @@ +package com.cool.store.dto.decoration; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/3 11:23 + * @Version 1.0 + */ +@Data +public class DecorationListDTO { + + private Long id; + + @ApiModelProperty("装修团队ID") + private Long teamId; + + @ApiModelProperty("门店ID") + private Long shopId; + + @ApiModelProperty("门店名称") + private String shopName; + + @ApiModelProperty("门店编号") + private String shopCode; + + @ApiModelProperty("门店区域ID") + private String regionId; + + @ApiModelProperty("门店区域名称") + private String regionName; + + @ApiModelProperty("门店省") + private String province; + + @ApiModelProperty("门店市") + private String city; + + @ApiModelProperty("门店县") + private String district; + + @ApiModelProperty("门店详细地址") + private String detailAddress; + + @ApiModelProperty("门店类型") + private Integer storeType; + + @ApiModelProperty("门店签约类型") + private Integer signType; + + @ApiModelProperty("门店装修分配状态") + private Integer decorationDescStatus; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/DecorationTeamDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/DecorationTeamDTO.java new file mode 100644 index 000000000..0c8ab3113 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/DecorationTeamDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto.decoration; + +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/10/29 18:41 + * @Version 1.0 + */ +@Data +public class DecorationTeamDTO { + + private Long id; + + private String teamName; + + private String teamCode; + + private Integer useSystem; + + private List cityList; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/TeamAreaMappingDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/TeamAreaMappingDTO.java new file mode 100644 index 000000000..0f616ac1a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/decoration/TeamAreaMappingDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.decoration; + +import lombok.Data; + +import javax.persistence.Column; + +/** + * @Author suzhuhong + * @Date 2025/10/29 19:01 + * @Version 1.0 + */ +@Data +public class TeamAreaMappingDTO { + + private Long teamId; + + private Long openCityId; + + private String openCityName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/AccountTagDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/AccountTagDTO.java new file mode 100644 index 000000000..8e4c0a21a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/AccountTagDTO.java @@ -0,0 +1,20 @@ +package com.cool.store.dto.huoma; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/6 11:09 + * @Version 1.0 + */ +@Data +public class AccountTagDTO { + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("设备名称") + private String deviceName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/HuoMaAccountDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/HuoMaAccountDTO.java new file mode 100644 index 000000000..4ccaccdf9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/HuoMaAccountDTO.java @@ -0,0 +1,39 @@ +package com.cool.store.dto.huoma; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 火码账号DTO + *

+ * + * @author wangff + * @since 2025/9/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class HuoMaAccountDTO { + /** + * 账号 + */ + private String account; + + /** + * 密码 + */ + private String password; + + /** + * 是否已查询 + */ + private Boolean isQuery; + + public HuoMaAccountDTO(String account, String password) { + this.account = account; + this.password = password; + this.isQuery = false; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/ProgramReqDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/ProgramReqDTO.java new file mode 100644 index 000000000..3983d99cb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/ProgramReqDTO.java @@ -0,0 +1,40 @@ +package com.cool.store.dto.huoma; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/5 14:43 + * @Version 1.0 + */ +@Data +public class ProgramReqDTO { + + @ApiModelProperty(name = "门店编码",required = true) + private String storeCode; + + @ApiModelProperty(name = "设备名称",required = true) + @NotEmpty(message = "设备名称不能为空") + private String deviceName; + + @ApiModelProperty(name = "第几页,",required = true) + private Integer index; + + @ApiModelProperty(name ="每页数量",required = true) + private Integer size; + + @ApiModelProperty(name = "时间",hidden = true) + private String date; + + @ApiModelProperty(name = "排序",hidden = true) + private String sort; + + @ApiModelProperty("标签id列表") + private List tagIds; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/ProgramResponseDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/ProgramResponseDTO.java new file mode 100644 index 000000000..3922c7ba9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/ProgramResponseDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto.huoma; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/5 14:44 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProgramResponseDTO { + + @ApiModelProperty("节目ID") + private Long id; + + @ApiModelProperty("节目名称") + private String name; + + @ApiModelProperty("节目缩略图") + private String thumbnail; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/PublishDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/PublishDTO.java new file mode 100644 index 000000000..6453c8c8c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/PublishDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.huoma; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/5 17:06 + * @Version 1.0 + */ +@Data +public class PublishDTO { + + @ApiModelProperty(name = "门店编号",required = true) + @NotEmpty(message = "门店编码不能为空") + private String storeCode; + @ApiModelProperty(name = "设备ID列表",required = true) + @NotEmpty(message = "设备ID列表不能为空") + @JSONField(name = "terminals") + private List deviceIdList; + @ApiModelProperty("节目id") + private Long programId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreEquipmentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreEquipmentDTO.java new file mode 100644 index 000000000..cfae3c530 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreEquipmentDTO.java @@ -0,0 +1,59 @@ +package com.cool.store.dto.huoma; + +import com.cool.store.utils.BrowserVersionUtils; +import lombok.Data; + +import java.util.Objects; + +/** + * @Author: WangShuo + * @Date: 2025/08/13/16:24 + * @Version 1.0 + * @注释: + */ +@Data +public class StoreEquipmentDTO { + /** + * 已授权登录数 + */ + private Integer activeCount; + + /** + * 总设备 + */ + private Integer terminalCount; + + /** + * 网点ID + */ + private Integer pointId; + + /** + * 网点号 + */ + private String pointCode; + + /** + * 签到数 + */ + private Integer signCount; + + /** + * 在线 + */ + + private Integer connectCount; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StoreEquipmentDTO that = (StoreEquipmentDTO) o; + return Objects.equals(pointCode, that.pointCode); + } + + @Override + public int hashCode() { + return Objects.hashCode(pointCode); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreRequestDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreRequestDTO.java new file mode 100644 index 000000000..5a22c8095 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreRequestDTO.java @@ -0,0 +1,40 @@ +package com.cool.store.dto.huoma; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/8/18 16:00 + * @Version 1.0 + */ +@Data +public class StoreRequestDTO { + + private String reportCode; + + private Integer index; + + private Integer size; + + private Params params; + + public StoreRequestDTO(String reportCode, Integer index, Integer size, String shopCode) { + this.reportCode = reportCode; + this.index = index; + this.size = size; + this.params = new Params(shopCode); + } + + @Data + static class Params{ + private String inputText_2; + + public Params(String inputText_2) { + this.inputText_2 = inputText_2; + } + } + + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreXinFaDetailRequestDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreXinFaDetailRequestDTO.java new file mode 100644 index 000000000..4e30a38ef --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreXinFaDetailRequestDTO.java @@ -0,0 +1,24 @@ +package com.cool.store.dto.huoma; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/8/18 16:38 + * @Version 1.0 + */ +@Data +public class StoreXinFaDetailRequestDTO { + + private Integer index; + + private Integer size; + + private Integer pointId; + + public StoreXinFaDetailRequestDTO(Integer index, Integer size, Integer pointId) { + this.index = index; + this.size = size; + this.pointId = pointId; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreXinFaDeviceDetail.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreXinFaDeviceDetail.java new file mode 100644 index 000000000..7ebf36201 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/StoreXinFaDeviceDetail.java @@ -0,0 +1,81 @@ +package com.cool.store.dto.huoma; + +import com.alibaba.fastjson.parser.DefaultJSONParser; +import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; +import com.cool.store.utils.BrowserVersionUtils; +import com.cool.store.utils.StringUtil; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.lang.reflect.Type; + +/** + * @Author suzhuhong + * @Date 2025/8/18 16:27 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class StoreXinFaDeviceDetail { + + /** + * 设备ID + */ + @ApiModelProperty(value = "设备ID") + private String id; + + @ApiModelProperty("设备id") + private String deviceId; + + /** + * 设备名称 + */ + @ApiModelProperty(value = "设备名称") + private String name; + + /** + * 设备连接状态 0:未连接 1:已连接 + */ + @ApiModelProperty(value = "设备连接状态 false:未连接 true:已连接") + private Boolean isConnect; + + /** + * 设备总内存 + */ + @ApiModelProperty(value = "设备总内存") + private String totalRam; + + /** + * 设备可用内存 + */ + @ApiModelProperty(value = "设备可用内存") + private String availRam; + + /** + * 设备浏览器信息 + */ + @ApiModelProperty(value = "设备浏览器信息") + private String userAgent; + + /** + * 内用内存小于300M 或者 浏览器版本小于60 + */ + @ApiModelProperty(value = "内用内存小于300M 或者 浏览器版本小于60") + private Boolean flag; + + public boolean getFlag() { + if (StringUtil.isEmpty(availRam)||StringUtil.isEmpty(userAgent)){ + return false; + } + try { + Boolean isOldChromeBrowser = BrowserVersionUtils.isOldChromeBrowser(userAgent); + long availableMemoryMB = Long.parseLong(availRam) / (1024 * 1024); + return availableMemoryMB < 300 || isOldChromeBrowser; + } catch (NumberFormatException e) { + return false; + } + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/TagDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/TagDTO.java new file mode 100644 index 000000000..6752e601a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/TagDTO.java @@ -0,0 +1,29 @@ +package com.cool.store.dto.huoma; + +import io.swagger.models.auth.In; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/5 9:33 + * @Version 1.0 + */ +@Data +public class TagDTO { + + private String channelType; + + private Integer index; + + private Integer size; + + private String type; + + public TagDTO(String channelType, Integer index, Integer size, String type) { + this.channelType = channelType; + this.index = index; + this.size = size; + this.type = type; + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/TagDetailDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/TagDetailDTO.java new file mode 100644 index 000000000..5274fb05d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/huoma/TagDetailDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto.huoma; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/5 9:41 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class TagDetailDTO { + + @ApiModelProperty("标签Id") + private Integer id; + + @ApiModelProperty("标签名称") + private String name; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java new file mode 100644 index 000000000..e309d2826 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.login; + +import com.cool.store.enums.LoginTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 登录DTO + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Data +public class UserLoginDTO { + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("密码") + private String password; + + @NotNull(message = "登录类型不能为空") + private LoginTypeEnum loginType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java new file mode 100644 index 000000000..acfa484c3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java @@ -0,0 +1,18 @@ +package com.cool.store.dto.login; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * RefreshToken登录DTO + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Data +public class UserRefreshLoginDTO { + @ApiModelProperty("RefreshToken") + private String refreshToken; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/notice/NoticeDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/notice/NoticeDTO.java index 76f35729e..acfc00cbb 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/notice/NoticeDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/notice/NoticeDTO.java @@ -75,4 +75,12 @@ public class NoticeDTO { @ApiModelProperty("发布人时间") private Date publishTime; + private String handlePersonInfo; + + private String storeInfo; + + private Integer jumpType; + + private String jumpUrl; + } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/LaunchDataDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/LaunchDataDTO.java new file mode 100644 index 000000000..90eb0e210 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/LaunchDataDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 服务包菜品数据 + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@Data +public class LaunchDataDTO { + @ApiModelProperty("名称") + private String spName; + + @ApiModelProperty("上新时间,yyyy-MM-dd") + private String upSaleDate; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RecipeLaunchDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RecipeLaunchDTO.java new file mode 100644 index 000000000..47a0179ba --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RecipeLaunchDTO.java @@ -0,0 +1,34 @@ +package com.cool.store.dto.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 菜品上新DTO + *

+ * + * @author wangff + * @since 2025/11/3 + */ +@Data +public class RecipeLaunchDTO { + @ApiModelProperty("商品编码") + private String goodsCode; + + @ApiModelProperty("商品图片") + private String goodsImageUrl; + + @ApiModelProperty("商品名称") + private String goodsName; + + @ApiModelProperty("上新时间") + private String launchTime; + + @ApiModelProperty("单日最高销量") + private Integer maxQty; + + @ApiModelProperty("销量总计") + private Integer sumQty; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RecipeSpLaunchDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RecipeSpLaunchDTO.java new file mode 100644 index 000000000..ffec16435 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RecipeSpLaunchDTO.java @@ -0,0 +1,23 @@ +package com.cool.store.dto.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 服务包菜品上新DTO + *

+ * + * @author wangff + * @since 2025/11/3 + */ +@Data +public class RecipeSpLaunchDTO { + @ApiModelProperty("菜品上新记录") + private List recipeRecordList; + + @ApiModelProperty("服务包执行记录") + private List spRecordList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RevenueDataDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RevenueDataDTO.java new file mode 100644 index 000000000..8a92a1c61 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RevenueDataDTO.java @@ -0,0 +1,44 @@ +package com.cool.store.dto.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 营收数据 + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@Data +public class RevenueDataDTO { + @ApiModelProperty("门店编码") + private String storeCode; + + @ApiModelProperty("营业额") + private BigDecimal amt; + + @ApiModelProperty("实收") + private BigDecimal receivedAmt; + + @ApiModelProperty("外卖实收") + private BigDecimal takeoutReceivedAmt; + + @ApiModelProperty("堂食实收") + private BigDecimal dineInReceivedAmt; + + @ApiModelProperty("营业时间,yyyy-MM-dd") + private String businessDate; + + @ApiModelProperty("服务包列表") + private List otherLaunchDates; + + @ApiModelProperty("菜品列表") + private List otherRecipeLaunchDates; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RevenueDataQueryDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RevenueDataQueryDTO.java new file mode 100644 index 000000000..56587568c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/RevenueDataQueryDTO.java @@ -0,0 +1,28 @@ +package com.cool.store.dto.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 营收数据查询DTO + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RevenueDataQueryDTO { + @ApiModelProperty("门店编码") + private String storeCode; + + @ApiModelProperty("业务时间开始") + private String businessDateFrom; + + @ApiModelProperty("业务时间结束") + private String businessDateTo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/ServicePackageExecuteDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/ServicePackageExecuteDTO.java new file mode 100644 index 000000000..b80308180 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/recipe/ServicePackageExecuteDTO.java @@ -0,0 +1,30 @@ +package com.cool.store.dto.recipe; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 服务包执行DTO + *

+ * + * @author wangff + * @since 2025/11/3 + */ +@Data +public class ServicePackageExecuteDTO { + @ApiModelProperty("服务包执行时间") + private String executeTime; + + @ApiModelProperty("服务包图片") + private String spImage; + + @ApiModelProperty("服务包名称") + private String spName; + + @ApiModelProperty("服务包id") + @JsonSerialize(using = ToStringSerializer.class) + private Long spId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java new file mode 100644 index 000000000..ed3f0aa40 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + *

+ * 门店最新订货时间DTO + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StoreOrderTimeDTO { + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("最新订货时间") + private Date latestOrderTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserDTO.java index 9ea6811b7..33104e47a 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserDTO.java @@ -1,6 +1,7 @@ package com.cool.store.dto.store; import lombok.Data; +import lombok.NoArgsConstructor; /** * @Author suzhuhong @@ -8,6 +9,7 @@ import lombok.Data; * @Version 1.0 */ @Data +@NoArgsConstructor public class StoreUserDTO { private String userId; @@ -18,4 +20,8 @@ public class StoreUserDTO { private String positionName; + public StoreUserDTO(String userName, String mobile) { + this.userName = userName; + this.mobile = mobile; + } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java index 69ed9ed5d..bcbd776bb 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java @@ -18,6 +18,8 @@ public class StoreUserPositionDTO { private String shopCode; + private String storeCode; + List userList; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java new file mode 100644 index 000000000..f9cdf6e0c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto.store; + +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/25 15:37 + * @Version 1.0 + */ +@Data +public class StoreUserUpdateDTO { + + private String storeCode; + + List userList; + + @Data + class UserDTO { + + private String userName; + + private String mobile; + + private String positionName; + + } + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountActiveUrlDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountActiveUrlDTO.java new file mode 100644 index 000000000..aef265344 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountActiveUrlDTO.java @@ -0,0 +1,20 @@ +package com.cool.store.dto.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/18 17:55 + * @Version 1.0 + */ +@Data +public class AccountActiveUrlDTO { + @ApiModelProperty(value = "商户门店编号",required = true) + private String outStoreId; + @ApiModelProperty(value = "H5 激活页短链(商户需访问此链接完成操作,非公网可直接访问需确认权限)",required = true) + private String activateUrl; + @ApiModelProperty(value = "短链失效时间(格式:YYYY-MM-DD HH:mm:ss,过期后需重新调用接口生成)",required = true) + private String expireTime; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountAuthenticationDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountAuthenticationDTO.java new file mode 100644 index 000000000..bde8f4c5a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountAuthenticationDTO.java @@ -0,0 +1,17 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 16:06 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AccountAuthenticationDTO { + + private Integer accountStatus; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountInfoDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountInfoDTO.java new file mode 100644 index 000000000..84069a95c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountInfoDTO.java @@ -0,0 +1,89 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 门店签约人账户 + * @Author suzhuhong + * @Date 2025/11/13 16:54 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AccountInfoDTO { + + @ApiModelProperty(value = "结算卡业务类型 枚举值:1:对公 2:对私", required = true) + private Integer accountType; + + @ApiModelProperty(value = "营业执照号码") + private String licenseNo; + + @ApiModelProperty(value = "工商注册名称") + private String licenseName; + + @ApiModelProperty(value = "法人姓名") + private String legalName; + + @ApiModelProperty(value = "法人证件号码") + private String legalNo; + + @ApiModelProperty(value = "法人联系电话") + private String legalPhone; + + @ApiModelProperty(value = "门店编号", required = true) + private String storeSn; + + @ApiModelProperty(value = "账户编号", required = true) + private String accountNo; + + @ApiModelProperty(value = "账户名称", required = true) + private String accountName; + + @ApiModelProperty(value = "账户别名", required = true) + private String accountAliasName; + + @ApiModelProperty(value = "结算银行卡号", required = true) + private String accountCardNo; + + @ApiModelProperty(value = "结算卡银行预留手机号", required = true) + private String accountPhone; + + @ApiModelProperty(value = "开户支行名称", required = true) + private String bankName; + + @ApiModelProperty(value = "支行编号", required = true) + private String bankNo; + + @ApiModelProperty(value = "总行名称") + private String headBankName; + + @ApiModelProperty(value = "账户状态 1:待提交 2:待鉴权 3:鉴权中 4:开通 5:开通失败", required = true) + private Integer accountStatus; + + @ApiModelProperty(value = "账户余额", required = true) + private String totalAmount; + + @ApiModelProperty(value = "可提现余额", required = true) + private String withdrawAmount; + + @ApiModelProperty(value = "打标状态 0 未打标 1 已打标", required = true) + private Integer labelingStatus; + + @ApiModelProperty(value = "是否签约人账户 0 否 1 是", required = true) + private Integer isLegal; + + @ApiModelProperty("工商类型 1.企业 2.个体工商户 3.小微商户(自然人)") + private Integer businessType; + + @ApiModelProperty("钱包类型 1平安 2网商") + private Integer walletType; + + @ApiModelProperty("失败原因(仅网商在创建失败或激活失败时返回)") + private String errMsg; + + @ApiModelProperty("crm门店id") + private String outStoreId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountNoDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountNoDTO.java new file mode 100644 index 000000000..2dec0858a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountNoDTO.java @@ -0,0 +1,17 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 14:58 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AccountNoDTO { + + private String accountNo; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountPageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountPageDTO.java new file mode 100644 index 000000000..36239e94d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountPageDTO.java @@ -0,0 +1,20 @@ +package com.cool.store.dto.wallet; + +import com.cool.store.request.wallet.WalletBasicPageInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/18 10:12 + * @Version 1.0 + */ +@Data +public class AccountPageDTO { + + private List pageData; + + private WalletBasicPageInfo page; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountVerifyDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountVerifyDTO.java new file mode 100644 index 000000000..501545a1d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AccountVerifyDTO.java @@ -0,0 +1,19 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 16:09 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AccountVerifyDTO { + + private String outStoreId; + + private Integer openStatus; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AddTagDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AddTagDTO.java new file mode 100644 index 000000000..3fc4b9a98 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/AddTagDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 14:59 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AddTagDTO { + + private Integer status; + + private Integer addTagType; + + @ApiModelProperty("网商状态,1.打标成功 2.打标失败 3.处理中") + private Integer wsStatus; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BankDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BankDTO.java new file mode 100644 index 000000000..221953dfa --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BankDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 10:54 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BankDTO { + + @ApiModelProperty("银行编号") + private String headCode; + @ApiModelProperty("银行名称") + private String headName; + @ApiModelProperty("支行号") + private String branchCode; + @ApiModelProperty("支行名称") + private String branchName; + @ApiModelProperty("支行地址") + private String branchAddress; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BankListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BankListDTO.java new file mode 100644 index 000000000..f6ffec419 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BankListDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto.wallet; + +import com.cool.store.request.wallet.WalletBasicPageInfo; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/13 14:36 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BankListDTO { + + WalletBasicPageInfo page; + + List pageData; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillDTO.java new file mode 100644 index 000000000..a175c4bae --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillDTO.java @@ -0,0 +1,84 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 10:31 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BillDTO { + + /** + * 业务系统付款单号(如 CRM 单号) + */ + private String reqNo; + + /** + * 交易Id(营帐通) + */ + private Long tradeId; + + /** + * 交易编号(扫呗) + */ + private String outTradeNo; + + /** + * 费用科目 + */ + private Integer feeItemId; + + /** + * 费用科目名称 + */ + private String feeItemName; + + /** + * 门店账户编号 + */ + private String storeAccountNo; + + /** + * 公司编号 + */ + private String companyCode; + + /** + * 公司账户编号 + */ + private String companyAccountNo; + + /** + * 提现银行卡 + */ + private String withdrawalBankCradNo; + + /** + * 提现银行卡户名 + */ + private String withdrawalBankCradName; + + /** + * 金额(元) + */ + private String amount; + + /** + * 交易状态 1.成功 2.失败 3.处理中 + */ + private Integer tradeStatus; + + /** + * 交易类型 1.转账 2.提现 + */ + private Integer tradeType; + + /** + * 交易发起时间 + */ + private String createTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillDetailDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillDetailDTO.java new file mode 100644 index 000000000..5a007ebfb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillDetailDTO.java @@ -0,0 +1,100 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 10:09 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BillDetailDTO { + + /** + * 外部门店唯一标识 + */ + private String outStoreId; + + /** + * 业务系统付款单号(如 CRM 单号) + */ + private String reqNo; + + /** + * 交易Id(营帐通) + */ + private Long tradeId; + + /** + * 交易编号(扫呗) + */ + private String outTradeNo; + + /** + * 交易科目 + */ + private Integer feeItemId; + + /** + * 费用科目名称 + */ + private String feeItemName; + + /** + * 门店账户编号 + */ + private String storeAccountNo; + + /** + * 交易对方账户编号 + */ + private String transAccountNo; + + /** + * 交易对方账户名称 + */ + private String transAccountName; + + /** + * 公司编号 + */ + private String companyCode; + + /** + * 公司账户编号 + */ + private String companyAccountNo; + + /** + * 提现银行卡 + */ + private String withdrawalBankCardNo; + + /** + * 提现银行卡户名 + */ + private String withdrawalBankCardName; + + /** + * 金额(元) + */ + private String amount; + + /** + * 交易状态 1.成功 2.失败 3.处理中 + */ + private Integer tradeStatus; + + /** + * 交易类型 1.转账 2.提现 + */ + private Integer tradeType; + + /** + * 交易发起时间 + */ + private String createTime; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillPageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillPageDTO.java new file mode 100644 index 000000000..1c0ae682e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/BillPageDTO.java @@ -0,0 +1,33 @@ +package com.cool.store.dto.wallet; + +import com.cool.store.request.wallet.WalletBasicPageInfo; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 交易列表DTO + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BillPageDTO { + private List pageData; + + private WalletBasicPageInfo page; + + /** + * 收入 + */ + private Long getAmount; + + /** + * 支出 + */ + private Long useAmount; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/CompanyDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/CompanyDTO.java new file mode 100644 index 000000000..18aa95d27 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/CompanyDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 10:34 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class CompanyDTO { + + @ApiModelProperty(value = "公司编号") + private String companyCode; + + @ApiModelProperty(value = "公司名称") + private String companyName; + + @ApiModelProperty(value = "公司账户") + private String companyAccountNo; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/CompanyListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/CompanyListDTO.java new file mode 100644 index 000000000..26dba0dd6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/CompanyListDTO.java @@ -0,0 +1,23 @@ +package com.cool.store.dto.wallet; + +import com.cool.store.request.wallet.WalletBasicPageInfo; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/14 10:57 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class CompanyListDTO { + + private List pageData; + + private WalletBasicPageInfo page; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/LargePaymentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/LargePaymentDTO.java new file mode 100644 index 000000000..48cf39f83 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/LargePaymentDTO.java @@ -0,0 +1,55 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 17:15 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class LargePaymentDTO { + + @ApiModelProperty(value = "外部门店唯一标识", required = true) + private String outStoreId; + + @ApiModelProperty(value = "请求预支付Id", required = true) + private String paymentId; + + @ApiModelProperty(value = "收款码唯一流水号", required = true) + private String transOrderTrace; + + @ApiModelProperty(value = "付款人账户编号", required = true) + private String payerAcctNo; + + @ApiModelProperty(value = "付款人户名", required = true) + private String payerAcctName; + + @ApiModelProperty(value = "付款银行名称") + private String payerBankName; + + @ApiModelProperty(value = "付款银行行号") + private String payerBankNo; + + @ApiModelProperty(value = "充值金额", required = true) + private String amt; + + @ApiModelProperty(value = "收款账号", required = true) + private String payeeAccNo; + + @ApiModelProperty(value = "收款账户名称", required = true) + private String payeeAccName; + + @ApiModelProperty(value = "收款银行名称", required = true) + private String payeeBankName; + + @ApiModelProperty(value = "收款银行行号", required = true) + private String payeeBankNo; + + @ApiModelProperty(value = "账号过期时间") + private String expireTime; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/OpenBasicInfoDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/OpenBasicInfoDTO.java new file mode 100644 index 000000000..75426047d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/OpenBasicInfoDTO.java @@ -0,0 +1,116 @@ +package com.cool.store.dto.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 开通网商需要的基本信息 + * @Author suzhuhong + * @Date 2025/11/20 10:49 + * @Version 1.0 + */ +@Data +public class OpenBasicInfoDTO { + + @ApiModelProperty(value = "门店编号") + private String storeCode; + + @ApiModelProperty("门店id") + private String storeId; + + /** + * 签约人名称 + */ + @ApiModelProperty(value = "签约人名称") + private String signerName; + + /** + * 签约人身份证号码 + */ + @ApiModelProperty(value = "签约人身份证号码") + private String signerIdCard; + + /** + * 签约人手机号 + */ + @ApiModelProperty(value = "签约人手机号") + private String signerPhone; + + /** + * 签约人身份证正面 + */ + @ApiModelProperty(value = "签约人身份证正面") + private String signerIdCardFront; + + /** + * 签约人身份证反面 + */ + @ApiModelProperty(value = "签约人身份证反面") + private String signerIdCardBack; + + /** + * 营业执照名字 + */ + @ApiModelProperty(value = "营业执照名字") + private String businessLicenseName; + + /** + * 营业执照社会信用代码 + */ + @ApiModelProperty(value = "营业执照社会信用代码") + private String businessLicenseCode; + + /** + * 营业执照照片 + */ + @ApiModelProperty(value = "营业执照照片") + private String businessLicensePhoto; + + /** + * 法人是否签约人 + */ + @ApiModelProperty(value = "法人是否签约人") + private Integer legalIsSigner; + + /** + * 法人身份证正面 + */ + @ApiModelProperty(value = "法人身份证正面") + private String legalIdCardFront; + + /** + * 法人身份证反面 + */ + @ApiModelProperty(value = "法人身份证反面") + private String legalIdCardBack; + + /** + * 结算卡 + */ + @ApiModelProperty(value = "结算卡") + private String settlementCard; + + /** + * 开户支行名称 + */ + @ApiModelProperty(value = "开户支行名称") + private String bankBranchName; + + /** + * 开户支行编号 + */ + @ApiModelProperty(value = "开户支行编号") + private String bankBranchCode; + + /** + * 银行预留手机号 + */ + @ApiModelProperty(value = "银行预留手机号") + private String bankReservedPhone; + + @ApiModelProperty("来源,开通流程传1,其他0") + private Integer source; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PasswordDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PasswordDTO.java new file mode 100644 index 000000000..826997b0a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PasswordDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/26 18:14 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class PasswordDTO { + + @ApiModelProperty(value = "密码是否已存在 1.存在 2.不存在", required = true) + private Integer isExist; + + @ApiModelProperty(value = "是否已存在账户 1.存在 2.不存在", required = true) + private Boolean isExistAccount; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PaymentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PaymentDTO.java new file mode 100644 index 000000000..acc9b5a14 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PaymentDTO.java @@ -0,0 +1,76 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Pattern; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/13 18:23 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class PaymentDTO { + + @ApiModelProperty(name = "外部门店唯一标识", required = true) + private String outStoreId; + + @ApiModelProperty(name = "请求预支付Id", required = true) + private String paymentId; + + @ApiModelProperty(name = "收款码唯一流水号", required = true) + private String transOrderTrace; + + @ApiModelProperty(name = "金额", required = true) + private String totalFee; + + @ApiModelProperty(name = "状态:1-成功 2-失败 3-支付中 4-撤销", required = true) + private Integer orderStatus; + + @ApiModelProperty(name = "利楚订单号(商户订单号)") + private String outTradeNo; + + @ApiModelProperty(name = "通道订单号(银行订单号)") + private String channelOrderNo; + + @ApiModelProperty(name = "付款人账号") + private String payerAccNo; + + @ApiModelProperty(name = "付款人户名") + private String payerAccName; + + @ApiModelProperty(name = "付款人银行名称") + private String payerBankName; + + @ApiModelProperty(name = "付款银行行号") + private String payerBankNo; + + @ApiModelProperty(name = "收款账号", required = true) + private String payeeAccNo; + + @ApiModelProperty(name = "收款账户名称", required = true) + private String payeeAccName; + + @ApiModelProperty(name = "收款银行名称", required = true) + private String payeeBankName; + + @ApiModelProperty(name = "收款银行行号", required = true) + private String payeeBankNo; + + @ApiModelProperty(name = "账号过期时间") + private String expireTime; + + @ApiModelProperty(name = "创建时间") + private String createTime; + + @ApiModelProperty(name = "付款明细") + private List payList; + + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PaymentDetailDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PaymentDetailDTO.java new file mode 100644 index 000000000..4cd9c03d8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/PaymentDetailDTO.java @@ -0,0 +1,34 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 17:38 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class PaymentDetailDTO { + + @ApiModelProperty(value = "打款金额", required = true) + private String tranAmt; + + @ApiModelProperty(value = "付款人账号", required = true) + private String payerAccountName; + + @ApiModelProperty(value = "付款时间", required = true) + private String paySuccessTime; + + @ApiModelProperty(value = "付款银行账号", required = true) + private String payerAccountBankNo; + + @ApiModelProperty(value = "银行受理时间", required = true) + private String tranSeqNo; + + @ApiModelProperty(value = "付款账号", required = true) + private String payerAccountNo; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/StoreAccountDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/StoreAccountDTO.java new file mode 100644 index 000000000..7f3fd0dbb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/StoreAccountDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 14:54 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class StoreAccountDTO { + + /** + * 营帐通的账户ID + */ + private String accountNo; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/StoreIdDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/StoreIdDTO.java new file mode 100644 index 000000000..116d2df3a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/StoreIdDTO.java @@ -0,0 +1,16 @@ +package com.cool.store.dto.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/18 18:20 + * @Version 1.0 + */ +@Data +public class StoreIdDTO { + @ApiModelProperty(value = "商户门店编号",required = true) + private String outStoreId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TextMsgSendDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TextMsgSendDTO.java new file mode 100644 index 000000000..23f917626 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TextMsgSendDTO.java @@ -0,0 +1,24 @@ +package com.cool.store.dto.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 网商激活短链DTO + *

+ * + * @author wangff + * @since 2025/11/20 + */ +@Data +public class TextMsgSendDTO { + @ApiModelProperty("crm门店id") + private String outStoreId; + + @ApiModelProperty("H5 激活页短链(商户需访问此链接完成操作,非公网可直接访问需确认权限)") + private String activityUrl; + + @ApiModelProperty("短链失效时间(格式:YYYY-MM-DD HH:mm:ss,过期后需重新调用接口生成)") + private String expireTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TradeRecordDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TradeRecordDTO.java new file mode 100644 index 000000000..7ba7ac5a9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TradeRecordDTO.java @@ -0,0 +1,80 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author suzhuhong + * @Date 2025/11/19 11:14 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class TradeRecordDTO implements Serializable { + + @ApiModelProperty(value = "业务系统付款单号(如 CRM 单号)", required = true) + private String reqNo; + + @ApiModelProperty(value = "交易(营帐通)", required = true) + private Long tradeId; + + @ApiModelProperty(value = "交易流水号(扫呗)", required = true) + private String outTradeNo; + + @ApiModelProperty(value = "费用科目", required = true) + private Integer feeItemId; + + @ApiModelProperty(value = "费用科目名称", required = true) + private String feeItemName; + + @ApiModelProperty(value = "转出方门店编号") + private String outStoreCode; + + @ApiModelProperty(value = "转入方门店编号") + private String inStoreCode; + + @ApiModelProperty(value = "转出方门店名称") + private String outStoreName; + + @ApiModelProperty(value = "转入方门店名称") + private String inStoreName; + + @ApiModelProperty(value = "转出方账户编号") + private String outAccountNo; + + @ApiModelProperty(value = "转入方账户编号") + private String inAccountNo; + + @ApiModelProperty(value = "转出方账户名称") + private String outAccountName; + + @ApiModelProperty(value = "转入方账户名称") + private String inAccountName; + + @ApiModelProperty(value = "提现银行卡号") + private String withdrawalBankCardNo; + + @ApiModelProperty(value = "提现银行卡户名") + private String withdrawalBankCardName; + + @ApiModelProperty(value = "金额(元)", required = true) + private String amount; + + @ApiModelProperty(value = "交易状态1.成功 2.失败 3.处理中 4.已退款", required = true) + private Integer tradeStatus; + + @ApiModelProperty(value = "1.转账2.提现 交易类型", required = true) + private Integer tradeType; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "错误原因") + private String errMsg; + + @ApiModelProperty(value = "交易发起时间YYYY-MM-DD HH:MM:SS", required = true) + private String createTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TradeRecordListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TradeRecordListDTO.java new file mode 100644 index 000000000..97b5899c4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TradeRecordListDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto.wallet; + +import com.cool.store.request.wallet.WalletBasicPageInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/19 11:15 + * @Version 1.0 + */ +@Data +public class TradeRecordListDTO { + + private List pageData; + + + private WalletBasicPageInfo page; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TransferDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TransferDTO.java new file mode 100644 index 000000000..563a2aea2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/TransferDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 9:49 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class TransferDTO { + + @ApiModelProperty(value="业务系统付款单号(如 CRM 单号)",required = true) + private String reqNo; + @ApiModelProperty(value="转账交易Id",required = true) + private Long tradeId; + @ApiModelProperty(value="金额(元)",required = true) + private String amount; + @ApiModelProperty(value="交易状态1.成功 2.失败 3.处理中",required = true) + private Integer tradeStatus; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithDrawerDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithDrawerDTO.java new file mode 100644 index 000000000..820d2b696 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithDrawerDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 9:59 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class WithDrawerDTO { + + @ApiModelProperty(value = "门店ID",required = true) + private String outStoreId; + @ApiModelProperty(value = "业务系统付款单号(如 CRM 单号)",required = true) + private String reqNo; + @ApiModelProperty(value = "转账交易Id(营帐通系统)",required = true) + private String tradeId; + @ApiModelProperty(value = "提现科目",required = true) + private Long feeItemId; + @ApiModelProperty(value = "提现账户编号",required = true) + private String accountNo; + @ApiModelProperty(value = "金额(元)",required = true) + private String amount; + @ApiModelProperty(value = "交易状态1.成功 2.失败 3.处理中",required = true) + private String tradeStatus; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/AccessTokenDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/AccessTokenDTO.java new file mode 100644 index 000000000..2b046715e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/AccessTokenDTO.java @@ -0,0 +1,17 @@ +package com.cool.store.dto.wechat; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/10/10 15:01 + * @Version 1.0 + */ +@Data +public class AccessTokenDTO { + + private String access_token; + + private Integer expires_in; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/CallbackMessageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/CallbackMessageDTO.java new file mode 100644 index 000000000..1bb7755dd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/CallbackMessageDTO.java @@ -0,0 +1,26 @@ +package com.cool.store.dto.wechat; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/10/14 14:39 + * @Version 1.0 + */ +@Data +public class CallbackMessageDTO { + + private String toUserName; + + private String fromUserName; + + private Long createTime; + + private String msgType; + + private String event; + + private String eventKey; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/ServiceAccountOpenIdDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/ServiceAccountOpenIdDTO.java new file mode 100644 index 000000000..425ba9021 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/ServiceAccountOpenIdDTO.java @@ -0,0 +1,23 @@ +package com.cool.store.dto.wechat; + +import lombok.Data; + +import java.util.Date; + +/** + * @Author suzhuhong + * @Date 2025/10/16 14:13 + * @Version 1.0 + */ +@Data +public class ServiceAccountOpenIdDTO { + + private String partnerId; + + private String unionId; + + private String serviceAccountOpenId; + + private Date lastUpdateTime; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/WechatTemplateMessageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/WechatTemplateMessageDTO.java new file mode 100644 index 000000000..33f7a681a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/WechatTemplateMessageDTO.java @@ -0,0 +1,90 @@ +package com.cool.store.dto.wechat; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Map; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:36 + * @Version 1.0 + */ +@Data +public class WechatTemplateMessageDTO { + + /** + * 接收者openid + */ + @JsonProperty("touser") + private String toUser; + + /** + * 模板ID + */ + @JsonProperty("template_id") + private String templateId; + + /** + * 模板跳转链接(非必须) + */ + private String url; + + /** + * 跳小程序所需数据,不需跳小程序可不用传该数据 + */ + private MiniprogramDTO miniprogram; + + /** + * 模板数据 + */ + private Map data; + + /** + * 小程序跳转DTO + */ + @Data + public static class MiniprogramDTO { + + /** + * 所需跳转到的小程序appid + */ + private String appid; + + /** + * 所需跳转到小程序的具体页面路径,支持带参数 + */ + private String pagepath; + } + + /** + * 模板数据项DTO + */ + @Data + public static class TemplateDataItemDTO { + + /** + * 模板内容 + */ + private String value; + + /** + * 模板内容字体颜色,不填默认为黑色 + */ + private String color; + + public TemplateDataItemDTO() { + } + + public TemplateDataItemDTO(String value) { + this.value = value; + this.color = "#333333"; + } + + public TemplateDataItemDTO(String value, String color) { + this.value = value; + this.color = color; + } + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/WechatUserInfoDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/WechatUserInfoDTO.java new file mode 100644 index 000000000..573ef562e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wechat/WechatUserInfoDTO.java @@ -0,0 +1,115 @@ +package com.cool.store.dto.wechat; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/10/15 9:56 + * @Version 1.0 + */ +@Data +public class WechatUserInfoDTO { + /** + * 用户是否订阅该公众号标识 + * 0代表未关注,1代表关注 + */ + private Integer subscribe; + + /** + * 用户的标识,对当前公众号唯一 + */ + private String openid; + + /** + * 用户的昵称 + */ + private String nickname; + + /** + * 用户的性别 + * 1为男性,2为女性,0为未知 + */ + private Integer sex; + + /** + * 用户所在城市 + */ + private String city; + + /** + * 用户所在国家 + */ + private String country; + + /** + * 用户所在省份 + */ + private String province; + + /** + * 用户的语言 + * 简体中文为zh_CN + */ + private String language; + + /** + * 用户头像 + */ + private String headimgurl; + + /** + * 用户关注时间,为时间戳 + */ + @JsonProperty("subscribe_time") + private Long subscribeTime; + + /** + * 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 + */ + private String unionid; + + /** + * 公众号运营者对粉丝的备注 + */ + private String remark; + + /** + * 用户所在的分组ID(兼容旧的用户分组接口) + */ + private Integer groupid; + + /** + * 用户被打上的标签ID列表 + */ + @JsonProperty("tagid_list") + private List tagidList; + + /** + * 返回用户关注的渠道来源 + */ + @JsonProperty("subscribe_scene") + private String subscribeScene; + + /** + * 二维码扫码场景(开发者自定义) + */ + @JsonProperty("qr_scene") + private Long qrScene; + + /** + * 二维码扫码场景描述(开发者自定义) + */ + @JsonProperty("qr_scene_str") + private String qrSceneStr; + + /** + * 是否已关注 + */ + public boolean isSubscribed() { + return subscribe != null && subscribe == 1; + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wx/MiniProgramFreeLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wx/MiniProgramFreeLoginDTO.java new file mode 100644 index 000000000..14041c0ca --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wx/MiniProgramFreeLoginDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.wx; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * 小程序免登DTO + *

+ * + * @author wangff + * @since 2025/9/18 + */ +@Data +public class MiniProgramFreeLoginDTO { + @ApiModelProperty("手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/BigRegionDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/BigRegionDO.java index 395574881..3d1b91047 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/BigRegionDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/BigRegionDO.java @@ -70,6 +70,12 @@ public class BigRegionDO { @Column(name = "hqt_region_name") private String hqtRegionName; + /** + * 加盟品牌 + */ + @Column(name = "join_brand") + private Integer joinBrand; + public String getHqtRegionName() { return hqtRegionName; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java index cf19521de..45fc4eb20 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java @@ -5,7 +5,10 @@ import java.io.Serializable; import java.util.Date; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.persistence.*; @@ -18,6 +21,9 @@ import javax.validation.constraints.NotBlank; */ @Table(name = "xfsg_build_information") @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class BuildInformationDO { @Id diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java index e1bb2f98c..648836e45 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java @@ -72,4 +72,8 @@ public class FranchiseFeeDO { @ApiModelProperty("新管家已缴金额") private BigDecimal xgjFeesPaid; + @Column(name = "cashier_fee") + @ApiModelProperty("收银费(系统费)") + private String cashierFee; + } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/MessageTemplateDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/MessageTemplateDO.java index fc0f7b28b..578191ad3 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/MessageTemplateDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/MessageTemplateDO.java @@ -151,5 +151,13 @@ public class MessageTemplateDO { @Column(name = "store_info") private String storeInfo; + @Column(name = "jump_type") + private Integer jumpType; + @Column(name = "jump_url") + private String jumpUrl; + + @Column(name = "handle_keyword") + private String handleKeyword; + } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/OldShopDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/OldShopDO.java index ed7fcc93b..17aca56b2 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/OldShopDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/OldShopDO.java @@ -1,13 +1,19 @@ package com.cool.store.entity; import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.Date; @Data @Table(name = "xfsg_old_shop") +@AllArgsConstructor +@NoArgsConstructor +@Builder public class OldShopDO { /** diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/OrderSysInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/OrderSysInfoDO.java index fcf946e2d..1c24e6dbe 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/OrderSysInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/OrderSysInfoDO.java @@ -117,4 +117,8 @@ public class OrderSysInfoDO { /** 总部订货收款修改人 */ @Column(name = "receiving_update_user") private String receivingUpdateUser; + + /** 订货方式,0先款后货、1先货后款 */ + @Column(name = "order_type") + private Integer orderType; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/PartnerUserWechatBindDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/PartnerUserWechatBindDO.java index f3496136a..79eabd0c4 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/PartnerUserWechatBindDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/PartnerUserWechatBindDO.java @@ -36,6 +36,10 @@ public class PartnerUserWechatBindDO implements Serializable { */ private String partnerId; + private String unionId; + + private String serviceAccountOpenId; + /** * 创建时间 */ diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java index 54b6a0f0f..4c11a5798 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java @@ -158,4 +158,7 @@ public class ShopInfoDO { //红圈通门店id @Column(name = "hqt_shop_id") private String hqtShopId; + // 门店id + @Column(name = "store_id") + private String storeId; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/StoreDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/StoreDO.java index 83572294e..35c9d2a9e 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/StoreDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/StoreDO.java @@ -238,5 +238,31 @@ public class StoreDO { private String miniProgramOrderStoreName; + /** + * 是否接入物联网 + */ + private Integer isIot; + + /** + * 收件人 + */ + private String addresseeName; + + /** + * 手机号 + */ + private String addresseeMobile; + + /** + * 收件省市区 + */ + private String addresseeArea; + + /** + * 收件详细地址 + */ + private String addresseeAddress; + + private Long branch; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/DecorationTeamConfigDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/DecorationTeamConfigDO.java new file mode 100644 index 000000000..718b81d42 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/DecorationTeamConfigDO.java @@ -0,0 +1,168 @@ +package com.cool.store.entity.decoration; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_decoration_team_config") +public class DecorationTeamConfigDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 团队名称 + */ + @Column(name = "team_name") + private String teamName; + + /** + * 团队编号 + */ + @Column(name = "team_code") + private String teamCode; + + /** + * 使用系统(1-CRM,2-红圈通) + */ + @Column(name = "use_system") + private Integer useSystem; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 删除状态(0-正常,1-删除) + */ + private Integer deleted; + + /** + * @return id + */ + public Long getId() { + return id; + } + + /** + * @param id + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 获取团队名称 + * + * @return team_name - 团队名称 + */ + public String getTeamName() { + return teamName; + } + + /** + * 设置团队名称 + * + * @param teamName 团队名称 + */ + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + /** + * 获取团队编号 + * + * @return team_code - 团队编号 + */ + public String getTeamCode() { + return teamCode; + } + + /** + * 设置团队编号 + * + * @param teamCode 团队编号 + */ + public void setTeamCode(String teamCode) { + this.teamCode = teamCode; + } + + /** + * 获取使用系统(1-CRM,2-红圈通) + * + * @return use_system - 使用系统(1-CRM,2-红圈通) + */ + public Integer getUseSystem() { + return useSystem; + } + + /** + * 设置使用系统(1-CRM,2-红圈通) + * + * @param useSystem 使用系统(1-CRM,2-红圈通) + */ + public void setUseSystem(Integer useSystem) { + this.useSystem = useSystem; + } + + /** + * 获取创建时间 + * + * @return create_time - 创建时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 设置创建时间 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 获取更新时间 + * + * @return update_time - 更新时间 + */ + public Date getUpdateTime() { + return updateTime; + } + + /** + * 设置更新时间 + * + * @param updateTime 更新时间 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + /** + * 获取删除状态(0-正常,1-删除) + * + * @return deleted - 删除状态(0-正常,1-删除) + */ + public Integer getDeleted() { + return deleted; + } + + /** + * 设置删除状态(0-正常,1-删除) + * + * @param deleted 删除状态(0-正常,1-删除) + */ + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/ShopDecorationAssignDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/ShopDecorationAssignDO.java new file mode 100644 index 000000000..b2e45d82e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/ShopDecorationAssignDO.java @@ -0,0 +1,145 @@ +package com.cool.store.entity.decoration; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_shop_decoration_assign") +public class ShopDecorationAssignDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 装修团队id + */ + @Column(name = "shop_id") + private Long shopId; + + /** + * 分配状态(0-待分配,1-已分配) + */ + @Column(name = "decoration_desc_status") + private Integer decorationDescStatus; + + /** + * 装修团队id + */ + @Column(name = "decoration_team_id") + private Long decorationTeamId; + + /** + * 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; + + /** + * @return id + */ + public Long getId() { + return id; + } + + /** + * @param id + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 获取装修团队id + * + * @return shop_id - 装修团队id + */ + public Long getShopId() { + return shopId; + } + + /** + * 设置装修团队id + * + * @param shopId 装修团队id + */ + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + /** + * 获取分配状态(0-待分配,1-已分配) + * + * @return decoration_desc_status - 分配状态(0-待分配,1-已分配) + */ + public Integer getDecorationDescStatus() { + return decorationDescStatus; + } + + /** + * 设置分配状态(0-待分配,1-已分配) + * + * @param decorationDescStatus 分配状态(0-待分配,1-已分配) + */ + public void setDecorationDescStatus(Integer decorationDescStatus) { + this.decorationDescStatus = decorationDescStatus; + } + + /** + * 获取装修团队id + * + * @return decoration_team_id - 装修团队id + */ + public Long getDecorationTeamId() { + return decorationTeamId; + } + + /** + * 设置装修团队id + * + * @param decorationTeamId 装修团队id + */ + public void setDecorationTeamId(Long decorationTeamId) { + this.decorationTeamId = decorationTeamId; + } + + /** + * 获取创建时间 + * + * @return created_time - 创建时间 + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置创建时间 + * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取更新时间 + * + * @return updated_time - 更新时间 + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置更新时间 + * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/TeamAreaMappingDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/TeamAreaMappingDO.java new file mode 100644 index 000000000..028ebf824 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/decoration/TeamAreaMappingDO.java @@ -0,0 +1,97 @@ +package com.cool.store.entity.decoration; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_team_area_mapping") +public class TeamAreaMappingDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 团队ID + */ + @Column(name = "team_id") + private Long teamId; + + /** + * 城市ID + */ + @Column(name = "open_city_id") + private Long openCityId; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * @return id + */ + public Long getId() { + return id; + } + + /** + * @param id + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 获取团队ID + * + * @return team_id - 团队ID + */ + public Long getTeamId() { + return teamId; + } + + /** + * 设置团队ID + * + * @param teamId 团队ID + */ + public void setTeamId(Long teamId) { + this.teamId = teamId; + } + + /** + * 获取城市ID + * + * @return open_city_id - 城市ID + */ + public Long getOpenCityId() { + return openCityId; + } + + /** + * 设置城市ID + * + * @param openCityId 城市ID + */ + public void setOpenCityId(Long openCityId) { + this.openCityId = openCityId; + } + + /** + * 获取创建时间 + * + * @return create_time - 创建时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 设置创建时间 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java new file mode 100644 index 000000000..c8965d44b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java @@ -0,0 +1,33 @@ +package com.cool.store.entity.login; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 用户登录信息 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginDO { + /** + * 用户id + */ + private String userId; + + /** + * 手机号 + */ + private String mobile; + + /** + * 密码 + */ + private String password; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java new file mode 100644 index 000000000..f3518fc6f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java @@ -0,0 +1,63 @@ +package com.cool.store.entity.store; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author wangff + * @date 2025-09-23 11:32 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StoreMasterSignerInfoDO implements Serializable { + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("门店ID") + private String storeId; + + @ApiModelProperty("签约人1姓名") + private String signer1Name; + + @ApiModelProperty("签约人1手机号") + private String signer1Mobile; + + @ApiModelProperty("签约人1身份证号()") + private String signer1IdCardNo; + + @ApiModelProperty("签约人1身份证正面图片路径") + private String signer1IdCardFront; + + @ApiModelProperty("签约人1身份证反面图片路径") + private String signer1IdCardBack; + + @ApiModelProperty("签约人2姓名") + private String signer2Name; + + @ApiModelProperty("签约人2手机号") + private String signer2Mobile; + + @ApiModelProperty("签约人2身份证号()") + private String signer2IdCardNo; + + @ApiModelProperty("签约人2身份证正面图片路径") + private String signer2IdCardFront; + + @ApiModelProperty("签约人2身份证反面图片路径") + private String signer2IdCardBack; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/OpenBankInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/OpenBankInfoDO.java new file mode 100644 index 000000000..529da0b4e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/OpenBankInfoDO.java @@ -0,0 +1,148 @@ +package com.cool.store.entity.wallet; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Table(name = "zxjp_open_bank_info") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OpenBankInfoDO { + /** + * 门店编号 + */ + @Column(name = "store_code") + private String storeCode; + + /** + * 门店id + */ + @Column(name = "store_id") + private String storeId; + + /** + * 签约人名称 + */ + @Column(name = "signer_name") + private String signerName; + + /** + * 签约人身份证号码 + */ + @Column(name = "signer_id_card") + private String signerIdCard; + + /** + * 签约人手机号 + */ + @Column(name = "signer_phone") + private String signerPhone; + + /** + * 签约人身份证正面 + */ + @Column(name = "signer_id_card_front") + private String signerIdCardFront; + + /** + * 签约人身份证反面 + */ + @Column(name = "signer_id_card_back") + private String signerIdCardBack; + + /** + * 营业执照名字 + */ + @Column(name = "business_license_name") + private String businessLicenseName; + + /** + * 营业执照社会信用代码 + */ + @Column(name = "business_license_code") + private String businessLicenseCode; + + /** + * 营业执照照片 + */ + @Column(name = "business_license_photo") + private String businessLicensePhoto; + + /** + * 法人名称 + */ + @Column(name = "legal_name") + private String legalName; + + /** + * 法人身份证号码 + */ + @Column(name = "legal_id_card") + private String legalIdCard; + + /** + * 法人身份证有效期字段 + */ + @Column(name = "legal_id_card_expire_time") + private String legalIdCardExpireTime; + + /** + * 法人手机号 + */ + @Column(name = "legal_phone") + private String legalPhone; + + /** + * 法人是否签约人 + */ + @Column(name = "legal_is_signer") + private Integer legalIsSigner; + + /** + * 法人身份证正面 + */ + @Column(name = "legal_id_card_front") + private String legalIdCardFront; + + /** + * 法人身份证反面 + */ + @Column(name = "legal_id_card_back") + private String legalIdCardBack; + + /** + * 结算卡 + */ + @Column(name = "settlement_card") + private String settlementCard; + + /** + * 开户支行名称 + */ + @Column(name = "bank_branch_name") + private String bankBranchName; + + /** + * 开户支行编号 + */ + @Column(name = "bank_branch_code") + private String bankBranchCode; + + /** + * 银行预留手机号 + */ + @Column(name = "bank_reserved_phone") + private String bankReservedPhone; + + /** + * 来源,开通流程传1,其他0 + */ + @Column(name = "source") + private Integer source; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/TempOpenWalletInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/TempOpenWalletInfoDO.java new file mode 100644 index 000000000..36f34c2ff --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/TempOpenWalletInfoDO.java @@ -0,0 +1,599 @@ +package com.cool.store.entity.wallet; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_temp_open_wallet_info") +public class TempOpenWalletInfoDO { + /** + * 门店编号 + */ + @Column(name = "store_code") + private String storeCode; + + /** + * 门店名称 + */ + @Column(name = "store_name") + private String storeName; + + /** + * 门店模式 + */ + @Column(name = "store_mode") + private String storeMode; + + /** + * 台账名称 + */ + @Column(name = "ledger_name") + private String ledgerName; + + /** + * 台账状态 + */ + @Column(name = "ledger_status") + private String ledgerStatus; + + /** + * 工商类型 + */ + @Column(name = "business_type") + private String businessType; + + /** + * 工商注册名称 + */ + @Column(name = "business_reg_name") + private String businessRegName; + + /** + * 营业执照编号 + */ + @Column(name = "business_license_no") + private String businessLicenseNo; + + /** + * 工商地址 + */ + @Column(name = "business_address") + private String businessAddress; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 区 + */ + private String district; + + /** + * 法人名称 + */ + @Column(name = "legal_person_name") + private String legalPersonName; + + /** + * 法人证件号 + */ + @Column(name = "legal_person_id_no") + private String legalPersonIdNo; + + /** + * 身份证开始时间 + */ + @Column(name = "legal_id_start_date") + private Date legalIdStartDate; + + /** + * 身份证过期时间 + */ + @Column(name = "legal_id_expire_date") + private Date legalIdExpireDate; + + /** + * 结算人 + */ + @Column(name = "settler_name") + private String settlerName; + + /** + * 结算人证件号 + */ + @Column(name = "settler_id_no") + private String settlerIdNo; + + /** + * 结算人身份证开始时间 + */ + @Column(name = "settler_id_start_date") + private Date settlerIdStartDate; + + /** + * 结算人身份证过期时间 + */ + @Column(name = "settler_id_expire_date") + private Date settlerIdExpireDate; + + /** + * 开户支行名称 + */ + @Column(name = "bank_branch_name") + private String bankBranchName; + + /** + * 开户支行编号 + */ + @Column(name = "bank_branch_no") + private String bankBranchNo; + + /** + * 结算卡 + */ + @Column(name = "settlement_card_no") + private String settlementCardNo; + + /** + * 银行预留手机号 + */ + @Column(name = "bank_reserved_phone") + private String bankReservedPhone; + + /** + * 分账关系 + */ + @Column(name = "accounting_relation") + private String accountingRelation; + + /** + * 获取门店编号 + * + * @return store_id - 门店编号 + */ + public String getStoreCode() { + return storeCode; + } + + public void setStoreCode(String storeCode) { + this.storeCode = storeCode; + } + + /** + * 获取门店名称 + * + * @return store_name - 门店名称 + */ + public String getStoreName() { + return storeName; + } + + /** + * 设置门店名称 + * + * @param storeName 门店名称 + */ + public void setStoreName(String storeName) { + this.storeName = storeName; + } + + /** + * 获取门店模式 + * + * @return store_mode - 门店模式 + */ + public String getStoreMode() { + return storeMode; + } + + /** + * 设置门店模式 + * + * @param storeMode 门店模式 + */ + public void setStoreMode(String storeMode) { + this.storeMode = storeMode; + } + + /** + * 获取台账名称 + * + * @return ledger_name - 台账名称 + */ + public String getLedgerName() { + return ledgerName; + } + + /** + * 设置台账名称 + * + * @param ledgerName 台账名称 + */ + public void setLedgerName(String ledgerName) { + this.ledgerName = ledgerName; + } + + /** + * 获取台账状态 + * + * @return ledger_status - 台账状态 + */ + public String getLedgerStatus() { + return ledgerStatus; + } + + /** + * 设置台账状态 + * + * @param ledgerStatus 台账状态 + */ + public void setLedgerStatus(String ledgerStatus) { + this.ledgerStatus = ledgerStatus; + } + + /** + * 获取工商类型 + * + * @return business_type - 工商类型 + */ + public String getBusinessType() { + return businessType; + } + + /** + * 设置工商类型 + * + * @param businessType 工商类型 + */ + public void setBusinessType(String businessType) { + this.businessType = businessType; + } + + /** + * 获取工商注册名称 + * + * @return business_reg_name - 工商注册名称 + */ + public String getBusinessRegName() { + return businessRegName; + } + + /** + * 设置工商注册名称 + * + * @param businessRegName 工商注册名称 + */ + public void setBusinessRegName(String businessRegName) { + this.businessRegName = businessRegName; + } + + /** + * 获取营业执照编号 + * + * @return business_license_no - 营业执照编号 + */ + public String getBusinessLicenseNo() { + return businessLicenseNo; + } + + /** + * 设置营业执照编号 + * + * @param businessLicenseNo 营业执照编号 + */ + public void setBusinessLicenseNo(String businessLicenseNo) { + this.businessLicenseNo = businessLicenseNo; + } + + /** + * 获取工商地址 + * + * @return business_address - 工商地址 + */ + public String getBusinessAddress() { + return businessAddress; + } + + /** + * 设置工商地址 + * + * @param businessAddress 工商地址 + */ + public void setBusinessAddress(String businessAddress) { + this.businessAddress = businessAddress; + } + + /** + * 获取省 + * + * @return province - 省 + */ + public String getProvince() { + return province; + } + + /** + * 设置省 + * + * @param province 省 + */ + public void setProvince(String province) { + this.province = province; + } + + /** + * 获取市 + * + * @return city - 市 + */ + public String getCity() { + return city; + } + + /** + * 设置市 + * + * @param city 市 + */ + public void setCity(String city) { + this.city = city; + } + + /** + * 获取区 + * + * @return district - 区 + */ + public String getDistrict() { + return district; + } + + /** + * 设置区 + * + * @param district 区 + */ + public void setDistrict(String district) { + this.district = district; + } + + /** + * 获取法人名称 + * + * @return legal_person_name - 法人名称 + */ + public String getLegalPersonName() { + return legalPersonName; + } + + /** + * 设置法人名称 + * + * @param legalPersonName 法人名称 + */ + public void setLegalPersonName(String legalPersonName) { + this.legalPersonName = legalPersonName; + } + + /** + * 获取法人证件号 + * + * @return legal_person_id_no - 法人证件号 + */ + public String getLegalPersonIdNo() { + return legalPersonIdNo; + } + + /** + * 设置法人证件号 + * + * @param legalPersonIdNo 法人证件号 + */ + public void setLegalPersonIdNo(String legalPersonIdNo) { + this.legalPersonIdNo = legalPersonIdNo; + } + + /** + * 获取身份证开始时间 + * + * @return legal_id_start_date - 身份证开始时间 + */ + public Date getLegalIdStartDate() { + return legalIdStartDate; + } + + /** + * 设置身份证开始时间 + * + * @param legalIdStartDate 身份证开始时间 + */ + public void setLegalIdStartDate(Date legalIdStartDate) { + this.legalIdStartDate = legalIdStartDate; + } + + /** + * 获取身份证过期时间 + * + * @return legal_id_expire_date - 身份证过期时间 + */ + public Date getLegalIdExpireDate() { + return legalIdExpireDate; + } + + /** + * 设置身份证过期时间 + * + * @param legalIdExpireDate 身份证过期时间 + */ + public void setLegalIdExpireDate(Date legalIdExpireDate) { + this.legalIdExpireDate = legalIdExpireDate; + } + + /** + * 获取结算人 + * + * @return settler_name - 结算人 + */ + public String getSettlerName() { + return settlerName; + } + + /** + * 设置结算人 + * + * @param settlerName 结算人 + */ + public void setSettlerName(String settlerName) { + this.settlerName = settlerName; + } + + /** + * 获取结算人证件号 + * + * @return settler_id_no - 结算人证件号 + */ + public String getSettlerIdNo() { + return settlerIdNo; + } + + /** + * 设置结算人证件号 + * + * @param settlerIdNo 结算人证件号 + */ + public void setSettlerIdNo(String settlerIdNo) { + this.settlerIdNo = settlerIdNo; + } + + /** + * 获取结算人身份证开始时间 + * + * @return settler_id_start_date - 结算人身份证开始时间 + */ + public Date getSettlerIdStartDate() { + return settlerIdStartDate; + } + + /** + * 设置结算人身份证开始时间 + * + * @param settlerIdStartDate 结算人身份证开始时间 + */ + public void setSettlerIdStartDate(Date settlerIdStartDate) { + this.settlerIdStartDate = settlerIdStartDate; + } + + /** + * 获取结算人身份证过期时间 + * + * @return settler_id_expire_date - 结算人身份证过期时间 + */ + public Date getSettlerIdExpireDate() { + return settlerIdExpireDate; + } + + /** + * 设置结算人身份证过期时间 + * + * @param settlerIdExpireDate 结算人身份证过期时间 + */ + public void setSettlerIdExpireDate(Date settlerIdExpireDate) { + this.settlerIdExpireDate = settlerIdExpireDate; + } + + /** + * 获取开户支行名称 + * + * @return bank_branch_name - 开户支行名称 + */ + public String getBankBranchName() { + return bankBranchName; + } + + /** + * 设置开户支行名称 + * + * @param bankBranchName 开户支行名称 + */ + public void setBankBranchName(String bankBranchName) { + this.bankBranchName = bankBranchName; + } + + /** + * 获取开户支行编号 + * + * @return bank_branch_no - 开户支行编号 + */ + public String getBankBranchNo() { + return bankBranchNo; + } + + /** + * 设置开户支行编号 + * + * @param bankBranchNo 开户支行编号 + */ + public void setBankBranchNo(String bankBranchNo) { + this.bankBranchNo = bankBranchNo; + } + + /** + * 获取结算卡 + * + * @return settlement_card_no - 结算卡 + */ + public String getSettlementCardNo() { + return settlementCardNo; + } + + /** + * 设置结算卡 + * + * @param settlementCardNo 结算卡 + */ + public void setSettlementCardNo(String settlementCardNo) { + this.settlementCardNo = settlementCardNo; + } + + /** + * 获取银行预留手机号 + * + * @return bank_reserved_phone - 银行预留手机号 + */ + public String getBankReservedPhone() { + return bankReservedPhone; + } + + /** + * 设置银行预留手机号 + * + * @param bankReservedPhone 银行预留手机号 + */ + public void setBankReservedPhone(String bankReservedPhone) { + this.bankReservedPhone = bankReservedPhone; + } + + /** + * 获取分账关系 + * + * @return accounting_relation - 分账关系 + */ + public String getAccountingRelation() { + return accountingRelation; + } + + /** + * 设置分账关系 + * + * @param accountingRelation 分账关系 + */ + public void setAccountingRelation(String accountingRelation) { + this.accountingRelation = accountingRelation; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/WalletPaymentOrderDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/WalletPaymentOrderDO.java new file mode 100644 index 000000000..11f192489 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/wallet/WalletPaymentOrderDO.java @@ -0,0 +1,74 @@ +package com.cool.store.entity.wallet; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +/** + * 钱包支付订单 + */ +@Table(name = "zxjp_wallet_payment_order") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class WalletPaymentOrderDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 门店id + */ + @Column(name = "store_id") + private String storeId; + + /** + * 预支付id + */ + @Column(name = "payment_id") + private String paymentId; + + /** + * 订单类型,0充值 1提现 + */ + @Column(name = "type") + private Integer type; + + /** + * 金额 + */ + private BigDecimal amount; + + /** + * 过期时间 + */ + @Column(name = "expire_time") + private String expireTime; + + /** + * 订单状态:1-成功 2-失败 3-支付中 4-撤销 + */ + @Column(name = "order_status") + private Integer orderStatus; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java index d5c9f3395..c0ec45835 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java @@ -44,6 +44,8 @@ public class FranchiseFeeRequest { @ApiModelProperty("加盟费优惠原因") private String discountReason; + @ApiModelProperty("收银费(系统费)(三明治使用)") + private String cashierFee; public FranchiseFeeDO toFranchiseFeeDO() { FranchiseFeeDO franchiseFeeDO = new FranchiseFeeDO(); @@ -63,6 +65,7 @@ public class FranchiseFeeRequest { franchiseFeeDO.setThirdYearFee(this.thirdYearFee); franchiseFeeDO.setPerformanceBond(this.performanceBond); franchiseFeeDO.setDiscountReason(this.discountReason); + franchiseFeeDO.setCashierFee(this.cashierFee); return franchiseFeeDO; } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/OrderSysInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/OrderSysInfoRequest.java index 1bbcbcb80..d553473bc 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/OrderSysInfoRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/OrderSysInfoRequest.java @@ -1,5 +1,6 @@ package com.cool.store.request; +import com.cool.store.constants.CommonConstants; import com.cool.store.entity.OrderSysInfoDO; import com.cool.store.enums.JoinModeEnum; import com.cool.store.enums.OrderSysTypeEnum; @@ -94,6 +95,9 @@ public class OrderSysInfoRequest { @ApiModelProperty(value = "总部订货收款修改人" ) private String receivingUpdateUser; + + @ApiModelProperty("订货方式,0先款后货、1先货后款") + private Integer orderType; public OrderSysInfoDO toOrderSysInfoDO() { OrderSysInfoDO orderSysInfoDO = new OrderSysInfoDO(); @@ -131,7 +135,10 @@ public class OrderSysInfoRequest { if (Objects.equals(joinMode, JoinModeEnum.FLAGSHIP_STORE.getCode())&&this.shopCode!=null){ return true; } - if (StringUtils.isAnyBlank(this.receivingFirmName,this.receivingMsBankAccount,this.receivingMsBankBranch,this.bankUnionPayAccount,this.shopCode)){ + if (StringUtils.isBlank(this.shopCode)) { + return false; + } + if (!CommonConstants.INDEX_ONE.equals(this.orderType) && StringUtils.isAnyBlank(this.receivingFirmName,this.receivingMsBankAccount,this.receivingMsBankBranch,this.bankUnionPayAccount)){ return false; } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java index 0a771beac..7f1e8cc20 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java @@ -16,6 +16,8 @@ import java.util.Date; public class StoreMasterDTO { private String enterpriseId; + @ApiModelProperty("门店id") + private String storeId; @ApiModelProperty("门店名称(加盟签约)") private String storeName; @@ -49,6 +51,12 @@ public class StoreMasterDTO { @ApiModelProperty("省市区") private String area; + @ApiModelProperty("省") + private String province; + @ApiModelProperty("市") + private String city; + @ApiModelProperty("区/县") + private String district; @ApiModelProperty("乡镇") private String town; @ApiModelProperty("门店地址") diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/ZxjpApiRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/ZxjpApiRequest.java index acb8dda8a..b48500de2 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/ZxjpApiRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/ZxjpApiRequest.java @@ -219,6 +219,8 @@ public class ZxjpApiRequest { private Long shopId; + @ApiModelProperty("合同编号") + private String contractCode; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java new file mode 100644 index 000000000..d29ccb1ed --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java @@ -0,0 +1,33 @@ +package com.cool.store.request.bigdata; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 最新订货日期Request + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class LatestOrderDateRequest { + /** + * 页码 + */ + private Integer pageNum; + + /** + * 页数量 + */ + private Integer pageSize; + + /** + * 门店编码列表 + */ + private String store_code; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/AddTeamRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/AddTeamRequest.java new file mode 100644 index 000000000..8d1d9493d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/AddTeamRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.decoration; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/10/29 16:13 + * @Version 1.0 + */ +@Data +public class AddTeamRequest { + @ApiModelProperty("团队名称") + private String teamName; + @ApiModelProperty("负责区域列表 直传市ID,选择省时,将市Id全部传入") + private List openCityIdList; + @ApiModelProperty("团队名称") + private Integer userSystem; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java new file mode 100644 index 000000000..328e96bb8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java @@ -0,0 +1,38 @@ +package com.cool.store.request.decoration; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/3 13:31 + * @Version 1.0 + */ +@Data +public class DecorationListRequest extends PageBasicInfo { + + @ApiModelProperty("关键字 门店名称/门店编码") + private String keyword; + + @ApiModelProperty("门店类型") + private Integer storeType; + + @ApiModelProperty("门店签约类型") + private Integer signType; + + @ApiModelProperty("门店区域ID") + private Integer regionId; + + @ApiModelProperty("门店意向开店区域") + private Long wantShopAreaId; + + @ApiModelProperty(value = "门店意向开店区域IDs",hidden = true) + private List wantShopAreaIds; + + @ApiModelProperty("门店装修分配状态") + private Integer decorationDescStatus; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DeletedRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DeletedRequest.java new file mode 100644 index 000000000..0a8b513d6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DeletedRequest.java @@ -0,0 +1,15 @@ +package com.cool.store.request.decoration; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/3 16:40 + * @Version 1.0 + */ +@Data +public class DeletedRequest { + + private Long teamId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/UpdateConstructionTeamRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/UpdateConstructionTeamRequest.java new file mode 100644 index 000000000..41ace8c8b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/UpdateConstructionTeamRequest.java @@ -0,0 +1,17 @@ +package com.cool.store.request.decoration; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/3 16:00 + * @Version 1.0 + */ +@Data +public class UpdateConstructionTeamRequest { + + private Long id; + + private Long teamId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/UpdateTeamRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/UpdateTeamRequest.java new file mode 100644 index 000000000..3ded0fdea --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/UpdateTeamRequest.java @@ -0,0 +1,28 @@ +package com.cool.store.request.decoration; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/10/29 16:16 + * @Version 1.0 + */ +@Data +public class UpdateTeamRequest { + + @ApiModelProperty("ID") + private Long id; + @ApiModelProperty("团队名称") + private String teamCode; + @ApiModelProperty("团队名称") + private String teamName; + @ApiModelProperty("负责区域列表 直传市ID,选择省时,将市Id全部传入") + private List openCityIdList; + @ApiModelProperty("团队名称") + private Integer userSystem; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java index 2d824e021..832d5c5bd 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java @@ -22,4 +22,6 @@ public class BatchPublishRequest { @ApiModelProperty( "默认处理人信息 type[person position userGroup organization]") List userInfoList; + @ApiModelProperty("事项类型") + private Integer matterType; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/MatterConfigAddRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/MatterConfigAddRequest.java index 788ff839a..74c2d05b8 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/MatterConfigAddRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/MatterConfigAddRequest.java @@ -28,13 +28,13 @@ public class MatterConfigAddRequest { private String systemSource; @ApiModelProperty( "1:H5 2:小程序") - private Boolean jumpType; + private Integer jumpType; @ApiModelProperty( "跳转链接") private String jumpUrl; @ApiModelProperty( "状态(0:禁用 1:启用)") - private Boolean status; + private Integer status; @ApiModelProperty( "备注") private String remark; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/ThirdHandleMessageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/ThirdHandleMessageRequest.java new file mode 100644 index 000000000..1ce35b465 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/ThirdHandleMessageRequest.java @@ -0,0 +1,26 @@ +package com.cool.store.request.notice; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/8/29 11:10 + * @Version 1.0 + */ +@Data +public class ThirdHandleMessageRequest { + + @ApiModelProperty("发起任务时 传的handleKeyword") + @NotBlank(message = "handleKeyword不能为空") + private String handleKeyword; + + @ApiModelProperty("门店编码列表") + @NotNull(message = "门店编码列表不能为空") + private List shopCodeList; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/ThirdMatterRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/ThirdMatterRequest.java new file mode 100644 index 000000000..49e08d99e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/ThirdMatterRequest.java @@ -0,0 +1,66 @@ +package com.cool.store.request.notice; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/8/26 16:10 + * @Version 1.0 + */ +@Data +public class ThirdMatterRequest { + + @ApiModelProperty("0-提交订单 5-已分配拣货 10-拣货完成 15-已出库 20-配送中 25-订单签收 30-服务包发布 35-补货 40-盘点通知 ") + @NotNull(message = "场景不能为空") + private Integer sceneCode; + + @ApiModelProperty("事项配置ID CRM配置好部分信息 找CRM提供") + @NotNull(message = "事项配置ID不能为空") + private Long matterConfigId; + + @ApiModelProperty("事项标题") + @NotBlank(message = "事项标题不能为空") + private String matterTitle; + + @ApiModelProperty("处理类型(1:仅阅读 2:需要处理)") + @NotNull(message = "处理类型不能为空") + private Integer processType; + + @ApiModelProperty("提醒类型(1:持续提醒 2:阶段提醒)") + @NotNull(message = "提醒类型不能为空") + private Integer remindType; + + @ApiModelProperty("阶段提醒时 需要设置时间范围 开始时间") + private Date remindStartTime; + + @ApiModelProperty("阶段提醒时 需要设置时间范围 结束时间") + private Date remindEndTime; + + @ApiModelProperty("截止时间") + private Date deadline; + + @ApiModelProperty("今日必办标识 0非必办 1必办") + @NotNull(message = "今日必办标识不能为空") + private Integer todayTask; + + @ApiModelProperty("消息图片URL 物流crm自动匹配 无需传递") + private String messageImage; + + @ApiModelProperty("门店范围 如果不传 默认取matterConfigId对应的门店范围 如果都没有 任务处于待发布状态") + List shopCodeList; + + @ApiModelProperty("手机号列表 如果不传 默认取matterConfigId配置的人员信息 如果都没有 任务处于待发布状态") + List mobileList; + + private String jumpUrl; + + @ApiModelProperty("处理关键字 针对processType需要处理的字段 需要传递该关键字识别 注意 每个批次门店任务keyword不能重复") + private String handleKeyword; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/recipe/RevenueDataRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/recipe/RevenueDataRequest.java new file mode 100644 index 000000000..e2795fabf --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/recipe/RevenueDataRequest.java @@ -0,0 +1,29 @@ +package com.cool.store.request.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * 营收数据Request + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@Data +public class RevenueDataRequest { + @ApiModelProperty("门店id") + @NotBlank(message = "门店id不能为空") + private String storeId; + + @ApiModelProperty("业务时间开始,yyyy-MM-dd") + @NotBlank(message = "业务时间开始不能为空") + private String businessDateFrom; + + @ApiModelProperty("业务时间结束,yyyy-MM-dd") + @NotBlank(message = "业务时间结束不能为空") + private String businessDateTo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountAddTagRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountAddTagRequest.java new file mode 100644 index 000000000..9d03f7c2e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountAddTagRequest.java @@ -0,0 +1,76 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + + +/** + * @Author suzhuhong + * @Date 2025/11/13 14:09 + * @Version 1.0 + */ +@Data +@ApiModel(description = "营业执照信息请求参数") +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AccountAddTagRequest { + + @ApiModelProperty(value = "外部门店唯一标识", required = true) + @NotBlank(message = "外部门店唯一标识不能为空") + private String outStoreId; + + @ApiModelProperty(value = "营业执照号码", required = true) + @NotBlank(message = "营业执照号码不能为空") + private String licenseNo; + + @ApiModelProperty(value = "工商注册名称", required = true) + @NotBlank(message = "工商注册名称不能为空") + private String licenseName; + + @ApiModelProperty(value = "营业执照到期日(格式YYYY-MM-DD),如果证件到期日期为“长期”,则传:“2999-12-31”)") + private String licenseExpire; + + @ApiModelProperty(value = "法人姓名", required = true) + @NotBlank(message = "法人姓名不能为空") + private String legalName; + + @ApiModelProperty(value = "法人证件号码", required = true) + @NotBlank(message = "法人证件号码不能为空") + private String legalNo; + + @ApiModelProperty(value = "证件发证日期 yyyy-MM-dd") + private String idCardStartDate; + + @ApiModelProperty(value = "证件到期日期 yyyy-MM-dd,如果证件到期日期为“长期”,则传:“2999-12-31”") + private String idCardEndDate; + + @ApiModelProperty(value = "法人联系电话", required = true) + @NotBlank(message = "法人联系电话不能为空") + private String legalPhone; + + @ApiModelProperty(value = "开户许可证图片链接,企业必选", required = true) + private String industryLicensePhoto; + + @ApiModelProperty(value = "法人代表证件人像面图片链接", required = true) + private String certPhotoA; + + @ApiModelProperty(value = "法人代表证件国徽面 / 签证面图片链接", required = true) + private String certPhotoB; + + @ApiModelProperty(value = "营业执照图片链接", required = true) + private String licensePhoto; + + @ApiModelProperty(value = "签约人证件人像面图片链接", required = true) + private String signatoryPhotoA; + + @ApiModelProperty(value = "签约人证件国徽面图片链接", required = true) + private String signatoryPhotoB; + +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountBatchQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountBatchQueryRequest.java new file mode 100644 index 000000000..5337a09c6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountBatchQueryRequest.java @@ -0,0 +1,31 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/18 10:02 + * @Version 1.0 + */ +@Data +public class AccountBatchQueryRequest { + + @ApiModelProperty(value = "关键字(账户名称、账户别名)") + private String keyword; + + @ApiModelProperty(value = "账户状态 1 待提交 2 待鉴权 3 鉴权中 4开通 账户状态") + private Integer accountStatus; + + @ApiModelProperty(value = "工商类型 1.企业 2.个体工商户 3.小微商户(自然人)") + private Integer businessType; + + @ApiModelProperty(value = "门店id") + private String outStoreId; + + @ApiModelProperty(value = "分页信息",required = true) + private WalletBasicPageInfo page; + + @ApiModelProperty(value = "钱包类型 1.平安 2.网商", required = true) + private Integer walletType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountBillQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountBillQueryRequest.java new file mode 100644 index 000000000..5bb6eb607 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountBillQueryRequest.java @@ -0,0 +1,44 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + *

+ * 交易流水查询Request + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class AccountBillQueryRequest extends StoreShopRequest { + + @ApiModelProperty("交易开始时间,不传查当月") + private Date beginDate; + + @ApiModelProperty("交易结束时间") + private Date endDate; + + @ApiModelProperty(value = "钱包类型 1.平安 2.网商", required = true) + @NotNull(message = "钱包类型不能为空") + private Integer walletType; + + @ApiModelProperty("是否签约人账户 0 否 1 是") + private Integer isLegal; + + @ApiModelProperty("交易类型: 0.全部,1.支出 2.收入") + private Integer recordType; + + @ApiModelProperty("费用类型ID") + private Long feeItemId; + + //页码 + private Integer pageNum; + + //分页大小 + private Integer pageSize; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountCreateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountCreateRequest.java new file mode 100644 index 000000000..d4756a6d7 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountCreateRequest.java @@ -0,0 +1,50 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

+ * 平安钱包账户创建Request + *

+ * + * @author wangff + * @since 2025/11/13 + */ +@Data +public class AccountCreateRequest { + @ApiModelProperty("门店id") + @NotNull(message = "门店id不能为空") + private Long shopId; + + @ApiModelProperty("签约人姓名") + @NotBlank(message = "签约人姓名不能为空") + private String userName; + + @ApiModelProperty("签约人手机号") + @NotBlank(message = "签约人手机号不能为空") + private String mobile; + + @ApiModelProperty("签约人身份证号") + @NotBlank(message = "签约人身份证号不能为空") + private String idCardNo; + + @ApiModelProperty("银行卡号") + @NotBlank(message = "银行卡号不能为空") + private String bankNumber; + + @ApiModelProperty("银行开户支行") + @NotBlank(message = "银行开户行不能为空") + private String bankName; + + @ApiModelProperty("银行开户支行编号") + @NotBlank(message = "银行开户行编号不能为空") + private String bankNo; + + @ApiModelProperty("银行卡预留手机号") + @NotBlank(message = "银行卡预留手机号不能为空") + private String bankMobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountOpenRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountOpenRequest.java new file mode 100644 index 000000000..aa92f07fb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountOpenRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 平安钱包账户开通Request + *

+ * + * @author wangff + * @since 2025/11/13 + */ +@Data +public class AccountOpenRequest { + @ApiModelProperty("shopId") + private Long shopId; + + @ApiModelProperty("短信验证码") + private String code; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountPasswordRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountPasswordRequest.java new file mode 100644 index 000000000..42ac0fe68 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountPasswordRequest.java @@ -0,0 +1,33 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 账户密码维护Request + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class AccountPasswordRequest extends StoreShopRequest { + + @ApiModelProperty("维护类型 1.设置密码 2.修改密码") + @NotNull(message = "维护类型不能为空") + private Integer upholdType; + + @ApiModelProperty("新支付密码(sm3加密后字符串)") + @NotNull(message = "新支付密码不能为空") + private String newPayPwd; + + @ApiModelProperty("确认新支付密码(sm3加密后字符串)") + @NotNull(message = "确认新支付密码不能为空") + private String confirmPayPwd; + + @ApiModelProperty("当前使用的支付密码(sm3加密后字符串),维护类型为修改密码时必填") + private String currentPayPwd; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountPaymentRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountPaymentRequest.java new file mode 100644 index 000000000..76fb33d0c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountPaymentRequest.java @@ -0,0 +1,23 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Digits; +import java.math.BigDecimal; + +/** + *

+ * 账户充值Request + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class AccountPaymentRequest extends StoreShopRequest { + @ApiModelProperty(value = "支付金额") + @Digits(integer = 10, fraction = 2, message = "金额整数位最多10位,小数位最多2位") + private BigDecimal amount; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountQueryRequest.java new file mode 100644 index 000000000..e98f65417 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountQueryRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 账户查询Request + *

+ * + * @author wangff + * @since 2025/11/19 + */ +@Data +public class AccountQueryRequest extends StoreShopRequest { + @ApiModelProperty("钱包类型 1平安 2网商") + private Integer walletType; + + @ApiModelProperty("账户编号") + private String accountNo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountTradeCallbackRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountTradeCallbackRequest.java new file mode 100644 index 000000000..fc96b9683 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountTradeCallbackRequest.java @@ -0,0 +1,29 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/18 9:36 + * @Version 1.0 + */ +@Data +public class AccountTradeCallbackRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "业务系统付款单号(如 CRM 单号)", required = true) + private String reqNo; + @ApiModelProperty(name = "交易Id", required = true) + private Long tradeId; + @ApiModelProperty(name = "交易编号", required = true) + private String outTTradeNo; + @ApiModelProperty(name = "金额(元)", required = true) + private String amount; + @ApiModelProperty(name = "交易状态1.成功 2.失败 3.处理中", required = true) + private Integer tradeStatus; + @ApiModelProperty(name = "1.转账2.提现", required = true) + private Integer tradeType; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountVerifyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountVerifyRequest.java new file mode 100644 index 000000000..0933e027d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AccountVerifyRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/13 16:08 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AccountVerifyRequest { + + private String outStoreId; + + private String verifyNo; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java new file mode 100644 index 000000000..b73530828 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java @@ -0,0 +1,24 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/17 13:49 + * @Version 1.0 + */ +@Data +public class AddTagCallbackNoticeRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "状态1.打标成功 2.打标失败 3.处理中(打标状态)", required = true) + private Integer status; + @ApiModelProperty(name = "1.法人 2.非法人", required = true) + private Integer addTagType; + @ApiModelProperty(name = "失败原因", required = false) + private String errorMsg; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BankListRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BankListRequest.java new file mode 100644 index 000000000..947f8e3cb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BankListRequest.java @@ -0,0 +1,22 @@ +package com.cool.store.request.wallet; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 支行信息查询Request + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Data +public class BankListRequest extends PageBasicInfo { + @ApiModelProperty("银行名称") + private String headName; + + @ApiModelProperty("关键字查询") + private String keyword; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BillDetailRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BillDetailRequest.java new file mode 100644 index 000000000..6eaa89cf4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BillDetailRequest.java @@ -0,0 +1,20 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description 门店签约账户转账提现查询接口 + * @Author suzhuhong + * @Date 2025/11/14 10:05 + * @Version 1.0 + */ +@Data +public class BillDetailRequest { + + @ApiModelProperty(value = "转账交易Id(转账交易编号二选一)") + private Long tradeId; + @ApiModelProperty(value = "转账交易编号(转账交易Id二选一)") + private String outTradeNo; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BillPageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BillPageRequest.java new file mode 100644 index 000000000..8122794e7 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/BillPageRequest.java @@ -0,0 +1,40 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/14 10:17 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class BillPageRequest { + + @ApiModelProperty(value = "门店ID", required = true) + private String outStoreId; + @ApiModelProperty(value = "交易开始时间YYYY-MM-DD HH:MM:SS", required = true) + private String beginDate; + @ApiModelProperty(value = "交易结束时间YYYY-MM-DD HH:MM:SS", required = true) + private String endDate; + @ApiModelProperty(value = "钱包类型 1.平安 2.网商", required = true) + private Integer walletType; + @ApiModelProperty(value = "是否签约人钱包", required = false) + private Integer isLegal; + @ApiModelProperty(value = "交易类型: 0.全部,1.支出 2.收入", required = false) + private Integer recordType; + @ApiModelProperty(value = "费用类型ID", required = true) + private Long feeItemId; + @ApiModelProperty(value = "当前页码", required = true) + private Integer currentPage; + @ApiModelProperty(value = "每页数量", required = true) + private Integer pageSize; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolAccountBatchQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolAccountBatchQueryRequest.java new file mode 100644 index 000000000..76b650e5f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolAccountBatchQueryRequest.java @@ -0,0 +1,45 @@ +package com.cool.store.request.wallet; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/19 13:56 + * @Version 1.0 + */ +@Data +public class CoolAccountBatchQueryRequest extends PageBasicInfo { + + @ApiModelProperty(value = "关键字(账户名称、账户别名)") + private String keyword; + + @ApiModelProperty(value = "账户状态 1 待提交 2 待鉴权 3 鉴权中 4开通 账户状态") + private Integer accountStatus; + + @ApiModelProperty(value = "工商类型 1.企业 2.个体工商户 3.小微商户(自然人)") + private Integer businessType; + + @ApiModelProperty(value = "门店id") + private String outStoreId; + + private Integer walletType; + + public AccountBatchQueryRequest convertToAccountBatchQueryRequest() { + AccountBatchQueryRequest target = new AccountBatchQueryRequest(); + target.setKeyword(this.getKeyword()); + target.setAccountStatus(this.getAccountStatus()); + target.setBusinessType(this.getBusinessType()); + target.setOutStoreId(this.getOutStoreId()); + target.setWalletType(this.getWalletType()); + + WalletBasicPageInfo walletBasicPageInfo = new WalletBasicPageInfo(); + walletBasicPageInfo.setCurrentPage(this.getPageNum()); + walletBasicPageInfo.setPageSize(this.getPageSize()); + target.setPage(walletBasicPageInfo); + return target; + } + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolOpenBasicInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolOpenBasicInfoRequest.java new file mode 100644 index 000000000..3442ce34d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolOpenBasicInfoRequest.java @@ -0,0 +1,133 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/20 13:38 + * @Version 1.0 + */ +@Data +public class CoolOpenBasicInfoRequest { + @ApiModelProperty(value = "门店id") + private String storeId; + + @ApiModelProperty(value = "门店编号") + private String storeCode; + + /** + * 签约人名称 + */ + @ApiModelProperty(value = "签约人名称") + private String signerName; + + /** + * 签约人身份证号码 + */ + @ApiModelProperty(value = "签约人身份证号码") + private String signerIdCard; + + /** + * 签约人手机号 + */ + @ApiModelProperty(value = "签约人手机号") + private String signerPhone; + + /** + * 签约人身份证正面 + */ + @ApiModelProperty(value = "签约人身份证正面") + private String signerIdCardFront; + + /** + * 签约人身份证反面 + */ + @ApiModelProperty(value = "签约人身份证反面") + private String signerIdCardBack; + + /** + * 营业执照名字 + */ + @ApiModelProperty(value = "营业执照名字") + private String businessLicenseName; + + /** + * 营业执照社会信用代码 + */ + @ApiModelProperty(value = "营业执照社会信用代码") + private String businessLicenseCode; + + /** + * 营业执照照片 + */ + @ApiModelProperty(value = "营业执照照片") + private String businessLicensePhoto; + + /** + * 法人是否签约人 + */ + @ApiModelProperty(value = "法人是否签约人") + private Integer legalIsSigner; + + + /** + * 法人名称 + */ + @ApiModelProperty(value = "法人名称") + private String legalName; + + /** + * 法人身份证号码 + */ + @ApiModelProperty(value = "法人身份证号码") + private String legalIdCard; + + @ApiModelProperty("法人身份证有效期字段,yyyy-MM-dd") + private String legalIdCardExpireTime; + + /** + * 法人手机号 + */ + @ApiModelProperty(value = "法人手机号") + private String legalPhone; + + + /** + * 法人身份证正面 + */ + @ApiModelProperty(value = "法人身份证正面") + private String legalIdCardFront; + + /** + * 法人身份证反面 + */ + @ApiModelProperty(value = "法人身份证反面") + private String legalIdCardBack; + + /** + * 结算卡 + */ + @ApiModelProperty(value = "结算卡") + private String settlementCard; + + /** + * 开户支行名称 + */ + @ApiModelProperty(value = "开户支行名称") + private String bankBranchName; + + /** + * 开户支行编号 + */ + @ApiModelProperty(value = "开户支行编号") + private String bankBranchCode; + + /** + * 银行预留手机号 + */ + @ApiModelProperty(value = "银行预留手机号") + private String bankReservedPhone; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java new file mode 100644 index 000000000..fe98c9eb6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java @@ -0,0 +1,41 @@ +package com.cool.store.request.wallet; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/19 14:09 + * @Version 1.0 + */ +@Data +public class CoolTradeRecodePageRequest extends PageBasicInfo { + + @ApiModelProperty(value = "交易开始时间YYYY-MM-DD HH:MM:SS",required = true) + private String beginDate; + @ApiModelProperty(value = "交易结束时间YYYY-MM-DD HH:MM:SS",required = true) + private String endDate; + @ApiModelProperty(value = "钱包类型 1.平安 2.网商",required = true) + private Integer walletType; + @ApiModelProperty(value = "关键字(账户名称,账户编号,业务系统付款单号,提现银行卡号)",required = true) + private String keyword; + @ApiModelProperty(value = "关键字(门店编号,门店名称)",required = true) + private String storeKeyword; + @ApiModelProperty(value = "费用科目",required = true) + private Integer feeItemId; + + public TradeRecodePageRequest convertToTradeRecodePageRequest() { + TradeRecodePageRequest target = new TradeRecodePageRequest(); + target.setBeginDate(this.getBeginDate()); + target.setEndDate(this.getEndDate()); + target.setWalletType(this.getWalletType()); + target.setKeyword(this.getKeyword()); + target.setStoreKeyword(this.getStoreKeyword()); + target.setFeeItemId(this.getFeeItemId()); + target.setCurrentPage(this.getPageNum()); + target.setPageSize(this.getPageSize()); + return target; + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CreateStoreAndAccountRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CreateStoreAndAccountRequest.java new file mode 100644 index 000000000..e8218cdf0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CreateStoreAndAccountRequest.java @@ -0,0 +1,45 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/13 13:49 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateStoreAndAccountRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "联系电话", required = true) + private String phoneNumber; + @ApiModelProperty(name = "结算卡业务类型 枚举值:1:对公 2:对私", required = true) + private Integer accountType; + @ApiModelProperty(name = "开户类型:1企业 2个体工商户,3个人(小微商户) ", required = true) + private Integer businessType; + @ApiModelProperty(name = "法人姓名", required = true) + private String legalName; + @ApiModelProperty(name = "法人证件号码", required = true) + private String legalNo; + @ApiModelProperty(name = "账户简称", required = true) + private String accountAliasName; + @ApiModelProperty(name = "结算银行卡号", required = true) + private String accountCardNo; + @ApiModelProperty(name = "结算卡银行预留手机号", required = true) + private String accountPhone; + @ApiModelProperty(name = "支行编号", required = true) + private String bankNo; + @ApiModelProperty(name = "开户支行名称", required = true) + private String bankName; + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CreateStoreRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CreateStoreRequest.java new file mode 100644 index 000000000..21f5930c6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CreateStoreRequest.java @@ -0,0 +1,66 @@ +package com.cool.store.request.wallet; + +import com.sun.istack.NotNull; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +/** + * @Author suzhuhong + * @Date 2025/11/13 14:07 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateStoreRequest { + + @ApiModelProperty(value = "CRM门店编号", required = true) + @NotBlank(message = "CRM门店编号不能为空") + private String outStoreId; + + @ApiModelProperty(value = "门店编号", required = true) + @NotBlank(message = "门店编号不能为空") + private String storeSn; + + @ApiModelProperty(value = "门店名称", required = true) + @NotBlank(message = "门店名称不能为空") + private String storeName; + + @ApiModelProperty(value = "门店内部名称") + private String inStoreName; + + @ApiModelProperty(value = "组织编号", required = true) + @NotBlank(message = "组织编号不能为空") + private String orgCode; + + @ApiModelProperty(value = "组织名称", required = true) + @NotBlank(message = "组织名称不能为空") + private String orgName; + + @ApiModelProperty(value = "联系电话", required = true) + @NotBlank(message = "联系电话不能为空") + private String phoneNumber; + + @ApiModelProperty(value = "门店模式: 1.社会加盟 2.强管 3.强加盟", required = true) + private Integer storeMode; + + @ApiModelProperty(value = "省-标准行政区域编码", required = true) + private Integer province; + + @ApiModelProperty(value = "市-标准行政区域编码", required = true) + private Integer city; + + @ApiModelProperty(value = "区县-标准行政区域编码", required = true) + private Integer district; + + @ApiModelProperty(value = "门店地址", required = true) + @NotBlank(message = "门店地址不能为空") + private String address; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/FindPageCompanyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/FindPageCompanyRequest.java new file mode 100644 index 000000000..d6e605eb1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/FindPageCompanyRequest.java @@ -0,0 +1,22 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 10:32 + * @Version 1.0 + */ +@Data +public class FindPageCompanyRequest { + + @ApiModelProperty(value = "公司编码") + private String companyCode; + + @ApiModelProperty(value = "公司名称") + private String companyName; + + private WalletBasicPageInfo page; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/GetBankRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/GetBankRequest.java new file mode 100644 index 000000000..6d8f8f0fc --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/GetBankRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 10:55 + * @Version 1.0 + */ +@Data +public class GetBankRequest { + + @ApiModelProperty("银行名称") + private String headName; + @ApiModelProperty("关键字查询") + private String keyword; + @ApiModelProperty("分页查询参数") + private WalletBasicPageInfo page; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentDetailRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentDetailRequest.java new file mode 100644 index 000000000..b24aadec2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentDetailRequest.java @@ -0,0 +1,17 @@ +package com.cool.store.request.wallet; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 18:28 + * @Version 1.0 + */ +@Data +public class LargePaymentDetailRequest { + + private String transOrderTrace; + + private String paymentId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentQueryRequest.java new file mode 100644 index 000000000..182e297f4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentQueryRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 大额支付订单查询Request + *

+ * + * @author wangff + * @since 2025/11/18 + */ +@Data +public class LargePaymentQueryRequest extends StoreShopRequest { + @ApiModelProperty("页码") + private Integer pageNum = 1; + + @ApiModelProperty("页数量") + private Integer pageSize = 10; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentRequest.java new file mode 100644 index 000000000..344d60c6f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/LargePaymentRequest.java @@ -0,0 +1,30 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/13 17:00 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class LargePaymentRequest { + + @ApiModelProperty(value = "商户门店编号",required = true) + private String outStoreId; + + @ApiModelProperty(value = "请求预支付Id",required = true) + private String paymentId; + + @ApiModelProperty(value = "签约人名称",required = true) + private String payerAccName; + + @ApiModelProperty(value = "支付金额",required = true) + private String amt; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OldStoreAccountCreateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OldStoreAccountCreateRequest.java new file mode 100644 index 000000000..96aef77e3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OldStoreAccountCreateRequest.java @@ -0,0 +1,86 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/18 18:16 + * @Version 1.0 + */ +@Data +public class OldStoreAccountCreateRequest { + + @ApiModelProperty(value = "CRM门店编号", required = true) + private String outStoreId; + + @ApiModelProperty(value = "联系电话", required = true) + private String phoneNumber; + + @ApiModelProperty(value = "结算卡业务类型 枚举值:1:对公 2:对私(结算类型)", required = true, example = "1") + private Integer accountType; + + @ApiModelProperty(value = "营业执照号码,与企业证件类型对应的企业注册号(企业与个体户必传)") + private String licenseNo; + + @ApiModelProperty(value = "工商注册名称(与注册工商信息时一致)(企业与个体户必传)") + private String licenseName; + + @ApiModelProperty(value = "法人姓名", required = true) + private String legalName; + + @ApiModelProperty(value = "法人证件号码", required = true) + private String legalNo; + + @ApiModelProperty("法人身份证有效期字段") + private String legalIdcardExpireTime; + + @ApiModelProperty(value = "法人联系电话(企业与个体户必传)") + private String legalPhone; + + @ApiModelProperty(value = "账户简称", required = true) + private String accountAliasName; + + @ApiModelProperty(value = "结算银行卡号", required = true) + private String accountCardNo; + + @ApiModelProperty(value = "结算卡银行预留手机号(存量门店可能没有)", required = true) + private String accountPhone; + + @ApiModelProperty(value = "开户支行", required = true) + private String bankNo; + + @ApiModelProperty(value = "开户支行名称", required = true) + private String bankName; + + @ApiModelProperty(value = "开户许可证图片链接,企业必选") + private String industryLicensePhoto; + + @ApiModelProperty(value = "法人代表证件人像面图片链接", required = true) + private String certPhotoA; + + @ApiModelProperty(value = "法人代表证件国徽面图片链接", required = true) + private String certPhotoB; + + @ApiModelProperty(value = "营业执照图片链接", required = true) + private String licensePhoto; + + @ApiModelProperty(value = "签约人姓名", required = true) + private String signatoryName; + + @ApiModelProperty(value = "签约人身份证", required = true) + private String signatoryNo; + + @ApiModelProperty(value = "签约人联系电话", required = true) + private String signatoryPhone; + + @ApiModelProperty(value = "签约人证件人像面图片链接", required = true) + private String signatoryPhotoA; + + @ApiModelProperty(value = "签约人证件国徽面图片链接", required = true) + private String signatoryPhotoB; + + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OnlineCommercialBankCallbackRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OnlineCommercialBankCallbackRequest.java new file mode 100644 index 000000000..64539e56b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OnlineCommercialBankCallbackRequest.java @@ -0,0 +1,25 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/18 18:00 + * @Version 1.0 + */ +@Data +public class OnlineCommercialBankCallbackRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "网商账户编号", required = true) + private String accountNo; + @ApiModelProperty(name = "4.已开通 5.开通失败", required = true) + private Integer accountStatus; + @ApiModelProperty(name = "开户失败原因", required = true) + private String failReason; + @ApiModelProperty(name = "钱包类型 1.平安 2.网商 目前只有网商是创建账户异步的 预留字段", required = true) + private int walletType; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OutStoreIdRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OutStoreIdRequest.java new file mode 100644 index 000000000..1ab4df0b6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/OutStoreIdRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/13 16:05 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OutStoreIdRequest { + + @ApiModelProperty(value = "外部门店唯一标识", required = true) + private String outStoreId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/PaymentDetailRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/PaymentDetailRequest.java new file mode 100644 index 000000000..8cfded563 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/PaymentDetailRequest.java @@ -0,0 +1,15 @@ +package com.cool.store.request.wallet; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 17:37 + * @Version 1.0 + */ +@Data +public class PaymentDetailRequest { + + private String paymentId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/StoreShopRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/StoreShopRequest.java new file mode 100644 index 000000000..ef7450aa2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/StoreShopRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 门店idRequest + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class StoreShopRequest { + @ApiModelProperty("门店id") + private Long shopId; + + @ApiModelProperty("门店id,两者取一") + private String storeId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TestVerifyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TestVerifyRequest.java new file mode 100644 index 000000000..e89f09614 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TestVerifyRequest.java @@ -0,0 +1,25 @@ +package com.cool.store.request.wallet; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/21 13:53 + * @Version 1.0 + */ +@Data +public class TestVerifyRequest { + + private String key; + + private String sign; + + private Long timestamp; + + private String outStoreId; + + private Integer status; + + private Integer addTagType; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TextMsgSendRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TextMsgSendRequest.java new file mode 100644 index 000000000..74179e741 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TextMsgSendRequest.java @@ -0,0 +1,22 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 网商账户重新发送激活短信Request + *

+ * + * @author wangff + * @since 2025/11/20 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TextMsgSendRequest { + @ApiModelProperty("门店id") + private String outStoreId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java new file mode 100644 index 000000000..abbe74f28 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java @@ -0,0 +1,33 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/19 11:07 + * @Version 1.0 + */ +@Data +public class TradeRecodePageRequest { + + @ApiModelProperty(value = "交易开始时间YYYY-MM-DD HH:MM:SS",required = true) + private String beginDate; + @ApiModelProperty(value = "交易结束时间YYYY-MM-DD HH:MM:SS",required = true) + private String endDate; + @ApiModelProperty(value = "钱包类型 1.平安 2.网商",required = true) + private Integer walletType; + @ApiModelProperty(value = "关键字(账户名称,账户编号,业务系统付款单号,提现银行卡号)",required = true) + private String keyword; + @ApiModelProperty(value = "关键字(门店编号,门店名称)",required = true) + private String storeKeyword; + @ApiModelProperty(value = "费用科目",required = true) + private Integer feeItemId; + @ApiModelProperty(value = "当前页码",required = true) + private Integer currentPage; + @ApiModelProperty(value = "每页数量",required = true) + private Integer pageSize; + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TransferRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TransferRequest.java new file mode 100644 index 000000000..8a74c09a7 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TransferRequest.java @@ -0,0 +1,31 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/14 9:40 + * @Version 1.0 + */ +@Data +public class TransferRequest { + + @ApiModelProperty(name = "门店唯一标识",required = true) + private String outStoreId; + @ApiModelProperty(name = "支付密码(sm3加密后字符串)",required = true) + private String payPwd; + @ApiModelProperty(name = "业务系统付款单号(如 CRM 单号),业务系统唯一",required = true) + private String reqNo; + @ApiModelProperty(name = "付款科目",required = true) + private Integer feeItemId; + @ApiModelProperty(name = "公司编号",required = true) + private String companyCode; + @ApiModelProperty(name = "公司编号绑定多个账户时,必传",required = false) + private String companyAccountCode; + @ApiModelProperty(name = "金额(元)",required = true) + private String amount; + @ApiModelProperty(name = "备注 ,交易摘要",required = true) + private String remark; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java new file mode 100644 index 000000000..a9e89b9b4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java @@ -0,0 +1,27 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/17 11:20 + * @Version 1.0 + */ +@Data +public class UpdatePasswordRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "维护类型 1.设置密码 2.修改密码", required = true) + private Integer upholdType; + @ApiModelProperty(name = "新支付密码(sm3加密后字符串)", required = true) + private String newPayPwd; + @ApiModelProperty(name = "确认新支付密码(sm3加密后字符串)", required = true) + private String confirmPayPwd; + @ApiModelProperty(name = "当前使用的支付密码(sm3加密后字符串),维护类型为修改密码时必填", required = false) + private String currentPayPwd; + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdateStoreAccountRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdateStoreAccountRequest.java new file mode 100644 index 000000000..5f6d41169 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdateStoreAccountRequest.java @@ -0,0 +1,29 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/13 16:46 + * @Version 1.0 + */ +@Data +public class UpdateStoreAccountRequest { + + @ApiModelProperty(name = "商户门店编号",required = true) + private String outStoreId; + @ApiModelProperty(name = "法人/自然人证件号码",required = true) + private String idnum; + @ApiModelProperty(name = "签约人姓名(对私结算卡必传)以上二选一",required = true) + private String accountName; + @ApiModelProperty(name = "结算银行卡号",required = true) + private String accountCardNo; + @ApiModelProperty(name = "结算卡银行预留手机号。",required = true) + private String accountPhone; + @ApiModelProperty(name = "支行编号",required = true) + private String bankNo; + @ApiModelProperty(name = "开户支行名称",required = true) + private String bankName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletBasicPageInfo.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletBasicPageInfo.java new file mode 100644 index 000000000..c2fba1f17 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletBasicPageInfo.java @@ -0,0 +1,40 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/13 10:56 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WalletBasicPageInfo { + + @ApiModelProperty(value = "当前页码",required = true) + private Integer currentPage; + + @ApiModelProperty(value = "每页数量",required = true) + private Integer pageSize; + + private Integer total; + + private Integer count; + + private Boolean first; + + private Boolean last; + + public WalletBasicPageInfo(Integer currentPage, Integer pageSize){ + this.currentPage = currentPage; + this.pageSize = pageSize; + } + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletShopRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletShopRequest.java new file mode 100644 index 000000000..b6b75ba29 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletShopRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 钱包门店Request + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Data +public class WalletShopRequest { + @ApiModelProperty("门店id") + @NotNull(message = "门店id不能为空") + private Long shopId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletWithDrawerRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletWithDrawerRequest.java new file mode 100644 index 000000000..80459c74f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WalletWithDrawerRequest.java @@ -0,0 +1,33 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Digits; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + *

+ * 钱包提现Request + *

+ * + * @author wangff + * @since 2025/11/18 + */ +@Data +public class WalletWithDrawerRequest extends StoreShopRequest { + @ApiModelProperty("提现金额") + @Digits(integer = 10, fraction = 2, message = "金额整数位最多10位,小数位最多2位") + @NotNull(message = "提现金额不能为空") + private BigDecimal amount; + + @ApiModelProperty("支付密码(sm3加密后字符串)") + @NotBlank(message = "支付密码不能为空") + private String payPwd; + + @ApiModelProperty("钱包类型 1.平安 2.网商") + @NotNull(message = "钱包类型不能为空") + private Integer walletType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WithDrawerRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WithDrawerRequest.java new file mode 100644 index 000000000..32cef81e6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/WithDrawerRequest.java @@ -0,0 +1,31 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author suzhuhong + * @Date 2025/11/14 9:56 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WithDrawerRequest { + + @ApiModelProperty(value = "门店ID") + private String outStoreId; + @ApiModelProperty(value = "支付密码(sm3加密后字符串)") + private String payPwd; + @ApiModelProperty(value = "业务系统付款单号(如 CRM 单号)") + private String reqNo; + @ApiModelProperty(value = "提现金额") + private String amount; + @ApiModelProperty(value = "提现备注") + private String remark; + @ApiModelProperty(value = "钱包类型 1.平安 2.网商", required = true) + private Integer walletType; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/PushFranchiseFeeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/PushFranchiseFeeRequest.java index fb150b4e1..373356ea5 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/PushFranchiseFeeRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/PushFranchiseFeeRequest.java @@ -3,10 +3,13 @@ package com.cool.store.request.xgj; import com.cool.store.entity.FranchiseFeeDO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.util.Date; +import static com.cool.store.utils.CommonUtil.convertToBig; + /** * @Author suzhuhong * @Date 2025/6/3 16:52 @@ -44,17 +47,24 @@ public class PushFranchiseFeeRequest { @ApiModelProperty( "创建时间") private Date createTime; + + @ApiModelProperty("品牌") + private Integer joinBrand; public PushFranchiseFeeRequest(){} public PushFranchiseFeeRequest(Long shopId, String partnerName, FranchiseFeeDO franchiseFeeDO){ this.setShopId(shopId); this.setPartnerName(partnerName); this.setBillId(franchiseFeeDO.getId().intValue()); - this.setFranchiseFee(new BigDecimal(franchiseFeeDO.getYearFranchiseFee())); - this.setBond(new BigDecimal(franchiseFeeDO.getLoanMargin())); - this.setFirstYearManageFee(new BigDecimal(franchiseFeeDO.getFirstYearManageFee())); - this.setFirstYearFee(new BigDecimal(franchiseFeeDO.getFirstYearFee())); - this.setDesignFee(new BigDecimal(franchiseFeeDO.getPerformanceBond())); + this.setFranchiseFee(convertToBig(franchiseFeeDO.getYearFranchiseFee())); + this.setBond(convertToBig(franchiseFeeDO.getLoanMargin())); + this.setFirstYearManageFee(convertToBig(franchiseFeeDO.getFirstYearManageFee())); + this.setFirstYearFee(convertToBig(franchiseFeeDO.getFirstYearFee())); + this.setDesignFee(convertToBig(franchiseFeeDO.getPerformanceBond())); + // 三明治收银费 + if (StringUtils.isNotBlank(franchiseFeeDO.getCashierFee())) { + this.setFranchiseFee(convertToBig(franchiseFeeDO.getCashierFee())); + } this.setTotalFee(this.getBond() .add(this.getFranchiseFee()) .add(this.getFirstYearManageFee()) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptRequest.java index 69a1110b7..d9c5877dc 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptRequest.java @@ -56,6 +56,9 @@ public class ReceiptRequest { @ApiModelProperty( "删除标识") private Integer deleted = 0; + @ApiModelProperty("品牌") + private Integer joinBrand; + public ReceiptRequest() { } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java index f07cac07e..d55a7c685 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java @@ -292,6 +292,8 @@ public class AddSignFranchiseResponse { */ @ApiModelProperty("加盟来源") private String joinSource; + @ApiModelProperty("收银费(系统费)") + private String cashierFee; /** * 签约形式 @@ -322,4 +324,6 @@ public class AddSignFranchiseResponse { */ @ApiModelProperty("加盟费折扣金额") private String discountAmount; + @ApiModelProperty("收银费(系统费)大写") + private String bigCashierFee; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/BranchShopResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/BranchShopResponse.java index 8b2427f02..f4300f4eb 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/BranchShopResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/BranchShopResponse.java @@ -61,6 +61,8 @@ public class BranchShopResponse { @ApiModelProperty("所属管理区域name") private String managerRegionName; + private String storeId; + public void setDays() { if (this.openingActivityEndTime==null){ diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/BuildInformationResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/BuildInformationResponse.java index f0795f6e0..9e3a1fd1f 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/BuildInformationResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/BuildInformationResponse.java @@ -206,4 +206,7 @@ public class BuildInformationResponse { @ApiModelProperty(value = "建店资料当前阶段状态") private Integer shopSubStageStatus; + + @ApiModelProperty("订货方式,0先款后货、1先货后款") + private Integer orderType; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java index 0decbfc60..aedd7e18c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java @@ -63,7 +63,8 @@ public class FranchiseFeeResponse { @ApiModelProperty("新管家已缴金额") private BigDecimal xgjFeesPaid; - + @ApiModelProperty("收银费(系统费)") + private String cashierFee; @Data public static class LinePay{ @@ -200,6 +201,7 @@ public class FranchiseFeeResponse { franchiseFeeResponse.setXgjCollectionStatus(franchiseFeeDO.getXgjCollectionStatus()); franchiseFeeResponse.setXgjRemainderPayableAmount(franchiseFeeDO.getXgjRemainderPayableAmount()); franchiseFeeResponse.setXgjFeesPaid(franchiseFeeDO.getXgjFeesPaid()); + franchiseFeeResponse.setCashierFee(franchiseFeeDO.getCashierFee()); return franchiseFeeResponse; } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java new file mode 100644 index 000000000..f1bd4d03c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java @@ -0,0 +1,21 @@ +package com.cool.store.response.bigdata; + +import lombok.Data; + +import java.util.List; + +/** + *

+ * 分页对象 + *

+ * + * @author wangff + * @since 2025/10/27 + */ +@Data +public class ApiPageResponse { + private Integer total; + private List list; + private Integer pageNum; + private Integer pageSize; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java index 96e2f49ff..cf391c02c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java @@ -3,9 +3,12 @@ package com.cool.store.response.bigdata; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ResponseCodeEnum; +import com.cool.store.response.ResponseResult; import lombok.Data; import org.slf4j.MDC; +import java.text.MessageFormat; + /** * @Author suzhuhong * @Date 2025/4/1 10:49 @@ -31,6 +34,22 @@ public class ApiResponse { return new ApiResponse(ResponseCodeEnum.SUCCESS.getCode(), "ok", data); } + /** + * 钱包系统 响应用200 + * @param data + * @param + * @return + */ + public static ApiResponse successByWallet(T data) { + return new ApiResponse(ResponseCodeEnum.SUCCESS_WALLET.getCode(), "ok", data); + } + + + public static ApiResponse fail(ErrorCodeEnum responseEnum, Object... objects){ + String message = MessageFormat.format(responseEnum.getMessage(), objects); + return new ApiResponse(responseEnum.getCode(), message, false); + } + public static ApiResponse error(ErrorCodeEnum errorCodeEnum) { return new ApiResponse(errorCodeEnum.getCode(), errorCodeEnum.getMessage(), null); } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java new file mode 100644 index 000000000..0b6cfa944 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java @@ -0,0 +1,24 @@ +package com.cool.store.response.bigdata; + +import lombok.Data; + +/** + *

+ * 最新订货日期Response + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +public class LatestOrderDateResponse { + /** + * 门店编码 + */ + private String store_code; + + /** + * 最新订货日期,yyyy-MM-dd + */ + private String latest_buy_date; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java new file mode 100644 index 000000000..4233acea8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java @@ -0,0 +1,17 @@ +package com.cool.store.response.caipin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/9/25 15:05 + * @Version 1.0 + */ +@Data +public class StoreUserResponse { + + private String msgDetail; + + private String msgFront; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java b/coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java new file mode 100644 index 000000000..b8a84fc0f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java @@ -0,0 +1,33 @@ +package com.cool.store.userholder; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * RefreshToken用户信息 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RefreshUser { + /** + * 用户Id + */ + private String userId; + + /** + * RefreshToken + */ + private String refreshToken; + + /** + * 手机号 + */ + private String mobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/IdentityCardInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/IdentityCardInfoVO.java index 4307cec8c..5ac289ad3 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/IdentityCardInfoVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/IdentityCardInfoVO.java @@ -1,5 +1,6 @@ package com.cool.store.vo; +import com.aliyun.tea.NameInMap; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,6 +25,15 @@ public class IdentityCardInfoVO { @ApiModelProperty("民族") private String nation; + @ApiModelProperty("结束时间") + public String endDate; + + @ApiModelProperty("所属分局") + public String issue; + + @ApiModelProperty("开始时间") + public String startDate; + public IdentityCardInfoVO(String username, String liveAddress, String birthdate, String sex, String idCard, String nation) { this.username = username; this.liveAddress = liveAddress; @@ -32,4 +42,10 @@ public class IdentityCardInfoVO { this.idCard = idCard; this.nation = nation; } + + public IdentityCardInfoVO(String endDate, String issue, String startDate) { + this.endDate = endDate; + this.issue = issue; + this.startDate = startDate; + } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java index bd6463823..7a45da8ce 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java @@ -56,4 +56,7 @@ public class PreparationCommonPendingVO { @ApiModelProperty("签约人2姓名") private String partnershipSignatorySecond; + + @ApiModelProperty("加盟品牌") + private String franchiseBrand; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java new file mode 100644 index 000000000..cceaadf5c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java @@ -0,0 +1,35 @@ +package com.cool.store.vo.login; + +import com.cool.store.entity.SysRoleDO; +import lombok.Data; + +/** + *

+ * 登录用户基本信息VO + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Data +public class UserBaseInfoVO { + private String id; + + private String userId; + + private String name; + + private Boolean isAdmin; + + private String mobile; + + private String email; + + private String avatar; + + private String roles; + + private String language; + + private SysRoleDO sysRoleDO; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java new file mode 100644 index 000000000..ac6370bdb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java @@ -0,0 +1,38 @@ +package com.cool.store.vo.login; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 用户登录VO + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginVO { + /** + * 登录token + */ + private String accessToken; + + /** + * 刷新token + */ + private String refreshToken; + + /** + * accessToken过期时间 + */ + private Integer expire; + + /** + * 用户信息 + */ + private UserBaseInfoVO user; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageDetailVO.java index 78fa5049a..c16e4d401 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageDetailVO.java @@ -39,5 +39,7 @@ public class MessageDetailVO { private Integer processStatus; private Integer processType; + @ApiModelProperty("第三方id") + private String handleKeyword; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageTemplateDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageTemplateDetailVO.java index 793fda56d..348edb15d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageTemplateDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/MessageTemplateDetailVO.java @@ -51,6 +51,8 @@ public class MessageTemplateDetailVO { private Integer totalNum; @ApiModelProperty("系统来源") private String systemSource; + @ApiModelProperty("第三方id") + private String handleKeyword; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/StoreMessageVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/StoreMessageVO.java index 4d614441c..4ab7d262e 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/StoreMessageVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/notice/StoreMessageVO.java @@ -13,9 +13,11 @@ import java.util.Date; @Data public class StoreMessageVO { private Long id; - @ApiModelProperty("模版COde") + @ApiModelProperty("模版Code") private Integer moduleCode; + private Integer matterType; + @ApiModelProperty("模版ID") private Long templateId; @ApiModelProperty("已读状态") @@ -33,4 +35,10 @@ public class StoreMessageVO { @ApiModelProperty("今日必办") private Integer todayTask; + private Integer jumpType; + + private String jumpUrl; + + private String resource; + } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/recipe/LaunchDataVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/recipe/LaunchDataVO.java new file mode 100644 index 000000000..0b9fc81de --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/recipe/LaunchDataVO.java @@ -0,0 +1,21 @@ +package com.cool.store.vo.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 服务包菜品数据 + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@Data +public class LaunchDataVO { + @ApiModelProperty("名称") + private String spName; + + @ApiModelProperty("上新时间,yyyy-MM-dd") + private String upSaleDate; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/recipe/RevenueDataVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/recipe/RevenueDataVO.java new file mode 100644 index 000000000..3420a29b2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/recipe/RevenueDataVO.java @@ -0,0 +1,44 @@ +package com.cool.store.vo.recipe; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 营收数据VO + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@Data +public class RevenueDataVO { + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("营业额") + private BigDecimal amt; + + @ApiModelProperty("实收") + private BigDecimal receivedAmt; + + @ApiModelProperty("营业时间,yyyy-MM-dd") + private String businessDate; + + @ApiModelProperty("服务包列表") + private List otherLaunchDates; + + @ApiModelProperty("菜品列表") + private List otherRecipeLaunchDates; + + @ApiModelProperty("外卖实收") + private BigDecimal takeoutReceivedAmt; + + @ApiModelProperty("堂食实收") + private BigDecimal dineInReceivedAmt; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountAuthenticationVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountAuthenticationVO.java new file mode 100644 index 000000000..25272050d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountAuthenticationVO.java @@ -0,0 +1,23 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 钱包账户鉴权VO + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AccountAuthenticationVO { + + @ApiModelProperty("1 待提交 2 待鉴权 3 鉴权中 4开通") + private Integer accountStatus; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountBillListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountBillListVO.java new file mode 100644 index 000000000..836758bf9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountBillListVO.java @@ -0,0 +1,40 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 账户交易列表VO + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class AccountBillListVO { + + @ApiModelProperty("交易Id(营帐通)") + private Long tradeId; + + @ApiModelProperty("交易编号(扫呗)") + private String outTradeNo; + + @ApiModelProperty("费用科目") + private Integer feeItemId; + + @ApiModelProperty("费用科目名称") + private String feeItemName; + + @ApiModelProperty("金额(元)") + private String amount; + + @ApiModelProperty("交易发起时间") + private String createTime; + + @ApiModelProperty("交易状态 1.成功 2.失败 3.处理中") + private Integer tradeStatus; + + @ApiModelProperty("交易类型 1.转账 2.提现") + private Integer tradeType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountBillPageVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountBillPageVO.java new file mode 100644 index 000000000..b6f4db0f7 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountBillPageVO.java @@ -0,0 +1,41 @@ +package com.cool.store.vo.wallet; + +import com.cool.store.dto.wallet.TradeRecordDTO; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Objects; + +/** + *

+ * 账户交易列表分页VO + *

+ * + * @author wangff + * @since 2025/11/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AccountBillPageVO { + @ApiModelProperty("分页数据") + PageInfo data; + + @ApiModelProperty("收入") + private BigDecimal getAmount; + + @ApiModelProperty("支出") + private BigDecimal useAmount; + + public AccountBillPageVO(PageInfo data, Long getAmount, Long useAmount) { + this.data = data; + BigDecimal denominator = new BigDecimal(100); + this.getAmount = new BigDecimal(Objects.nonNull(getAmount) ? getAmount : 0).divide(denominator, 2, RoundingMode.HALF_UP); + this.useAmount = new BigDecimal(Objects.nonNull(useAmount) ? useAmount : 0).divide(denominator, 2, RoundingMode.HALF_UP); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountDataVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountDataVO.java new file mode 100644 index 000000000..4abc60142 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountDataVO.java @@ -0,0 +1,30 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *

+ * 账户信息VO + *

+ * + * @author wangff + * @since 2025/11/20 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AccountDataVO { + @ApiModelProperty("网商账户开通失败标识") + private Boolean onlineBankOpenFail; + + @ApiModelProperty("是否已激活") + private Boolean activated; + + @ApiModelProperty("账户列表") + private List accountList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountInfoVO.java new file mode 100644 index 000000000..96ef50043 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountInfoVO.java @@ -0,0 +1,51 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 账户信息VO + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class AccountInfoVO { + @ApiModelProperty(value = "账户状态 1:待提交 2:待鉴权 3:鉴权中 4:开通") + private Integer accountStatus; + + @ApiModelProperty(value = "是否签约人账户 0 否 1 是") + private Integer isLegal; + + @ApiModelProperty(value = "账户编号") + private String accountNo; + + @ApiModelProperty(value = "账户名称") + private String accountName; + + @ApiModelProperty(value = "结算银行卡号") + private String accountCardNo; + + @ApiModelProperty(value = "开户支行名称") + private String bankName; + + @ApiModelProperty(value = "总行名称") + private String headBankName; + + @ApiModelProperty(value = "账户余额") + private String totalAmount; + + @ApiModelProperty(value = "可提现余额", required = true) + private String withdrawAmount; + + @ApiModelProperty(value = "打标状态 0 未打标 1 已打标") + private Integer labelingStatus; + + @ApiModelProperty("平安账户升级失败原因") + private String failReason; + + @ApiModelProperty("失败原因(仅网商在创建失败或激活失败时返回)") + private String errMsg; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountPageVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountPageVO.java new file mode 100644 index 000000000..ffb478e9e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountPageVO.java @@ -0,0 +1,93 @@ +package com.cool.store.vo.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 门店签约人账户 + * @Author suzhuhong + * @Date 2025/11/13 16:54 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AccountPageVO { + + @ApiModelProperty(value = "结算卡业务类型 枚举值:1:对公 2:对私", required = true) + private Integer accountType; + + @ApiModelProperty(value = "营业执照号码") + private String licenseNo; + + @ApiModelProperty(value = "工商注册名称") + private String licenseName; + + @ApiModelProperty(value = "法人姓名") + private String legalName; + + @ApiModelProperty(value = "法人证件号码") + private String legalNo; + + @ApiModelProperty(value = "法人联系电话") + private String legalPhone; + + @ApiModelProperty(value = "门店编号", required = true) + private String storeSn; + + @ApiModelProperty(value = "账户编号", required = true) + private String accountNo; + + @ApiModelProperty(value = "账户名称", required = true) + private String accountName; + + @ApiModelProperty(value = "账户别名", required = true) + private String accountAliasName; + + @ApiModelProperty(value = "结算银行卡号", required = true) + private String accountCardNo; + + @ApiModelProperty(value = "结算卡银行预留手机号", required = true) + private String accountPhone; + + @ApiModelProperty(value = "开户支行名称", required = true) + private String bankName; + + @ApiModelProperty(value = "支行编号", required = true) + private String bankNo; + + @ApiModelProperty(value = "总行名称") + private String headBankName; + + @ApiModelProperty(value = "账户状态 1:待提交 2:待鉴权 3:鉴权中 4:开通 5:开通失败", required = true) + private Integer accountStatus; + + @ApiModelProperty(value = "账户余额", required = true) + private String totalAmount; + + @ApiModelProperty(value = "可提现余额", required = true) + private String withdrawAmount; + + + @ApiModelProperty(value = "打标状态 0 未打标 1 已打标", required = true) + private Integer labelingStatus; + + @ApiModelProperty(value = "是否签约人账户 0 否 1 是", required = true) + private Integer isLegal; + + @ApiModelProperty("工商类型 1.企业 2.个体工商户 3.小微商户(自然人)") + private Integer businessType; + + @ApiModelProperty("钱包类型 1平安 2网商") + private Integer walletType; + + @ApiModelProperty("失败原因(仅网商在创建失败或激活失败时返回)") + private String errMsg; + + @ApiModelProperty("crm门店id") + private String storeId; + + @ApiModelProperty("门店名称") + private String storeName; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountPaymentVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountPaymentVO.java new file mode 100644 index 000000000..519046904 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AccountPaymentVO.java @@ -0,0 +1,28 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 账户充值VO + *

+ * + * @author wangff + * @since 2025/11/17 + */ +@Data +public class AccountPaymentVO { + + @ApiModelProperty(value = "收款账号", required = true) + private String payeeAccNo; + + @ApiModelProperty(value = "收款账户名称", required = true) + private String payeeAccName; + + @ApiModelProperty(value = "收款银行名称", required = true) + private String payeeBankName; + + @ApiModelProperty("过期倒计时(秒)") + private Long expiryCountdown; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AllAccountInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AllAccountInfoVO.java new file mode 100644 index 000000000..25d5dc0fd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/AllAccountInfoVO.java @@ -0,0 +1,83 @@ +package com.cool.store.vo.wallet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 门店签约人账户 + * @Author suzhuhong + * @Date 2025/11/13 16:54 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AllAccountInfoVO { + + @ApiModelProperty(value = "结算卡业务类型 枚举值:1:对公 2:对私", required = true) + private Integer accountType; + + @ApiModelProperty(value = "营业执照号码") + private String licenseNo; + + @ApiModelProperty(value = "工商注册名称") + private String licenseName; + + @ApiModelProperty(value = "法人姓名") + private String legalName; + + @ApiModelProperty(value = "法人证件号码") + private String legalNo; + + @ApiModelProperty(value = "法人联系电话") + private String legalPhone; + + @ApiModelProperty(value = "门店编号", required = true) + private String storeSn; + + @ApiModelProperty(value = "账户编号", required = true) + private String accountNo; + + @ApiModelProperty(value = "账户名称", required = true) + private String accountName; + + @ApiModelProperty(value = "账户别名", required = true) + private String accountAliasName; + + @ApiModelProperty(value = "结算银行卡号", required = true) + private String accountCardNo; + + @ApiModelProperty(value = "结算卡银行预留手机号", required = true) + private String accountPhone; + + @ApiModelProperty(value = "开户支行名称", required = true) + private String bankName; + + @ApiModelProperty(value = "支行编号", required = true) + private String bankNo; + + @ApiModelProperty(value = "总行名称") + private String headBankName; + + @ApiModelProperty(value = "账户状态 1:待提交 2:待鉴权 3:鉴权中 4:开通 5:开通失败", required = true) + private Integer accountStatus; + + @ApiModelProperty(value = "账户余额", required = true) + private String totalAmount; + + @ApiModelProperty(value = "打标状态 0 未打标 1 已打标", required = true) + private Integer labelingStatus; + + @ApiModelProperty(value = "是否签约人账户 0 否 1 是", required = true) + private Integer isLegal; + + @ApiModelProperty("工商类型 1.企业 2.个体工商户 3.小微商户(自然人)") + private Integer businessType; + + @ApiModelProperty("钱包类型 1平安 2网商") + private Integer walletType; + + @ApiModelProperty("失败原因(仅网商在创建失败或激活失败时返回)") + private String errMsg; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/BankVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/BankVO.java new file mode 100644 index 000000000..93288bba2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/BankVO.java @@ -0,0 +1,24 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 银行VO + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Data +public class BankVO { + @ApiModelProperty("银行编号") + private String headCode; + @ApiModelProperty("银行名称") + private String headName; + @ApiModelProperty("支行号") + private String branchCode; + @ApiModelProperty("支行名称") + private String branchName; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/WalletPaymentOrderVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/WalletPaymentOrderVO.java new file mode 100644 index 000000000..cc03ef2cf --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/wallet/WalletPaymentOrderVO.java @@ -0,0 +1,30 @@ +package com.cool.store.vo.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 钱包支付订单VO + *

+ * + * @author wangff + * @since 2025/11/18 + */ +@Data +public class WalletPaymentOrderVO { + @ApiModelProperty("预支付id") + private String paymentId; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("订单状态:1-成功 2-失败 3-支付中 4-撤销") + private Integer orderStatus; + + @ApiModelProperty("创建时间") + private Date createTime; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/builder/TemplateMessageBuilder.java b/coolstore-partner-service/src/main/java/com/cool/store/builder/TemplateMessageBuilder.java new file mode 100644 index 000000000..9881c7cb3 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/builder/TemplateMessageBuilder.java @@ -0,0 +1,126 @@ +package com.cool.store.builder; + +import com.cool.store.config.weixin.WechatMiniappProperties; +import com.cool.store.dto.wechat.WechatTemplateMessageDTO; +import com.cool.store.enums.wechat.WechatTemplateEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:34 + * @Version 1.0 + */ +@Component +public class TemplateMessageBuilder { + + @Autowired + private WechatMiniappProperties wechatMiniappProperties; + + /** + * 构建普通模板消息 + */ + public WechatTemplateMessageDTO buildNormalTemplate(String openId, + WechatTemplateEnum template, + Map data) { + WechatTemplateMessageDTO messageDTO = new WechatTemplateMessageDTO(); + messageDTO.setToUser(openId); + messageDTO.setTemplateId(template.getTemplateId()); + + // 设置URL(如果data中包含url) + if (data.containsKey("url")) { + messageDTO.setUrl((String) data.get("url")); + } + + // 构建模板数据 + messageDTO.setData(buildTemplateData(data)); + + return messageDTO; + } + + /** + * 构建小程序跳转模板消息 + */ + public WechatTemplateMessageDTO buildMiniappTemplate(String openId, + WechatTemplateEnum template, + Map data, + String miniAppPagePath) { + WechatTemplateMessageDTO messageDTO = new WechatTemplateMessageDTO(); + messageDTO.setToUser(openId); + messageDTO.setTemplateId(template.getTemplateId()); + + // 设置小程序跳转 + WechatTemplateMessageDTO.MiniprogramDTO miniProgram = new WechatTemplateMessageDTO.MiniprogramDTO(); + miniProgram.setAppid(wechatMiniappProperties.getAppId()); + miniProgram.setPagepath(miniAppPagePath != null ? miniAppPagePath : wechatMiniappProperties.getDefaultPagePath()); + messageDTO.setMiniprogram(miniProgram); + + // 设置备用URL(如果data中包含url) + if (data.containsKey("url")) { + messageDTO.setUrl((String) data.get("url")); + } + + // 构建模板数据 + messageDTO.setData(buildTemplateData(data)); + + return messageDTO; + } + + /** + * 构建小程序跳转模板消息(带备用URL) + */ + public WechatTemplateMessageDTO buildMiniAppTemplateWithUrl(String openId, + WechatTemplateEnum template, + Map data, + String miniAppPagePath, + String backupUrl) { + WechatTemplateMessageDTO messageDTO = buildMiniappTemplate(openId, template, data, miniAppPagePath); + + // 设置备用URL + if (backupUrl != null && !backupUrl.trim().isEmpty()) { + messageDTO.setUrl(backupUrl); + } + + return messageDTO; + } + + /** + * 构建模板数据 + */ + private Map buildTemplateData(Map data) { + Map templateData = new HashMap<>(); + + data.forEach((key, value) -> { + if (!"url".equals(key) && value != null) { + WechatTemplateMessageDTO.TemplateDataItemDTO item = + new WechatTemplateMessageDTO.TemplateDataItemDTO( + value.toString(), + getColorByField(key) + ); + templateData.put(key, item); + } + }); + + return templateData; + } + + /** + * 根据字段名获取颜色 + */ + private String getColorByField(String fieldName) { + switch (fieldName) { + case "amount": + case "refundAmount": + case "couponValue": + case "character_string2": + return "#FF0000"; // 金额类字段用红色 + case "orderNo": + case "expressNo": + return "#173177"; // 编号类字段用蓝色 + default: + return "#333333"; // 默认用深灰色 + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMiniappProperties.java b/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMiniappProperties.java new file mode 100644 index 000000000..b1be5c0f6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMiniappProperties.java @@ -0,0 +1,32 @@ +package com.cool.store.config.weixin; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:41 + * @Version 1.0 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "wechat.miniapp") +public class WechatMiniappProperties { + + /** + * 小程序appId + */ + private String appId; + + /** + * 小程序页面路径 + */ + private String defaultPagePath ; + + /** + * 是否使用小程序跳转 + */ + private boolean enabled = false; + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java b/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java new file mode 100644 index 000000000..10acc5f25 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java @@ -0,0 +1,37 @@ +package com.cool.store.config.weixin; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:29 + * @Version 1.0 + * 微信服务号配置 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "wechat.mp") +public class WechatMpProperties { + + /** + * 公众号appId + */ + private String appId; + + /** + * 公众号appSecret + */ + private String appSecret; + + /** + * 获取access_token的URL + */ + private String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token"; + + /** + * 发送模板消息的URL + */ + private String sendTemplateMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send"; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/handler/WeChatHandler.java b/coolstore-partner-service/src/main/java/com/cool/store/handler/WeChatHandler.java new file mode 100644 index 000000000..95c461dd7 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/handler/WeChatHandler.java @@ -0,0 +1,157 @@ +package com.cool.store.handler; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dao.PartnerUserWechatBindDAO; +import com.cool.store.dto.wechat.WechatUserInfoDTO; +import com.cool.store.service.wechat.WechatTemplateService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import javax.annotation.Resource; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author suzhuhong + * @Date 2025/10/14 14:56 + * @Version 1.0 + */ +@Component +@Slf4j +public class WeChatHandler { + + @Resource + PartnerUserWechatBindDAO partnerUserWechatBindDAO; + @Resource + WechatTemplateService wechatTemplateService; + + public Map parseXmlToMap(String xmlContent) throws Exception { + Map result = new HashMap<>(); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new InputSource(new StringReader(xmlContent))); + + NodeList nodes = document.getDocumentElement().getChildNodes(); + for (int i = 0; i < nodes.getLength(); i++) { + Node node = nodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + String tagName = node.getNodeName(); + String textContent = node.getTextContent(); + result.put(tagName, textContent); + } + } + + return result; + } + + + public String processMessage(Map messageMap) { + String msgType = (String) messageMap.get("MsgType"); + String event = (String) messageMap.get("Event"); + + switch (msgType) { + case "event": + return handleEvent(messageMap); + +// case "text": +// return handleTextMessage(message); +// +// case "image": +// return handleImageMessage(message); + + default: + // 其他类型的消息直接回复success + return "success"; + } + } + + private String handleEvent(Map messageMap) { + String event = (String) messageMap.get("Event"); + String fromUserName = (String) messageMap.get("FromUserName"); + String toUserName = (String) messageMap.get("ToUserName"); + + switch (event) { + case "subscribe": + // 关注事件 - 绑定用户 + return handleSubscribeEvent(fromUserName,toUserName); + + case "unsubscribe": + // 取消关注事件 - 解绑用户 + return handleUnsubscribeEvent(fromUserName,toUserName); + + default: + return buildWelcomeReply(fromUserName, toUserName); + } + } + + private String handleSubscribeEvent(String fromUserName,String toUserName) { + try { + + //根据openId 获取用户信息 + WechatUserInfoDTO userInfo = wechatTemplateService.getUserInfo(fromUserName, null); + + log.info("handleSubscribeEvent: {}", JSONObject.toJSONString(userInfo)); + + //根据unionId 更新服务号ID + if (userInfo != null) { + partnerUserWechatBindDAO.updateByUnionId(userInfo.getUnionid(),fromUserName); + } + + // 立即回复欢迎消息 + return buildWelcomeReply(fromUserName, toUserName); + + } catch (Exception e) { + // 即使处理失败也要返回success + return buildWelcomeReply(fromUserName, toUserName); + } + } + + /** + * 处理取消关注事件 + */ + private String handleUnsubscribeEvent(String fromUserName,String toUserName) { + + // 异步处理用户解绑 + //userBindingService.unbindOfficialAccountUser(openId); + + return "success"; + } + + private String buildSuccessReply(String fromUser, String toUser) { + return String.format( + "" + + "" + + "" + + "%d" + + "" + + "" + + "", + fromUser, toUser, System.currentTimeMillis() / 1000 + ); + } + + + private String buildWelcomeReply(String fromUser, String toUser) { + return String.format( + "" + + "" + + "" + + "%d" + + "" + + "" + + "", + fromUser, toUser, System.currentTimeMillis() / 1000 + ); + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java b/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java new file mode 100644 index 000000000..f0c8a8dfd --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java @@ -0,0 +1,239 @@ +package com.cool.store.http; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.utils.RsaSignUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Author suzhuhong + * @Date 2025/11/13 10:00 + * @Version 1.0 + */ +@Service +@Slf4j +public class WalletHttpClientRest { + + @Autowired + private OkHttpClient okHttpClient; + + @Autowired + private ObjectMapper objectMapper; + + @Value("${cool.api.rsa.private.key}") + private String coolPrivateKey; + @Value("${wallet.api.rsa.public.key}") + private String walletPublicKey; + @Value("${wallet.api.yzt.key}") + private String yztKey; + + + /** + * 发送带签名的POST请求 + */ + public T postWithSign(String url, Object request, Class responseType) { + try { + // 1. 准备请求参数 + Map requestParams = convertToMap(request); + requestParams.put("timestamp", System.currentTimeMillis()); + requestParams.put("key", yztKey); + // 2. 生成签名 + String signature = RsaSignUtil.generateSign(requestParams,coolPrivateKey); + requestParams.put("sign", signature); + + // 3. 发送请求 + String responseJson = executePost(url, requestParams); + + // 4. 解析响应 + return parseResponse(responseJson, responseType); + + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + // 其他异常统一包装为RuntimeException + log.error("发送带签名POST请求失败: {}", url, e); + throw new RuntimeException("接口调用异常: " + e.getMessage(), e); + } + } + + /** + * 发送带签名和验签的POST请求 + */ + public T postWithSignAndVerify(String url, Object request, Class responseType) { + try { + // 1. 准备请求参数 + Map requestParams = convertToMap(request); + requestParams.put("timestamp", System.currentTimeMillis()); + + // 2. 生成签名 + String signature = RsaSignUtil.generateSign(requestParams,coolPrivateKey); + requestParams.put("sign", signature); + + // 3. 发送请求 + String responseJson = executePost(url, requestParams); + + // 4. 解析响应并验证签名 + return parseAndVerifyResponse(responseJson, responseType); + + } catch (Exception e) { + log.error("发送带签名和验签POST请求失败: {}", url, e); + throw new RuntimeException(e.getMessage()); + } + } + + /** + * 发送普通POST请求(无签名) + */ + public T post(String url, Object request, Class responseType) { + try { + String responseJson = executePost(url, request); + return parseResponse(responseJson, responseType); + } catch (Exception e) { + log.error("发送POST请求失败: {}", url, e); + throw new RuntimeException("调用外部接口失败: " + e.getMessage()); + } + } + + /** + * 执行POST请求 + */ + private String executePost(String url, Object body) throws IOException { + String jsonBody = objectMapper.writeValueAsString(body); + RequestBody requestBody = RequestBody.create( MediaType.parse("application/json; charset=utf-8"),jsonBody); + + Request request = new Request.Builder() + .url(url) + .post(requestBody) + .addHeader("Content-Type", "application/json") + .build(); + + log.info("发送POST请求: {}, 数据: {}", url, jsonBody); + + try (Response response = okHttpClient.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,response.code() + " " + response.message()); + } + + + String responseBody = response.body().string(); + log.info("收到响应: {}", responseBody); + + checkBusinessResponseCode(responseBody); + + return responseBody; + } + } + + private void checkBusinessResponseCode(String responseJson) throws IOException { + try { + Map responseMap = objectMapper.readValue(responseJson, + new TypeReference>() { + }); + + Object codeObj = responseMap.get("code"); + if (codeObj != null) { + int code = 0; + if (codeObj instanceof Number) { + code = ((Number) codeObj).intValue(); + } else { + code = Integer.parseInt(codeObj.toString()); + } + + if (code != 200) { + String msg = (String) responseMap.get("msg"); + // 700-799为平安银行错误 + if (code >= 700 && code <= 799) { + throw new ServiceException(ErrorCodeEnum.WALLET_API_ERROR, msg); + } else { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "code: " + code + ", msg: " + msg); + } + } + } + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + // 如果解析失败,说明可能不是标准格式,继续处理 + log.debug("无法解析响应码格式: {}", e.getMessage()); + } + } + + /** + * 解析响应 + */ + @SuppressWarnings("unchecked") + private T parseResponse(String responseJson, Class responseType) throws Exception { + // 解析为通用响应格式 + Map responseMap = objectMapper.readValue(responseJson, + new TypeReference>() {}); + + + // 如果返回类型是Map,直接返回 + if (responseType == Map.class) { + return (T) responseMap; + } + + // 提取data字段 + Object data = responseMap.get("data"); + if (data != null && responseType != Object.class) { + if (data instanceof List) { + // 保持List结构,让调用方处理具体类型转换 + return (T)JSONObject.toJSONString(data); + } + return objectMapper.convertValue(data, responseType); + } + + return objectMapper.convertValue(responseMap, responseType); + } + + /** + * 解析响应并验证签名 + */ + @SuppressWarnings("unchecked") + private T parseAndVerifyResponse(String responseJson, Class responseType) throws Exception { + // 解析为Map来验证签名 + Map responseMap = objectMapper.readValue(responseJson, + new TypeReference>() {}); + + // 验证响应签名 + String responseSign = (String) responseMap.get("sign"); + if (responseSign != null) { + // 移除sign字段后进行验签 + Map verifyParams = new HashMap<>(responseMap); + + boolean isValid = RsaSignUtil.verifySign(verifyParams, walletPublicKey); + if (!isValid) { + throw new SecurityException("响应签名验证失败"); + } + log.debug("响应签名验证成功"); + } + + // 返回指定类型的数据 + return parseResponse(responseJson, responseType); + } + + /** + * 转换为Map + */ + @SuppressWarnings("unchecked") + private Map convertToMap(Object obj) { + if (obj instanceof Map) { + return (Map) obj; + } + return objectMapper.convertValue(obj, new TypeReference>() {}); + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java index e420dac8a..fd3635272 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java @@ -8,6 +8,8 @@ import com.aliyun.openservices.ons.api.bean.Subscription; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.RocketMqGroupEnum; import com.cool.store.mq.RocketMqConfig; +import com.cool.store.mq.consumer.listener.ShopDecorationAssignListener; +import com.cool.store.mq.consumer.listener.StoreUserUpdateListener; import com.cool.store.mq.consumer.listener.XfsgTrainingPersonSyncListener; import com.google.common.collect.Maps; import org.springframework.context.annotation.Bean; @@ -32,6 +34,10 @@ public class ConsumerClient { // private FeiShuEventListener feiShuEventListener; @Resource private XfsgTrainingPersonSyncListener xfsgTrainingPersonSyncListener; + @Resource + private StoreUserUpdateListener storeUserUpdateListener; + @Resource + private ShopDecorationAssignListener shopDecorationAssignListener; /** * 获取通用配置 @@ -85,4 +91,30 @@ public class ConsumerClient { // } + @Bean(initMethod = "start", destroyMethod = "shutdown") + public ConsumerBean storeUserUpdate() { + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.STORE_USER_UPDATE; + ConsumerBean consumerBean = new ConsumerBean(); + //配置文件 + Properties properties = getCommonProperties(groupEnum); + consumerBean.setProperties(properties); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, storeUserUpdateListener); + //订阅多个topic如上面设置 + consumerBean.setSubscriptionTable(commonSubscriptionTable); + return consumerBean; + } + + @Bean(initMethod = "start", destroyMethod = "shutdown") + public ConsumerBean shopDecorationAssign() { + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.SHOP_DECORATION_ASSIGN; + ConsumerBean consumerBean = new ConsumerBean(); + //配置文件 + Properties properties = getCommonProperties(groupEnum); + consumerBean.setProperties(properties); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, shopDecorationAssignListener); + //订阅多个topic如上面设置 + consumerBean.setSubscriptionTable(commonSubscriptionTable); + return consumerBean; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ShopDecorationAssignListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ShopDecorationAssignListener.java new file mode 100644 index 000000000..e465de67a --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ShopDecorationAssignListener.java @@ -0,0 +1,65 @@ +package com.cool.store.mq.consumer.listener; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.dao.decoration.ShopDecorationAssignDAO; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; +import com.cool.store.entity.decoration.ShopDecorationAssignDO; +import com.cool.store.service.DecorationHandleService; +import com.cool.store.utils.RedisUtilPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/3 10:13 + * @Version 1.0 + */ +@Slf4j +@Service +public class ShopDecorationAssignListener implements MessageListener { + + @Autowired + public RedisUtilPool redisUtilPool; + @Resource + DecorationHandleService decorationHandleService; + @Resource + ShopDecorationAssignDAO shopDecorationAssignDAO; + + @Override + public Action consume(Message message, ConsumeContext context) { + String text = new String(message.getBody()); + if(StringUtils.isBlank(text)){ + log.info("消息体为空,tag:{},messageId:{}",message.getTag(),message.getMsgID()); + return Action.CommitMessage; + } + String lockKey = "ShopDecorationAssignListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if(lock){ + try { + ShopDecorationAssignDO shopDecorationAssignDO = shopDecorationAssignDAO.getById(Long.valueOf(text)); + decorationHandleService.handleDecorationTeam(shopDecorationAssignDO); + }catch (Exception e){ + log.error("ShopDecorationAssignListener consume error",e); + return Action.ReconsumeLater; + }finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{},reqBody={}",message.getTag(),message.getMsgID(),text); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java new file mode 100644 index 000000000..7509fbe66 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java @@ -0,0 +1,68 @@ +package com.cool.store.mq.consumer.listener; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; +import com.cool.store.service.PushService; +import com.cool.store.service.StoreService; +import com.cool.store.service.ThirdFoodService; +import com.cool.store.utils.RedisUtilPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/25 14:49 + * @Version 1.0 + */ +@Slf4j +@Service +public class StoreUserUpdateListener implements MessageListener { + + @Autowired + public RedisUtilPool redisUtilPool; + @Autowired + StoreService storeService; + @Autowired + ThirdFoodService thirdFoodService; + + @Override + public Action consume(Message message, ConsumeContext context) { + String text = new String(message.getBody()); + if(StringUtils.isBlank(text)){ + log.info("消息体为空,tag:{},messageId:{}",message.getTag(),message.getMsgID()); + return Action.CommitMessage; + } + String lockKey = "StoreUserUpdateListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if(lock){ + try { + List storeUser = storeService.getStoreUser(Arrays.asList(text)); + if (CollectionUtils.isNotEmpty(storeUser)){ + //转换 否则验签不通过 + List storeUserUpdateDTOS = JSONObject.parseArray(JSONObject.toJSONString(storeUser), StoreUserUpdateDTO.class); + thirdFoodService.pushStoreUser(storeUserUpdateDTOS); + } + }catch (Exception e){ + log.error("StoreUserUpdateListener consume error",e); + return Action.ReconsumeLater; + }finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{},reqBody={}",message.getTag(),message.getMsgID(),text); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/BigRegionService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/BigRegionService.java index 19df3e8a7..f32a099e2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/BigRegionService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/BigRegionService.java @@ -21,7 +21,7 @@ public interface BigRegionService { * @param keyword 关键字 * @return */ - List queryAllBigRegion(String keyword); + List queryAllBigRegion(String keyword, Integer joinBrand); /** * 根据门店所属大区和加盟模式查询新管家对应组织信息 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/DecorationHandleService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/DecorationHandleService.java new file mode 100644 index 000000000..5461f94a8 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/DecorationHandleService.java @@ -0,0 +1,94 @@ +package com.cool.store.service; + +import com.cool.store.common.PageBasicInfo; +import com.cool.store.dto.ShopSignerInfoDTO; +import com.cool.store.dto.decoration.DecorationListDTO; +import com.cool.store.dto.decoration.DecorationTeamDTO; +import com.cool.store.entity.decoration.ShopDecorationAssignDO; +import com.cool.store.request.decoration.AddTeamRequest; +import com.cool.store.request.decoration.DecorationListRequest; +import com.cool.store.request.decoration.UpdateConstructionTeamRequest; +import com.cool.store.request.decoration.UpdateTeamRequest; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/10/29 15:54 + * @Version 1.0 + */ +public interface DecorationHandleService { + + + /** + * 新增团队 + * @param request + * @return + */ + Boolean addTeam(AddTeamRequest request); + + /** + * 修改团队 + * @param request + * @return + */ + Boolean update(UpdateTeamRequest request); + + /** + * 删除团队 + * @param teamId + * @return + */ + Boolean deleteByTeamId(Long teamId); + + /** + * pageBasicInfo + * 根据条件查询团队 + * @return + */ + PageInfo listByCondition(PageBasicInfo pageBasicInfo ); + + /** + * openCityId + * @param openCityId + * @return + */ + Long getDecorationTeamIdByCityId(Long openCityId); + + /** + * 处理团队 + * @param teamId + * @return + */ + Boolean handleDecorationTeam(ShopDecorationAssignDO shopDecorationAssignDO); + + /** + * 列表 + * @param request + * @return + */ + PageInfo getDecorationAssignList(DecorationListRequest request); + + /** + * 获取门店签约信息 + * @param shopId + * @return + */ + ShopSignerInfoDTO getShopSignerInfo(Long shopId); + + /** + * 更新施工团队 + * @param request + * @return + */ + Boolean updateConstructionTeam(UpdateConstructionTeamRequest request); + + + + + + + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java index f00f75d0b..33ddacccc 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java @@ -1,5 +1,8 @@ package com.cool.store.service; +import com.cool.store.userholder.CurrentUser; +import com.cool.store.userholder.RefreshUser; + /** * @Author suzhuhong * @Date 2025/5/29 16:34 @@ -13,7 +16,17 @@ public interface EnterpriseService { * @param mobile * @return */ - String getAccessToken(String mobile); + CurrentUser getLoginInfo(String mobile); + /** + * 获取并缓存refreshToken + */ + RefreshUser getRefreshUser(String userId, String mobile); + /** + * 校验用户新建分店/新建线索 可以选择加盟类型类型 + * @param userId + * @param joinMode + */ + void checkUser(String userId,Integer joinMode); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java index dd9424a70..941a8a741 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java @@ -3,6 +3,7 @@ package com.cool.store.service; import com.cool.store.context.LoginUserInfo; import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.request.notice.*; +import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.notice.*; import com.github.pagehelper.PageInfo; @@ -51,11 +52,17 @@ public interface MessageTemplateService { /** * batch 批量发布 * @param request - * @param user + * @param userId * @return */ - Boolean batchPublishMessageTemplate(BatchPublishRequest request, LoginUserInfo user); + Boolean batchPublishMessageTemplate(BatchPublishRequest request, String userId); + /** + * thirdMatterHandle 第三方接口处理 + * @param thirdMatterRequest + * @return + */ + ApiResponse thirdMatterHandle(ThirdMatterRequest thirdMatterRequest); /** * 获取列表 @@ -84,15 +91,16 @@ public interface MessageTemplateService { */ Boolean revokeById(Long id, LoginUserInfo user); - List getModuleList(String storeId,PartnerUserInfoVO userInfoVO); + List getModuleList(String storeId,String mobile); PageInfo getStorePendingList(StoreMessagePendingRequest request); MessageDetailVO getMessageDetail(Long id); - Boolean readMessage(Long id, PartnerUserInfoVO userInfoVO); + Boolean readMessage(Long id, String mobile); - Boolean handleMessage(Long id, PartnerUserInfoVO userInfoVO); + Boolean handleMessage(Long id, String userName,String mobile); + ApiResponse thirdHandleMessage(ThirdHandleMessageRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java index 508c602f9..5cc920f53 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java @@ -48,6 +48,12 @@ public interface PreparationService { * @param shopId */ void sysStoreCompleted(Long shopId); + + /** + * 营业执照和建店资料收集阶段完成后推进POS和营帐通开通 + * @param shopId 店铺id + */ + void businessLicenseAndBuildStoreCompleted(Long shopId); /** * 证照办理+建店资料 都完成 初始化平台建店数据 * @param shopId @@ -89,6 +95,7 @@ public interface PreparationService { /** * POS 建店昨天完成 * 选址与建店资料完成(加盟合同完成) + * v20251024 选址与建店资料完成与营业执照完成 * @param shopId * @return */ diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java index cd514be2e..c9dd0e01b 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java @@ -4,6 +4,7 @@ import com.cool.store.context.LoginUserInfo; import com.cool.store.request.AddSignFranchiseRequest; import com.cool.store.request.AuditApproveRequest; import com.cool.store.request.AuditResultRequest; +import com.cool.store.request.HqtBuildRequest; import com.cool.store.response.AddSignFranchiseResponse; import com.cool.store.response.ResponseResult; @@ -51,4 +52,6 @@ public interface SignFranchiseService { Integer dateHandle(); + + HqtBuildRequest getHqtBuildRequest(Long shopId); } 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 index d916b61a7..3397041b1 100644 --- 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 @@ -1,6 +1,7 @@ package com.cool.store.service; import com.cool.store.dto.StoreDTO; +import com.cool.store.dto.StoreNameDTO; import com.cool.store.dto.store.AuthStoreUserDTO; import com.cool.store.dto.store.StoreUserPositionDTO; import com.cool.store.response.MiniShopsResponse; @@ -24,6 +25,11 @@ public interface StoreService { */ PageInfo getStoreExtendFieldInfo(Integer pageSize,Integer pageNum); + /** + * 分页查询接入物联网的门店 + */ + PageInfo getIotStoreList(Integer pageNum, Integer pageSize); + PageInfo getStoreListByMobile(String mobile,Integer pageNum,Integer pageSize,String storeName,String storeNum); List getStoreUser(List storeCodeList); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java index 4e690ee3c..2349eea5a 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java @@ -1,8 +1,10 @@ package com.cool.store.service; +import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.bigdata.ProfitDataRequest; import com.cool.store.request.oppty.CityRequest; import com.cool.store.response.bigdata.ActDataResponse; +import com.cool.store.response.bigdata.LatestOrderDateResponse; import com.cool.store.response.bigdata.ProfitDataResponse; import com.cool.store.response.bigdata.ProfitRateResponse; import com.cool.store.response.oppty.CityResponse; @@ -53,5 +55,11 @@ public interface ThirdBigDataService { */ ActDataResponse getActData(ProfitDataRequest requestBody); + /** + * 获取门店最新订货日期 + * @param requestBody 最新订货日期Request + * @return 最新订货日期Response列表 + */ + List getLatestOrderDate(LatestOrderDateRequest requestBody); } 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 index c16a436e1..88045070d 100644 --- 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 @@ -1,7 +1,13 @@ package com.cool.store.service; import com.cool.store.dto.FoodTokenDTO; -import com.cool.store.dto.GetAccessTokenDTO; +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; /** * 正新菜品市场api对接-埃林哲-对接人徐哲 @@ -19,4 +25,24 @@ public interface ThirdFoodService { */ String getFoodToken(FoodTokenDTO dto); + /** + * 推送门店人员信息 + * @param storeUserUpdateDTOList + * @return + */ + StoreUserResponse pushStoreUser(List storeUserUpdateDTOList); + + /** + * 查询门店营收实收数据 + * @param request 营收数据Request + * @return 营收数据VO列表 + */ + List getRevenueData(RevenueDataRequest request); + + /** + * 查询菜品服务包上新数据 + * @param request 请求request + * @return 服务包菜品上新DTO + */ + RecipeSpLaunchDTO getRecipeServiceLaunch(RevenueDataRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java index fa329957e..d77703d46 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java @@ -1,6 +1,7 @@ package com.cool.store.service; import com.cool.store.dto.wx.MiniAppUrlLinkReqDTO; +import com.cool.store.dto.wx.MiniProgramFreeLoginDTO; import com.cool.store.dto.wx.MiniProgramLoginDTO; import com.cool.store.request.MobileUpdateRequest; import com.cool.store.vo.PartnerUserInfoVO; @@ -28,4 +29,18 @@ public interface WechatMiniAppService { String getMiniAppUrl(); String getMiniAppUrlLink(MiniAppUrlLinkReqDTO miniAppUrlLinkReqDTO); + + /** + * 通过手机号获取短期token + * @param param 小程序免登DTO + * @return Token + */ + String getShortTermTokenByMobile(MiniProgramFreeLoginDTO param); + + /** + * 通过短期token获取用户信息 + * @param token 短期token + * @return 用户信息VO + */ + PartnerUserInfoVO getUserInfoByShortTermToken(String token); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java index 1bd00abc6..7b3f5f2e3 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java @@ -69,6 +69,7 @@ public class AliyunServiceImpl implements AliyunService { RecognizeIdentityCardResponse idCardResponse = client.recognizeIdentityCardAdvance(recognizeIdentityCardAdvanceRequest, runtime); log.info("身份证解析结果:{}", JSONObject.toJSONString(idCardResponse)); RecognizeIdentityCardResponseBody.RecognizeIdentityCardResponseBodyDataFrontResult frontResult = Optional.ofNullable(idCardResponse).map(o -> o.getBody()).map(o -> o.data).map(o -> o.frontResult).orElse(null); + RecognizeIdentityCardResponseBody.RecognizeIdentityCardResponseBodyDataBackResult BackResult = Optional.ofNullable(idCardResponse).map(o -> o.getBody()).map(o -> o.data).map(o -> o.backResult).orElse(null); if(Objects.nonNull(frontResult)){ String username = frontResult.name; String liveAddress = frontResult.address; @@ -80,7 +81,15 @@ public class AliyunServiceImpl implements AliyunService { String idCard = frontResult.IDNumber; String nation = frontResult.nationality; IdentityCardInfoVO result = new IdentityCardInfoVO(username, liveAddress, birthdate, sex, idCard, nation); - log.info("身份证解析:{}", JSONObject.toJSONString(result)); + log.info("身份证正面解析:{}", JSONObject.toJSONString(result)); + return result; + } + if (Objects.nonNull(BackResult)){ + String endDate = BackResult.getEndDate(); + String issue = BackResult.getIssue(); + String startDate = BackResult.getStartDate(); + IdentityCardInfoVO result = new IdentityCardInfoVO(endDate,issue,startDate); + log.info("身份证背面解析:{}", JSONObject.toJSONString(result)); return result; } return null; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java index 773f13871..119c63028 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java @@ -19,6 +19,7 @@ import com.cool.store.response.GetStoreInfoByCodeResponse; import com.cool.store.response.LicenseListResponse; import com.cool.store.response.SubmitLicenseResponse; import com.cool.store.service.*; +import com.cool.store.service.wallet.WalletService; import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.StringUtil; import com.cool.store.utils.poi.StringUtils; @@ -98,6 +99,9 @@ public class ApplyLicenseServiceImpl implements ApplyLicenseService { @Resource UserAuthMappingService userAuthMappingService; + @Resource + WalletService walletService; + @Override public Boolean submitBusinessLicense(BusinessLicenseRequest request, PartnerUserInfoVO user) { @@ -138,13 +142,21 @@ public class ApplyLicenseServiceImpl implements ApplyLicenseService { ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_3); if (Constants.ONE_INTEGER.equals(request.getSubmitStatus()) && shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_30.getShopSubStageStatus())) { shopStageInfoDAO.updateShopStageAndAuditInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_33, null); + preparationService.businessLicenseAndBuildStoreCompleted(request.getShopId()); preparationService.licenseCompleted(request.getShopId()); preparationService.updateShopStatus(request.getShopId()); preparationService.buildStoreAndDecorationComplete(request.getShopId()); + preparationService.selectSiteAndBuildStoreComplete(request.getShopId()); } + addTagIfUploadLicense(request.getShopId()); return Boolean.TRUE; } + private void addTagIfUploadLicense(Long shopId) { + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); + walletService.addTagIfUploadLicense(shopId, shopInfo.getStoreId(), shopInfo.getLineId()); + } + @Override public Boolean submitFoodLicense(FoodLicenseRequest request, PartnerUserInfoVO user) { log.info("submitBusinessLicense request:{}", JSONObject.toJSONString(request)); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java index d2751cb00..166263a54 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java @@ -25,8 +25,8 @@ public class BigRegionServiceImpl implements BigRegionService { BigRegionDAO bigRegionDAO; @Override - public List queryAllBigRegion(String keyword){ - return bigRegionDAO.queryAllBigRegion(keyword); + public List queryAllBigRegion(String keyword, Integer joinBrand){ + return bigRegionDAO.queryAllBigRegion(keyword, joinBrand); } @Override diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java index fb36918f4..ea175790d 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java @@ -1,6 +1,7 @@ package com.cool.store.service.impl; +import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; import com.cool.store.entity.*; @@ -20,7 +21,7 @@ import com.cool.store.service.UserAuthMappingService; import com.cool.store.utils.RedisConstantUtil; import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.poi.StringUtils; -import io.lettuce.core.ZAddArgs; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -38,6 +39,7 @@ import java.util.stream.Stream; * @createDate 2024-10-09 14:05:52 */ @Service +@Slf4j public class BuildInformationServiceImpl implements BuildInformationService { @Resource private PlatformBuildDAO platformBuildDAO; @@ -71,130 +73,14 @@ public class BuildInformationServiceImpl implements BuildInformationService { private OrderSysInfoDAO orderSysInfoDAO; @Autowired private BigRegionDAO bigRegionDAO; + @Resource + private AcceptanceInfoDAO acceptanceInfoDAO; - @Override - public BuildInformationResponse getBuildInformation(Long shopId) { - BuildInformationResponse response = new BuildInformationResponse(); - ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); - if (Objects.isNull(shopInfo)) { - throw new ServiceException(ErrorCodeEnum.SHOP_NOT_EXIST); - } - LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfo.getLineId()); - ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(shopId, ShopSubStageEnum.SHOP_STAGE_15); - response.setShopSubStageStatus(shopSubStageInfo.getShopSubStageStatus()); - response.setUsername(lineInfoDO.getUsername()); - response.setShopId(shopId); - response.setShopName(shopInfo.getShopName()); - response.setShopCode(shopInfo.getShopCode()); - response.setProvince(shopInfo.getProvince()); - response.setDistrict(shopInfo.getDistrict()); - response.setCity(shopInfo.getCity()); - response.setTownship(shopInfo.getDetailAddress()); - BuildInformationDO informationDO = buildInformationDAO.selectOneByShopId(shopId); - if (Objects.nonNull(informationDO)) { - extracted(response, informationDO); - } - OrderSysInfoDO orderSysInfoDO = orderSysInfoDAO.selectByShopId(shopId); - if (Objects.nonNull(orderSysInfoDO)) { - response.setAddresseeName(orderSysInfoDO.getAddresseeName()); - response.setAddresseeMobile(orderSysInfoDO.getAddresseeMobile()); - response.setXgjVicePresident(orderSysInfoDO.getXgjVicePresident()); - response.setXgjRegionId(orderSysInfoDO.getXgjRegionId()); - response.setXgjRegionName(orderSysInfoDO.getXgjRegionName()); - response.setAddresseeProvince(orderSysInfoDO.getAddresseeProvince()); - response.setAddresseeCity(orderSysInfoDO.getAddresseeCity()); - response.setAddresseeDistrict(orderSysInfoDO.getAddresseeDistrict()); - response.setAddresseeAddress(orderSysInfoDO.getAddresseeAddress()); - response.setDeclareGoodsLogisticsWarehouse(orderSysInfoDO.getDeclareGoodsLogisticsWarehouse()); - response.setDeclareGoodsDate(orderSysInfoDO.getDeclareGoodsDate()); - response.setWarehouseDeliveryDate(orderSysInfoDO.getWarehouseDeliveryDate()); - response.setReceivingFirmName(orderSysInfoDO.getReceivingFirmName()); - response.setReceivingMsBankAccount(orderSysInfoDO.getReceivingMsBankAccount()); - response.setReceivingMsBankBranch(orderSysInfoDO.getReceivingMsBankBranch()); - response.setBankUnionPayAccount(orderSysInfoDO.getBankUnionPayAccount()); - WarehouseInfoDO warehouseInfoDO = warehouseInfoMapper.getByCode(orderSysInfoDO.getDeclareGoodsLogisticsWarehouse()); - if (Objects.nonNull(warehouseInfoDO)) { - response.setDeclareGoodsLogisticsWarehouseName(warehouseInfoDO.getWarehouseName()); - } - response.setDeclareGoodsType(orderSysInfoDO.getDeclareGoodsType()); - } - if (StringUtils.isBlank(response.getXgjVicePresident())) { - List userList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.VICE_PRESIDENT_IN_CHARGE, shopInfo.getRegionId()); - if (CollectionUtils.isNotEmpty(userList)) { - List xgjVicePresidentList = enumInfoService.getByTypeCode(ZxjpEnum.XGJ_VICE_PRESIDENT.getCode()); - List userNameSet = userList.stream().map(EnterpriseUserDO::getName).collect(Collectors.toList()); - List xgjVicePresidentNameList = xgjVicePresidentList.stream().map(EnumInfoDO::getSysValue).collect(Collectors.toList()); - List resultUserNameList = userNameSet.stream() - .filter(xgjVicePresidentNameList::contains) - .collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(resultUserNameList)){ - response.setXgjVicePresident(resultUserNameList.get(0)); - } - } - } - //根据映射关系默认带出新管家组织 - if (StringUtils.isBlank(response.getXgjRegionName())) { - Integer joinMode = shopInfo.getJoinMode() == 3 ? CommonConstants.ONE : CommonConstants.ZERO; - BigRegionDO bigRegionDO = bigRegionDAO.queryOrgInfoByBigRegionAndJoinMode(shopInfo.getRegionId(), joinMode); - if (Objects.nonNull(bigRegionDO)) { - response.setXgjRegionId(bigRegionDO.getOrgId()); - response.setXgjRegionName(bigRegionDO.getOrgName()); - } - } - if (StringUtils.isBlank(response.getAddresseeProvince())) { - response.setAddresseeProvince(shopInfo.getProvince()); - } - if (StringUtils.isBlank(response.getAddresseeCity())) { - response.setAddresseeCity(shopInfo.getCity()); - } - if (StringUtils.isBlank(response.getAddresseeDistrict())) { - response.setAddresseeDistrict(shopInfo.getDistrict()); - } - if (StringUtils.isBlank(response.getAddresseeAddress())) { - response.setAddresseeAddress(shopInfo.getDetailAddress()); - } - - return response; - - } - - private static void extracted(BuildInformationResponse response, BuildInformationDO informationDO) { - response.setShopContactName(informationDO.getShopContactName()); - response.setShopContactMobile(informationDO.getShopContactMobile()); - response.setBusinessHours(informationDO.getBusinessHours()); - response.setBusinessMobile(informationDO.getBusinessMobile()); - response.setDoorPhoto(informationDO.getDoorPhoto()); - response.setInStorePhoto(informationDO.getInStorePhoto()); - response.setJuridicalIdCardFront(informationDO.getJuridicalIdCardFront()); - response.setJuridicalName(informationDO.getJuridicalName()); - response.setJuridicalIdCardNo(informationDO.getJuridicalIdCardNo()); - response.setJuridicalIdCardReverse(informationDO.getJuridicalIdCardReverse()); - response.setJuridicalHandheldIdCardReverse(informationDO.getJuridicalHandheldIdCardReverse()); - response.setJuridicalHandheldIdCardFront(informationDO.getJuridicalHandheldIdCardFront()); - response.setJuridicalHandheldIdCardReverse(informationDO.getJuridicalHandheldIdCardReverse()); - response.setSettlerIdCardNo(informationDO.getSettlerIdCardNo()); - response.setSettlerName(informationDO.getSettlerName()); - response.setSettlerBankPhotoUrl(informationDO.getSettlerBankPhotoUrl()); - response.setSettlerIdCardFront(informationDO.getSettlerIdCardFront()); - response.setSettlerIdCardReverse(informationDO.getSettlerIdCardReverse()); - response.setSettlerBankNumber(informationDO.getSettlerBankNumber()); - response.setSettlerBankMobile(informationDO.getSettlerBankMobile()); - response.setSettlerBankName(informationDO.getSettlerBankName()); - response.setAuthorizationUrl(informationDO.getAuthorizationUrl()); - response.setRelationshipProve(informationDO.getRelationshipProve()); - response.setAccountOpeningPermit(informationDO.getAccountOpeningPermit()); - response.setSettlerInHandFrontPicture(informationDO.getSettlerInHandFrontPicture()); - response.setSettlerInHandBackPicture(informationDO.getSettlerInHandBackPicture()); - response.setMiniProgramsShopName(informationDO.getCShopName()); - response.setSettlerBankBackPhotoUrl(informationDO.getSettlerBankBackPhotoUrl()); - response.setSettlerIsSamePartner(informationDO.getSettlerIsSamePartner()); - response.setJuridicalIsSamePartner(informationDO.getJuridicalIsSamePartner()); - } - @Override @Transactional(rollbackFor = Exception.class) public Integer submitOrUpdate(BuildInformationRequest request) { + log.info("提交/修改建店资料开始,shopId:{}", JSONObject.toJSONString(request)); String lockKey = redisConstantUtil.submitBuildKey(request.getShopId()); String lockValue = UUID.randomUUID().toString(); boolean acquired = false; @@ -203,6 +89,9 @@ public class BuildInformationServiceImpl implements BuildInformationService { if (Boolean.TRUE.equals(acquired)) { ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(request.getShopId()); // if (JoinModeEnum.FLAGSHIP_STORE.getCode()!=shopInfoDO.getJoinMode()){ +// log.info("FLAGSHIP_STORE:{},{},{},{},{},{},{}",request.getSettlerName(),request.getSettlerIdCardFront(), +// request.getSettlerInHandFrontPicture(),request.getSettlerBankBackPhotoUrl(), +// request.getSettlerBankNumber(),request.getSettlerBankMobile(),request.getSettlerBankName()); // //校验结算人非空 // if (StringUtils.isAnyBlank(request.getSettlerName(),request.getSettlerIdCardFront(), // request.getSettlerInHandFrontPicture(),request.getSettlerBankBackPhotoUrl(), @@ -284,6 +173,133 @@ public class BuildInformationServiceImpl implements BuildInformationService { } } + @Override + public BuildInformationResponse getBuildInformation(Long shopId) { + BuildInformationResponse response = new BuildInformationResponse(); + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); + if (Objects.isNull(shopInfo)) { + throw new ServiceException(ErrorCodeEnum.SHOP_NOT_EXIST); + } + LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfo.getLineId()); + ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(shopId, ShopSubStageEnum.SHOP_STAGE_15); + response.setShopSubStageStatus(shopSubStageInfo.getShopSubStageStatus()); + response.setUsername(lineInfoDO.getUsername()); + response.setShopId(shopId); + response.setShopName(shopInfo.getShopName()); + response.setShopCode(shopInfo.getShopCode()); + response.setProvince(shopInfo.getProvince()); + response.setDistrict(shopInfo.getDistrict()); + response.setCity(shopInfo.getCity()); + response.setTownship(shopInfo.getDetailAddress()); + BuildInformationDO informationDO = buildInformationDAO.selectOneByShopId(shopId); + if (Objects.nonNull(informationDO)) { + extracted(response, informationDO); + } + OrderSysInfoDO orderSysInfoDO = orderSysInfoDAO.selectByShopId(shopId); + if (Objects.nonNull(orderSysInfoDO)) { + response.setAddresseeName(orderSysInfoDO.getAddresseeName()); + response.setAddresseeMobile(orderSysInfoDO.getAddresseeMobile()); + response.setXgjVicePresident(orderSysInfoDO.getXgjVicePresident()); + response.setXgjRegionId(orderSysInfoDO.getXgjRegionId()); + response.setXgjRegionName(orderSysInfoDO.getXgjRegionName()); + response.setAddresseeProvince(orderSysInfoDO.getAddresseeProvince()); + response.setAddresseeCity(orderSysInfoDO.getAddresseeCity()); + response.setAddresseeDistrict(orderSysInfoDO.getAddresseeDistrict()); + response.setAddresseeAddress(orderSysInfoDO.getAddresseeAddress()); + response.setDeclareGoodsLogisticsWarehouse(orderSysInfoDO.getDeclareGoodsLogisticsWarehouse()); + response.setDeclareGoodsDate(orderSysInfoDO.getDeclareGoodsDate()); + response.setWarehouseDeliveryDate(orderSysInfoDO.getWarehouseDeliveryDate()); + response.setReceivingFirmName(orderSysInfoDO.getReceivingFirmName()); + 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()); + } + response.setDeclareGoodsType(orderSysInfoDO.getDeclareGoodsType()); + } + if (StringUtils.isBlank(response.getXgjVicePresident())) { + List userList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.VICE_PRESIDENT_IN_CHARGE, shopInfo.getRegionId()); + if (CollectionUtils.isNotEmpty(userList)) { + List xgjVicePresidentList = enumInfoService.getByTypeCode(ZxjpEnum.XGJ_VICE_PRESIDENT.getCode()); + List userNameSet = userList.stream().map(EnterpriseUserDO::getName).collect(Collectors.toList()); + List xgjVicePresidentNameList = xgjVicePresidentList.stream().map(EnumInfoDO::getSysValue).collect(Collectors.toList()); + List resultUserNameList = userNameSet.stream() + .filter(xgjVicePresidentNameList::contains) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(resultUserNameList)){ + response.setXgjVicePresident(resultUserNameList.get(0)); + } + } + } + //根据映射关系默认带出新管家组织 + if (StringUtils.isBlank(response.getXgjRegionName())) { + Integer joinMode = shopInfo.getJoinMode() == 3 ? CommonConstants.ONE : CommonConstants.ZERO; + BigRegionDO bigRegionDO = bigRegionDAO.queryOrgInfoByBigRegionAndJoinMode(shopInfo.getRegionId(), joinMode); + if (Objects.nonNull(bigRegionDO)) { + response.setXgjRegionId(bigRegionDO.getOrgId()); + response.setXgjRegionName(bigRegionDO.getOrgName()); + } + } + if (StringUtils.isBlank(response.getAddresseeProvince())) { + response.setAddresseeProvince(shopInfo.getProvince()); + } + if (StringUtils.isBlank(response.getAddresseeCity())) { + response.setAddresseeCity(shopInfo.getCity()); + } + if (StringUtils.isBlank(response.getAddresseeDistrict())) { + response.setAddresseeDistrict(shopInfo.getDistrict()); + } + if (StringUtils.isBlank(response.getAddresseeAddress())) { + response.setAddresseeAddress(shopInfo.getDetailAddress()); + } + // 不存在的情况下从装修验收中获取 + if (StringUtils.isBlank(response.getDoorPhoto()) || StringUtils.isBlank(response.getInStorePhoto())) { + AcceptanceInfoDO acceptanceInfoDO = acceptanceInfoDAO.selectByShopId(shopId); + if (Objects.nonNull(acceptanceInfoDO)) { + response.setDoorPhoto(StringUtils.isNotBlank(response.getDoorPhoto()) ? response.getDoorPhoto() : acceptanceInfoDO.getShopDoorwayPhoto()); + response.setInStorePhoto(StringUtils.isNotBlank(response.getInStorePhoto()) ? response.getInStorePhoto() : acceptanceInfoDO.getShopInteriorPhoto()); + } + } + return response; + + } + + private static void extracted(BuildInformationResponse response, BuildInformationDO informationDO) { + response.setShopContactName(informationDO.getShopContactName()); + response.setShopContactMobile(informationDO.getShopContactMobile()); + response.setBusinessHours(informationDO.getBusinessHours()); + response.setBusinessMobile(informationDO.getBusinessMobile()); + response.setDoorPhoto(informationDO.getDoorPhoto()); + response.setInStorePhoto(informationDO.getInStorePhoto()); + response.setJuridicalIdCardFront(informationDO.getJuridicalIdCardFront()); + response.setJuridicalName(informationDO.getJuridicalName()); + response.setJuridicalIdCardNo(informationDO.getJuridicalIdCardNo()); + response.setJuridicalIdCardReverse(informationDO.getJuridicalIdCardReverse()); + response.setJuridicalHandheldIdCardReverse(informationDO.getJuridicalHandheldIdCardReverse()); + response.setJuridicalHandheldIdCardFront(informationDO.getJuridicalHandheldIdCardFront()); + response.setJuridicalHandheldIdCardReverse(informationDO.getJuridicalHandheldIdCardReverse()); + response.setSettlerIdCardNo(informationDO.getSettlerIdCardNo()); + response.setSettlerName(informationDO.getSettlerName()); + response.setSettlerBankPhotoUrl(informationDO.getSettlerBankPhotoUrl()); + response.setSettlerIdCardFront(informationDO.getSettlerIdCardFront()); + response.setSettlerIdCardReverse(informationDO.getSettlerIdCardReverse()); + response.setSettlerBankNumber(informationDO.getSettlerBankNumber()); + response.setSettlerBankMobile(informationDO.getSettlerBankMobile()); + response.setSettlerBankName(informationDO.getSettlerBankName()); + response.setAuthorizationUrl(informationDO.getAuthorizationUrl()); + response.setRelationshipProve(informationDO.getRelationshipProve()); + response.setAccountOpeningPermit(informationDO.getAccountOpeningPermit()); + response.setSettlerInHandFrontPicture(informationDO.getSettlerInHandFrontPicture()); + response.setSettlerInHandBackPicture(informationDO.getSettlerInHandBackPicture()); + response.setMiniProgramsShopName(informationDO.getCShopName()); + response.setSettlerBankBackPhotoUrl(informationDO.getSettlerBankBackPhotoUrl()); + response.setSettlerIsSamePartner(informationDO.getSettlerIsSamePartner()); + response.setJuridicalIsSamePartner(informationDO.getJuridicalIsSamePartner()); + } + private static @NotNull OrderSysInfoDO getOrderSysInfoDO(BuildInformationRequest request) { OrderSysInfoDO orderSysInfoDO = new OrderSysInfoDO(); orderSysInfoDO.setShopId(request.getShopId()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java index 872f9fb52..efcef8449 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java @@ -1170,7 +1170,7 @@ public class DataHandlerServerImpl implements DataHandlerServer { shopInfoDO.setManagerRegionId(isCreateStoreDTO.getPid()); updateList.add(shopInfoDO); } - List bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null); + List bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null, null); Map bigRegionDTOMap = bigRegionDTOS.stream().collect(Collectors.toMap(BigRegionDTO::getRegionId, x -> x)); //XX大区 正烧鸡 List storeManageIds = bigRegionDTOS.stream().filter(x -> x.getStoreManageRegionId() != null).map(BigRegionDTO::getStoreManageRegionId).collect(Collectors.toList()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java index 03b389bef..6bd8c39f0 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java @@ -1,5 +1,7 @@ package com.cool.store.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.cool.store.dao.*; import com.cool.store.entity.*; import com.cool.store.enums.ErrorCodeEnum; @@ -10,14 +12,12 @@ import com.cool.store.exception.ServiceException; import com.cool.store.request.*; import com.cool.store.service.DecorationDesignInfoService; import com.cool.store.utils.poi.StringUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -40,6 +40,8 @@ public class DecorationDesignInfoServiceImpl implements DecorationDesignInfoServ private ShopStageInfoDAO shopStageInfoDAO; @Resource private LineInfoDAO lineInfoDAO; + @Resource + private BuildInformationDAO buildInformationDAO; @Override @Transactional(rollbackFor = Exception.class) @@ -277,8 +279,28 @@ public class DecorationDesignInfoServiceImpl implements DecorationDesignInfoServ if (shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_122.getShopSubStageStatus())) { shopStageInfoDAO.updateShopStageInfo(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_123); } + // 覆盖建店资料中的门头照和内景照 + BuildInformationDO buildInformation = BuildInformationDO.builder().shopId(request.getShopId()).doorPhoto(buildJson(request.getShopDoorwayPhotoUrl())) + .inStorePhoto(buildJson(request.getShopInteriorPhotoUrl())).build(); + buildInformationDAO.updateByShopIdSelective(buildInformation); return true; } + public String buildJson(List urls) { + if (CollectionUtils.isEmpty(urls)) { + return null; + } + JSONArray jsonArray = new JSONArray(); + for (String url : urls) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("url", url); + jsonObject.put("type", extractImageSuffix(url)); + jsonArray.add(jsonObject); + } + return jsonArray.toJSONString(); + } + public String extractImageSuffix(String url) { + return url.substring(url.lastIndexOf(".") + 1); + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationHandleServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationHandleServiceImpl.java new file mode 100644 index 000000000..32501daf2 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationHandleServiceImpl.java @@ -0,0 +1,251 @@ +package com.cool.store.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.common.PageBasicInfo; +import com.cool.store.dao.*; +import com.cool.store.dao.decoration.DecorationTeamConfigDAO; +import com.cool.store.dao.decoration.ShopDecorationAssignDAO; +import com.cool.store.dao.decoration.TeamAreaMappingDAO; +import com.cool.store.dto.ShopSignerInfoDTO; +import com.cool.store.dto.decoration.DecorationListDTO; +import com.cool.store.dto.decoration.DecorationTeamDTO; +import com.cool.store.dto.decoration.TeamAreaMappingDTO; +import com.cool.store.entity.*; +import com.cool.store.entity.decoration.DecorationTeamConfigDO; +import com.cool.store.entity.decoration.ShopDecorationAssignDO; +import com.cool.store.entity.decoration.TeamAreaMappingDO; +import com.cool.store.enums.Decoration.DecorationDescStatus; +import com.cool.store.enums.Decoration.DecorationUseSystemEnum; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.JoinModeEnum; +import com.cool.store.enums.point.ShopSubStageStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.decoration.AddTeamRequest; +import com.cool.store.request.decoration.DecorationListRequest; +import com.cool.store.request.decoration.UpdateConstructionTeamRequest; +import com.cool.store.request.decoration.UpdateTeamRequest; +import com.cool.store.service.DecorationHandleService; +import com.cool.store.service.HqtAPIService; +import com.cool.store.service.SignFranchiseService; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; +import springfox.documentation.service.ApiListing; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/10/29 15:55 + * @Version 1.0 + */ +@Service +@Slf4j +public class DecorationHandleServiceImpl implements DecorationHandleService { + + + @Resource + private DecorationTeamConfigDAO decorationTeamConfigDAO; + @Resource + private TeamAreaMappingDAO teamAreaMappingDAO; + @Resource + ShopDecorationAssignDAO shopDecorationAssignDAO; + @Resource + RedisUtilPool redisUtilPool; + @Resource + private HqtAPIService hqtAPIService; + @Resource + ShopStageInfoDAO shopStageInfoDAO; + @Resource + ShopInfoDAO shopInfoDAO; + @Resource + SignFranchiseService signFranchiseService; + @Resource + RegionDao regionDao; + @Resource + LineInfoDAO lineInfoDAO; + @Resource + private SignFranchiseDAO signFranchiseDAO; + + @Override + public Boolean addTeam(AddTeamRequest request) { + //校验 + if (Objects.isNull(request)||CollectionUtils.isEmpty(request.getOpenCityIdList()) || StringUtil.isEmpty(request.getTeamName())){ + throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); + } + //先删除城市团队关系 + teamAreaMappingDAO.deletedIds(request.getOpenCityIdList()); + + DecorationTeamConfigDO decorationTeamConfigDO = new DecorationTeamConfigDO(); + decorationTeamConfigDO.setTeamName(request.getTeamName()); + decorationTeamConfigDO.setTeamCode(getNextNumber()); + decorationTeamConfigDO.setUseSystem(request.getUserSystem()); + decorationTeamConfigDAO.addTeam(decorationTeamConfigDO); + teamAreaMappingDAO.batchInsert(decorationTeamConfigDO.getId(),request.getOpenCityIdList()); + return Boolean.TRUE; + } + + @Override + public Boolean update(UpdateTeamRequest request) { + if (request.getId() == null||CollectionUtils.isEmpty(request.getOpenCityIdList()) || StringUtil.isEmpty(request.getTeamName())){ + throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); + } + DecorationTeamConfigDO teamConfigDO = decorationTeamConfigDAO.getById(request.getId()); + if (teamConfigDO==null){ + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + teamConfigDO.setTeamName(request.getTeamName()); + teamConfigDO.setUseSystem(request.getUserSystem()); + decorationTeamConfigDAO.updateTeam(teamConfigDO); + //删除团队城市关系 + teamAreaMappingDAO.deletedByTeamId(teamConfigDO.getId()); + //新增更新之后的团队城市关系 + teamAreaMappingDAO.batchInsert(teamConfigDO.getId(),request.getOpenCityIdList()); + return Boolean.TRUE; + } + + @Override + public Boolean deleteByTeamId(Long teamId) { + DecorationTeamConfigDO teamConfigDO = decorationTeamConfigDAO.getById(teamId); + if (teamConfigDO==null){ + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + //查询当前团队是否有门店使用 有的话 不能删除 + Integer count = shopDecorationAssignDAO.countByTeamId(teamId); + if (count != null && count > 0){ + throw new ServiceException(ErrorCodeEnum.TEAM_USED); + } + teamConfigDO.setDeleted(1); + teamAreaMappingDAO.deletedByTeamId(teamId); + decorationTeamConfigDAO.updateTeam(teamConfigDO); + return Boolean.TRUE; + } + + @Override + public PageInfo listByCondition(PageBasicInfo pageBasicInfo) { + PageHelper.startPage(pageBasicInfo.getPageNum(), pageBasicInfo.getPageSize()); + List list = decorationTeamConfigDAO.listByCondition(); + if (CollectionUtils.isEmpty(list)){ + return new PageInfo<>(); + } + List teamIds = list.stream().map(DecorationTeamDTO::getId).collect(Collectors.toList()); + Map> listMap = teamAreaMappingDAO.listByTeamIdList(teamIds); + list.forEach(x->{ + x.setCityList(listMap.get(x.getId())); + }); + PageInfo result = new PageInfo<>(list); + return result; + } + + @Override + public Long getDecorationTeamIdByCityId(Long openCityId) { + if (openCityId==null){ + throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); + } + TeamAreaMappingDO cityInfo = teamAreaMappingDAO.getByCityId(openCityId); + if (Objects.isNull(cityInfo)){ + return null; + } + DecorationTeamConfigDO teamInfo = decorationTeamConfigDAO.getById(cityInfo.getTeamId()); + return teamInfo.getId(); + } + + @Override + public Boolean handleDecorationTeam(ShopDecorationAssignDO shopDecorationAssign) { + //先查询 + if (shopDecorationAssign == null){ + log.info("handleDecorationTeam_error data not exist"); + return Boolean.FALSE; + } + //如果门店是已经分配状态 则不能再次分配 + if (DecorationDescStatus.ASSIGNED.getCode().equals(shopDecorationAssign.getDecorationDescStatus())){ + log.info("handleDecorationTeam id:{},门店已分配", JSONObject.toJSONString(shopDecorationAssign)); + } + //没有分配的门店 开始分配 + ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(shopDecorationAssign.getShopId()); + //查询装修团队 + DecorationTeamConfigDO teamInfo = decorationTeamConfigDAO.getById(shopDecorationAssign.getDecorationTeamId()); + if (teamInfo == null){ + log.info("handleDecorationTeam_error team not exist"); + return Boolean.FALSE; + } + //配置的系统是红圈通 且不是加盟公司自有店 则推送数据 也就是配置了crm或者是加盟公司自有店 走crm流程 + if (teamInfo.getUseSystem().equals(DecorationUseSystemEnum.HQT.getCode())&&!shopInfoDO.getJoinMode().equals(JoinModeEnum.OWN_STORE.getCode())){ + hqtAPIService.pushHqtBuild(signFranchiseService.getHqtBuildRequest(shopInfoDO.getId())); + } + shopDecorationAssign.setDecorationDescStatus(DecorationDescStatus.ASSIGNED.getCode()); + shopDecorationAssignDAO.update(shopDecorationAssign); + //阶段 + shopStageInfoDAO.updateShopStageInfo(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_861); + return Boolean.TRUE; + } + + @Override + public PageInfo getDecorationAssignList(DecorationListRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List decorationListDTOS = shopDecorationAssignDAO.listByCondition(request); + if (CollectionUtils.isEmpty(decorationListDTOS)){ + return new PageInfo<>(); + } + Set regionIds = decorationListDTOS.stream().map(DecorationListDTO::getRegionId).collect(Collectors.toSet()); + List regionList = regionDao.getRegionByRegionIds(new ArrayList<>(regionIds)); + //转为map + Map regionMap = regionList.stream().collect(Collectors.toMap(RegionDO::getRegionId, RegionDO::getName)); + decorationListDTOS.forEach(x->{ + x.setRegionName(regionMap.get(x.getRegionId())); + }); + return new PageInfo<>(decorationListDTOS); + } + + @Override + public ShopSignerInfoDTO getShopSignerInfo(Long shopId) { + if (shopId==null){ + throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); + } + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); + if (shopInfo == null){ + throw new ServiceException(ErrorCodeEnum.SHOP_NOT_EXIST); + } + LineInfoDO lineInfo = lineInfoDAO.getLineInfo(shopInfo.getLineId()); + ShopSignerInfoDTO shopSignerInfoDTO = new ShopSignerInfoDTO(); + shopSignerInfoDTO.setPartnershipSignatoryFirst(lineInfo.getUsername()); + shopSignerInfoDTO.setPartnershipSignatoryFirstMobile(lineInfo.getMobile()); + SignFranchiseDO signFranchiseDO = signFranchiseDAO.selectByShopId(shopId); + if (signFranchiseDO!=null){ + shopSignerInfoDTO.setPartnershipSignatorySecond(signFranchiseDO.getPartnershipSignatorySecond()); + shopSignerInfoDTO.setPartnershipSignatorySecondMobile(signFranchiseDO.getPartnershipSignatorySecondMobile()); + } + return shopSignerInfoDTO; + } + + @Override + public Boolean updateConstructionTeam(UpdateConstructionTeamRequest request) { + //查询待分配门店信息 + ShopDecorationAssignDO shopDecorationAssign = shopDecorationAssignDAO.getById(request.getId()); + if (shopDecorationAssign == null){ + log.info("handleDecorationTeam_error data not exist"); + return Boolean.FALSE; + } + shopDecorationAssign.setDecorationTeamId(request.getTeamId()); + handleDecorationTeam(shopDecorationAssign); + return Boolean.TRUE; + } + + + public String getNextNumber() { + Long current = redisUtilPool.incrby("counter_key", 1); + if (current == 1) { + // 如果是第一次,重新设置为 1(因为 increment 从 0 开始) + redisUtilPool.setString("counter_key", "1"); + current = 1L; + } + return String.format("TD%04d", current); + } + +} 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 38adb09b6..f48912741 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 @@ -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); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java index 7f5c7ac66..036c02713 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java @@ -1,19 +1,23 @@ package com.cool.store.service.impl; import com.alibaba.fastjson.JSON; +import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.entity.EnterpriseUserDO; import com.cool.store.entity.SysRoleDO; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.JoinModeEnum; import com.cool.store.enums.Role; import com.cool.store.enums.UserStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.SysRoleMapper; import com.cool.store.service.EnterpriseService; import com.cool.store.userholder.CurrentUser; +import com.cool.store.userholder.RefreshUser; import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.poi.DateUtils; +import com.cool.store.utils.poi.constant.Constants; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.crypto.RandomNumberGenerator; @@ -48,7 +52,7 @@ public class EnterpriseServiceImpl implements EnterpriseService { private String eid; @Override - public String getAccessToken(String mobile) { + public CurrentUser getLoginInfo(String mobile) { CurrentUser currentUser = new CurrentUser(); EnterpriseUserDO enterpriseUser = enterpriseUserDAO.selectByMobile(mobile); if (Objects.isNull(enterpriseUser)){ @@ -107,8 +111,36 @@ public class EnterpriseServiceImpl implements EnterpriseService { currentUser.setAppType("qw_self_dkf"); currentUser.setUnionid(enterpriseUser.getUnionid()); currentUser.setUserType(enterpriseUser.getUserType()); - redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), 24 * 60 * 60); - return currentUser.getAccessToken(); + redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), CommonConstants.ACTION_TOKEN_EXPIRE); + return currentUser; + } + + @Override + public RefreshUser getRefreshUser(String userId, String mobile) { + if (StringUtils.isBlank(mobile)) { + EnterpriseUserDO userInfo = enterpriseUserDAO.getUserInfoById(userId); + mobile = userInfo.getMobile(); + } + String refreshToken = getToken(); + RefreshUser refreshUser = new RefreshUser(userId, refreshToken, mobile); + redisUtilPool.setString(RedisConstant.REFRESH_TOKEN_PREFIX + refreshToken, JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE); + return refreshUser; + } + + @Override + public void checkUser(String userId,Integer joinMode) { + EnterpriseUserDO userInfo = enterpriseUserDAO.getUserInfoById(userId); + if (userInfo !=null){ + //校验当前人员是否是加盟部 581 + String departments = userInfo.getDepartments(); + //如果departments包含/581/ 加盟部 + if (com.cool.store.utils.poi.StringUtils.isNotBlank(departments) && departments.contains("/581/")) { + //加盟部 FRANCHISE_COMPANIES + if (!JoinModeEnum.isFranchise(joinMode)){ + throw new ServiceException(ErrorCodeEnum.JOIN_MODE_NOT_ALLOW_OPERATE); + } + } + } } public static void main(String[] args) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java index 5a404ff5f..adb9afe79 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java @@ -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; } 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 5f00aa80f..dc2c8f013 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 @@ -305,6 +305,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; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java index 2db3f5441..cc40863fd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java @@ -88,6 +88,8 @@ public class LineServiceImpl implements LineService { private RegionQrcodeConfigDao regionQrcodeConfigDao; @Resource QualificationsInfoDAO qualificationsInfoDAO; + @Resource + EnterpriseService enterpriseService; @Override @@ -514,6 +516,7 @@ public class LineServiceImpl implements LineService { public Boolean addLine(AddLineRequest addLineRequest, LoginUserInfo userInfo) { //必填参数 log.info("addLine:{}", JSONObject.toJSONString(addLineRequest)); + enterpriseService.checkUser(userInfo.getUserId(), addLineRequest.getJoinMode()); if (!StringUtil.isNoneBlank(addLineRequest.getMobile(), addLineRequest.getUserName())) { throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MatterConfigServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MatterConfigServiceImpl.java index 4875e39fe..ad78098c1 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MatterConfigServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MatterConfigServiceImpl.java @@ -5,6 +5,8 @@ import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.MatterConfigDAO; import com.cool.store.dto.notice.CommonDTO; import com.cool.store.entity.MatterConfigDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; import com.cool.store.request.notice.MatterConfigAddRequest; import com.cool.store.request.notice.MatterConfigQueryRequest; import com.cool.store.service.MatterConfigService; @@ -36,19 +38,30 @@ public class MatterConfigServiceImpl implements MatterConfigService { MatterConfigDO matterConfigDO = new MatterConfigDO(); BeanUtils.copyProperties(request, matterConfigDO); matterConfigDO.setCreateUserId(currentUser.getUserId()); - matterConfigDO.setDefaultStoreInfo(JSONObject.toJSONString(request.getStoreInfoList())); - matterConfigDO.setDefaultHandlePersonInfo(JSONObject.toJSONString(request.getUserInfoList())); + if (CollectionUtils.isNotEmpty(request.getStoreInfoList())){ + matterConfigDO.setDefaultStoreInfo(JSONObject.toJSONString(request.getStoreInfoList())); + } + if (CollectionUtils.isNotEmpty(request.getUserInfoList())){ + matterConfigDO.setDefaultHandlePersonInfo(JSONObject.toJSONString(request.getUserInfoList())); + } return matterConfigDAO.insert(matterConfigDO); } @Override public int editMatterConfig(MatterConfigAddRequest request, LoginUserInfo currentUser) { + if (request.getId() == null){ + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } MatterConfigDO matterConfigDO = new MatterConfigDO(); BeanUtils.copyProperties(request, matterConfigDO); matterConfigDO.setUpdateUserId(currentUser.getUserId()); matterConfigDO.setUpdateTime(new Date()); - matterConfigDO.setDefaultStoreInfo(JSONObject.toJSONString(request.getStoreInfoList())); - matterConfigDO.setDefaultHandlePersonInfo(JSONObject.toJSONString(request.getUserInfoList())); + if (CollectionUtils.isNotEmpty(request.getStoreInfoList())){ + matterConfigDO.setDefaultStoreInfo(JSONObject.toJSONString(request.getStoreInfoList())); + } + if (CollectionUtils.isNotEmpty(request.getUserInfoList())){ + matterConfigDO.setDefaultHandlePersonInfo(JSONObject.toJSONString(request.getUserInfoList())); + } return matterConfigDAO.updateForce(matterConfigDO); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java new file mode 100644 index 000000000..b96dc18f7 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java @@ -0,0 +1,78 @@ +package com.cool.store.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.util.ArrayUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dao.MessageTemplateDAO; +import com.cool.store.entity.MessageTemplateDO; +import com.cool.store.entity.StoreMessageDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.vo.notice.StoreMessageVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.messaging.MessagingException; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + *

+ * 消息下发 服务类 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class MessageIssueService { + private final MessageTemplateDAO messageTemplateDAO; + private final SimpMessagingTemplate simpMessagingTemplate; + + /** + * 下发即时通知消息 + * + * @param list 门店消息列表 + */ + @Async("generalThreadPool") + public void issueMessage(List list) { + if (CollectionUtils.isEmpty(list)) return; + log.info("下发即时通知, messageList:{}", JSONObject.toJSONString(list)); + try { + Set messageTemplateIds = CollStreamUtil.toSet(list, StoreMessageDO::getMessageTemplateId); + List messageTemplateList = messageTemplateDAO.getByIds(new ArrayList<>(messageTemplateIds)); + Map messageTemplateMap = CollStreamUtil.toMap(messageTemplateList, MessageTemplateDO::getId, v -> v); + + for (StoreMessageDO storeMessageDO : list) { + if (StringUtils.isNotBlank(storeMessageDO.getOperatorList())) { + String[] userIds = storeMessageDO.getOperatorList().split(","); + if (ArrayUtil.isNotEmpty(userIds)) { + MessageTemplateDO messageTemplateDO = messageTemplateMap.get(storeMessageDO.getMessageTemplateId()); + if (Objects.isNull(messageTemplateDO)) { + throw new ServiceException(ErrorCodeEnum.MESSAGE_NOT_EXIST); + } + StoreMessageVO storeMessageVO = BeanUtil.toBean(storeMessageDO, StoreMessageVO.class); + BeanUtil.copyProperties(messageTemplateDO, storeMessageVO, "id"); + String message = JSONObject.toJSONString(storeMessageVO); + for (String userId : userIds) { + try { + simpMessagingTemplate.convertAndSend("/queue/message/" + userId, message); + } catch (MessagingException e) { + log.info("即时通知下发异常, userId:{}, error:{}", userId, e.getMessage()); + } + } + } + } + } + } catch (Exception e) { + log.info("即时通知下发异常", e); + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java index e321196a6..fb98026cd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java @@ -3,40 +3,46 @@ package com.cool.store.service.impl; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.context.LoginUserInfo; -import com.cool.store.context.PartnerUserHolder; -import com.cool.store.dao.EnterpriseUserDAO; -import com.cool.store.dao.MessageTemplateDAO; -import com.cool.store.dao.RegionDao; -import com.cool.store.dao.StoreMessageDAO; +import com.cool.store.dao.*; import com.cool.store.dto.notice.CommonDTO; import com.cool.store.dto.notice.MessageTemplateCountDTO; import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.dto.store.AuthStoreUserDTO; import com.cool.store.dto.store.StoreAreaDTO; +import com.cool.store.dto.wechat.ServiceAccountOpenIdDTO; import com.cool.store.entity.*; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.notice.*; +import com.cool.store.enums.wechat.WechatTemplateDetailEnum; +import com.cool.store.enums.wechat.WechatTemplateEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.StoreGroupMappingMapper; import com.cool.store.mapper.StoreMapper; import com.cool.store.request.notice.*; +import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.MessageTemplateService; import com.cool.store.service.StoreService; +import com.cool.store.service.wechat.WechatTemplateService; import com.cool.store.utils.CoolDateUtils; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.poi.DateUtils; import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.notice.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.google.common.collect.Lists; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.ibatis.annotations.Param; import org.springframework.beans.BeanUtils; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.time.Duration; import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; @@ -65,6 +71,18 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { StoreMessageDAO storeMessageDAO; @Resource EnterpriseUserDAO enterpriseUserDAO; + @Resource + MatterConfigDAO matterConfigDAO; + @Resource + WechatTemplateService wechatTemplateService; + @Resource + RedisUtilPool redisUtilPool; + @Resource + TaskExecutor noticeThreadPool; + @Resource + HyPartnerUserInfoDAO hyPartnerUserInfoDAO; + @Resource + MessageIssueService messageIssueService; @@ -82,8 +100,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { public String getMessageTemplateCode() { //当前日期 - String today = CoolDateUtils.getToday(); - return "16" + today + String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); + String today = CoolDateUtils.getTodayMillis(); + return "16" + today + String.format("%04d", ThreadLocalRandom.current().nextInt(100)); } @Override @@ -135,55 +153,264 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { @Override - public Boolean batchPublishMessageTemplate(BatchPublishRequest request, LoginUserInfo user) { + public Boolean batchPublishMessageTemplate(BatchPublishRequest request, String userId) { + log.info("batchPublishMessageTemplate:{}",JSONObject.toJSONString(request)); if (CollectionUtils.isEmpty(request.getIds())||CollectionUtils.isEmpty(request.getStoreInfoList())||CollectionUtils.isEmpty(request.getUserInfoList())){ throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); } - - List storeAreaDTOS = getStoreRange(request.getStoreInfoList()); - List storeIds = storeAreaDTOS.stream().map(StoreAreaDTO::getStoreId).collect(Collectors.toList()); - - Map> authUser = getAuthUser(request.getUserInfoList(), storeIds); - List list = messageTemplateDAO.getByIds(request.getIds()); //过滤 只保留未发布的 list = list.stream().filter(x -> PublishStatusEnum.UNPUBLISHED.getCode().equals(x.getPublishStatus())).collect(Collectors.toList()); if (CollUtil.isEmpty(list)){ log.info("未找到待发布消息模板"); + return Boolean.TRUE; } - list.stream().forEach(x -> { - List result = new ArrayList<>(); - storeAreaDTOS.forEach(y->{ - if (CollectionUtils.isEmpty(authUser.get(y.getStoreId()))){ - log.info("当前门店没有人员 门店名称:{}",y.getStoreName()); - return; - } - StoreMessageDO storeMessageDO = new StoreMessageDO(); - storeMessageDO.setStoreId(y.getStoreId()); - storeMessageDO.setStoreName(y.getStoreName()); - storeMessageDO.setStoreCode(y.getStoreCode()); - storeMessageDO.setMessageTemplateId(x.getId()); - storeMessageDO.setReadStatus(ReadStatusEnum.UNREAD.getCode()); - storeMessageDO.setReadTime(new Date()); - storeMessageDO.setProcessStatus(ProcessStatusEnum.UNTREATED.getCode()); - storeMessageDO.setProcessTime(new Date()); - String userIdStr = authUser.get(y.getStoreId()).stream().collect(Collectors.joining(",")); - storeMessageDO.setOperatorList(userIdStr); - result.add(storeMessageDO); - }); - storeMessageDAO.batchInsert(result); - }); + List lockKeys = list.stream() + .map(x -> "msg_template_publish:" + x.getId()) + .collect(Collectors.toList()); - List updateIds = list.stream().map(MessageTemplateDO::getId).collect(Collectors.toList()); - messageTemplateDAO.batchUpdateStoreInfoAndUserInfo(updateIds, - JSONObject.toJSONString(request.getStoreInfoList()), - JSONObject.toJSONString(request.getUserInfoList()), - user.getUserId()); + boolean allLocksAcquired = tryAcquireLocks(lockKeys); + if (!allLocksAcquired) { + log.warn("存在正在发布的模板,本次操作取消。模板IDs: {}", JSONObject.toJSONString(lockKeys)); + throw new ServiceException(ErrorCodeEnum.MESSAGE_PUBLISH); + } + List finalList = list; + noticeThreadPool.execute(() -> { + syncPublish(request, userId, finalList, lockKeys); + }); return Boolean.TRUE; } + public Boolean syncPublish(BatchPublishRequest request, String userId, List list,List lockKeys){ + try { + List storeAreaDTOS = getStoreRange(request.getStoreInfoList()); + List storeIds = storeAreaDTOS.stream().map(StoreAreaDTO::getStoreId).collect(Collectors.toList()); + Map> authUser = getAuthUser(request.getUserInfoList(), storeIds); + List realtimeMessageList = new ArrayList<>(); + list.stream().forEach(x -> { + List result = new ArrayList<>(); + storeAreaDTOS.forEach(y->{ + if (CollectionUtils.isEmpty(authUser.get(y.getStoreId()))){ + log.info("当前门店没有人员 门店名称:{}",y.getStoreName()); + return; + } + StoreMessageDO storeMessageDO = new StoreMessageDO(); + storeMessageDO.setStoreId(y.getStoreId()); + storeMessageDO.setStoreName(y.getStoreName()); + storeMessageDO.setStoreCode(y.getStoreCode()); + storeMessageDO.setMessageTemplateId(x.getId()); + storeMessageDO.setReadStatus(ReadStatusEnum.UNREAD.getCode()); + storeMessageDO.setReadTime(new Date()); + storeMessageDO.setProcessStatus(ProcessStatusEnum.UNTREATED.getCode()); + storeMessageDO.setProcessTime(new Date()); + String userIdStr = authUser.get(y.getStoreId()).stream().collect(Collectors.joining(",")); + storeMessageDO.setOperatorList(userIdStr); + result.add(storeMessageDO); + }); + storeMessageDAO.batchInsert(result); + if (MatterTypeEnum.REALTIME.getCode().equals(request.getMatterType())) { + realtimeMessageList.addAll(result); + } + }); + + //存在第一个成功 第二个失败 会有问题 todo + List updateIds = list.stream().map(MessageTemplateDO::getId).collect(Collectors.toList()); + messageTemplateDAO.batchUpdateStoreInfoAndUserInfo(updateIds, + JSONObject.toJSONString(request.getStoreInfoList()), + JSONObject.toJSONString(request.getUserInfoList()), + userId); + + //发送通知 + Set userIds = authUser.values().stream().flatMap(Collection::stream).collect(Collectors.toSet()); + + //分批 查询用户信息 + List openIdList = new ArrayList<>(); + Lists.partition(new ArrayList<>(userIds), 100).forEach(x->{ + List userInfoByUserIds = enterpriseUserDAO.getUserInfoByUserIds(x); + //取出用户的手机号,过滤掉空的手机号 + List mobileList = userInfoByUserIds.stream().filter(user -> StringUtils.isNotBlank(user.getMobile())).map(EnterpriseUserDO::getMobile).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(mobileList)){ + List serviceAccountOpenIdDTOS = hyPartnerUserInfoDAO.selectLastBindRecord(mobileList); + if (CollectionUtils.isNotEmpty(serviceAccountOpenIdDTOS)){ + //服务号ID + openIdList.addAll(serviceAccountOpenIdDTOS.stream().map(ServiceAccountOpenIdDTO::getServiceAccountOpenId).collect(Collectors.toList())); + } + + } + }); + + MessageTemplateDO messageTemplateDO = list.get(0); + Map data = new HashMap<>(); + data.put(WechatTemplateDetailEnum.THING6.getCode(), messageTemplateDO.getMessageTitle()); + data.put(WechatTemplateDetailEnum.TIME33.getCode(), DateUtils.parseDateToStr(DateUtils.SPECIAL_DATE_START, new Date())); + data.put(WechatTemplateDetailEnum.CHARACTER_STRING14.getCode(), messageTemplateDO.getMessageCode()); + openIdList.forEach(x->{ + wechatTemplateService.sendMiniAppTemplate(x, WechatTemplateEnum.NEW_QUESTION_NOTICE,data,"pages/notification/index"); + }); + // 即时消息下发 + messageIssueService.issueMessage(realtimeMessageList); + } catch (Exception e) { + log.info("发布流程异常 e:{}",e.getMessage()); + } finally { + releaseLocks(lockKeys); + log.info("发布流程结束,已释放Redis锁"); + } + return Boolean.TRUE; + } + + + + + /** + * 尝试获取所有Redis锁 + */ + private boolean tryAcquireLocks(List lockKeys) { + boolean allSuccess = true; + List acquiredLocks = new ArrayList<>(); + + for (String lockKey : lockKeys) { + try { + // 设置锁,过期时间设为5分钟,防止死锁 + Boolean success = redisUtilPool.setNxExpire(lockKey, "locking",1000*60*5); + if (success != null && success) { + acquiredLocks.add(lockKey); + } else { + log.warn("获取Redis锁失败: {}", lockKey); + allSuccess = false; + break; + } + } catch (Exception e) { + log.error("获取Redis锁异常: {}", lockKey, e); + allSuccess = false; + break; + } + } + + // 如果任何一个锁获取失败,释放之前已经获取的锁 + if (!allSuccess) { + releaseLocks(acquiredLocks); + } + + return allSuccess; + } + + /** + * 释放Redis锁 + */ + private void releaseLocks(List lockKeys) { + if (CollUtil.isEmpty(lockKeys)) { + return; + } + for (String lockKey : lockKeys) { + try { + redisUtilPool.delKey(lockKey); + log.debug("释放Redis锁成功: {}", lockKey); + } catch (Exception e) { + log.error("释放Redis锁异常: {}", lockKey, e); + } + } + } + + + + @Override + @Transactional(rollbackFor = Exception.class) + public ApiResponse thirdMatterHandle(ThirdMatterRequest thirdMatterRequest) { + log.info("thirdMatterHandle request:{}", JSONObject.toJSONString(thirdMatterRequest)); + //第三方事项处理 + MatterConfigDO matterConfig = matterConfigDAO.getById(thirdMatterRequest.getMatterConfigId()); + if (matterConfig==null||matterConfig.getStatus()==0){ + return ApiResponse.error(ErrorCodeEnum.CONFIG_NOT_EXIST); + } + //封装事项模版 + MessageTemplateDO messageTemplateDO = new MessageTemplateDO(); + messageTemplateDO.setMessageCode(getMessageTemplateCode()); + messageTemplateDO.setModuleCode(matterConfig.getModuleCode()); + messageTemplateDO.setMatterType(matterConfig.getMatterType()); + messageTemplateDO.setMessageTitle(thirdMatterRequest.getMatterTitle()); + messageTemplateDO.setSystemSource(matterConfig.getSystemSource()); + messageTemplateDO.setProcessType(thirdMatterRequest.getProcessType()); + messageTemplateDO.setRemindType(thirdMatterRequest.getRemindType()); + if (RemindTypeEnum.STAGE_REMINDER.getCode().equals(thirdMatterRequest.getRemindType())){ + messageTemplateDO.setRemindStartTime(thirdMatterRequest.getRemindStartTime()); + messageTemplateDO.setRemindEndTime(thirdMatterRequest.getRemindEndTime()); + } + messageTemplateDO.setDeadline(thirdMatterRequest.getDeadline()); + messageTemplateDO.setTodayTask(thirdMatterRequest.getTodayTask()); + messageTemplateDO.setMessageImage(thirdMatterRequest.getMessageImage()); + messageTemplateDO.setPublishStatus(PublishStatusEnum.UNPUBLISHED.getCode()); + messageTemplateDO.setJumpType(matterConfig.getJumpType()); + messageTemplateDO.setJumpUrl(matterConfig.getJumpUrl()); + messageTemplateDO.setHandleKeyword(thirdMatterRequest.getHandleKeyword()); + + if (MatterTypeEnum.LOGISTICS.getCode().equals(matterConfig.getMatterType())){ + SceneEnum scene = SceneEnum.getByCode(thirdMatterRequest.getSceneCode()); + messageTemplateDO.setMessageImage(scene.getScenePicture()); + //物流直接使用传过来的地址 + messageTemplateDO.setJumpUrl(thirdMatterRequest.getJumpUrl()); + } + //如果是盘点 截止日期去当天 + if (MatterTypeEnum.INVENTORY.getCode().equals(matterConfig.getMatterType())){ + messageTemplateDO.setDeadline(new Date()); + } + String storeInfo = matterConfig.getDefaultStoreInfo(); + String userInfo = matterConfig.getDefaultHandlePersonInfo(); + //门店 + if (CollectionUtils.isNotEmpty(thirdMatterRequest.getShopCodeList())){ + log.info("shopCodeList:{}",JSONObject.toJSONString(thirdMatterRequest.getShopCodeList())); + List storeNumByStoreCodes = storeMapper.getStoreNumByStoreCodes(thirdMatterRequest.getShopCodeList()); + if (CollectionUtils.isNotEmpty(storeNumByStoreCodes)){ + //组装成门店信息 + List storeList = new ArrayList<>(); + storeNumByStoreCodes.forEach(x -> { + CommonDTO store = new CommonDTO("store", x.getStoreId(), x.getStoreName()); + storeList.add(store); + }); + storeInfo = JSONObject.toJSONString(storeList); + } + } + //人员 + List userInfoByUserMobileList = enterpriseUserDAO.getUserInfoByUserMobileList(thirdMatterRequest.getMobileList()); + if (CollectionUtils.isNotEmpty(userInfoByUserMobileList)){ + //组装人员信息 + List userList = new ArrayList<>(); + userInfoByUserMobileList.forEach(x -> { + CommonDTO user = new CommonDTO("person", x.getUserId(), x.getName()); + userList.add(user); + }); + userInfo = JSONObject.toJSONString(userList); + } + Boolean publishFlag = Boolean.TRUE; + //校验是否发布 + if (StringUtils.isEmpty(userInfo)|| StringUtils.isEmpty(storeInfo)){ + publishFlag = Boolean.FALSE; + } + messageTemplateDO.setCreateUserId("system"); + if (!publishFlag){ + //如果不发布 保存门店人员信息 + messageTemplateDO.setStoreInfo(storeInfo); + messageTemplateDO.setHandlePersonInfo(userInfo); + } + messageTemplateDAO.insert(messageTemplateDO); + //调用发布 + if (publishFlag){ + //开始计算人员门店 + BatchPublishRequest batchPublishRequest = new BatchPublishRequest(); + batchPublishRequest.setIds(Arrays.asList(messageTemplateDO.getId())); + batchPublishRequest.setStoreInfoList(JSONObject.parseArray(storeInfo, CommonDTO.class)); + batchPublishRequest.setUserInfoList(JSONObject.parseArray(userInfo, CommonDTO.class)); + batchPublishRequest.setMatterType(matterConfig.getMatterType()); + try { + batchPublishMessageTemplate(batchPublishRequest,""); + } catch (ServiceException e) { + return new ApiResponse(e.getErrorCode(), e.getErrorMessage(), null); + } + return ApiResponse.success(Boolean.TRUE); + } + return ApiResponse.success(Boolean.TRUE); + } @Override @@ -275,9 +502,9 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { } @Override - public List getModuleList(String storeId,PartnerUserInfoVO userInfoVO) { + public List getModuleList(String storeId,String mobile) { List moduleAndMatterList = ModuleAndMatterVO.getModuleAndMatterList(); - EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(userInfoVO.getMobile()); + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(mobile); if (enterpriseUserDO == null){ enterpriseUserDO = new EnterpriseUserDO(); } @@ -312,13 +539,15 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { MessageDetailVO messageDetailVO = storeMessageDAO.getMessageDetail(id); if (messageDetailVO!=null&&messageDetailVO.getPublishUserId()!=null){ EnterpriseUserDO userInfoById = enterpriseUserDAO.getUserInfoById(messageDetailVO.getPublishUserId()); - messageDetailVO.setPublishUserName(userInfoById.getName()); + if (userInfoById != null){ + messageDetailVO.setPublishUserName(userInfoById.getName()); + } } return messageDetailVO; } @Override - public Boolean readMessage(Long id, PartnerUserInfoVO userInfoVO) { + public Boolean readMessage(Long id, String mobile) { StoreMessageDO message = storeMessageDAO.getById(id); if (ProcessStatusEnum.PROCESSED.getCode().equals(message.getProcessStatus())){ log.info("当前消息已读已处理:{}",JSONObject.toJSONString( message)); @@ -330,7 +559,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { if (ProcessTypeEnum.READ.getCode().equals(template.getProcessType())){ message.setProcessStatus(ProcessStatusEnum.PROCESSED.getCode()); message.setProcessTime(new Date()); - EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(userInfoVO.getMobile()); + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(mobile); if (enterpriseUserDO != null){ message.setActualOperatorId(enterpriseUserDO.getId()); message.setActualOperatorName(enterpriseUserDO.getName()); @@ -341,15 +570,15 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { } @Override - public Boolean handleMessage(Long id, PartnerUserInfoVO userInfoVO) { - log.info("handleMessage request:{},处理人:{}", JSONObject.toJSONString(id), userInfoVO.getUsername()); + public Boolean handleMessage(Long id, String userName,String mobile) { + log.info("handleMessage request:{},处理人:{}", JSONObject.toJSONString(id), userName); StoreMessageDO message = storeMessageDAO.getById(id); if (message==null){ throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); } message.setProcessStatus(ProcessStatusEnum.PROCESSED.getCode()); message.setProcessTime(new Date()); - EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(userInfoVO.getMobile()); + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(mobile); if (enterpriseUserDO != null){ message.setActualOperatorId(enterpriseUserDO.getId()); message.setActualOperatorName(enterpriseUserDO.getName()); @@ -358,6 +587,20 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { return Boolean.TRUE; } + @Override + public ApiResponse thirdHandleMessage(ThirdHandleMessageRequest request) { + log.info("thirdHandleMessage request:{}", JSONObject.toJSONString(request)); + MessageTemplateDO message = messageTemplateDAO.getByKeyword(request.getHandleKeyword()); + if (message==null){ + return ApiResponse.error(ErrorCodeEnum.MESSAGE_NOT_EXIST); + } + if (!ProcessTypeEnum.HANDLE.getCode().equals(message.getProcessType())){ + return ApiResponse.error(ErrorCodeEnum.MESSAGE_NOT_HANDLED); + } + storeMessageDAO.batchUpdateHandle(message.getId(), request.getShopCodeList()); + return ApiResponse.success(Boolean.TRUE); + } + public Map> getAuthUser(List personInfo, List storeIds){ if (CollectionUtils.isEmpty(personInfo)){ diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java index c658e1f14..e95ba45a2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java @@ -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()); @@ -293,6 +294,7 @@ public class OrderSysInfoServiceImpl implements OrderSysInfoService { //初始化数据 preparationService.licenseCompleted(shopId); preparationService.sysStoreCompleted(shopId); + preparationService.businessLicenseAndBuildStoreCompleted(shopId); preparationService.buildStoreAndDecorationComplete(shopId); preparationService.selectSiteAndBuildStoreComplete(shopId); preparationService.buildStoreComplete(shopId); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java index 8b15ce1e4..06b5bc244 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java @@ -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()); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PosAndOrderInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PosAndOrderInfoServiceImpl.java index 5a38cebd7..0d0def296 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PosAndOrderInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PosAndOrderInfoServiceImpl.java @@ -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); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java index b1c786bae..e5c0f3c21 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java @@ -223,6 +223,22 @@ public class PreparationServiceImpl implements PreparationService { 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); + } + } + } + + @Override + public void businessLicenseAndBuildStoreCompleted(Long shopId) { + List shopStageInfo = shopStageInfoDAO.getShopStageInfo(shopId, null); + if (CollectionUtils.isNotEmpty(shopStageInfo)) { + Map shopStageInfoDOMap = shopStageInfo.stream().collect(Collectors.toMap(ShopStageInfoDO::getShopSubStage, data -> data)); + boolean flag1 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_156.getShopSubStageStatus(). + equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus()); + boolean flag2 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_33.getShopSubStageStatus(). + equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_3.getShopSubStage()).getShopSubStageStatus()); + if (flag1 && flag2) { + List list = new ArrayList<>(); list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_240); shopStageInfoDAO.batchUpdateShopStageStatus(shopId, list); } @@ -346,7 +362,7 @@ public class PreparationServiceImpl implements PreparationService { Boolean flag3 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_156.getShopSubStageStatus(). equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus()); - log.info("selectSiteAndBuildStoreComplete flag2->{} flag3->{}",flag2,flag3); + log.info("selectSiteAndBuildStoreComplete flag2->{} flag3->{} flag4->{}",flag2,flag3); //都完成了 状态修改 if (flag2 && flag3) { shopAccountDAO.updateStatusByShopIdAndSystemName(shopId, Arrays.asList(ShopAccountEnum.HUOMA.getSystemName()), OpenStatusEnum.OPENSTATUSENUM_2.getCode(),null,null); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java index afff5d4bb..5a8f2e806 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java @@ -3,7 +3,17 @@ package com.cool.store.service.impl; import com.alibaba.fastjson.JSONObject; import com.cool.store.dto.*; import com.cool.store.dto.contract.ContractCallbackDTO; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.EnterpriseUserRoleDao; +import com.cool.store.dao.StoreDao; +import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.dto.HqtTokenDTO; +import com.cool.store.dto.ModifyPasswordDTO; +import com.cool.store.dto.XgjOrganizationDTO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.StoreDO; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.UserRoleEnum; import com.cool.store.exception.ServiceException; import com.cool.store.request.ZxjpApiRequest; import com.cool.store.request.xgj.PushFranchiseFeeRequest; @@ -170,6 +180,10 @@ public class PushServiceImpl implements PushService { @Override public String getYlsToken(GetAccessTokenDTO dto) { + String yls = redisUtilPool.getString("yls"); + if (StringUtils.isNotBlank(yls)) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"云流水系统修复中"); + } String apiUrl = ylsUrl + "/Store.axd?action=getToken"; return executeApiCall(apiUrl, dto, String.class, ylsUsername, ylsSecret); } @@ -181,8 +195,29 @@ public class PushServiceImpl implements PushService { return executeApiCall(apiUrl, dto, String.class, "", ""); } + @Resource + EnterpriseUserDAO enterpriseUserDAO; + @Resource + EnterpriseUserRoleDao enterpriseUserRoleDao; + @Resource + StoreDao storeDao; + @Override public String getPosToken(GetAccessTokenDTO dto) { + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(dto.getMobile()); + if (enterpriseUserDO != null){ + List userRoleIds = enterpriseUserRoleDao.getUserRoleIds(enterpriseUserDO.getUserId()); + //如果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){ + dto.setMobile(store.getTelephone()); + } + } + } String apiUrl = url + "/dzgV1/zxcrm/business_user/generateToken"; return executeApiCall(apiUrl, dto, String.class, username, secret); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopAccountServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopAccountServiceImpl.java index b7603e4ee..7dc3b069f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopAccountServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopAccountServiceImpl.java @@ -59,6 +59,8 @@ public class ShopAccountServiceImpl implements ShopAccountService { ThirdXinGuanJiaService thirdXinGuanJiaService; @Resource private LineInfoDAO lineInfoDAO; + @Resource + private StoreDao storeDao; @Override public List getShopAccountByShopId(Long shopId) { @@ -244,30 +246,16 @@ public class ShopAccountServiceImpl implements ShopAccountService { } List accountDOS = shopAccountDAO.selectByShopId(shopId); if (CollectionUtils.isEmpty(accountDOS)) { - throw new ServiceException(ErrorCodeEnum.SYSTEM_DATA_ERROR); + return "ZXA8_"+shopInfo.getShopCode(); } Map map = accountDOS.stream().collect(Collectors.toMap(ShopAccountDO::getSystemName, data -> data)); ShopAccountDO shopAccountDO = map.get(ShopAccountEnum.YLS.getSystemName()); if (Objects.isNull(shopAccountDO)) { - throw new ServiceException(ErrorCodeEnum.SYSTEM_DATA_ERROR); + return "ZXA8_"+shopInfo.getShopCode(); } return StringUtil.isEmpty(shopAccountDO.getAccount()) ? shopInfo.getShopCode() : shopAccountDO.getAccount(); } - @Override - public String shopCodeToYlsCode(String shopCode) { - ShopInfoDO shopInfoDO = shopInfoDAO.selectByStoreCode(shopCode); - if (!Objects.isNull(shopInfoDO)) { - return this.shopIdToYlsCode(shopInfoDO.getId()); - } - //查询老店关联表数据 - OldShopDO oldShopDO = oldShopDAO.getByCode(shopCode); - if (Objects.isNull(oldShopDO)) { - throw new ServiceException(ErrorCodeEnum.GET_YLS_CODE_FAIL); - } - return oldShopDO.getYlsShopCode(); - } - @Override @Transactional(rollbackFor = Exception.class) public Boolean handleOldData() { @@ -316,6 +304,30 @@ public class ShopAccountServiceImpl implements ShopAccountService { return true; } + @Override + public String shopCodeToYlsCode(String shopCode) { + ShopInfoDO shopInfoDO = shopInfoDAO.selectByStoreCode(shopCode); + if (!Objects.isNull(shopInfoDO)) { + return this.shopIdToYlsCode(shopInfoDO.getId()); + } + //查询老店关联表数据 + OldShopDO oldShopDO = oldShopDAO.getByCode(shopCode); + if (Objects.isNull(oldShopDO)) { + 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(); + } + @Override @Transactional(rollbackFor = Exception.class) public Boolean handleAccountPassword() { 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 ef44ca211..24a3ae4e1 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 @@ -110,6 +110,8 @@ public class ShopServiceImpl implements ShopService { DecorationDesignInfoDAO decorationDesignInfoDAO; @Resource StoreService storeService; + @Resource + EnterpriseService enterpriseService; @Override @@ -144,7 +146,7 @@ public class ShopServiceImpl implements ShopService { } shopInfoDAO.batchAddShop(addShopList); List 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); @@ -296,7 +298,7 @@ public class ShopServiceImpl implements ShopService { } shopInfoDAO.batchAddShop(addShopList); List shopIds = addShopList.stream().map(ShopInfoDO::getId).collect(Collectors.toList()); - shopStageInfoDAO.initShopStageInfo(lineInfo.getId(), shopIds, true); + shopStageInfoDAO.initShopStageInfo(lineInfo.getId(), addShopList, true); return 1L; } @@ -330,6 +332,7 @@ public class ShopServiceImpl implements ShopService { if (StringUtils.isBlank(request.getInvestmentManagerUserId())) { request.setInvestmentManagerUserId(userId); } + enterpriseService.checkUser(userId, request.getJoinMode()); LineInfoDO lineInfo = lineInfoDAO.getLineInfo(request.getLineId()); if (lineInfo.getWorkflowSubStageStatus() < WorkflowSubStageStatusEnum.PAY_DEPOSIT_45.getCode()) { throw new ServiceException(ErrorCodeEnum.LINE_STATUS_NOT_ALLOW_OPERATE); @@ -353,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 map = new HashMap<>(); map.put("partnerUsername", lineInfo.getUsername()); map.put("partnerMobile", lineInfo.getMobile()); @@ -378,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()); @@ -560,6 +563,7 @@ public class ShopServiceImpl implements ShopService { response.setLineId(dto.getLineId()); response.setUsername(dto.getUsername()); response.setMobile(dto.getMobile()); + response.setStoreId(dto.getStoreId()); response.setShopName(dto.getShopName()); response.setShopCode(dto.getShopCode()); response.setRegionName(regionNameMap.getOrDefault(dto.getRegionId(), "")); 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 3e5f9b81a..38052821d 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 @@ -6,15 +6,23 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.*; import com.cool.store.dto.ContractInformationDTO; +import com.cool.store.dao.decoration.DecorationTeamConfigDAO; +import com.cool.store.dao.decoration.ShopDecorationAssignDAO; +import com.cool.store.dao.decoration.TeamAreaMappingDAO; import com.cool.store.dto.PartnerBankInfoDTO; import com.cool.store.dto.contract.ContractCallbackDTO; import com.cool.store.dto.contract.PushContractDTO; import com.cool.store.entity.*; +import com.cool.store.entity.decoration.DecorationTeamConfigDO; +import com.cool.store.entity.decoration.ShopDecorationAssignDO; +import com.cool.store.entity.decoration.TeamAreaMappingDO; import com.cool.store.enums.*; +import com.cool.store.enums.Decoration.DecorationDescStatus; import com.cool.store.enums.point.ShopSubStageEnum; import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.*; +import com.cool.store.mq.producer.SimpleMessageService; import com.cool.store.request.*; import com.cool.store.response.AddSignFranchiseResponse; import com.cool.store.response.ResponseResult; @@ -31,6 +39,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import sun.font.Decoration; import javax.annotation.Resource; import java.math.BigDecimal; @@ -40,6 +49,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 @@ -129,6 +139,14 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu ContractConfigDAO contractConfigDAO; @Resource PushService pushService; + @Resource + TeamAreaMappingDAO teamAreaMappingDAO; + @Resource + DecorationTeamConfigDAO decorationTeamConfigDAO; + @Resource + ShopDecorationAssignDAO shopDecorationAssignDAO; + @Resource + private SimpleMessageService simpleMessageService; @Override @@ -186,6 +204,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); + } //校验金额 if (!feeCheck(request)){ throw new ServiceException(ErrorCodeEnum.FEE_NOT_CONSISTENT); @@ -458,10 +480,26 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu )); }else{ //,加盟公司自有店->加盟公司建店 不推送数据 再crm中完成 - if ( !shopInfoDO.getJoinMode().equals(JoinModeEnum.OWN_STORE.getCode())){ - hqtAPIService.pushHqtBuild(getHqtBuildRequest(request.getShopId())); + //v2.0.0 先确认装修团队 + TeamAreaMappingDO city = teamAreaMappingDAO.getByCityId(shopInfoDO.getWantShopAreaId()); + //默认团队 + Long teamId = 1L; + if (Objects.nonNull(city)) { + //v2.0.0 确认团队 + DecorationTeamConfigDO decorationTeamConfigDO = decorationTeamConfigDAO.getById(city.getTeamId()); + if (Objects.nonNull(decorationTeamConfigDO)) { + //v2.0.0 确认团队 + teamId = decorationTeamConfigDO.getId(); + } + } - shopStageInfoDAO.updateShopStageInfo(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_861); + ShopDecorationAssignDO shopDecorationAssignDO = new ShopDecorationAssignDO(); + shopDecorationAssignDO.setDecorationDescStatus(DecorationDescStatus.TO_BE_ASSIGNED.getCode()); + shopDecorationAssignDO.setDecorationTeamId(teamId); + shopDecorationAssignDO.setShopId(shopId); + shopDecorationAssignDAO.insert(shopDecorationAssignDO); + //新增一个延迟队列 四个小时之后确定是否手动分配 没有手动分配 直接自动分配 红圈通推送和下一个流程开始改为分配团队之后 触发 + simpleMessageService.send(String.valueOf(shopDecorationAssignDO.getId()), RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN,System.currentTimeMillis() + 4*60*60 * 1000); } shopAuditInfoDO.setResultType(Constants.ZERO_INTEGER); shopAuditInfoDO.setPassReason(request.getCause()); @@ -600,6 +638,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu return null; } + @Override public HqtBuildRequest getHqtBuildRequest(Long shopId) { ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfo.getLineId()); @@ -677,11 +716,12 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu BeanUtils.copyProperties(signFranchiseDO, addSignFranchiseResponse); } 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()); @@ -734,9 +774,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()); @@ -748,7 +788,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; } 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 index c2b36d9c6..697808c84 100644 --- 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 @@ -1,8 +1,12 @@ package com.cool.store.service.impl; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.StoreNameDTO; +import com.cool.store.dao.store.StoreMasterSignerInfoDAO; import com.cool.store.dto.store.AuthStoreUserDTO; import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.dao.EnterpriseUserRoleDao; @@ -12,10 +16,8 @@ import com.cool.store.dto.StoreDTO; import com.cool.store.dto.store.StoreAreaDTO; import com.cool.store.dto.store.StoreUserDTO; import com.cool.store.dto.store.StoreUserPositionDTO; -import com.cool.store.entity.EnterpriseUserDO; -import com.cool.store.entity.StoreDO; -import com.cool.store.entity.SysRoleDO; -import com.cool.store.entity.UserAuthMappingDO; +import com.cool.store.entity.*; +import com.cool.store.entity.store.StoreMasterSignerInfoDO; import com.cool.store.enums.*; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.*; @@ -38,6 +40,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Author suzhuhong @@ -70,6 +73,8 @@ public class StoreServiceImpl implements StoreService { EnterpriseUserMapper enterpriseUserMapper; @Resource EnterpriseUserGroupMappingMapper enterpriseUserGroupMappingMapper; + @Resource + StoreMasterSignerInfoDAO storeMasterSignerInfoDAO; @Override public PageInfo getStoreExtendFieldInfo(Integer pageSize, Integer pageNum) { @@ -77,16 +82,42 @@ public class StoreServiceImpl implements StoreService { throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE,"单次最多获取200条门店数据"); } PageHelper.startPage(pageNum,pageSize); - List list = storeDao.list(); + List list = storeDao.list(null); PageInfo info = new PageInfo<>(list); if (CollectionUtils.isEmpty(list)){ return info; } - List storeDTOS = processStores(list); + //使用regionId与branch 合并的集合 + Set regionIds = list.stream() + .filter(Objects::nonNull) + .flatMap(store -> Stream.of(store.getBranch(), store.getRegionId())) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + List regionList = regionMapper.getByIds(new ArrayList<>(regionIds)); + Map regionNameMap = regionList.stream().collect(Collectors.toMap(RegionDO::getId, RegionDO::getName)); + + List storeDTOS = processStores(list, regionNameMap); info.setList(storeDTOS); return info; } + @Override + public PageInfo getIotStoreList(Integer pageNum, Integer pageSize) { + if (pageSize > 200) { + throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE, "单次最多获取200条门店数据"); + } + PageHelper.startPage(pageNum, pageSize); + List list = storeDao.list(1); + PageInfo info = new PageInfo<>(list); + if (CollectionUtils.isEmpty(list)){ + return info; + } + List result = list.stream().map(v -> new StoreNameDTO(v.getStoreName(), v.getStoreNum())).collect(Collectors.toList()); + info.setList(result); + return info; + } + @Override public PageInfo getStoreListByMobile(String mobile,Integer pageNum,Integer pageSize,String storeName,String storeNum) { //根据手机号查询 标品userId @@ -97,7 +128,11 @@ public class StoreServiceImpl implements StoreService { List userRoleIds = enterpriseUserRoleDao.getUserRoleIds(enterpriseUserDO.getUserId()); //查询职位详情,筛选掉店外职位 List roleIds = sysRoleDao.selectRoleByRoleIds(userRoleIds); - List sysRoleDOS = roleIds.stream().filter(role -> "store_inside".equals(role.getPositionType())).collect(Collectors.toList()); + List 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)){ //获取用户管辖区域 List userAuthMapping = userAuthMappingService.listUserAuthMappingByUserId(enterpriseUserDO.getUserId()); @@ -120,6 +155,8 @@ public class StoreServiceImpl implements StoreService { if (CollectionUtils.isEmpty(list)){ return new ArrayList<>(); } + List storeIds = CollStreamUtil.toList(list, StoreDO::getStoreId); + Map signerMap = storeMasterSignerInfoDAO.getSignerMapByStoreIds(storeIds); List result = new ArrayList<>(); list.forEach(x->{ StoreUserPositionDTO storeUserPositionDTO = new StoreUserPositionDTO(); @@ -128,6 +165,7 @@ public class StoreServiceImpl implements StoreService { storeUserPositionDTO.setStoreId(x.getStoreId()); storeUserPositionDTO.setStoreName(x.getStoreName()); storeUserPositionDTO.setShopCode(x.getStoreNum()); + storeUserPositionDTO.setStoreCode(x.getStoreNum()); List userList = Lists.newArrayList(); for (String userId : storeUserDTOMap.keySet()) { List singleUserDTOList = storeUserDTOMap.get(userId); @@ -140,6 +178,16 @@ public class StoreServiceImpl implements StoreService { storeUserDTO.setPositionName(String.join(Constants.COMMA, positionNameList)); userList.add(storeUserDTO); } + StoreMasterSignerInfoDO signerInfoDO = signerMap.get(x.getStoreId()); + if (Objects.nonNull(signerInfoDO)) { + Set mobiles = CollStreamUtil.toSet(userList, StoreUserDTO::getMobile); + if (StringUtils.isNotBlank(signerInfoDO.getSigner1Mobile()) && mobiles.add(signerInfoDO.getSigner1Mobile())) { + userList.add(new StoreUserDTO(signerInfoDO.getSigner1Name(), signerInfoDO.getSigner1Mobile())); + } + if (StringUtils.isNotBlank(signerInfoDO.getSigner2Mobile()) && mobiles.add(signerInfoDO.getSigner2Mobile())) { + userList.add(new StoreUserDTO(signerInfoDO.getSigner2Name(), signerInfoDO.getSigner2Mobile())); + } + } storeUserPositionDTO.setUserList(userList); result.add(storeUserPositionDTO); }); @@ -342,25 +390,23 @@ public class StoreServiceImpl implements StoreService { } - public static List processStores(List stores) { + public static List processStores(List stores,Map regionMap) { // 处理每个门店 return stores.stream().map(store -> { - StoreDTO dto = new StoreDTO(); - dto.setStoreName(store.getStoreName()); + StoreDTO dto = BeanUtil.toBean(store, StoreDTO.class); dto.setStoreCode(store.getStoreNum()); - dto.setStoreAddress(store.getStoreAddress()); dto.setStoreAvatar(store.getAvatar()); - dto.setTelephone(store.getTelephone()); - dto.setMonthlyRent(store.getMonthlyRent()); - dto.setMonthlyPersonnelSalary(store.getMonthlyPersonnelSalary()); - dto.setMonthlyOtherExpenses(store.getMonthlyOtherExpenses()); - dto.setUnifiedManagement(store.getUnifiedManagement()); dto.setStoreType(StoreTypeEnum.getMessage(store.getStoreType())); dto.setJoinMode(JoinModeEnum.getByCode(store.getJoinModel())); dto.setBrand(FranchiseBrandEnum.getDescByCode(store.getJoinBrand())); dto.setOrderMiniProgramName(store.getMiniProgramOrderStoreName()); - dto.setLongitude(store.getLongitude()); - dto.setLatitude(store.getLatitude()); + dto.setStatus(StoreStatusEnum.getName(store.getStoreStatus())); + if (store.getRegionId() != null){ + dto.setManagerSupervisionName(regionMap.get(store.getRegionId())); + } + if (store.getBranch()!=null){ + dto.setBranchName(regionMap.get(store.getBranch())); + } return dto; }).collect(Collectors.toList()); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java index d870d8eb1..ac7bb60cd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java @@ -119,6 +119,7 @@ public class SyncDataServiceImpl implements SyncDataService { } request.setPartnershipSignatory(partnershipSignatory); request.setBusinessModel(signFranchiseDO.getBusinessModel()); + request.setContractCode(signFranchiseDO.getContractCode()); } request.setPartnerMobile(lineInfoDO.getMobile()); request.setShopCode(shopInfo.getShopCode()); @@ -272,6 +273,18 @@ public class SyncDataServiceImpl implements SyncDataService { } catch (Exception e) { log.info("getUrl error:{},JSON:{}", e.getMessage(), json); } + return getUrlListByComma(json); + } + + private static List getUrlListByComma(String str) { + if (StringUtils.isBlank(str)) { + return null; + } + try { + return Arrays.asList(str.split(",")); + } catch (Exception e) { + log.info("getUrlListByComma error:{},str:{}", e.getMessage(), str); + } return null; } @@ -288,43 +301,31 @@ public class SyncDataServiceImpl implements SyncDataService { if (String.valueOf(FranchiseBrandEnum.ZXJP.getCode()).equals(shopInfoDO.getFranchiseBrand())) { //M10001 if (shopCode.matches("M\\d*")) { - return partnershipSignatorySecondIsNull - ? "MX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "MX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "MX" + shopInfoDO.getShopName(); } //FS10001 if (shopCode.matches("FS\\d*")) { - return partnershipSignatorySecondIsNull - ? "FS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "FS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "FS" + shopInfoDO.getShopName(); } // MS10001 if (shopCode.matches("MS\\d*")) { - return partnershipSignatorySecondIsNull - ? "MS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "MS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "MS" + shopInfoDO.getShopName(); } // S10001 if (shopCode.matches("S\\d*")) { - return partnershipSignatorySecondIsNull - ? "S" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "S" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "S" + shopInfoDO.getShopName(); } // ZX0001 if (shopCode.matches("ZX\\d*")) { return "ZX" + shopInfoDO.getShopName(); } if(shopCode.matches("HL\\d*")){ - return partnershipSignatorySecondIsNull - ? "HL" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "HL" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "HL" + shopInfoDO.getShopName(); } } if (String.valueOf(FranchiseBrandEnum.MZG.getCode()).equals(shopInfoDO.getFranchiseBrand())) { if (shopCode.matches("MZGM\\d*")) { - return partnershipSignatorySecondIsNull - ? "MZGM" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "MZGM" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "MZGM" + shopInfoDO.getShopName(); } if (shopCode.matches("MZGS\\d*")) { return FranchiseBrandEnum.MZG.getDesc() + shopInfoDO.getShopName(); @@ -332,19 +333,13 @@ public class SyncDataServiceImpl implements SyncDataService { } if (String.valueOf(FranchiseBrandEnum.ZJS.getCode()).equals(shopInfoDO.getFranchiseBrand())) { if (shopCode.matches("LX\\d*")) { - return partnershipSignatorySecondIsNull - ? "LX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "LX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "LX" + shopInfoDO.getShopName(); } if (shopCode.matches("X\\d*")) { - return partnershipSignatorySecondIsNull - ? "X" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "X" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "X" + shopInfoDO.getShopName(); } if (shopCode.matches("Q\\d*")) { - return partnershipSignatorySecondIsNull - ? "Q" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "Q" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "Q" + shopInfoDO.getShopName(); } if (shopCode.matches("Z\\d*")) { return FranchiseBrandEnum.ZJS.getDesc() + shopInfoDO.getShopName(); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java index dac429721..89da73c43 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java @@ -1,20 +1,16 @@ package com.cool.store.service.impl; import com.alibaba.fastjson.JSONObject; -import com.cool.store.context.CurrentUserHolder; import com.cool.store.dao.*; import com.cool.store.entity.*; import com.cool.store.enums.*; import com.cool.store.enums.point.PaymentMethodEnum; -import com.cool.store.exception.ServiceException; -import com.cool.store.mapper.FranchiseFeeMapper; -import com.cool.store.mapper.SignFranchiseMapper; +import com.cool.store.enums.wallet.YztStoreModel; import com.cool.store.mq.producer.SimpleMessageService; import com.cool.store.request.StoreMasterDTO; -import com.cool.store.request.StoreRequestBody; -import com.cool.store.service.OperationLogService; +import com.cool.store.request.wallet.CreateStoreRequest; import com.cool.store.service.SyncMainSysServer; -import com.cool.store.service.UserAuthMappingService; +import com.cool.store.service.wallet.WalletApiService; import com.cool.store.utils.poi.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -25,12 +21,6 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import static com.cool.store.enums.AuditExecuteEnum.FRANCHISEES; -import static com.cool.store.enums.ExtendFieldTypeEnum.*; /** * @Author: WangShuo @@ -48,39 +38,27 @@ public class SyncMainSysServerImpl implements SyncMainSysServer { @Resource private SimpleMessageService simpleMessageService; @Resource - private SignFranchiseMapper signFranchiseMapper; - @Resource private BuildInformationDAO buildInformationDAO; @Resource private PointInfoDAO pointInfoDAO; @Resource - FranchiseFeeMapper franchiseFeeMapper; - @Resource - private OperationLogDAO operationLogDAO; - @Resource private OrderSysInfoDAO orderSysInfoDAO; @Resource - private ShopStageInfoDAO shopStageInfoDAO; - @Resource - private PreparationServiceImpl preparationService; - @Resource - private UserAuthMappingService userAuthMappingService; - @Resource - private CommonService commonService; - @Resource private ShopInfoDAO shopInfoDAO; @Resource private LineInfoDAO lineInfoDAO; @Value("${mybatis.configuration.variables.enterpriseId}") private String eid; @Resource - private StoreDao storeDao; + private SignFranchiseDAO signFranchiseDAO; @Resource - SignFranchiseDAO signFranchiseDAO; + private PointDetailInfoDAO pointDetailDAO; @Resource - PointDetailInfoDAO pointDetailDAO; + private QualificationsInfoDAO qualificationsInfoDAO; @Resource - QualificationsInfoDAO qualificationsInfoDAO; + private RegionDao regionDao; + @Resource + private WalletApiService walletApiService; @Override @Async @@ -103,6 +81,7 @@ public class SyncMainSysServerImpl implements SyncMainSysServer { return; } storeMasterDTO.setEnterpriseId(eid); + storeMasterDTO.setStoreId(shopInfo.getStoreId()); storeMasterDTO.setStoreStatus("not_open"); storeMasterDTO.setStoreName(shopInfo.getShopName()); storeMasterDTO.setStoreNum(shopInfo.getShopCode()); @@ -160,6 +139,9 @@ public class SyncMainSysServerImpl implements SyncMainSysServer { PointDetailInfoDO pointDetail = pointDetailDAO.getPointDetailInfoByPointId(shopInfo.getPointId()); if (info != null){ storeMasterDTO.setArea(info.getProvince()+info.getCity()+info.getDistrict()); + storeMasterDTO.setProvince(info.getProvince()); + storeMasterDTO.setCity(info.getCity()); + storeMasterDTO.setDistrict(info.getDistrict()); storeMasterDTO.setTown(info.getTownship()); storeMasterDTO.setStoreAddress(info.getAddress()); storeMasterDTO.setLocationAddress(info.getAddress()); @@ -203,10 +185,35 @@ public class SyncMainSysServerImpl implements SyncMainSysServer { } storeMasterDTO.setSignerInfo(signerInfo); simpleMessageService.send(JSONObject.toJSONString(storeMasterDTO), RocketMqTagEnum.ZXJP_CREATE_STORE); + // 推送营帐通 + pushStoreToYzt(shopInfo, lineInfoDO); } catch (Exception e) { log.info("asdStore_error:{},shopId:{}", e.getMessage(), shopId.toString()); } } - + /** + * 钱包推送营帐通创建门店 + */ + public void pushStoreToYzt(ShopInfoDO shopInfoDO, LineInfoDO lineInfoDO) { + try { + RegionDO regionDO = regionDao.getRegionById(shopInfoDO.getRegionId()); + CreateStoreRequest createStoreRequest = CreateStoreRequest.builder() + .outStoreId(shopInfoDO.getStoreId()) + .storeSn(shopInfoDO.getShopCode()) + .storeName(shopInfoDO.getShopName()) + .orgCode(String.valueOf(regionDO.getId())) + .orgName(regionDO.getName()) + .phoneNumber(lineInfoDO.getMobile()) + .storeMode(YztStoreModel.getYztStoreModel(Integer.valueOf(shopInfoDO.getFranchiseBrand()))) + .province(shopInfoDO.getProvinceCode()) + .city(shopInfoDO.getCityCode()) + .district(shopInfoDO.getDistrictCode()) + .address(shopInfoDO.getDetailAddress()) + .build(); + walletApiService.createStore(createStoreRequest); + } catch (Exception e) { + log.error("推送营帐通钱包创建门店失败", e); + } + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java index ee6331d45..6ac1a03a0 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java @@ -3,12 +3,10 @@ package com.cool.store.service.impl; import com.alibaba.fastjson.JSONObject; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; +import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.bigdata.ProfitDataRequest; import com.cool.store.request.oppty.CityRequest; -import com.cool.store.response.bigdata.ActDataResponse; -import com.cool.store.response.bigdata.ApiResponse; -import com.cool.store.response.bigdata.ProfitDataResponse; -import com.cool.store.response.bigdata.ProfitRateResponse; +import com.cool.store.response.bigdata.*; import com.cool.store.response.oppty.CityResponse; import com.cool.store.response.oppty.OpportunityApiResponse; import com.cool.store.response.oppty.OpportunityDetailResponse; @@ -96,6 +94,15 @@ public class ThirdBigDataServiceImpl implements ThirdBigDataService { return executeApiCall(url, requestBody, ActDataResponse.class); } + @Override + public List getLatestOrderDate(LatestOrderDateRequest requestBody) { + String url = apiUrl + "api/web/v1/buy/latest_buy_date"; + JavaType javaType = objectMapper.getTypeFactory() + .constructParametricType(ApiPageResponse.class, LatestOrderDateResponse.class); + ApiPageResponse response = executeApiCallWithGenericType(url, requestBody, javaType); + return response.getList(); + } + private T executeApiCall(String url, Object requestBody, Class responseType) { // 1. 打印请求前日志 @@ -136,6 +143,44 @@ public class ThirdBigDataServiceImpl implements ThirdBigDataService { } } + private T executeApiCallWithGenericType(String url, Object requestBody, JavaType 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() != 0) { + 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) { Map params = JsonUtils.parseJsonToMap(JSONObject.toJSONString(requestBody)); 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 index e812a1ea6..4fddb48d1 100644 --- 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 @@ -1,14 +1,24 @@ 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.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; import lombok.extern.slf4j.Slf4j; @@ -20,8 +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.Map; +import java.util.Collections; +import java.util.List; +import java.util.Objects; /** * @Author suzhuhong @@ -40,15 +51,46 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { OkHttpClient okHttpClient; @Resource ObjectMapper objectMapper; + @Resource + private StoreDao storeDao; @Override public String getFoodToken(FoodTokenDTO dto) { // 1. 发送POST请求 - String url = apiUrl + "/interface/v1/user/getToken"; + String url = "/v1/user/getToken"; return executeApiCall(url, dto, String.class); } + @Override + public StoreUserResponse pushStoreUser(List dto) { + String url = "/v1/store/updateStoreUser"; + return executeApiCall(url, dto, StoreUserResponse.class); + } + + @Override + public List 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 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 executeApiCall(String url, Object requestBody, Class responseType) { // 1. 打印请求前日志 @@ -62,7 +104,7 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { String responseBody = response.body().string(); // 3. 打印响应日志 - logResponse(url, response.code(), responseBody); + logResponse(apiUrl+ url, response.code(), responseBody); if (!response.isSuccessful()) { throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, @@ -94,20 +136,24 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { String random = RandomUtil.randomString(20); String signString = null; + String reqBody = null; try { - signString = SignatureUtils.sign("POST","/v1/user/getToken", objectMapper.writeValueAsString(requestBody),timestamp,random); + reqBody = objectMapper.writeValueAsString(requestBody); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + try { + signString = SignatureUtils.sign("POST",url, reqBody,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) - ); + RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json"), reqBody); return new Request.Builder() - .url(url) + .url(apiUrl + url) .post(body) .addHeader("X-ZhengXin-Sign", signString) .addHeader("X-ZhengXin-SignTime", timestamp) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java index dcdec32f3..bf6ddb727 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java @@ -17,6 +17,7 @@ import com.cool.store.utils.UUIDUtils; import com.cool.store.vo.PartnerUserInfoVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -110,9 +111,16 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService { PartnerUserWechatBindDO bindDO = new PartnerUserWechatBindDO(); bindDO.setBindTime(new Date()); bindDO.setOpenId(openid); + bindDO.setUnionId(unionId); bindDO.setPartnerId(hyPartnerUserInfoDO.getPartnerId()); bindDO.setCreateTime(new Date()); partnerUserWechatBindDAO.insertSelective(bindDO); + }else { + //维护unionId 针对老数据没有unionId + if (zlPartnerUserBindDO.getUnionId()==null){ + zlPartnerUserBindDO.setUnionId(unionId); + partnerUserWechatBindDAO.update(zlPartnerUserBindDO); + } } BeanUtil.copyProperties(hyPartnerUserInfoDO, userInfoVO); fillLineInfo(userInfoVO, hyPartnerUserInfoDO.getPartnerId()); @@ -252,4 +260,30 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService { return null; } + @Override + public String getShortTermTokenByMobile(MiniProgramFreeLoginDTO param) { + HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByMobile(param.getMobile()); + if (Objects.isNull(hyPartnerUserInfoDO)) { + return ""; + } + PartnerUserInfoVO userInfoVO = BeanUtil.toBean(hyPartnerUserInfoDO, PartnerUserInfoVO.class); + fillLineInfo(userInfoVO, hyPartnerUserInfoDO.getPartnerId()); + String token = new SecureRandomNumberGenerator().nextBytes().toHex(); + String key = MessageFormat.format(CommonConstants.ZXJP_MIN_PROGRAM_SHORT_TERM_LOGIN_FLAG, token); + redisUtilPool.setString(key, JSONObject.toJSONString(userInfoVO), CommonConstants.SHORT_TERM_TOKEN_EXPIRE); + return token; + } + + @Override + public PartnerUserInfoVO getUserInfoByShortTermToken(String token) { + String key = MessageFormat.format(CommonConstants.ZXJP_MIN_PROGRAM_SHORT_TERM_LOGIN_FLAG, token); + String userStr = redisUtilPool.getString(key); + if (StringUtils.isNotBlank(userStr)) { + PartnerUserInfoVO userInfoVO = JSONObject.parseObject(userStr, PartnerUserInfoVO.class); + redisUtilPool.delKey(key); + return userInfoVO; + } + return null; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/xinfa/XinFaBusinessServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/xinfa/XinFaBusinessServiceImpl.java new file mode 100644 index 000000000..b00e6b0dc --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/xinfa/XinFaBusinessServiceImpl.java @@ -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 getStoreXinFaDeviceDetail(String storeNum) { + return xinFaDeviceService.getStoreXinFaDeviceDetail(storeNum); + } + + @Override + public List getAccountAllTags(String storeNum,String deviceName) { + //如果是广告机,不需要展示标签 + if (deviceName.contains("广告机")){ + return new ArrayList<>(); + } + List 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 getProgramList(ProgramReqDTO programReqDTO) { + //如果没传tag 查所有 根据更新时间倒序排 + programReqDTO.setSort("desc"); + programReqDTO.setDate("updateTime"); + if (CollectionUtils.isEmpty(programReqDTO.getTagIds())){ + //设备名称包含 广告机 只查询电子价目表 + programReqDTO.setTagIds(xinFaDeviceService.getAccountSpecialTagIds(programReqDTO.getStoreCode(), SpecialTagEnum.getElectronicPriceTagName())); + } + List programList = xinFaDeviceService.getProgramList(programReqDTO); + return programList; + } + + @Override + public Boolean publishProgram(PublishDTO publishDTO) { + return xinFaDeviceService.publish(publishDTO); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java new file mode 100644 index 000000000..c7de70b03 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java @@ -0,0 +1,106 @@ +package com.cool.store.service.login; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.CommonConstants; +import com.cool.store.constants.RedisConstant; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.dto.login.UserRefreshLoginDTO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.EnterpriseService; +import com.cool.store.userholder.CurrentUser; +import com.cool.store.userholder.RefreshUser; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.poi.constant.Constants; +import com.cool.store.vo.login.UserBaseInfoVO; +import com.cool.store.vo.login.UserLoginVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.time.LocalDate; + +/** + *

+ * 登录基础服务类 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Slf4j +@Service +public abstract class LoginBaseService implements LoginStrategy { + @Resource + private RedisUtilPool redisUtilPool; + @Resource + private EnterpriseUserDAO enterpriseUserDAO; + @Resource + private EnterpriseService enterpriseService; + + /** + * 策略登录实现方法 + */ + public abstract ResponseResult userLogin(UserLoginDTO param, UserLoginDO userLoginDO); + + @Override + public ResponseResult login(UserLoginDTO param) { + log.info("login:{}", JSONObject.toJSONString(param)); + String errorPasswordCountKey = MessageFormat.format(RedisConstant.ERROR_PASSWORD_COUNT_KEY, LocalDate.now(), param.getMobile()); + String errorCount = redisUtilPool.getString(errorPasswordCountKey); + //判断密码错误次数 + if (StringUtils.isNotBlank(errorCount)) { + if (Integer.parseInt(errorCount) >= CommonConstants.MAX_ERROR_PASSWORD_COUNT) { + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MAX_COUNT, errorCount); + } + } + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(param.getMobile()); + UserLoginDO userLoginDO = enterpriseUserDAO.getUserLoginByUnionid(enterpriseUserDO.getUnionid()); + return userLogin(param, userLoginDO); + } + + @Override + public ResponseResult refreshLogin(UserRefreshLoginDTO param) { + String refreshTokenKey = RedisConstant.REFRESH_TOKEN_PREFIX + param.getRefreshToken(); + String refreshUserStr = redisUtilPool.getString(refreshTokenKey); + if (StringUtils.isBlank(refreshUserStr)) { + return ResponseResult.fail(ErrorCodeEnum.REFRESH_TOKEN_INVALID); + } + RefreshUser refreshUser = JSONObject.parseObject(refreshUserStr, RefreshUser.class); + if (StringUtils.isBlank(refreshUser.getMobile())) { + return ResponseResult.fail(ErrorCodeEnum.REFRESH_TOKEN_INVALID); + } + UserLoginDO userLoginDO = new UserLoginDO(refreshUser.getUserId(), refreshUser.getMobile(), null); + return ResponseResult.success(getUserLoginInfo(userLoginDO)); + } + + @Override + public ResponseResult logout() { + LoginUserInfo currentUser = CurrentUserHolder.getUser(); + String accessToken = currentUser.getAccessToken(); + String key = RedisConstant.ACCESS_TOKEN_PREFIX + accessToken; + redisUtilPool.delKey(key); + return ResponseResult.success(); + } + + /** + * 获取登录accessToken + * + * @param userLoginDO 用户登录信息 + * @return accessToken + */ + public UserLoginVO getUserLoginInfo(UserLoginDO userLoginDO) { + CurrentUser currentUser = enterpriseService.getLoginInfo(userLoginDO.getMobile()); + UserBaseInfoVO userBAseInfoVO = BeanUtil.toBean(currentUser, UserBaseInfoVO.class); + RefreshUser refreshUser = enterpriseService.getRefreshUser(userLoginDO.getUserId(), userLoginDO.getMobile()); + return new UserLoginVO(currentUser.getAccessToken(), refreshUser.getRefreshToken(), CommonConstants.ACTION_TOKEN_EXPIRE, userBAseInfoVO); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java new file mode 100644 index 000000000..fefd75d54 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java @@ -0,0 +1,30 @@ +package com.cool.store.service.login; + +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.dto.login.UserRefreshLoginDTO; +import com.cool.store.response.ResponseResult; + +/** + *

+ * 登录策略 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +public interface LoginStrategy { + /** + * 登录基础方法 + */ + ResponseResult login(UserLoginDTO param); + + /** + * refreshToken登录 + */ + ResponseResult refreshLogin(UserRefreshLoginDTO param); + + /** + * 登出 + */ + ResponseResult logout(); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java new file mode 100644 index 000000000..f863e543d --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java @@ -0,0 +1,55 @@ +package com.cool.store.service.login.impl; + +import com.aliyun.core.utils.StringUtils; +import com.cool.store.constants.CommonConstants; +import com.cool.store.constants.RedisConstant; +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.entity.login.UserLoginDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.login.LoginBaseService; +import com.cool.store.utils.Md5Utils; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.poi.constant.Constants; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.text.MessageFormat; +import java.time.LocalDate; + +/** + *

+ * 密码登录服务实现类 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class PasswordLoginServiceImpl extends LoginBaseService { + private final RedisUtilPool redisUtilPool; + + @Override + public ResponseResult userLogin(UserLoginDTO param, UserLoginDO userLoginDO) { + if (StringUtils.isBlank(param.getPassword())) { + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_MISSING); + } + if (StringUtils.isBlank(userLoginDO.getPassword())) { + return ResponseResult.fail(ErrorCodeEnum.IMPROVE_USER_INFO); + } + String password = Md5Utils.md5(param.getPassword() + CommonConstants.USER_AUTH_KEY); + if (!password.equals(userLoginDO.getPassword())) { + String errorPasswordCountKey = MessageFormat.format(RedisConstant.ERROR_PASSWORD_COUNT_KEY, LocalDate.now(), param.getMobile()); + Long errorNum = redisUtilPool.incrby(errorPasswordCountKey, 1); + redisUtilPool.expire(errorPasswordCountKey, 24 * 60 * 60); + if(errorNum == 1){ + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR); + } + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MULTI, errorNum.toString()); + } + return ResponseResult.success(getUserLoginInfo(userLoginDO)); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java new file mode 100644 index 000000000..9aae38f6f --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java @@ -0,0 +1,231 @@ +package com.cool.store.service.wallet; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.wallet.*; +import com.cool.store.http.WalletHttpClientRest; +import com.cool.store.request.wallet.*; +import com.cool.store.utils.StringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/13 10:51 + * @Version 1.0 + */ +@Service +public class WalletApiService { + + @Resource + WalletHttpClientRest walletHttpClientRest; + + @Value("${wallet.url}") + private String walletBaseUrl; + + /** + * 在平安扫呗系统中,创建签约人账户 + * @param request + * @return + */ + public StoreAccountDTO createStoreAndAccount(CreateStoreAndAccountRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/createStoreAndAccount", request, StoreAccountDTO.class); + } + + /** + * 开通失败 开通 + * @param request + * @return + */ + public StoreAccountDTO updateStoreAccount(UpdateStoreAccountRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/updateStoreAccount", request, StoreAccountDTO.class); + } + + /** + * 创建门店接口 + * @param request + * @return + */ + public AccountNoDTO createStore(CreateStoreRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/createStore", request, AccountNoDTO.class); + } + + /** + * 银行发送短信接口 + * @param request + * @return + */ + public AccountAuthenticationDTO authentication(OutStoreIdRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/authentication", request, AccountAuthenticationDTO.class); + } + + /** + * 门店开通平安银行接口 + * @param request + * @return + */ + public AccountVerifyDTO openAccount(AccountVerifyRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/openAccount", request, AccountVerifyDTO.class); + } + + /** + * 签约人账户打标升级 + * @param request + * @return + */ + public AddTagDTO addTag(AccountAddTagRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/addTag", request, AddTagDTO.class); + } + + /** + * 获取账户信息 + * @param request + * @return + */ + public List getAccountInfo(OutStoreIdRequest request){ + String accountInfoStr = walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/queryAccountInfo", request, String.class); + if (StringUtil.isNotEmpty(accountInfoStr)){ + return JSONObject.parseArray(accountInfoStr, AccountInfoDTO.class); + } + return null; + } + + /** + * 大额预支付接口 + * @param request + * @return + */ + public LargePaymentDTO largePayment(LargePaymentRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/largePayment", request, LargePaymentDTO.class); + } + + /** + * 大额预支付查询接口 + * @param request + * @return + */ + public PaymentDTO largePaymentQuery(PaymentDetailRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/largePaymentQuery", request, PaymentDTO.class); + } + + /** + * 门店账户向公司分账转账接口 + * @param request + * @return + */ + public TransferDTO transfer(TransferRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/transfer", request, TransferDTO.class); + } + + + /** + * 门店签约账户,退款提现至提现卡 + * @param request + * @return + */ + public WithDrawerDTO withdraw(WithDrawerRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/withdrawer", request, WithDrawerDTO.class); + } + + /** + * 账单详情 + * @param request + * @return + */ + public TradeRecordDTO getBillDetail(BillDetailRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/billDetail", request, TradeRecordDTO.class); + } + + /** + * 获取门店账户流水 + * @param request + * @return + */ + public BillPageDTO getBillPage(BillPageRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/billPage", request, BillPageDTO.class); + } + + /** + * 获取门店账户信息 + * @param request + * @return + */ + public CompanyListDTO getCompanyInfo(FindPageCompanyRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/base/v1/findPageCompany", request, CompanyListDTO.class); + } + + /** + * 获取支行信息 + * @param request + * @return + */ + public BankListDTO getBankList(GetBankRequest request) { + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/base/v1/findPageBank", request, BankListDTO.class); + } + + /** + * 修改密码 + * @param request + * @return + */ + public String upholdPwd(UpdatePasswordRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/upholdPwd", request, String.class); + } + + /** + * 获取账户列表信息 + * @param request + * @return + */ + public AccountPageDTO getAccountList(AccountBatchQueryRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/findAccountPage", request, AccountPageDTO.class); + } + + /** + * 获取账户激活链接 + * @param request + * @return + */ + public AccountActiveUrlDTO pushAccountActiveUrl(OutStoreIdRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/ws/v1/create", request, AccountActiveUrlDTO.class); + } + + /** + * 老店创建门店网商账户 + * @param request + * @return + */ + public StoreIdDTO oldStoreOpenAccount(OldStoreAccountCreateRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/ws/v1/create", request, StoreIdDTO.class); + } + + /** + * 获取交易记录列表 + * @param request + * @return + */ + public TradeRecordListDTO getTradeRecordList(TradeRecodePageRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/trans/v1/accRecordPage", request, TradeRecordListDTO.class); + } + + /** + * 网商银行重新激活发送短链接 + * @param request 网商账户重新发送激活短信Request + * @return 网商激活短链DTO + */ + public TextMsgSendDTO textMsgSend(TextMsgSendRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/ws/v1/textMsgSend", request, TextMsgSendDTO.class); + } + + + /** + * 查询密码是否设置 + * @param request + * @return + */ + public PasswordDTO passwordIsExist(OutStoreIdRequest request){ + return walletHttpClientRest.postWithSign(walletBaseUrl+"/open/crm/account/v1/existPwd", request, PasswordDTO.class); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java new file mode 100644 index 000000000..584a4027b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java @@ -0,0 +1,189 @@ +package com.cool.store.service.wallet; + +import com.cool.store.dto.wallet.*; +import com.cool.store.request.wallet.*; +import com.cool.store.vo.wallet.*; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + *

+ * 钱包 服务类 + *

+ * + * @author wangff + * @since 2025/11/13 + */ +public interface WalletService { + + /** + * 平安银行钱包账号创建 + * @param request 平安钱包账户创建Request + * @return 是否成功 + */ + Boolean accountCreate(AccountCreateRequest request); + + /** + * 鉴权申请 + * @param request 门店id + * @return 是否成功 + */ + AccountAuthenticationVO authentication(WalletShopRequest request); + + /** + * 账号开通 + * @param request 平安钱包账户开通Request + * @return 是否成功 + */ + Boolean openAccount(AccountOpenRequest request); + + /** + * 银行支行列表查询 + * @param request 支行信息查询Request + * @return 银行支行信息列表 + */ + PageInfo getBankList(BankListRequest request); + + /** + * 判断营业执照是否已经上传,已上传则调用打标接口 + * @param shopId 门店shopId + * @param storeId 主数据门店id + * @param lineId 线索id + */ + void addTagIfUploadLicense(Long shopId, String storeId, Long lineId); + + /** + * 打标成功回调通知 + * @param request + * @return + */ + Boolean addTagCallback(AddTagCallbackNoticeRequest request); + + /** + * 大额充值 回调接口 + * @param request + * @return + */ + Boolean largePaymentCallback(PaymentDTO request); + + /** + * 网商银行 回调接口 + * @param request + * @return + */ + Boolean onlineCommercialBankCallback(OnlineCommercialBankCallbackRequest request); + + /** + * 账户交易回调 + * @param request + * @return + */ + Boolean accountTradeCallback(AccountTradeCallbackRequest request); + + /** + * 查询账户列表 + * @param request 账户查询Request + * @return 账户信息VO列表 + */ + AccountDataVO getAccountList(AccountQueryRequest request); + + /** + * 根据账户编号查询账户信息 + * @param request 账户查询Request + * @return 账户信息VO + */ + AccountInfoVO getAccountInfo(AccountQueryRequest request); + + /** + * 交易流水 + * @param request 交易流水查询Request + * @return 账户交易列表VO列表 + */ + AccountBillPageVO getBillPage(AccountBillQueryRequest request); + + /** + * 账户交易详情 + * @param request 交易详情查询Request + * @return 交易详情VO + */ + TradeRecordDTO getBillDetail(BillDetailRequest request); + + /** + * 密码维护 + * @param request 账户密码维护Request + * @return 是否成功 + */ + Boolean passwordUpdate(AccountPasswordRequest request); + + /** + * 门店是否存在密码 + * @param request + * @return + */ + PasswordDTO existPassword(OutStoreIdRequest request); + + /** + * 账户充值 + * @param request 账户充值Request + * @return 账户充值VO + */ + AccountPaymentVO payment(AccountPaymentRequest request); + + /** + * 未完成充值订单查询 + * @param request 查询request + * @return 钱包支付订单VO列表 + */ + PageInfo nonPaymentOrderPage(LargePaymentQueryRequest request); + + /** + * 根据预支付id查询收款账户详情 + * @param paymentId 预支付id + * @return 账户充值VO + */ + AccountPaymentVO paymentDetail(String paymentId); + + /** + * 提现 + * @param request 钱包提现Request + * @return 是否成功 + */ + Boolean withDrawer(WalletWithDrawerRequest request); + + /** + * 批量查询账户信息 分页查询 所有门店账户 + * @param request 批量查询账户信息Request + * @return 账户信息VO列表 + */ + PageInfo getAllAccountList(CoolAccountBatchQueryRequest request); + + /** + * 批量查询账户交易流水 + * @param request + * @return + */ + PageInfo getTradeRecordList(CoolTradeRecodePageRequest request); + + + /** + * 通过门店Code 查询存量客户开通基本信息 + * @param storeCode + * @return + */ + OpenBasicInfoDTO getOpenBasicInfo(String storeId, String storeCode); + + /** + * 开通网商银行 + * @param request + * @return + */ + Boolean openOnlineBankAccount(CoolOpenBasicInfoRequest request); + + /** + * 网商发送激活短信 + * @param request 门店idRequest + * @return 是否成功 + */ + Boolean onlineBankActive(StoreShopRequest request); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java new file mode 100644 index 000000000..46bc1f2d7 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java @@ -0,0 +1,667 @@ +package com.cool.store.service.wallet.impl; + +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.CommonConstants; +import com.cool.store.constants.RedisConstant; +import com.cool.store.dao.*; +import com.cool.store.dao.store.StoreMasterSignerInfoDAO; +import com.cool.store.dao.wallet.OpenBankInfoDAO; +import com.cool.store.dao.wallet.TempOpenWalletInfoDAO; +import com.cool.store.dao.wallet.WalletPaymentOrderDAO; +import com.cool.store.dto.wallet.*; +import com.cool.store.entity.*; +import com.cool.store.entity.store.StoreMasterSignerInfoDO; +import com.cool.store.entity.wallet.OpenBankInfoDO; +import com.cool.store.entity.wallet.TempOpenWalletInfoDO; +import com.cool.store.entity.wallet.WalletPaymentOrderDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.point.ShopSubStageEnum; +import com.cool.store.enums.point.ShopSubStageStatusEnum; +import com.cool.store.enums.wallet.BankAccountTypeEnum; +import com.cool.store.enums.wallet.BankBusinessTypeEnum; +import com.cool.store.enums.wechat.WalletTypeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mapper.ApplyLicenseMapper; +import com.cool.store.request.wallet.*; +import com.cool.store.service.wallet.WalletApiService; +import com.cool.store.service.wallet.WalletService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.UUIDUtils; +import com.cool.store.vo.wallet.*; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.sql.Date; +import java.text.MessageFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 钱包 服务实现类 + *

+ * + * @author wangff + * @since 2025/11/13 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class WalletServiceImpl implements WalletService { + private final ShopInfoDAO shopInfoDAO; + private final ShopStageInfoDAO shopStageInfoDAO; + private final ApplyLicenseMapper applyLicenseMapper; + private final WalletApiService walletApiService; + private final WalletPaymentOrderDAO walletPaymentOrderDAO; + private final LineInfoDAO lineInfoDAO; + private final RedisUtilPool redisUtilPool; + private final QualificationsInfoDAO qualificationsInfoDAO; + private final StoreDao storeDao; + private final StoreMasterSignerInfoDAO storeMasterSignerInfoDAO; + private final TempOpenWalletInfoDAO tempOpenWalletInfoDAO; + private final OpenBankInfoDAO openBankInfoDAO; + + private final static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public Boolean accountCreate(AccountCreateRequest request) { + ShopInfoDO shopInfo = getAndVerifyShopAndStage(request.getShopId()); + // 存储银行卡信息 + OpenBankInfoDO openBankInfoDO = OpenBankInfoDO.builder() + .storeId(shopInfo.getStoreId()) + .settlementCard(request.getBankNumber()) + .bankBranchName(request.getBankName()) + .bankBranchCode(request.getBankNo()) + .bankReservedPhone(request.getBankMobile()) + .source(1) + .build(); + openBankInfoDAO.insertOrUpdateByStoreId(openBankInfoDO); + // 调用 创建门店签约人账户接口 + CreateStoreAndAccountRequest accountRequest = CreateStoreAndAccountRequest.builder() + .outStoreId(shopInfo.getStoreId()) + .phoneNumber(request.getMobile()) + .accountType(BankAccountTypeEnum.PRIVATE.getType()) + .businessType(BankBusinessTypeEnum.PERSONAL.getType()) + .legalName(request.getUserName()) + .legalNo(request.getIdCardNo()) + .accountAliasName(request.getUserName() + "_" + shopInfo.getStoreId()) + .accountCardNo(request.getBankNumber()) + .accountPhone(request.getBankMobile()) + .bankNo(request.getBankNo()) + .bankName(request.getBankName()) + .build(); + StoreAccountDTO storeAndAccount = walletApiService.createStoreAndAccount(accountRequest); + return StringUtils.isNotBlank(storeAndAccount.getAccountNo()); + } + + @Override + public AccountAuthenticationVO authentication(WalletShopRequest request) { + ShopInfoDO shopInfo = getAndVerifyShopAndStage(request.getShopId()); + // 调用 门店签约人账户鉴权申请接口 + AccountAuthenticationDTO authentication = walletApiService.authentication(new OutStoreIdRequest(shopInfo.getStoreId())); + if (Objects.nonNull(authentication)) { + if (authentication.getAccountStatus().equals(4)) { + // 判断营业执照是否已经上传,已上传则调用打标接口 + addTagIfUploadLicense(request.getShopId(), shopInfo.getStoreId(), shopInfo.getLineId()); + } + return new AccountAuthenticationVO(authentication.getAccountStatus()); + } + throw new ServiceException(ErrorCodeEnum.WALLET_OPEN_ACCOUNT_FAIL); + } + + @Override + public Boolean openAccount(AccountOpenRequest request) { + // 校验阶段是否合法 + ShopInfoDO shopInfo = getAndVerifyShopAndStage(request.getShopId()); + + // 调用 门店签约人账户开通接口 + log.info("开通账户"); + AccountVerifyDTO accountVerifyDTO = walletApiService.openAccount(new AccountVerifyRequest(shopInfo.getStoreId(), request.getCode())); + if (!CommonConstants.INDEX_ONE.equals(accountVerifyDTO.getOpenStatus())) { + throw new ServiceException(ErrorCodeEnum.WALLET_OPEN_ACCOUNT_FAIL); + } + + // 更新钱包开通阶段状态 + List updateSubStageList = new ArrayList<>(); + updateSubStageList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_61); + // 判断一下缴费阶段是否开启,未开启则开启缴费阶段 + ShopStageInfoDO payStage = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_7); + if (ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_00.getShopSubStageStatus().equals(payStage.getShopSubStageStatus())) { + updateSubStageList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_70); + } + shopStageInfoDAO.batchUpdateShopStageStatus(request.getShopId(), updateSubStageList); + + // 判断营业执照是否已经上传,已上传则调用打标接口 + addTagIfUploadLicense(request.getShopId(), shopInfo.getStoreId(), shopInfo.getLineId()); + return true; + } + + @Override + public PageInfo getBankList(BankListRequest request) { + GetBankRequest getBankRequest = new GetBankRequest(); + WalletBasicPageInfo pageParam = new WalletBasicPageInfo(); + pageParam.setCurrentPage(request.getPageNum()); + pageParam.setPageSize(request.getPageSize()); + getBankRequest.setPage(pageParam); + getBankRequest.setHeadName(request.getHeadName()); + getBankRequest.setKeyword(request.getKeyword()); + BankListDTO bankListDTO = walletApiService.getBankList(getBankRequest); + return toPageInfo(bankListDTO.getPageData(), BankVO.class, bankListDTO.getPage()); + } + + public static PageInfo toPageInfo(List list, Class clazz, WalletBasicPageInfo page) { + PageInfo result = new PageInfo<>(); + result.setPageNum(page.getCurrentPage()); + result.setPageSize(page.getPageSize()); + result.setPages(page.getCount()); + result.setTotal(page.getTotal()); + result.setList(CollectionUtils.isNotEmpty(list) ? (list.get(0).getClass().equals(clazz) ? (List) list : BeanUtil.toList(list, clazz)) : Collections.emptyList()); + return result; + } + + @Override + public void addTagIfUploadLicense(Long shopId, String storeId, Long lineId) { + LicenseTransactDO license = applyLicenseMapper.selectByShopId(shopId); + // 营业执照已上传,调用打标接口 + if (Objects.nonNull(license) && StringUtils.isNotBlank(license.getCreditUrl())) { + try { + // 判断一下账户的开通状态 + if (enableAddTag(storeId)) { + OpenBankInfoDO openBankInfo = getAndUpdateOpenBankInfo(storeId, lineId, license); + // 调用 签约人账户打标(升级)接口 + log.info("营业执照已上传,账户打标"); + AccountAddTagRequest tagRequest = AccountAddTagRequest.builder() + .outStoreId(storeId) + .licenseNo(openBankInfo.getBusinessLicenseCode()) + .licenseName(openBankInfo.getBusinessLicenseName()) + .legalName(openBankInfo.getLegalName()) + .legalNo(openBankInfo.getLegalIdCard()) + .legalPhone(openBankInfo.getLegalPhone()) + .certPhotoA(openBankInfo.getLegalIdCardFront()) + .certPhotoB(openBankInfo.getLegalIdCardBack()) + .licensePhoto(openBankInfo.getBusinessLicensePhoto()) + .signatoryPhotoA(openBankInfo.getSignerIdCardFront()) + .signatoryPhotoB(openBankInfo.getSignerIdCardBack()) + .build(); + executeAddTag(tagRequest); + } + } catch (ServiceException e) { + // 平安打标 签约人和法人一致时,同步返回,失败原因从msg中取 + String key = MessageFormat.format(RedisConstant.WALLET_OPEN_FAIL, storeId, WalletTypeEnum.PING_AN.getType()); + redisUtilPool.setString(key, e.getErrorCode().equals(ErrorCodeEnum.WALLET_API_ERROR.getCode()) ? e.getMessage() : "系统异常"); + log.info("营业执照已上传,接口异常", e); + } catch (Exception e) { + log.error("营业执照已上传,打标失败", e); + } + } + } + + /** + * 执行打标接口,执行失败缓存标记 + */ + private void executeAddTag(AccountAddTagRequest tagRequest) { + AddTagDTO addTagDTO = walletApiService.addTag(tagRequest); + log.info("打标接口调用成功,response:{}", JSONObject.toJSONString(addTagDTO)); + // 如果网商创建失败,缓存标记 + if (CommonConstants.INDEX_TWO.equals(addTagDTO.getWsStatus())) { + redisUtilPool.setString(MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_TAG_FAIL, tagRequest.getOutStoreId()), "1"); + } else { + // 网商创建成功,记录已激活状态 + redisUtilPool.setString(MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_ACTIVATED, tagRequest.getOutStoreId()), "1"); + } + } + + /** + * 获取并更新门店开通网商信息 + */ + private OpenBankInfoDO getAndUpdateOpenBankInfo(String storeId, Long lineId, LicenseTransactDO license) { + LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(lineId); + QualificationsInfoDO qualificationsInfoDO = qualificationsInfoDAO.getByLineId(lineId); + OpenBankInfoDO openBankInfoDO = OpenBankInfoDO.builder() + .storeId(storeId) + .signerName(lineInfoDO.getUsername()) + .signerIdCard(qualificationsInfoDO.getIdCardNo()) + .signerPhone(lineInfoDO.getMobile()) + .signerIdCardFront(qualificationsInfoDO.getFrontOfIdCard()) + .signerIdCardBack(qualificationsInfoDO.getBackOfIdCard()) + .businessLicenseName(license.getBusinessLicense()) + .businessLicenseCode(license.getCreditCode()) + .businessLicensePhoto(license.getCreditUrl()) + .legalName(license.getLicenseLegalPerson()) + .legalIdCard(license.getLicenseLegalIdCardNo()) + .legalPhone(license.getLicenseLegalMobile()) + .legalIdCardFront(license.getLicenseLegalIdCardFront()) + .legalIdCardBack(license.getLicenseLegalIdCardBack()) + .build(); + openBankInfoDAO.insertOrUpdateByStoreId(openBankInfoDO); + return openBankInfoDO; + } + + /** + * 账户存在且未打标 + */ + private boolean enableAddTag(String storeId) { + List accountInfo = walletApiService.getAccountInfo(new OutStoreIdRequest(storeId)); + return CollectionUtils.isNotEmpty(accountInfo) && accountInfo.size() == 1 && accountInfo.get(0).getLabelingStatus().equals(0); + } + + @Override + public Boolean addTagCallback(AddTagCallbackNoticeRequest request) { + try { + String key = MessageFormat.format(RedisConstant.WALLET_OPEN_FAIL, request.getOutStoreId(), WalletTypeEnum.PING_AN.getType()); + if (Integer.valueOf(2).equals(request.getStatus())) { + redisUtilPool.setString(key, request.getErrorMsg()); + } else { + redisUtilPool.delKey(key); + } + } catch (Exception e) { + log.info("平安打标回调失败", e); + } + return Boolean.TRUE; + } + + @Override + public Boolean largePaymentCallback(PaymentDTO request) { + try { + walletPaymentOrderDAO.updateOrderByPaymentId(request.getOutStoreId(), request.getPaymentId(), request.getOrderStatus()); + } catch (Exception e) { + log.error("大额充值回调失败", e); + } + return Boolean.TRUE; + } + + @Override + public Boolean onlineCommercialBankCallback(OnlineCommercialBankCallbackRequest request) { + try { + String key = MessageFormat.format(RedisConstant.WALLET_OPEN_FAIL, request.getOutStoreId(), "1"); + if (Integer.valueOf(5).equals(request.getAccountStatus())) { + redisUtilPool.setString(key, request.getFailReason()); + } else { + redisUtilPool.delKey(key); + } + // 如果创建成功,删除网商开通失败标识 + if (Integer.valueOf(4).equals(request.getAccountStatus())) { + redisUtilPool.delKey(MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_TAG_FAIL, request.getOutStoreId())); + redisUtilPool.delKey(MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_ACTIVATED, request.getOutStoreId())); + } + } catch (Exception e) { + log.info("平安打标回调失败", e); + } + return Boolean.TRUE; + } + + @Override + public Boolean accountTradeCallback(AccountTradeCallbackRequest request) { + return Boolean.TRUE; + } + + @Override + public AccountDataVO getAccountList(AccountQueryRequest request) { + String storeId = getStoreId(request); + List accountInfo = walletApiService.getAccountInfo(new OutStoreIdRequest(storeId)); + List accountList = accountInfo.stream() + .filter(v -> Objects.isNull(request.getWalletType()) || request.getWalletType().equals(v.getWalletType())) + .map(v -> { + AccountInfoVO vo = BeanUtil.toBean(v, AccountInfoVO.class); + String key = MessageFormat.format(RedisConstant.WALLET_OPEN_FAIL, storeId, String.valueOf(v.getWalletType())); + vo.setFailReason(redisUtilPool.getString(key)); + return vo; + }).collect(Collectors.toList()); + boolean onlineBankOpenFail = false; + boolean activated = false; + if (WalletTypeEnum.ONLINE_BANK.getType().equals(request.getWalletType())) { + onlineBankOpenFail = getOnlineBankFailTag(storeId); + String key = MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_ACTIVATED, storeId); + activated = StringUtils.isNotBlank(redisUtilPool.getString(key)); + } + return new AccountDataVO(onlineBankOpenFail, activated, accountList); + } + + @Override + public AccountInfoVO getAccountInfo(AccountQueryRequest request) { + String storeId = getStoreId(request); + List accountInfo = walletApiService.getAccountInfo(new OutStoreIdRequest(storeId)); + AccountInfoDTO accountInfoDTO = accountInfo.stream().filter(v -> v.getAccountNo().equals(request.getAccountNo())).findFirst().orElse(null); + return BeanUtil.toBean(accountInfoDTO, AccountInfoVO.class); + } + + @Override + public AccountBillPageVO getBillPage(AccountBillQueryRequest request) { + String storeId = getStoreId(request); + LocalDate now = LocalDate.now(); + if (Objects.isNull(request.getBeginDate()) || Objects.isNull(request.getEndDate())) { + request.setBeginDate(Date.valueOf(now.withDayOfMonth(1))); + request.setEndDate(Date.valueOf(now)); + } + BillPageRequest billPageRequest = BillPageRequest.builder() + .outStoreId(storeId) + .beginDate(DateUtil.format(request.getBeginDate(), "yyyy-MM-dd HH:mm:ss")) + .endDate(DateUtil.format(request.getEndDate(), "yyyy-MM-dd HH:mm:ss")) + .walletType(request.getWalletType()) + .isLegal(request.getIsLegal()) + .recordType(request.getRecordType()) + .feeItemId(request.getFeeItemId()) + .currentPage(request.getPageNum()) + .pageSize(request.getPageSize()) + .build(); + BillPageDTO billPage = walletApiService.getBillPage(billPageRequest); + PageInfo data = toPageInfo(billPage.getPageData(), TradeRecordDTO.class, billPage.getPage()); + return new AccountBillPageVO(data, billPage.getGetAmount(), billPage.getUseAmount()); + } + + @Override + public TradeRecordDTO getBillDetail(BillDetailRequest request) { + return walletApiService.getBillDetail(request); + } + + @Override + public Boolean passwordUpdate(AccountPasswordRequest request) { + String storeId = getStoreId(request); + UpdatePasswordRequest passwordRequest = BeanUtil.toBean(request, UpdatePasswordRequest.class); + passwordRequest.setOutStoreId(storeId); + walletApiService.upholdPwd(passwordRequest); + return true; + } + + @Override + public PasswordDTO existPassword(OutStoreIdRequest request) { + PasswordDTO passwordDTO = walletApiService.passwordIsExist(request); + List list = walletApiService.getAccountInfo(request); + Boolean isExistAccount = false; + if (CollectionUtils.isNotEmpty( list)){ + isExistAccount = Boolean.TRUE; + } + passwordDTO.setIsExistAccount(isExistAccount); + return passwordDTO; + } + + @Override + public AccountPaymentVO payment(AccountPaymentRequest request) { + ShopInfoDO shopInfo = null; + if (Objects.nonNull(request.getShopId())) { + shopInfo = shopInfoDAO.getShopInfo(request.getShopId()); + } else if (StringUtils.isNotBlank(request.getStoreId())) { + shopInfo = shopInfoDAO.getShopInfoByStoreId(request.getStoreId()); + } + if (Objects.isNull(shopInfo)) { + throw new ServiceException(ErrorCodeEnum.SHOP_NOT_EXIST); + } + String storeId = shopInfo.getStoreId(); + LineInfoDO lineInfo = lineInfoDAO.getByPartnerId(shopInfo.getPartnerId()); + if (Objects.isNull(lineInfo)) { + throw new ServiceException(ErrorCodeEnum.LINE_ID_IS_NOT_EXIST); + } + String paymentId = UUIDUtils.get32UUID(); + LargePaymentRequest paymentRequest = new LargePaymentRequest(storeId, paymentId, lineInfo.getUsername(), request.getAmount().toString()); + LargePaymentDTO resultDTO = walletApiService.largePayment(paymentRequest); + + long expiryCountdown = 0; + if (StringUtils.isNotBlank(resultDTO.getExpireTime())) { + expiryCountdown = Math.max(0, Duration.between(LocalDateTime.now(), LocalDateTime.parse(resultDTO.getExpireTime(), formatter)).getSeconds()); + } + WalletPaymentOrderDO orderDO = WalletPaymentOrderDO.builder() + .storeId(storeId) + .paymentId(paymentId) + .type(0) + .amount(request.getAmount()) + .expireTime(resultDTO.getExpireTime()) + .orderStatus(3) + .build(); + walletPaymentOrderDAO.insertSelective(orderDO); + AccountPaymentVO result = BeanUtil.toBean(resultDTO, AccountPaymentVO.class); + result.setExpiryCountdown(expiryCountdown); + return result; + } + + @Override + public PageInfo nonPaymentOrderPage(LargePaymentQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + String storeId = getStoreId(request); + List list = walletPaymentOrderDAO.getNonPaymentList(storeId); + PageInfo page = new PageInfo<>(list); + return BeanUtil.toPage(page, WalletPaymentOrderVO.class); + } + + @Override + public AccountPaymentVO paymentDetail(String paymentId) { + PaymentDetailRequest request = new PaymentDetailRequest(); + request.setPaymentId(paymentId); + PaymentDTO resultDTO = walletApiService.largePaymentQuery(request); + + long expiryCountdown = 0; + if (StringUtils.isNotBlank(resultDTO.getExpireTime())) { + expiryCountdown = Math.max(0, Duration.between(LocalDateTime.now(), LocalDateTime.parse(resultDTO.getExpireTime(), formatter)).getSeconds()); + } + AccountPaymentVO result = BeanUtil.toBean(resultDTO, AccountPaymentVO.class); + result.setExpiryCountdown(expiryCountdown); + return result; + } + + @Override + public Boolean withDrawer(WalletWithDrawerRequest request) { + String storeId = getStoreId(request); + String reqNo = UUIDUtils.get32UUID(); + WithDrawerRequest withDrawerRequest = new WithDrawerRequest(storeId, request.getPayPwd(), reqNo, request.getAmount().toString(), "提现", request.getWalletType()); + WithDrawerDTO withdraw = walletApiService.withdraw(withDrawerRequest); + if ("2".equals(withdraw.getTradeStatus())) { + throw new ServiceException(ErrorCodeEnum.WALLET_WITH_DRAWER_FAIL); + } + WalletPaymentOrderDO orderDO = WalletPaymentOrderDO.builder() + .storeId(storeId) + .paymentId(reqNo) + .type(1) + .amount(request.getAmount()) + .orderStatus(1) + .build(); + walletPaymentOrderDAO.insertSelective(orderDO); + return true; + } + + @Override + public PageInfo getAllAccountList(CoolAccountBatchQueryRequest request) { + AccountBatchQueryRequest accountBatchQueryRequest = request.convertToAccountBatchQueryRequest(); + AccountPageDTO accountList = walletApiService.getAccountList(accountBatchQueryRequest); + List list = BeanUtil.toList(accountList.getPageData(), AccountPageVO.class, CopyOptions.create().setFieldMapping(Collections.singletonMap("outStoreId", "storeId"))); + PageInfo page = toPageInfo(list, AccountPageVO.class, accountList.getPage()); + List storeIds = CollStreamUtil.toList(page.getList(), AccountPageVO::getStoreId); + Map storeNameMap = getStoreNameMap(storeIds); + page.getList().forEach(v -> v.setStoreName(storeNameMap.get(v.getStoreId()))); + return page; + } + + private Map getStoreNameMap(List storeIds) { + Map storeNameMap = new HashMap<>(); + List stores = storeDao.getEffectiveStoreByStoreIds(storeIds); + Map storeMap = CollStreamUtil.toMap(stores, StoreDO::getStoreId, StoreDO::getStoreName); + storeNameMap.putAll(storeMap); + List shops = shopInfoDAO.getShopInfoByStoreIds(storeIds); + Map shopMap = CollStreamUtil.toMap(shops, ShopInfoDO::getStoreId, ShopInfoDO::getShopName); + storeNameMap.putAll(shopMap); + return storeNameMap; + } + + @Override + public PageInfo getTradeRecordList(CoolTradeRecodePageRequest request) { + TradeRecodePageRequest tradeRecodePageRequest = request.convertToTradeRecodePageRequest(); + TradeRecordListDTO tradeRecordListDTO = walletApiService.getTradeRecordList(tradeRecodePageRequest); + return toPageInfo(tradeRecordListDTO.getPageData(), TradeRecordDTO.class, tradeRecordListDTO.getPage()); + } + + @Override + public OpenBasicInfoDTO getOpenBasicInfo(String storeId, String storeCode) { + OpenBasicInfoDTO openBasicInfoDTO = new OpenBasicInfoDTO(); + //非首次提交 获取上次提交的信息 其他情况走主数据与营账通开通数据 + OpenBankInfoDO openBankInfo; + if (StringUtils.isNotBlank(storeId)) { + openBankInfo = openBankInfoDAO.getOpenBankInfoByStoreId(storeId); + } else { + openBankInfo = openBankInfoDAO.getOpenBankInfo(storeCode); + } + if (Objects.nonNull(openBankInfo)){ + openBasicInfoDTO.setSignerName(openBankInfo.getSignerName()); + openBasicInfoDTO.setSignerIdCard(openBankInfo.getSignerIdCard()); + openBasicInfoDTO.setSignerPhone(openBankInfo.getSignerPhone()); + openBasicInfoDTO.setSignerIdCardFront(openBankInfo.getSignerIdCardFront()); + openBasicInfoDTO.setSignerIdCardBack(openBankInfo.getSignerIdCardBack()); + openBasicInfoDTO.setBusinessLicenseName(openBankInfo.getBusinessLicenseName()); + openBasicInfoDTO.setBusinessLicensePhoto(openBankInfo.getBusinessLicensePhoto()); + openBasicInfoDTO.setBusinessLicenseCode(openBankInfo.getBusinessLicenseCode()); + openBasicInfoDTO.setSettlementCard(openBankInfo.getSettlementCard()); + openBasicInfoDTO.setBankBranchName(openBankInfo.getBankBranchName()); + openBasicInfoDTO.setBankBranchCode(openBankInfo.getBankBranchCode()); + openBasicInfoDTO.setBankReservedPhone(openBankInfo.getBankReservedPhone()); + return openBasicInfoDTO; + } + //先查询当前门店 + StoreDO store = storeDao.getByStoreNum(storeCode); + if (Objects.isNull( store)){ + return null; + } + Map signerMapByStoreIds = storeMasterSignerInfoDAO.getSignerMapByStoreIds(Collections.singletonList(store.getStoreId())); + StoreMasterSignerInfoDO signerInfoDO = signerMapByStoreIds.get(store.getStoreId()); + + if (Objects.nonNull(signerInfoDO)){ + openBasicInfoDTO.setSignerName(signerInfoDO.getSigner1Name()); + openBasicInfoDTO.setSignerIdCard(signerInfoDO.getSigner1IdCardNo()); + openBasicInfoDTO.setSignerPhone(signerInfoDO.getSigner1Mobile()); + openBasicInfoDTO.setSignerIdCardFront(signerInfoDO.getSigner1IdCardFront()); + openBasicInfoDTO.setSignerIdCardBack(signerInfoDO.getSigner1IdCardBack()); + } + TempOpenWalletInfoDO tempOpenWalletInfoByStoreCode = tempOpenWalletInfoDAO.getTempOpenWalletInfoByStoreCode(storeCode); + if (Objects.nonNull(tempOpenWalletInfoByStoreCode)){ + openBasicInfoDTO.setBusinessLicenseName(tempOpenWalletInfoByStoreCode.getBusinessRegName()); + openBasicInfoDTO.setBusinessLicenseCode(tempOpenWalletInfoByStoreCode.getBusinessLicenseNo()); + openBasicInfoDTO.setSettlementCard(tempOpenWalletInfoByStoreCode.getSettlementCardNo()); + openBasicInfoDTO.setBankBranchName(tempOpenWalletInfoByStoreCode.getBankBranchName()); + openBasicInfoDTO.setBankBranchCode(tempOpenWalletInfoByStoreCode.getBankBranchNo()); + openBasicInfoDTO.setBankReservedPhone(tempOpenWalletInfoByStoreCode.getBankReservedPhone()); + } + return openBasicInfoDTO; + } + + + @Override + public Boolean openOnlineBankAccount(CoolOpenBasicInfoRequest request) { + //首先存储提交的信息 + OpenBankInfoDO openBankInfoDO = new OpenBankInfoDO(); + BeanUtil.copyProperties(request, openBankInfoDO); + //查询是否有提交过 + OpenBankInfoDO openBankInfo = openBankInfoDAO.getOpenBankInfo(request.getStoreCode()); + if (Objects.isNull(openBankInfo)){ + openBankInfoDAO.insertSelective(openBankInfoDO); + }else { + openBankInfoDAO.updateByStoreCode(openBankInfoDO); + } + // 如果是开店流程中网商开通失败,则重新调用打标接口 + if (getOnlineBankFailTag(request.getStoreId())) { + onlineBankFailReOpen(request); + return true; + } + OldStoreAccountCreateRequest oldStoreAccountCreateRequest = new OldStoreAccountCreateRequest(); + StoreDO store = storeDao.getByStoreNum(request.getStoreCode()); + oldStoreAccountCreateRequest.setOutStoreId(store.getStoreId()); + oldStoreAccountCreateRequest.setPhoneNumber(request.getSignerPhone()); + oldStoreAccountCreateRequest.setAccountType(2); + oldStoreAccountCreateRequest.setLicenseNo(request.getBusinessLicenseCode()); + oldStoreAccountCreateRequest.setLicenseName(request.getBusinessLicenseName()); + oldStoreAccountCreateRequest.setLegalName(request.getLegalName()); + oldStoreAccountCreateRequest.setLegalNo(request.getLegalIdCard()); + oldStoreAccountCreateRequest.setLegalPhone(request.getLegalPhone()); + oldStoreAccountCreateRequest.setLegalIdcardExpireTime(request.getLegalIdCardExpireTime()); + //账户简称使用营业执照名称 + oldStoreAccountCreateRequest.setAccountAliasName(request.getBusinessLicenseName()); + oldStoreAccountCreateRequest.setAccountCardNo(request.getSettlementCard()); + oldStoreAccountCreateRequest.setAccountPhone(request.getBankReservedPhone()); + oldStoreAccountCreateRequest.setBankNo(request.getBankBranchCode()); + oldStoreAccountCreateRequest.setBankName(request.getBankBranchName()); + oldStoreAccountCreateRequest.setCertPhotoA(request.getLegalIdCardFront()); + oldStoreAccountCreateRequest.setCertPhotoB(request.getLegalIdCardBack()); + oldStoreAccountCreateRequest.setLicensePhoto(request.getBusinessLicensePhoto()); + oldStoreAccountCreateRequest.setSignatoryName(request.getSignerName()); + oldStoreAccountCreateRequest.setSignatoryPhone(request.getSignerPhone()); + oldStoreAccountCreateRequest.setSignatoryNo(request.getSignerIdCard()); + oldStoreAccountCreateRequest.setSignatoryPhotoA(request.getSignerIdCardFront()); + oldStoreAccountCreateRequest.setSignatoryPhotoB(request.getSignerIdCardBack()); + walletApiService.oldStoreOpenAccount(oldStoreAccountCreateRequest); + // 网商创建成功,记录已激活状态 + redisUtilPool.setString(MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_ACTIVATED, store.getStoreId()), "1"); + return Boolean.TRUE; + } + + /** + * 获取开店流程网商银行开通失败标记 + */ + private boolean getOnlineBankFailTag(String storeId) { + String key = MessageFormat.format(RedisConstant.WALLET_ONLINE_BANK_TAG_FAIL, storeId); + String flag = redisUtilPool.getString(key); + return StringUtils.isNotBlank(flag); + } + + /** + * 开通流程创建网商银行账户失败的情况下,重新开通 + */ + private void onlineBankFailReOpen(CoolOpenBasicInfoRequest request) { + log.info("网商钱包开通失败后重新提交打标接口"); + AccountAddTagRequest tagRequest = AccountAddTagRequest.builder() + .outStoreId(request.getStoreId()) + .licenseNo(request.getBusinessLicenseCode()) + .licenseName(request.getBusinessLicenseName()) + .legalName(request.getLegalName()) + .legalNo(request.getLegalIdCard()) + .legalPhone(request.getLegalPhone()) + .certPhotoA(request.getLegalIdCardFront()) + .certPhotoB(request.getLegalIdCardBack()) + .licensePhoto(request.getBusinessLicensePhoto()) + .signatoryPhotoA(request.getSignerIdCardFront()) + .signatoryPhotoB(request.getSignerIdCardBack()) + .build(); + executeAddTag(tagRequest); + } + + @Override + public Boolean onlineBankActive(StoreShopRequest request) { + String storeId = getStoreId(request); + walletApiService.textMsgSend(new TextMsgSendRequest(storeId)); + return true; + } + + public String getStoreId(StoreShopRequest request) { + String storeId = request.getStoreId(); + if (StringUtils.isBlank(storeId) && Objects.nonNull(request.getShopId())) { + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId()); + storeId = Objects.nonNull(shopInfo) ? shopInfo.getStoreId() : null; + } + if (StringUtils.isBlank(storeId)) { + throw new ServiceException(ErrorCodeEnum.SHOP_NOT_EXIST); + } + return storeId; + } + + /** + * 查询并校验门店是否存在以及阶段是否处于平安钱包未开通状态 + */ + private ShopInfoDO getAndVerifyShopAndStage(Long shopId) { + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); + if (Objects.isNull(shopInfo)) { + throw new ServiceException(ErrorCodeEnum.SHOP_NOT_EXIST); + } + ShopStageInfoDO stageInfo = shopStageInfoDAO.getShopSubStageInfo(shopId, ShopSubStageEnum.SHOP_STAGE_6); + if (!ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_60.getShopSubStageStatus().equals(stageInfo.getShopSubStageStatus())) { + throw new ServiceException(ErrorCodeEnum.SHOP_STAGE_NOT_OPERATE); + } + return shopInfo; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wechat/WechatTemplateService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wechat/WechatTemplateService.java new file mode 100644 index 000000000..eb40fbde8 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wechat/WechatTemplateService.java @@ -0,0 +1,149 @@ +package com.cool.store.service.wechat; + +import com.cool.store.builder.TemplateMessageBuilder; +import com.cool.store.config.weixin.WechatMpProperties; +import com.cool.store.dto.wechat.AccessTokenDTO; +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; + +/** + * @Author suzhuhong + * @Date 2025/10/10 14:15 + * @Version 1.0 + */ +@Slf4j +@Service +public class WechatTemplateService { + + + private static final String ACCESS_TOKEN_KEY = "wechat_service_account_access_token"; + + @Autowired + private WechatMpProperties wechatMpProperties; + + @Autowired + private TemplateMessageBuilder templateMessageBuilder; + + @Autowired + 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(), + wechatMpProperties.getAppSecret()); + try { + String result = okHttpUtil.doGet(url); + log.info("获取access_token响应: {}", result); + + if (StringUtils.isNotEmpty( result)){ + AccessTokenDTO responseDTO = objectMapper.readValue(result, AccessTokenDTO.class); + 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) { + log.error("获取access_token失败", e); + } catch (Exception e) { + log.error("解析access_token响应失败", e); + } + return null; + } + + public WechatUserInfoDTO getUserInfo(String openId, String lang) { + String accessToken = getAccessToken(); + //默认中国 + lang = StringUtils.isEmpty(lang)?"zh_CN":lang; + if (accessToken == null) { + log.error("获取access_token失败"); + return null; + } + String url = String.format("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s", + accessToken, openId); + + if (lang != null && !lang.trim().isEmpty()) { + url += "&lang=" + lang; + } + try { + String result = okHttpUtil.doGet(url); + log.debug("获取用户信息响应: {}", result); + WechatUserInfoDTO userInfo = objectMapper.readValue(result, WechatUserInfoDTO.class); + return userInfo; + } catch (IOException e) { + log.error("获取用户信息失败", e); + return null; + } catch (Exception e) { + log.error("解析用户信息响应失败", e); + return null; + } + } + + public boolean sendNormalTemplate(String openId, WechatTemplateEnum template, Map data) { + WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildNormalTemplate(openId, template, data); + return sendTemplateMessage(messageDTO); + } + + public boolean sendMiniAppTemplate(String openId, WechatTemplateEnum template, + Map data, String miniAppPagePath) { + WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildMiniappTemplate( + openId, template, data, miniAppPagePath); + return sendTemplateMessage(messageDTO); + } + + public boolean sendMiniAppTemplateWithUrl(String openId, WechatTemplateEnum template, + Map data, String miniAppPagePath, String backupUrl) { + WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildMiniAppTemplateWithUrl( + openId, template, data, miniAppPagePath, backupUrl); + return sendTemplateMessage(messageDTO); + } + + private boolean sendTemplateMessage(WechatTemplateMessageDTO messageDTO) { + String accessToken = getAccessToken(); + if (accessToken == null) { + log.error("获取access_token失败,无法发送模板消息"); + return false; + } + + String url = String.format("%s?access_token=%s", + wechatMpProperties.getSendTemplateMessageUrl(), accessToken); + + log.info("发送模板消息: {}", messageDTO); + try { + String result = okHttpUtil.doPostJson(url, messageDTO); + log.info("发送模板消息响应: {}", result); + + return Boolean.TRUE; + } catch (Exception e) { + log.error("解析模板消息响应失败", e); + return false; + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/xinfa/XinFaBusinessService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/xinfa/XinFaBusinessService.java new file mode 100644 index 000000000..8ff1c2fd6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/xinfa/XinFaBusinessService.java @@ -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 getStoreXinFaDeviceDetail(String storeNum); + + /** + * 获取账号下有哪些标签 + * @param storeNum + * @return + */ + List getAccountAllTags(String storeNum,String deviceName); + + /** + * 获取账号下有哪些节目、 + * 通过门店在哪个账号下 确定账号 + * @param programReqDTO + * @return + */ + List getProgramList(ProgramReqDTO programReqDTO); + + /** + * 发布信发设备 + * @param publishDTO + * @return + */ + Boolean publishProgram(PublishDTO publishDTO); + + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/xinfa/XinFaDeviceService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/xinfa/XinFaDeviceService.java new file mode 100644 index 000000000..0c3d4667b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/xinfa/XinFaDeviceService.java @@ -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 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 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 getStoreEquipmentDataByStoreNumList(List storeNumList, String token) { + Map> 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 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 deviceDetailDetail = getStoreXinFaDeviceDetailDetail(storeNum, token); + if (CollectionUtils.isNotEmpty(deviceDetailDetail)) { + return deviceDetailDetail; + } + } + } + for (Map.Entry entry : accountMap.entrySet()) { + HuoMaAccountDTO huoMaAccountDTO = entry.getValue(); + if (!huoMaAccountDTO.getIsQuery()) { + String token = getStoreToken(huoMaAccountDTO.getAccount(), huoMaAccountDTO.getPassword()); + List 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 getStoreXinFaDeviceDetailDetail(String storeNum, String token) { + Integer storeIdByStoreNum = getStoreIdByStoreNum(storeNum, token); + return getStoreXinFaDeviceDetailByPointId(storeIdByStoreNum, token); + } + + + public List 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 getAccountSpecialTagIds( String storeNum,List tagList) { + List 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 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 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()); + } + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java index f4262d9e7..7c5cdc771 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java @@ -220,6 +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; } diff --git a/coolstore-partner-web/pom.xml b/coolstore-partner-web/pom.xml index 22e75fcb9..fe6d27e01 100644 --- a/coolstore-partner-web/pom.xml +++ b/coolstore-partner-web/pom.xml @@ -35,6 +35,65 @@
+ + + dev + + dev + + + + dev2 + + dev2 + + + + local + + true + + + local + + + + test + + test + + + + test3 + + test3 + + + + ab + + ab + + + + online + + online + + + + hd + + hd + + + + zcb + + zcb + + + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java b/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java index 9f1f66664..05d745b0d 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java @@ -40,4 +40,16 @@ public class PartnerWebApplication { return defaultDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); } + @Bean + @ConfigurationProperties("platform.datasource") + public DataSourceProperties platformDataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean + @ConfigurationProperties("spring.datasource.hikari") + public DataSource platformDataSource() { + return platformDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); + } + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/aspect/DataSourceAspect.java b/coolstore-partner-web/src/main/java/com/cool/store/aspect/DataSourceAspect.java new file mode 100644 index 000000000..87e0f0a85 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/aspect/DataSourceAspect.java @@ -0,0 +1,37 @@ +package com.cool.store.aspect; + +import com.cool.store.annotation.PlatformDB; +import com.cool.store.datasource.DataSourceContextHolder; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +/** + *

+ * 数据源切换 切面 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Aspect +@Component +public class DataSourceAspect { + + @Before("@annotation(platformDB)") + public void before(PlatformDB platformDB) { + DataSourceContextHolder.setDataSourceType("platform"); + } + + @After("@annotation(platformDB)") + public void after(PlatformDB platformDB) { + DataSourceContextHolder.clearDataSourceType(); + } + + @AfterThrowing("@annotation(platformDB)") + public void afterThrowing(PlatformDB platformDB) { + DataSourceContextHolder.clearDataSourceType(); + } +} 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 1eb0558b3..116654044 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 @@ -5,7 +5,9 @@ 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.response.bigdata.ApiResponse; import com.cool.store.utils.OpenSignatureUtil; +import com.cool.store.utils.RsaSignUtil; import com.cool.store.utils.UUIDUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -42,11 +44,22 @@ public class OpenApiValidateFilter implements Filter { private String coolAppKey; @Value("${cool.api.secret}") private String coolAppSecret; + @Value("${cool.api.rsa.private.key}") + private String coolPrivateKey; + @Value("${wallet.api.rsa.public.key}") + private String walletPublicKey; + private static final Set WHITELIST_URIS = new HashSet<>(Arrays.asList( + "/zxjp/open/v1/statusRefresh", + "/zxjp/open/v1/getStoreUser", + "/zxjp/open/v1/callback" + )); private static final List oldUrlMapping = new ArrayList<>(Arrays.asList( "/zxjp/open/v1/statusRefresh","/zxjp/open/v1/changePaymentStatus", "/zxjp/open/v1/getYlsToken", "/zxjp/open/v1/getStoreList", "/zxjp/open/v1/changeReceiptStatus", "/zxjp/open/v1/getStoreUser")); + // 添加钱包接口路径前缀常量 + private static final String WALLET_API_PATTERN = "^/zxjp/open/v\\d+/wallet/.*$"; @Override public void init(FilterConfig filterConfig) throws ServletException { } @@ -61,10 +74,16 @@ public class OpenApiValidateFilter implements Filter { } MDC.put(CommonConstants.REQUEST_ID, UUIDUtils.get32UUID()); //statusRefresh 放开不需要验签 - if (uri.startsWith("/zxjp/open/v1/statusRefresh") || uri.startsWith("/zxjp/open/v1/getStoreUser")) { + if (isWhitelistUri(uri)) { filterChain.doFilter(servletRequest, response); return; } + // 针对钱包接口的专用验签处理 所有符合 /zxjp/open/v{版本号}/wallet/ 格式的接口都会走钱包专用的验签流程。 + if (uri.matches(WALLET_API_PATTERN)) { + handleWalletApiValidation(request, response, filterChain); + return; + } + HttpServletResponse res = (HttpServletResponse) response; // 1. 验证时间戳 try { @@ -174,7 +193,96 @@ public class OpenApiValidateFilter implements Filter { return OpenSignatureUtil.generateOldSign(params, coolAppSecret); } + private boolean isWhitelistUri(String uri) { + return WHITELIST_URIS.stream().anyMatch(uri::startsWith); + } @Override public void destroy() { } + + + private void handleWalletApiValidation(HttpServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + + try { + // 读取请求体 + StringBuilder requestBody = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + String line; + while ((line = reader.readLine()) != null) { + requestBody.append(line); + } + } + + String jsonBody = requestBody.toString(); + + // 1. 验证时间戳 + String timestampStr = extractTimestampFromJson(jsonBody); + if (timestampStr == null) { + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "缺少timestamp参数"); + return; + } + + long timestamp = Long.parseLong(timestampStr); + long currentTime = System.currentTimeMillis() / 1000; + long timeDiff = Math.abs(currentTime - timestamp); + + if (timeDiff > 600) { + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "请求已过期,请保证timestamp时间在10分钟之内"); + return; + } + + // 2. 钱包接口专用验签逻辑 + if (!verifyWalletSignatureFromBody(jsonBody)) { + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "签名校验失败"); + return; + } + + filterChain.doFilter(request, response); + } catch (Exception e) { + log.error("钱包接口验签异常: ", e); + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "验签异常"); + } + } + + /** + * 从JSON中提取timestamp字段 + */ + private String extractTimestampFromJson(String jsonBody) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + Map params = objectMapper.readValue(jsonBody, new TypeReference>() {}); + Object timestamp = params.get("timestamp"); + return timestamp != null ? timestamp.toString() : null; + } catch (Exception e) { + log.error("提取timestamp失败: ", e); + return null; + } + } + + /** + * 钱包接口签名验证方法 - 签名在请求体中 + */ + private boolean verifyWalletSignatureFromBody(String jsonBody) { + try { + // 解析请求参数 + ObjectMapper objectMapper = new ObjectMapper(); + Map params = objectMapper.readValue(jsonBody, new TypeReference>() {}); + + // 使用RsaSignUtil.verifyWalletSign进行验签 + return RsaSignUtil.verifySign(params, walletPublicKey); + } catch (Exception e) { + log.error("钱包接口签名验证失败: ", e); + return false; + } + } + + /** + * 写入错误响应 + */ + private void writeErrorResponse(HttpServletResponse response, ErrorCodeEnum errorCode, String message) throws IOException { + response.setStatus(HttpStatus.OK.value()); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(JSON.toJSONString(ApiResponse.fail(errorCode, message))); + } } \ No newline at end of file diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index d96af4e4a..7f0e14992 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -59,7 +59,9 @@ public class SignValidateFilter implements Filter { "/zxjp/mini/program/v1/partnerManage/openArea/areaApplyQuery", "/zxjp/**/api/audit/result", "/zxjp/**/api/license", - "/zxjp/mini/line/getRegionPayPic" + "/zxjp/mini/line/getRegionPayPic", + "/zxjp/mini/miniProgram/getUserInfoByToken", + "/zxjp/ws/**" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java index 2115f4f26..93d16ade2 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -52,7 +52,10 @@ public class TokenValidateFilter implements Filter { "/zxjp/pc/sysRole/**", "/zxjp/**/api/audit/result", "/zxjp/pc/video/**", - "/zxjp/**/api/license" + "/zxjp/**/api/license", + "/zxjp/pc/v3/login/accountLogin", + "/zxjp/pc/v3/login/refreshLogin", + "/zxjp/ws/**" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java new file mode 100644 index 000000000..79118b4b2 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java @@ -0,0 +1,72 @@ +package com.cool.store.config.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +/** + *

+ * WebSocket配置类 + *

+ * + * @author wangff + * @since 2025/9/2 + */ +@Configuration +@EnableWebSocketMessageBroker +@Slf4j +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws/zxzs") + .setAllowedOrigins("*") + .withSockJS(); // 启用SockJS支持 + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 配置消息代理 + registry.enableSimpleBroker("/topic", "/queue") // 启用简单代理,用于广播和点对点消息 + .setHeartbeatValue(new long[]{0, 10000}) + .setTaskScheduler(webSocketTaskScheduler()); + registry.setApplicationDestinationPrefixes("/app"); // 设置应用程序端点前缀 +// registry.setUserDestinationPrefix("/user"); + } + + @Bean + public TaskScheduler webSocketTaskScheduler() { + ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); + taskScheduler.setPoolSize(1); + taskScheduler.setThreadNamePrefix("websocket-heartbeat-"); + taskScheduler.initialize(); + return taskScheduler; + } + +// @Override +// public void configureClientInboundChannel(ChannelRegistration registration) { +// registration.interceptors(new ChannelInterceptor() { +// @Override +// public Message preSend(Message message, MessageChannel channel) { +// StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); +// +// if (StompCommand.CONNECT.equals(accessor.getCommand())) { +// // 从STOMP头部获取login字段作为用户标识 +// String login = accessor.getLogin(); +// log.info("用户login:{}", login); +// if (login != null && !login.isEmpty()) { +// // 设置用户身份 +// accessor.setUser(() -> login); +// } +// } +// return message; +// } +// }); +// } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AccountTokenController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AccountTokenController.java new file mode 100644 index 000000000..17a557d78 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AccountTokenController.java @@ -0,0 +1,61 @@ +package com.cool.store.controller.webb; + +import com.cool.store.dto.FoodTokenDTO; +import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.PushService; +import com.cool.store.service.ThirdFoodService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @Author suzhuhong + * @Date 2025/11/24 16:50 + * @Version 1.0 + */ +@RestController +@RequestMapping("/pc/token") +@Api(tags = "第三方平台token") +@Slf4j +public class AccountTokenController { + + + @Resource + PushService pushService; + + @Resource + ThirdFoodService thirdFoodService; + + @ApiOperation("获取云流水免登token") + @PostMapping("/getYlsToken") + public ResponseResult getYlsToken(@RequestBody @Validated GetAccessTokenDTO dto) { + return ResponseResult.success(pushService.getYlsToken(dto)); + } + + @ApiOperation("获取POS免登token") + @PostMapping("/getPosToken") + public ResponseResult getPosToken(@RequestBody @Validated GetAccessTokenDTO dto) { + return ResponseResult.success(pushService.getPosToken(dto)); + } + + @ApiOperation("获取新掌柜免登token") + @PostMapping("/getXzgToken") + public ResponseResult getXzgToken(@RequestBody @Validated GetAccessTokenDTO dto) { + return ResponseResult.success(pushService.getXzgToken(dto)); + } + + @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/webb/BigRegionController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/BigRegionController.java index c16945bf8..0b1a4e1e1 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/BigRegionController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/BigRegionController.java @@ -28,8 +28,9 @@ public class BigRegionController { @PostMapping("/queryAllBigRegion") @ApiOperation("获取所有可选择的大区") - public ResponseResult> queryContentInfo(@RequestParam(required = false) String keyword) { - return ResponseResult.success(bigRegionService.queryAllBigRegion(keyword)); + public ResponseResult> queryContentInfo(@RequestParam(required = false) String keyword, + @RequestParam(required = false) Integer joinBrand) { + return ResponseResult.success(bigRegionService.queryAllBigRegion(keyword, joinBrand)); } @PostMapping("/queryBigRegion") diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DataBoardController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DataBoardController.java new file mode 100644 index 000000000..4e69892b7 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DataBoardController.java @@ -0,0 +1,37 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.recipe.RevenueDataRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ThirdFoodService; +import com.cool.store.vo.recipe.RevenueDataVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 数据看板 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@RestController +@RequestMapping("/pc/databoard") +@Api(tags = "数据看板") +@Slf4j +@RequiredArgsConstructor +public class DataBoardController { + private final ThirdFoodService thirdFoodService; + + @ApiOperation("门店营收") + @PostMapping("/revenueData") + public ResponseResult> getStoreRevenueData(@RequestBody @Valid RevenueDataRequest request) { + return ResponseResult.success(thirdFoodService.getRevenueData(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DecorationAllocationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DecorationAllocationController.java new file mode 100644 index 000000000..5b50c98cb --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DecorationAllocationController.java @@ -0,0 +1,76 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.PageBasicInfo; +import com.cool.store.dto.ShopSignerInfoDTO; +import com.cool.store.dto.decoration.DecorationListDTO; +import com.cool.store.dto.decoration.DecorationTeamDTO; +import com.cool.store.request.decoration.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.DecorationHandleService; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @Author suzhuhong + * @Date 2025/10/30 18:00 + * @Version 1.0 + */ +@RequestMapping("/pc/decoration") +@RestController +@Api(tags = "装修分配团队") +@Slf4j +public class DecorationAllocationController { + + @Resource + private DecorationHandleService decorationHandleService; + + + @PostMapping("/addTeam") + @ApiOperation("添加团队") + public ResponseResult addTeam(@RequestBody AddTeamRequest request){ + return ResponseResult.success(decorationHandleService.addTeam(request)); + } + + @PostMapping("/update") + @ApiOperation("修改团队") + public ResponseResult update(@RequestBody UpdateTeamRequest request){ + return ResponseResult.success(decorationHandleService.update(request)); + } + + @PostMapping("/deleteByTeamId") + @ApiOperation("删除团队") + public ResponseResult deleteByTeamId(@RequestBody DeletedRequest request){ + return ResponseResult.success(decorationHandleService.deleteByTeamId(request.getTeamId())); + } + + @PostMapping("/listByCondition") + @ApiOperation("查询团队") + public ResponseResult> listByCondition(@RequestBody PageBasicInfo pageBasicInfo){ + return ResponseResult.success(decorationHandleService.listByCondition(pageBasicInfo)); + } + + @PostMapping("/getDecorationAssignList") + @ApiOperation("装修分配列表/待办列表 查询待办时 分配状态传-0") + public ResponseResult> getDecorationAssignList(@RequestBody DecorationListRequest pageBasicInfo){ + return ResponseResult.success(decorationHandleService.getDecorationAssignList(pageBasicInfo)); + } + + @GetMapping("/getShopSignerInfo") + @ApiOperation("详情中获取签约人信息") + public ResponseResult getShopSignerInfo(@RequestParam("shopId") Long shopId){ + return ResponseResult.success(decorationHandleService.getShopSignerInfo(shopId)); + } + + @PostMapping("/confirm") + @ApiOperation("确认") + public ResponseResult updateConstructionTeam(@RequestBody UpdateConstructionTeamRequest request){ + return ResponseResult.success(decorationHandleService.updateConstructionTeam(request)); + } + + +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java new file mode 100644 index 000000000..9eb1b27c7 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java @@ -0,0 +1,47 @@ +package com.cool.store.controller.webb; + +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.dto.login.UserRefreshLoginDTO; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.login.LoginBaseService; +import com.cool.store.service.login.LoginStrategy; +import com.cool.store.utils.SpringContextUtil; +import com.cool.store.vo.login.UserLoginVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 登录 前端控制器 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Api(tags = "登录") +@RestController +@RequestMapping("/pc/v3/login") +@RequiredArgsConstructor +public class LoginController { + private final LoginBaseService loginBaseService; + + @ApiOperation("账号密码登录") + @PostMapping("/accountLogin") + public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { + return SpringContextUtil.getBean(param.getLoginType().getClazzName(), LoginStrategy.class).login(param); + } + + @ApiOperation("refresh登录") + @PostMapping("/refreshLogin") + public ResponseResult refreshLogin(@RequestBody UserRefreshLoginDTO param) { + return loginBaseService.refreshLogin(param); + } + + @ApiOperation("登出") + @PostMapping("/logout") + public ResponseResult logout() { + return loginBaseService.logout(); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java index a431ab605..5b51d7a44 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java @@ -1,12 +1,12 @@ package com.cool.store.controller.webb; import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.request.notice.*; import com.cool.store.response.ResponseResult; import com.cool.store.service.MessageTemplateService; -import com.cool.store.vo.notice.MessageTemplateDetailVO; -import com.cool.store.vo.notice.StoreMessageDetailVO; +import com.cool.store.vo.notice.*; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -59,7 +59,8 @@ public class MessageTemplateController { @PostMapping("/batchPublish") @ApiOperation("批量发布") public ResponseResult batchPublishMessageTemplate(@RequestBody BatchPublishRequest request) { - return ResponseResult.success(messageTemplateService.batchPublishMessageTemplate(request, CurrentUserHolder.getUser())); + messageTemplateService.batchPublishMessageTemplate(request, CurrentUserHolder.getUser().getUserId()); + return ResponseResult.success(Boolean.TRUE); } @PostMapping("/getMessageTemplateList") @@ -86,5 +87,34 @@ public class MessageTemplateController { return ResponseResult.success(messageTemplateService.revokeById(id,CurrentUserHolder.getUser())); } + @ApiOperation("获取每个门店需要展示的模块") + @GetMapping("/getModuleListByStoreId") + public ResponseResult> getModuleListByStoreId(@RequestParam("id")String storeId) { + return ResponseResult.success(messageTemplateService.getModuleList(storeId, CurrentUserHolder.getUser().getMobile())); + } + @ApiOperation("获取消息详情") + @GetMapping("/getMessageDetail") + public ResponseResult getMessageDetail(@RequestParam("id")Long id) { + return ResponseResult.success(messageTemplateService.getMessageDetail(id)); + } + + @ApiOperation("待办列表/模块列表") + @PostMapping("/getStorePendingList") + public ResponseResult> getStorePendingList(@RequestBody StoreMessagePendingRequest request) { + return ResponseResult.success(messageTemplateService.getStorePendingList(request)); + } + + @ApiOperation("确认已读") + @GetMapping("/readMessage") + public ResponseResult readMessage(@RequestParam("id")Long id) { + return ResponseResult.success(messageTemplateService.readMessage(id, CurrentUserHolder.getUser().getMobile())); + } + + @ApiOperation("确认已处理") + @GetMapping("/handleMessage") + public ResponseResult handleMessage(@RequestParam("id")Long id) { + LoginUserInfo user = CurrentUserHolder.getUser(); + return ResponseResult.success(messageTemplateService.handleMessage(id, user.getName(), user.getMobile())); + } } 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 3156a3ce7..d062235ff 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 @@ -1,20 +1,32 @@ package com.cool.store.controller.webb; import com.alibaba.fastjson.JSONObject; +import com.cool.store.context.PartnerUserHolder; import com.cool.store.dto.*; import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.wallet.PaymentDTO; +import com.cool.store.dto.wx.MiniProgramFreeLoginDTO; +import com.cool.store.handler.WeChatHandler; import com.cool.store.request.OpenApiStoreRequest; import com.cool.store.request.StoreCodeDTO; import com.cool.store.request.*; +import com.cool.store.request.notice.ThirdHandleMessageRequest; +import com.cool.store.request.notice.ThirdMatterRequest; +import com.cool.store.request.wallet.AccountTradeCallbackRequest; +import com.cool.store.request.wallet.AddTagCallbackNoticeRequest; +import com.cool.store.request.wallet.OnlineCommercialBankCallbackRequest; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.*; +import com.cool.store.service.wallet.WalletService; +import com.cool.store.utils.poi.StringUtils; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -44,6 +56,14 @@ public class OpenApiController { ShopAccountService shopAccountService; @Resource StoreService storeService; + @Resource + MessageTemplateService messageTemplateService; + @Resource + WechatMiniAppService wechatMiniAppService; + @Autowired + WeChatHandler weChatHandler; + @Resource + WalletService walletService; @PostMapping("/statusRefresh") public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ @@ -63,6 +83,13 @@ public class OpenApiController { public ApiResponse> getStoreList(@RequestBody @Validated OpenApiStoreRequest dto) { return ApiResponse.success(storeService.getStoreExtendFieldInfo(dto.getPageSize(),dto.getPageNum())); } + + @ApiOperation("获取接入物联网门店信息") + @PostMapping("/getIoTStoreList") + public ApiResponse> getIotStoreList(@RequestBody @Validated OpenApiStoreRequest dto) { + return ApiResponse.success(storeService.getIotStoreList(dto.getPageNum(), dto.getPageSize())); + } + @ApiOperation("新管家回调 刷新收款单状态") @PostMapping("/changeReceiptStatus") public ApiResponse changeReceiptStatus(@RequestBody @Validated ReceiptCallBackRequest request){ @@ -151,4 +178,72 @@ public class OpenApiController { return ApiResponse.success(decorationDesignInfoService.decorationAcceptance(request)); } + @ApiOperation("事项处理") + @PostMapping("/matterHandle") + public ApiResponse thirdMatterHandle(@RequestBody @Validated ThirdMatterRequest request) { + log.info("thirdMatterHandle request:{}", JSONObject.toJSONString(request)); + return messageTemplateService.thirdMatterHandle(request); + } + + + @ApiOperation("确认已处理") + @PostMapping("/handleMessage") + public ApiResponse handleMessage(@RequestBody @Validated ThirdHandleMessageRequest request) { + return messageTemplateService.thirdHandleMessage(request); + } + + @ApiOperation("根据手机号获取短期token") + @PostMapping("/getShortTermToken") + public ApiResponse getTokenByMobile(@RequestBody @Validated MiniProgramFreeLoginDTO param) { + return ApiResponse.success(wechatMiniAppService.getShortTermTokenByMobile(param)); + } + + @RequestMapping(value = "/callback", produces = "application/xml;charset=UTF-8") + @ApiOperation("callback") + public String handleWechatMessage( + @RequestParam("signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam(value = "echostr", required = false) String echostr, + @RequestBody(required = false) String requestBody) { + + log.info("url:{}","/open/v1/"); + log.info("callback_signature:{},timestamp:{},nonce:{}",signature,timestamp,nonce); + log.info("requestBody:{}",requestBody); + + if (StringUtils.isNotEmpty(requestBody)) { + try { + return weChatHandler.processMessage(weChatHandler.parseXmlToMap(requestBody)); + } catch (Exception e) { + log.info("回调处理失败 e:{}",e); + return "success"; + } + } + return echostr; + } + + @ApiOperation("打标回调通知接口") + @PostMapping("/wallet/addTagCallback") + public ApiResponse addTagCallback(@RequestBody @Validated AddTagCallbackNoticeRequest request) { + return ApiResponse.successByWallet(walletService.addTagCallback(request)); + } + + @ApiOperation("大额充值通知接口") + @PostMapping("/wallet/largePaymentCallback") + public ApiResponse largePaymentCallback(@RequestBody @Validated PaymentDTO request) { + return ApiResponse.successByWallet(walletService.largePaymentCallback(request)); + } + + @ApiOperation("账户交易回调") + @PostMapping("/wallet/accountTradeCallback") + public ApiResponse accountTradeCallback(@RequestBody @Validated AccountTradeCallbackRequest request) { + return ApiResponse.successByWallet(walletService.accountTradeCallback(request)); + } + + @ApiOperation("网商银行通知接口") + @PostMapping("/wallet/onlineCommercialBankCallback") + public ApiResponse accountTradeCallback(@RequestBody @Validated OnlineCommercialBankCallbackRequest request) { + return ApiResponse.successByWallet(walletService.onlineCommercialBankCallback(request)); + } + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java new file mode 100644 index 000000000..c821855df --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java @@ -0,0 +1,34 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.PageBasicInfo; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.response.MiniShopsResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.StoreService; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * PC门店 前端控制器 + *

+ * + * @author wangff + * @since 2025/9/9 + */ +@Api(tags = "PC门店") +@RestController +@RequestMapping("/pc/stores") +@RequiredArgsConstructor +public class PCStoreController { + private final StoreService storeService; + + @ApiOperation("当前用户门店列表") + @PostMapping("/userStoreList") + public ResponseResult> getCurrentUserStoreList(@RequestBody PageBasicInfo request) { + return ResponseResult.success(storeService.getStoreListByMobile(CurrentUserHolder.getUser().getMobile(), request.getPageNum(), request.getPageSize(), null, null)); + } +} 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 c80580481..3ddcb6d12 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 @@ -2,19 +2,22 @@ package com.cool.store.controller.webb; import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; -import com.cool.store.constants.RedisConstant; import com.cool.store.dao.*; import com.cool.store.dto.*; import com.cool.store.dto.contract.ContractCallbackDTO; +import com.cool.store.dto.*; +import com.cool.store.dto.huoma.*; +import com.cool.store.dto.wallet.*; import com.cool.store.entity.*; import com.cool.store.enums.DownSystemTypeEnum; import com.cool.store.enums.FranchiseBrandEnum; import com.cool.store.enums.MessageEnum; import com.cool.store.enums.SMSMsgEnum; import com.cool.store.enums.point.ShopSubStageStatusEnum; +import com.cool.store.enums.wechat.WechatTemplateEnum; +import com.cool.store.handler.WeChatHandler; import com.cool.store.job.XxlJobHandler; import com.cool.store.mapper.FranchiseFeeMapper; -import com.cool.store.mapper.LineInfoMapper; import com.cool.store.mapper.ShopInfoMapper; import com.cool.store.mapper.SignFranchiseMapper; import com.cool.store.mq.util.HttpRestTemplateService; @@ -22,6 +25,7 @@ import com.cool.store.request.*; import com.cool.store.request.bigdata.ProfitDataRequest; import com.cool.store.request.huoma.ShopBasicInfoRequest; import com.cool.store.request.oppty.*; +import com.cool.store.request.wallet.*; import com.cool.store.request.xgj.PushFranchiseFeeRequest; import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ActDataResponse; @@ -34,22 +38,25 @@ import com.cool.store.response.oppty.OpportunityDetailResponse; import com.cool.store.response.oppty.OpportunityInfoPageResponse; import com.cool.store.service.*; import com.cool.store.service.impl.CommonService; -import com.cool.store.service.impl.OrderSysInfoServiceImpl; import com.cool.store.service.impl.UserAuthMappingServiceImpl; -import com.cool.store.utils.CoolDateUtils; -import com.cool.store.utils.RedisConstantUtil; -import com.cool.store.utils.RedisUtilPool; +import com.cool.store.service.wallet.WalletApiService; +import com.cool.store.service.wechat.WechatTemplateService; +import com.cool.store.service.xinfa.XinFaBusinessService; +import com.cool.store.utils.RsaSignUtil; import com.cool.store.utils.poi.StringUtils; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; -import java.util.stream.Collectors; @Slf4j @RestController @@ -92,7 +99,8 @@ public class PCTestController { private HttpRestTemplateService httpRestTemplateService; @Resource FranchiseFeeMapper franchiseFeeMapper; - + @Resource + WechatTemplateService wechatTemplateService; @Resource ShopInfoMapper shopInfoMapper; @Resource @@ -102,6 +110,8 @@ public class PCTestController { @Resource SignFranchiseMapper signFranchiseMapper; + @Autowired + WeChatHandler weChatHandler; @GetMapping("/syncStore") public ResponseResult syncStore(@RequestParam("shopId")Long shopId){ syncMainSysServer.syncStore(shopId); @@ -596,4 +606,246 @@ public class PCTestController { return request; } + + @RequestMapping(value = "/testWxNotice", produces = "application/xml;charset=UTF-8") + @ApiOperation("testWxNotice") + public String handleWechatMessage( + @RequestParam("signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam(value = "echostr", required = false) String echostr, + @RequestBody(required = false) String requestBody) { + + System.out.println("收到微信消息:"); + System.out.println("signature: " + signature); + System.out.println("timestamp: " + timestamp); + System.out.println("nonce: " + nonce); + System.out.println("echostr: " + echostr); + System.out.println("requestBody: " + requestBody); + + if (StringUtils.isNotEmpty(requestBody)) { + try { + return weChatHandler.processMessage(weChatHandler.parseXmlToMap(requestBody)); + } catch (Exception e) { + log.info("回调处理失败 e:{}",e.getMessage()); + return "success"; + } + } + return nonce; + } + + @ApiOperation("测试小程序模板消息") + @PostMapping("/testMiniAppTemplate") + public ApiResponse testMiniAppTemplate() { + Map data = new HashMap<>(); + data.put("character_string2", "ceshi002"); + data.put("thing10", "测试通知功能"); + data.put("time14", "2025-10-01 12:00:00"); + data.put("thing25", "正新管理有限公司"); + data.put("thing60", "上海市-松江区"); + wechatTemplateService.sendNormalTemplate("o9_unvpJy1SGdnkeun7igRBSLuB0", WechatTemplateEnum.QUESTION_NOTICE, data); + return ApiResponse.success(true); + } + + @Resource + XinFaBusinessService xinFaBusinessService; + @ApiOperation("测试门店设备信息") + @GetMapping("/getStoreXinFaDeviceDetail") + public ResponseResult> getStoreXinFaDeviceDetail(@RequestParam("storeNum")String storeNum) { + return ResponseResult.success(xinFaBusinessService.getStoreXinFaDeviceDetail(storeNum)); + } + + @ApiOperation("测试标签信息") + @GetMapping("/getAccountAllTags") + public ResponseResult> getAccountAllTags(@RequestParam("storeNum")String storeNum, + @RequestParam("deviceName")String deviceName) { + List accountAllTags = xinFaBusinessService.getAccountAllTags(storeNum,deviceName); + return ResponseResult.success(accountAllTags); + } + + @ApiOperation("获取节目列表") + @PostMapping("/getProgramList") + public ResponseResult> getProgramList(@RequestBody ProgramReqDTO programReqDTO) { + List accountAllTags = xinFaBusinessService.getProgramList(programReqDTO); + return ResponseResult.success(accountAllTags); + } + + @ApiOperation("发布/上架") + @PostMapping("/publishProgram") + public ResponseResult publishProgram(@RequestBody PublishDTO publishDTO) { + Boolean publishStatus = xinFaBusinessService.publishProgram(publishDTO); + return ResponseResult.success(publishStatus); + } + + + public static void main(String[] args) { + // 测试数据 + Map params = new HashMap<>(); + params.put("key", "370728957227141"); + params.put("status", 1); + params.put("addTagType", 1); + params.put("timestamp", "1763694267"); + params.put("outStoreId", "359c107b31c148b59fbe1c2562fdd096"); + + + String privateKey = "MIIEpQIBAAKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQABAoIBACbBGi8I+CE77M+13wAu4RkD8xL7CQc3ic2ojGqIRPi7r5CuphD6mpzvXqtyfhd7DKr9h8bAxwBlnQ28ObjVgsI96/aM7dxvMs/uVPpqwIJyWuTDG5A05EPVC9REQnC6Mp09mnPL7rZz3Mfy6dIGY2YQWfwmWiPl1B45k+wZ+WPZPI0JVnvRzM881kf4aAhEAt08i9VoihylwVAjWIPmLuhf6ZcqI5q8iUsjfO22wZJsudVTCA/dsJdNxv+1RDKeYnSLJL79cZQcodqEhFqTy6vnn2dMsaHH7dpphU27barxUjeL482SR7kFfMqEXn5sltRn/3ep+3sf4Ph2vMtoZeECgYEA6gXzEtT9ZOeAMp4BRGmfNZ0TQLprPPVSwudz/uUBE4j/vyhfXkh9p7hqwyoxN+Z8b65yINvx8yP6hge6ek/MyAwBCZyfIRxZAPZu1eEGoYKl391ubFt2EIVqrN2DtAvzHMr5B/E2VHBq6AJm/rERFX5oKsg6zHS9tPLhgGnWVd0CgYEA5aFWOrtiqZJlp1MHQ4OeWBJatBSynkORdxCW7ic0CKbkYus0NSz1SsvskpbnfEXNB53x98qJxRhSopg/DC4m7XqxjSf9lY3HH4Y/9907olj33yGAnLWC88GivVndt577u/XhYRCk33vOQ3GoibEdjnpMOkWmOfwYG/FsRWWQvaECgYEA1N2siEisZIgel+wZAv2AD+hchtgKi1wqd5bIb+Yl4HsRBfPXK4+MnG6mzfcm5c4FCiEHNtRZc+waCKgm+vJzNtOUbgXEyP1cCAAgOPOCcI7CCqsDshRPhB+XNL4Y+kCUVnBZrNu/q3bGB1uIC8tL2t0sKx4OPcNCe8EhVQjwKRECgYEA4uothdhKRPtwDIsVsHfN74Yjr7SMVay7gIcaPrjqyGnzYnS+oJWOx50AaFNK6Rko5JAF3jF9NxE0B4yfMPAic6Y88hpEkpcJ4HMPn2Y1WdbFCu/WYgVUJICCys6VNLCcXj85umtyIY38Y9VbEMW/SV49GZBeFQqy4FoP/fvBrkECgYEAnfjTDYwgdmJdsUqyNzAocwcJXG2rVtYc7Txrl0TltcwuJmgoSywdzyOP2R9+NZsfoxWDzG0/yr15ApMvUcnnTwHN/8bGQ9SLatFLKqS4EtdwDKKS1JvNbs7V1myQGpt7jbShZOI0e6Fs4xP8ujxsLeGgiq9mZrS9UdRj5XKDoVM="; + + String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQAB"; + + try { + // 1. 加签 + String sign = RsaSignUtil.generateSign(new HashMap<>(params), privateKey); + System.out.println("生成的签名: " + sign); + + // 2. 将签名放入参数中 + params.put("sign", sign); + + // 3. 验签 + boolean isValid = RsaSignUtil.verifySign(new HashMap<>(params), publicKey); + System.out.println("验签结果: " + isValid); + + // 4. 测试排序字符串生成 + String sortedString = RsaSignUtil.objectToSortedString(params); + System.out.println("排序后的字符串: " + sortedString); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + @Resource + WalletApiService walletApiService; + + @ApiOperation("获取银行信息") + @PostMapping("/getBankList") + public ResponseResult getBankList(@RequestBody GetBankRequest request) { + BankListDTO bankList = walletApiService.getBankList(request); + return ResponseResult.success(bankList); + } + + @ApiOperation("签约人开通信息") + @PostMapping("/createStoreAndAccount") + public ResponseResult createStoreAndAccount(@RequestBody CreateStoreAndAccountRequest request) { + StoreAccountDTO dto = walletApiService.createStoreAndAccount(request); + return ResponseResult.success(dto); + } + + @ApiOperation("创建门店接口") + @PostMapping("/createStore") + public ResponseResult createStore(@RequestBody CreateStoreRequest request) { + AccountNoDTO accountNoDTO = walletApiService.createStore(request); + return ResponseResult.success(accountNoDTO); + } + + + @ApiOperation("打标接口") + @PostMapping("/addTag") + public ResponseResult addTag(@RequestBody AccountAddTagRequest request) { + AddTagDTO addTag = walletApiService.addTag(request); + return ResponseResult.success(addTag); + } + + @ApiOperation("门店签约人账户鉴权申请接口") + @PostMapping("/authentication") + public ResponseResult authentication(@RequestBody OutStoreIdRequest request) { + AccountAuthenticationDTO accountAuthenticationDTO = walletApiService.authentication(request); + return ResponseResult.success(accountAuthenticationDTO); + } + + @ApiOperation("门店签约人账户开通接口") + @PostMapping("/openAccount") + public ResponseResult openAccount(@RequestBody AccountVerifyRequest request) { + AccountVerifyDTO accountVerifyDTO = walletApiService.openAccount(request); + return ResponseResult.success(accountVerifyDTO); + } + + @ApiOperation("获取账户信息") + @PostMapping("/getAccountInfo") + public ResponseResult> getAccountInfo(@RequestBody OutStoreIdRequest request) { + List accountInfoList = walletApiService.getAccountInfo(request); + return ResponseResult.success(accountInfoList); + } + + @ApiOperation("大额预支付接口") + @PostMapping("/largePayment") + public ResponseResult largePayment(@RequestBody LargePaymentRequest request) { + LargePaymentDTO largePayment = walletApiService.largePayment(request); + return ResponseResult.success(largePayment); + } + + @ApiOperation("大额预支付查询接口") + @PostMapping("/largePaymentQuery") + public ResponseResult largePaymentQuery(@RequestBody PaymentDetailRequest request) { + PaymentDTO PaymentDTO = walletApiService.largePaymentQuery(request); + return ResponseResult.success(PaymentDTO); + } + + @ApiOperation("门店账户向公司分账转账接口") + @PostMapping("/transfer") + public ResponseResult transfer(@RequestBody TransferRequest request) { + TransferDTO transfer = walletApiService.transfer(request); + return ResponseResult.success(transfer); + } + + @ApiOperation("门店签约账户,退款提现至提现卡") + @PostMapping("/withdraw") + public ResponseResult withdraw(@RequestBody WithDrawerRequest request) { + WithDrawerDTO withdraw = walletApiService.withdraw(request); + return ResponseResult.success(withdraw); + } + + @ApiOperation(" 获取账单详情") + @PostMapping("/getBillDetail") + public ResponseResult getBillDetail(@RequestBody BillDetailRequest request) { + TradeRecordDTO billDetail = walletApiService.getBillDetail(request); + return ResponseResult.success(billDetail); + } + + @ApiOperation("获取账单列表") + @PostMapping("/getBillPage") + public ResponseResult getBillPage(@RequestBody BillPageRequest request) { + BillPageDTO billPage = walletApiService.getBillPage(request); + return ResponseResult.success(billPage); + } + + @ApiOperation("获取银行信息") + @PostMapping("/getCompanyInfo") + public ResponseResult getCompanyInfo(@RequestBody FindPageCompanyRequest request) { + CompanyListDTO companyDTO = walletApiService.getCompanyInfo(request); + return ResponseResult.success(companyDTO); + } + + + @ApiOperation("获取账户列表信息") + @PostMapping("/getAccountList") + public ResponseResult getAccountList(@RequestBody AccountBatchQueryRequest request) { + AccountPageDTO accountList = walletApiService.getAccountList(request); + return ResponseResult.success(accountList); + } + + + + @Value("${cool.api.rsa.private.key}") + private String coolPrivateKey; + @Value("${cool.api.rsa.public.key}") + private String coolPublicKey; + @ApiOperation("验签") + @PostMapping("/verify") + public ResponseResult test(@RequestBody TestVerifyRequest request) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + Map params = objectMapper.readValue(JSONObject.toJSONString(request), new TypeReference>() {}); + String s = RsaSignUtil.generateSign(params, coolPrivateKey); + params.put("sign",s); + boolean b = RsaSignUtil.verifySign(params, coolPublicKey); + log.info("验签结果:{}",b); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return ResponseResult.success(Boolean.TRUE); + } + + + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/WalletController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/WalletController.java new file mode 100644 index 000000000..a489ca900 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/WalletController.java @@ -0,0 +1,71 @@ +package com.cool.store.controller.webb; + +import com.cool.store.dto.wallet.AccountInfoDTO; +import com.cool.store.dto.wallet.BillDetailDTO; +import com.cool.store.dto.wallet.TradeRecordDTO; +import com.cool.store.request.wallet.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.wallet.WalletService; +import com.cool.store.vo.wallet.AccountBillPageVO; +import com.cool.store.vo.wallet.AccountInfoVO; +import com.cool.store.vo.wallet.AccountPageVO; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 钱包 前端控制器 + *

+ * + * @author wangff + * @since 2025/11/18 + */ +@Api(tags = "钱包") +@RestController +@RequestMapping("/pc/wallet") +@RequiredArgsConstructor +public class WalletController { + private final WalletService walletService; + + @ApiOperation("账户列表") + @GetMapping("/accountList") + public ResponseResult> getAccountList(AccountQueryRequest request) { + return ResponseResult.success(walletService.getAccountList(request).getAccountList()); + } + + @ApiOperation("账户详情") + @PostMapping("/accountInfo") + public ResponseResult getAccountInfo(@RequestBody AccountQueryRequest request) { + return ResponseResult.success(walletService.getAccountInfo(request)); + } + + @ApiOperation("分页查询所有门店账户列表 支持条件查询") + @PostMapping("/getAllAccountList") + public ResponseResult> getAllAccountList(@RequestBody CoolAccountBatchQueryRequest request) { + return ResponseResult.success(walletService.getAllAccountList(request)); + } + + @ApiOperation("分页查询所有流水列表 支持条件查询") + @PostMapping("/getTradeRecordList") + public ResponseResult> getTradeRecordList(@RequestBody CoolTradeRecodePageRequest request) { + return ResponseResult.success(walletService.getTradeRecordList(request)); + } + + @ApiOperation("账户流水") + @PostMapping("/billPage") + public ResponseResult> getBillPage(@RequestBody @Validated AccountBillQueryRequest request) { + return ResponseResult.success(walletService.getBillPage(request).getData()); + } + + @ApiOperation("交易流水详情") + @GetMapping("/billDetail") + public ResponseResult getBillDetail(BillDetailRequest request) { + return ResponseResult.success(walletService.getBillDetail(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniDataBoardController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniDataBoardController.java new file mode 100644 index 000000000..e471872c4 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniDataBoardController.java @@ -0,0 +1,47 @@ +package com.cool.store.controller.webc; + +import com.cool.store.dto.recipe.RecipeSpLaunchDTO; +import com.cool.store.request.recipe.RevenueDataRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ThirdFoodService; +import com.cool.store.vo.recipe.RevenueDataVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 数据看板 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/30 + */ +@RestController +@RequestMapping("/mini/databoard") +@Api(tags = "Mini数据看板") +@Slf4j +@RequiredArgsConstructor +public class MiniDataBoardController { + private final ThirdFoodService thirdFoodService; + + @ApiOperation("门店营收") + @PostMapping("/revenueData") + public ResponseResult> getStoreRevenueData(@RequestBody @Valid RevenueDataRequest request) { + return ResponseResult.success(thirdFoodService.getRevenueData(request)); + } + + @ApiOperation("查询菜品服务包上新数据") + @PostMapping("/recipeSpLaunch") + public ResponseResult getRecipeSpLaunchData(@RequestBody @Valid RevenueDataRequest request) { + return ResponseResult.success(thirdFoodService.getRecipeServiceLaunch(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java index 9d46ede11..b21257317 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java @@ -5,6 +5,7 @@ import com.cool.store.context.PartnerUserHolder; import com.cool.store.request.notice.StoreMessagePendingRequest; import com.cool.store.response.ResponseResult; import com.cool.store.service.MessageTemplateService; +import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.notice.MessageDetailVO; import com.cool.store.vo.notice.ModuleAndMatterVO; import com.cool.store.vo.notice.StoreMessageVO; @@ -34,7 +35,7 @@ public class MiniMessageTemplateController { @ApiOperation("获取每个门店需要展示的模块") @GetMapping("/getModuleListByStoreId") public ResponseResult> getModuleListByStoreId(@RequestParam("id")String storeId) { - return ResponseResult.success(messageTemplateService.getModuleList(storeId, PartnerUserHolder.getUser())); + return ResponseResult.success(messageTemplateService.getModuleList(storeId, PartnerUserHolder.getUser().getMobile())); } @ApiOperation("获取消息详情") @@ -52,13 +53,14 @@ public class MiniMessageTemplateController { @ApiOperation("确认已读") @GetMapping("/readMessage") public ResponseResult readMessage(@RequestParam("id")Long id) { - return ResponseResult.success(messageTemplateService.readMessage(id, PartnerUserHolder.getUser())); + return ResponseResult.success(messageTemplateService.readMessage(id, PartnerUserHolder.getUser().getMobile())); } @ApiOperation("确认已处理") @GetMapping("/handleMessage") public ResponseResult handleMessage(@RequestParam("id")Long id) { - return ResponseResult.success(messageTemplateService.handleMessage(id, PartnerUserHolder.getUser())); + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + return ResponseResult.success(messageTemplateService.handleMessage(id, user.getUsername(), user.getMobile())); } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java index fa6c0f6f4..6cd6686d4 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java @@ -7,6 +7,7 @@ import com.cool.store.response.ResponseResult; import com.cool.store.service.WechatMiniAppService; import com.cool.store.vo.PartnerUserInfoVO; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -65,4 +66,11 @@ public class MiniProgramAppController { PartnerUserInfoVO userInfoVO = PartnerUserHolder.getUser(); return ResponseResult.success(userInfoVO); } + + @ApiOperation("根据短期token获取用户信息") + @ApiImplicitParam(name = "token", value = "短期token", required = true, dataType = "String", paramType = "query") + @GetMapping("/getUserInfoByToken") + public ResponseResult getUserInfoByToken(String token) { + return ResponseResult.success(wechatMiniAppService.getUserInfoByShortTermToken(token)); + } } 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 0a8f5341a..e7982e7fa 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 @@ -8,7 +8,6 @@ import com.cool.store.dto.ShopAccount.ShopAccountDTO; import com.cool.store.request.GetPasswordDTO; import com.cool.store.response.ResponseResult; import com.cool.store.service.*; -import com.cool.store.vo.PartnerUserInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; @@ -95,7 +94,7 @@ public class MiniShopAccountController { @ApiOperation("获取标品登录token") @GetMapping("/getAccessToken") public ResponseResult getAccessToken() { - return ResponseResult.success(enterpriseService.getAccessToken(PartnerUserHolder.getUser().getMobile())); + return ResponseResult.success(enterpriseService.getLoginInfo(PartnerUserHolder.getUser().getMobile()).getAccessToken()); } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniWalletController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniWalletController.java new file mode 100644 index 000000000..c59d49f12 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniWalletController.java @@ -0,0 +1,145 @@ +package com.cool.store.controller.webc; + +import com.cool.store.dto.wallet.OpenBasicInfoDTO; +import com.cool.store.dto.wallet.PasswordDTO; +import com.cool.store.dto.wallet.TradeRecordDTO; +import com.cool.store.request.wallet.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.wallet.WalletService; +import com.cool.store.vo.wallet.*; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * Mini钱包 前端控制器 + *

+ * + * @author wangff + * @since 2025/11/14 + */ +@Api(tags = "Mini钱包") +@RestController +@RequestMapping("/mini/wallet") +@RequiredArgsConstructor +@Validated +public class MiniWalletController { + private final WalletService walletService; + + @ApiOperation("步骤1:平安银行钱包账号创建") + @PostMapping("/accountCreate") + public ResponseResult accountCreate(@RequestBody @Validated AccountCreateRequest request) { + return ResponseResult.success(walletService.accountCreate(request)); + } + + @ApiOperation("步骤2:鉴权申请") + @PostMapping("/authentication") + public ResponseResult authentication(@RequestBody @Validated WalletShopRequest request) { + return ResponseResult.success(walletService.authentication(request)); + } + + @ApiOperation("步骤3:账号开通(步骤2接口返回4时无需调用)") + @PostMapping("/openAccount") + public ResponseResult openAccount(@RequestBody @Validated AccountOpenRequest request) { + return ResponseResult.success(walletService.openAccount(request)); + } + + @ApiOperation("支行信息查询") + @PostMapping("/bankList") + public ResponseResult> getBankList(@RequestBody BankListRequest request) { + return ResponseResult.success(walletService.getBankList(request)); + } + + @ApiOperation("账户列表") + @GetMapping("/accountList") + public ResponseResult getAccountList(AccountQueryRequest request) { + return ResponseResult.success(walletService.getAccountList(request)); + } + + @ApiOperation("账户详情") + @PostMapping("/accountInfo") + public ResponseResult getAccountInfo(@RequestBody AccountQueryRequest request) { + return ResponseResult.success(walletService.getAccountInfo(request)); + } + + @ApiOperation("账户流水") + @PostMapping("/billPage") + public ResponseResult getBillPage(@RequestBody @Validated AccountBillQueryRequest request) { + return ResponseResult.success(walletService.getBillPage(request)); + } + + @ApiOperation("交易流水详情") + @GetMapping("/billDetail") + public ResponseResult getBillDetail(BillDetailRequest request) { + return ResponseResult.success(walletService.getBillDetail(request)); + } + + @ApiOperation("密码维护") + @PostMapping("/passwordUpdate") + public ResponseResult passwordUpdate(@RequestBody @Validated AccountPasswordRequest request) { + return ResponseResult.success(walletService.passwordUpdate(request)); + } + + @ApiOperation("门店是否存在密码") + @PostMapping("/existPwd") + public ResponseResult passwordUpdate(@RequestBody @Validated OutStoreIdRequest request) { + return ResponseResult.success(walletService.existPassword(request)); + } + + + + @ApiOperation("账户充值") + @PostMapping("/payment") + public ResponseResult payment(@RequestBody @Validated AccountPaymentRequest request) { + return ResponseResult.success(walletService.payment(request)); + } + + @ApiOperation("未支付充值订单分页查询") + @GetMapping("/nonPaymentPage") + public ResponseResult> nonPaymentPage(LargePaymentQueryRequest request) { + return ResponseResult.success(walletService.nonPaymentOrderPage(request)); + } + + @ApiOperation("根据预支付id查询收款账户详情") + @GetMapping("/paymentDetail") + public ResponseResult paymentDetail(@NotBlank(message = "预支付id不能为空") String paymentId) { + return ResponseResult.success(walletService.paymentDetail(paymentId)); + } + + @ApiOperation("提现") + @PostMapping("/withDrawer") + public ResponseResult withDrawer(@RequestBody @Validated WalletWithDrawerRequest request) { + return ResponseResult.success(walletService.withDrawer(request)); + } + @ApiOperation("根据门店编码查询开通基础信息") + @GetMapping("/getOpenBasicInfo") + @ApiImplicitParams({ + @ApiImplicitParam(name = "storeId", value = "门店id", required = true, dataType = "String"), + @ApiImplicitParam(name = "storeCode", value = "门店编号", required = true, dataType = "String"), + }) + public ResponseResult getOpenBasicInfo(@NotBlank(message = "门店id不能为空") String storeId, + @NotBlank(message = "门店编码不能为空") String storeCode) { + return ResponseResult.success(walletService.getOpenBasicInfo(storeId, storeCode)); + } + + @ApiOperation("提交开通") + @PostMapping("/openOnlineBankAccount") + public ResponseResult openOnlineBankAccount(@RequestBody @Validated CoolOpenBasicInfoRequest request) { + return ResponseResult.success(walletService.openOnlineBankAccount(request)); + } + + + @ApiOperation("网商账户激活") + @PostMapping("/onlineBankActive") + public ResponseResult onlineBankActive(@RequestBody @Validated StoreShopRequest request) { + return ResponseResult.success(walletService.onlineBankActive(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniXinFaController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniXinFaController.java new file mode 100644 index 000000000..a9cc9a5b7 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniXinFaController.java @@ -0,0 +1,54 @@ +package com.cool.store.controller.webc; + +import com.cool.store.dto.huoma.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.xinfa.XinFaBusinessService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/5 17:49 + * @Version 1.0 + */ +@RestController +@RequestMapping("/mini/xinfa") +@Api(tags = "小程序-信发") +@Slf4j +public class MiniXinFaController { + + @Resource + XinFaBusinessService xinFaBusinessService; + @ApiOperation("测试门店设备信息") + @GetMapping("/getStoreXinFaDeviceDetail") + public ResponseResult> getStoreXinFaDeviceDetail(@RequestParam("storeNum")String storeNum) { + return ResponseResult.success(xinFaBusinessService.getStoreXinFaDeviceDetail(storeNum)); + } + + @ApiOperation("测试标签信息") + @PostMapping("/getAccountAllTags") + public ResponseResult> getAccountAllTags(@RequestBody AccountTagDTO tagDTO) { + List accountAllTags = xinFaBusinessService.getAccountAllTags(tagDTO.getStoreNum(), tagDTO.getDeviceName()); + return ResponseResult.success(accountAllTags); + } + + @ApiOperation("获取节目列表") + @PostMapping("/getProgramList") + public ResponseResult> getProgramList(@RequestBody ProgramReqDTO programReqDTO) { + List accountAllTags = xinFaBusinessService.getProgramList(programReqDTO); + return ResponseResult.success(accountAllTags); + } + + @ApiOperation("发布/上架") + @PostMapping("/publishProgram") + public ResponseResult publishProgram(@RequestBody PublishDTO publishDTO) { + Boolean publishStatus = xinFaBusinessService.publishProgram(publishDTO); + return ResponseResult.success(publishStatus); + } + +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java index 76a71ac39..61bad4ad0 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java @@ -5,6 +5,9 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; import com.cool.store.dto.OpenCityDTO; import com.cool.store.dto.ocr.InvoiceDTO; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; +import com.cool.store.dto.wallet.OpenBasicInfoDTO; import com.cool.store.entity.*; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.IDCardSideEnum; @@ -17,11 +20,16 @@ import com.cool.store.exception.ServiceException; import com.cool.store.job.XxlJobHandler; import com.cool.store.mapper.HyOpenAreaInfoMapper; import com.cool.store.request.ShopListSuccessOpenRequest; +import com.cool.store.request.wallet.CoolOpenBasicInfoRequest; import com.cool.store.request.xfsgFirstOrderListRequest; +import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; +import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.MiniShopsResponse; import com.cool.store.response.ResponseResult; +import com.cool.store.response.caipin.StoreUserResponse; import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; +import com.cool.store.service.wallet.WalletService; import com.cool.store.utils.poi.ExcelUtil; import com.cool.store.utils.poi.StringUtils; import com.cool.store.vo.RegionPathNameVO; @@ -29,12 +37,15 @@ import com.github.pagehelper.PageInfo; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.validation.constraints.NotBlank; import java.io.ByteArrayOutputStream; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalTime; import java.time.temporal.ChronoUnit; @@ -77,6 +88,31 @@ public class TestController { @Resource ShopStageInfoDAO shopStageInfoDAO; + @Resource + ThirdFoodService thirdFoodService; + @Autowired + StoreService storeService; + @Resource + LinePayDAO linePayDAO; + @Resource + OpenApiService openApiService; + + @PostMapping("/testXgjCallback") + public ResponseResult testXgjCallback(Long linePayId) { + LinePayDO linePayDO = linePayDAO.getById(linePayId); + ReceiptCallBackRequest receiptRequest = new ReceiptCallBackRequest(); + receiptRequest.setReceiptId(linePayDO.getPaymentReceiptCode()); + receiptRequest.setClaimStatus(1); + openApiService.changeReceiptStatus(receiptRequest); + FranchiseFeeCallBackRequest franchiseRequest = new FranchiseFeeCallBackRequest(); + franchiseRequest.setShopId(linePayDO.getShopId()); + franchiseRequest.setPayableFee(linePayDO.getAmount()); + franchiseRequest.setPaidFees(linePayDO.getAmount()); + franchiseRequest.setRemainingFee(BigDecimal.ZERO); + franchiseRequest.setPaymentStatus(2); + openApiService.changePaymentStatus(franchiseRequest); + return ResponseResult.success(true); + } @PostMapping("/getFirstOrders") public ResponseResult getFirstOrders(@RequestBody xfsgFirstOrderListRequest storeCodeList) { @@ -354,4 +390,25 @@ public class TestController { public void initTallyBook() { xxlJobHandler.initTallyBook(); } + + @GetMapping("/pushStoreUser") + public void pushStoreUser(String storeCode){ + List storeUser = storeService.getStoreUser(Arrays.asList(storeCode)); + List storeUserUpdateDTOS = JSONObject.parseArray(JSONObject.toJSONString(storeUser), StoreUserUpdateDTO.class); + StoreUserResponse storeUserResponse = thirdFoodService.pushStoreUser(storeUserUpdateDTOS); + } + + @Resource + WalletService walletService; + @ApiOperation("根据门店编码查询开通基础信息") + @GetMapping("/getOpenBasicInfo") + public ResponseResult getOpenBasicInfo(@NotBlank(message = "门店编码不能为空") String storeCode) { + return ResponseResult.success(walletService.getOpenBasicInfo(null, storeCode)); + } + + @ApiOperation("提交开通") + @PostMapping("/openOnlineBankAccount") + public ResponseResult openOnlineBankAccount(@RequestBody @Validated CoolOpenBasicInfoRequest request) { + return ResponseResult.success(walletService.openOnlineBankAccount(request)); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java index 26375991a..cce519796 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java @@ -1,5 +1,6 @@ package com.cool.store.job; +import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; @@ -7,6 +8,7 @@ import com.cool.store.dao.*; import com.cool.store.dto.*; import com.cool.store.dto.decoration.ConstructionScheduleDTO; import com.cool.store.dto.openPreparation.OpenPlanShopInfoDTO; +import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.*; import com.cool.store.enums.*; import com.cool.store.enums.point.ShopStatusEnum; @@ -19,11 +21,14 @@ import com.cool.store.mapper.TrainingExperienceMapper; import com.cool.store.mq.producer.SimpleMessageService; import com.cool.store.mq.util.HttpRestTemplateService; import com.cool.store.request.ZxjpApiRequest; +import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.xfsgFirstOrderListRequest; +import com.cool.store.response.bigdata.LatestOrderDateResponse; import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; import com.cool.store.service.impl.CommonService; import com.cool.store.utils.CoolDateUtils; +import com.cool.store.utils.MDCUtils; import com.cool.store.utils.NumberConverter; import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; @@ -40,6 +45,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; @@ -111,6 +117,10 @@ public class XxlJobHandler { @Resource PushService pushService; + @Resource + StoreDao storeDao; + @Resource + ThirdBigDataService thirdBigDataService; /** @@ -395,4 +405,56 @@ public class XxlJobHandler { } } + @XxlJob("latestOrderDate") + public void latestOrderDate() { + log.info("------start latestOrderDate------"); + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + String param = XxlJobHelper.getJobParam(); + List storeStatus = null; + if (StringUtils.isNotBlank(param)) { + storeStatus = Arrays.asList(param.split(",")); + } + boolean hasNext = true; + int pageNum = 1; + int pageSize = CommonConstants.BATCH_SIZE; + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + while (hasNext) { + PageHelper.startPage(pageNum, pageSize); + List storeList = storeDao.getAllStoreIdAndNum(storeStatus); + if (CollectionUtils.isEmpty(storeList)) { + break; + } + hasNext = storeList.size() >= pageSize; + List storeNums = CollStreamUtil.toList(storeList, StoreDO::getStoreNum); + Map storeIdMap = CollStreamUtil.toMap(storeList, StoreDO::getStoreNum, StoreDO::getStoreId); + LatestOrderDateRequest request = new LatestOrderDateRequest(1, pageSize, String.join(",", storeNums)); + List resList = thirdBigDataService.getLatestOrderDate(request); + log.info("接口请求门店数量:{},返回门店数:{}", storeList.size(), resList.size()); + if (CollectionUtils.isNotEmpty(resList)) { + try { + List updateList = resList.stream() + .map(v -> { + Date date = parseDate(v, dateFormat); + return Objects.nonNull(date) ? new StoreOrderTimeDTO(storeIdMap.get(v.getStore_code()), date) : null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + storeDao.batchInsertOrUpdateOrderTime(updateList); + } catch (Exception e) { + log.error("获取最新订货时间失败", e); + } + } + pageNum++; + } + log.info("------end latestOrderDate------"); + } + + public Date parseDate(LatestOrderDateResponse v, DateFormat format) { + try { + return format.parse(v.getLatest_buy_date()); + } catch (ParseException e) { + log.error("日期转化失败,storeCode:{},latestBuyDate:{}", v.getStore_code(), v.getLatest_buy_date()); + } + return null; + } } diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties index ee3e65210..ba49de141 100644 --- a/coolstore-partner-web/src/main/resources/application-ab.properties +++ b/coolstore-partner-web/src/main/resources/application-ab.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 @@ -116,7 +120,7 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c @@ -133,3 +137,28 @@ hqt.token.grant_type=client_credentials hqt.token.client.id=WrPffdGpcWkcPsbN hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD +#fuwuhao appId +wechat.mp.appId=wx4a18ef8bb41aa55c +wechat.mp.appSecret=793904b58f4ecdead3bbe4312c5f5c45 +#xiaochengxu appid +wechat.miniapp.appId=wxd77a2761c1911ee1 + +huoMa.token.url = https://www.huoMayunping.com/api/SAASLogin/merchant +huoMa.id.url = https://www.huomayunping.com/api/reportCenter/executeSql +huoMa.store.device.detail.url = https://www.huomayunping.com/api/terminal/search +huoMa.get.point.terminal.url = https://www.huoMayunping.com/api/terminal/getPointTerminalInfos +huoMa.get.tag.url = https://www.huomayunping.com/api/tag/search +huoMa.get.program.url = https://www.huomayunping.com/api/program/search +huoMa.get.publish.url = https://www.huomayunping.com/api/channelPublish/target/v2/quick-publish +huoMa.direct.stores.account = 18375320931 +huoMa.direct.stores.password = Huoma@123456. +huoMa.franchise.stores.account = 13345565081 +huoMa.franchise.stores.password = Huoma@123456. +huoMa.restaurant.stores.account = 15167817007 +huoMa.restaurant.stores.password = Huoma@123456. + +wallet.url=https://api.dev.wenmatech.com:443 +wallet.api.yzt.key=360155690205317 +cool.api.rsa.private.key=MIIEpQIBAAKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQABAoIBACbBGi8I+CE77M+13wAu4RkD8xL7CQc3ic2ojGqIRPi7r5CuphD6mpzvXqtyfhd7DKr9h8bAxwBlnQ28ObjVgsI96/aM7dxvMs/uVPpqwIJyWuTDG5A05EPVC9REQnC6Mp09mnPL7rZz3Mfy6dIGY2YQWfwmWiPl1B45k+wZ+WPZPI0JVnvRzM881kf4aAhEAt08i9VoihylwVAjWIPmLuhf6ZcqI5q8iUsjfO22wZJsudVTCA/dsJdNxv+1RDKeYnSLJL79cZQcodqEhFqTy6vnn2dMsaHH7dpphU27barxUjeL482SR7kFfMqEXn5sltRn/3ep+3sf4Ph2vMtoZeECgYEA6gXzEtT9ZOeAMp4BRGmfNZ0TQLprPPVSwudz/uUBE4j/vyhfXkh9p7hqwyoxN+Z8b65yINvx8yP6hge6ek/MyAwBCZyfIRxZAPZu1eEGoYKl391ubFt2EIVqrN2DtAvzHMr5B/E2VHBq6AJm/rERFX5oKsg6zHS9tPLhgGnWVd0CgYEA5aFWOrtiqZJlp1MHQ4OeWBJatBSynkORdxCW7ic0CKbkYus0NSz1SsvskpbnfEXNB53x98qJxRhSopg/DC4m7XqxjSf9lY3HH4Y/9907olj33yGAnLWC88GivVndt577u/XhYRCk33vOQ3GoibEdjnpMOkWmOfwYG/FsRWWQvaECgYEA1N2siEisZIgel+wZAv2AD+hchtgKi1wqd5bIb+Yl4HsRBfPXK4+MnG6mzfcm5c4FCiEHNtRZc+waCKgm+vJzNtOUbgXEyP1cCAAgOPOCcI7CCqsDshRPhB+XNL4Y+kCUVnBZrNu/q3bGB1uIC8tL2t0sKx4OPcNCe8EhVQjwKRECgYEA4uothdhKRPtwDIsVsHfN74Yjr7SMVay7gIcaPrjqyGnzYnS+oJWOx50AaFNK6Rko5JAF3jF9NxE0B4yfMPAic6Y88hpEkpcJ4HMPn2Y1WdbFCu/WYgVUJICCys6VNLCcXj85umtyIY38Y9VbEMW/SV49GZBeFQqy4FoP/fvBrkECgYEAnfjTDYwgdmJdsUqyNzAocwcJXG2rVtYc7Txrl0TltcwuJmgoSywdzyOP2R9+NZsfoxWDzG0/yr15ApMvUcnnTwHN/8bGQ9SLatFLKqS4EtdwDKKS1JvNbs7V1myQGpt7jbShZOI0e6Fs4xP8ujxsLeGgiq9mZrS9UdRj5XKDoVM= +cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQAB +wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB diff --git a/coolstore-partner-web/src/main/resources/application-hd.properties b/coolstore-partner-web/src/main/resources/application-hd.properties index c06c32835..335d6cf18 100644 --- a/coolstore-partner-web/src/main/resources/application-hd.properties +++ b/coolstore-partner-web/src/main/resources/application-hd.properties @@ -1,9 +1,13 @@ #mysql config -default.datasource.url=jdbc:mysql://store10-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_10027?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_10027?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties index 12948da5d..43af7137a 100644 --- a/coolstore-partner-web/src/main/resources/application-local.properties +++ b/coolstore-partner-web/src/main/resources/application-local.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege-open.redis.rds.aliyuncs.com:6379/0 @@ -123,7 +127,7 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c @@ -133,3 +137,14 @@ special.user.id=wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAA0TC8mkCJeXouw94hYA-D3 ask.bot.url=https://test.auth.wx.askbot.cn +hqt.token.url=https://tc.cloud.hecom.cn +hqt.token.username=18161486722 +hqt.token.grant_type=client_credentials +hqt.token.client.id=WrPffdGpcWkcPsbN +hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD + +wallet.url=https://api.dev.wenmatech.com:443 +wallet.api.yzt.key=360155690205317 +cool.api.rsa.private.key=MIIEpQIBAAKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQABAoIBACbBGi8I+CE77M+13wAu4RkD8xL7CQc3ic2ojGqIRPi7r5CuphD6mpzvXqtyfhd7DKr9h8bAxwBlnQ28ObjVgsI96/aM7dxvMs/uVPpqwIJyWuTDG5A05EPVC9REQnC6Mp09mnPL7rZz3Mfy6dIGY2YQWfwmWiPl1B45k+wZ+WPZPI0JVnvRzM881kf4aAhEAt08i9VoihylwVAjWIPmLuhf6ZcqI5q8iUsjfO22wZJsudVTCA/dsJdNxv+1RDKeYnSLJL79cZQcodqEhFqTy6vnn2dMsaHH7dpphU27barxUjeL482SR7kFfMqEXn5sltRn/3ep+3sf4Ph2vMtoZeECgYEA6gXzEtT9ZOeAMp4BRGmfNZ0TQLprPPVSwudz/uUBE4j/vyhfXkh9p7hqwyoxN+Z8b65yINvx8yP6hge6ek/MyAwBCZyfIRxZAPZu1eEGoYKl391ubFt2EIVqrN2DtAvzHMr5B/E2VHBq6AJm/rERFX5oKsg6zHS9tPLhgGnWVd0CgYEA5aFWOrtiqZJlp1MHQ4OeWBJatBSynkORdxCW7ic0CKbkYus0NSz1SsvskpbnfEXNB53x98qJxRhSopg/DC4m7XqxjSf9lY3HH4Y/9907olj33yGAnLWC88GivVndt577u/XhYRCk33vOQ3GoibEdjnpMOkWmOfwYG/FsRWWQvaECgYEA1N2siEisZIgel+wZAv2AD+hchtgKi1wqd5bIb+Yl4HsRBfPXK4+MnG6mzfcm5c4FCiEHNtRZc+waCKgm+vJzNtOUbgXEyP1cCAAgOPOCcI7CCqsDshRPhB+XNL4Y+kCUVnBZrNu/q3bGB1uIC8tL2t0sKx4OPcNCe8EhVQjwKRECgYEA4uothdhKRPtwDIsVsHfN74Yjr7SMVay7gIcaPrjqyGnzYnS+oJWOx50AaFNK6Rko5JAF3jF9NxE0B4yfMPAic6Y88hpEkpcJ4HMPn2Y1WdbFCu/WYgVUJICCys6VNLCcXj85umtyIY38Y9VbEMW/SV49GZBeFQqy4FoP/fvBrkECgYEAnfjTDYwgdmJdsUqyNzAocwcJXG2rVtYc7Txrl0TltcwuJmgoSywdzyOP2R9+NZsfoxWDzG0/yr15ApMvUcnnTwHN/8bGQ9SLatFLKqS4EtdwDKKS1JvNbs7V1myQGpt7jbShZOI0e6Fs4xP8ujxsLeGgiq9mZrS9UdRj5XKDoVM= +cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQAB +wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB \ No newline at end of file diff --git a/coolstore-partner-web/src/main/resources/application-online.properties b/coolstore-partner-web/src/main/resources/application-online.properties index ae1f91591..faea71843 100644 --- a/coolstore-partner-web/src/main/resources/application-online.properties +++ b/coolstore-partner-web/src/main/resources/application-online.properties @@ -3,6 +3,10 @@ default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coo default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 @@ -121,7 +125,7 @@ zx.big.data.appSecret=35b8b9a400b4430fa022190be0913cd6 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinshipin.com +zx.food.url=https://datacenter.zhengxinshipin.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c @@ -134,4 +138,31 @@ hqt.token.url=https://tc.cloud.hecom.cn hqt.token.username=18161486722 hqt.token.grant_type=client_credentials hqt.token.client.id=WrPffdGpcWkcPsbN -hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD \ No newline at end of file +hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD + +#fuwuhao appId +wechat.mp.appId=wx4a18ef8bb41aa55c +wechat.mp.appSecret=793904b58f4ecdead3bbe4312c5f5c45 +#xiaochengxu appid +wechat.miniapp.appId=wxd77a2761c1911ee1 + +huoMa.token.url = https://www.huoMayunping.com/api/SAASLogin/merchant +huoMa.id.url = https://www.huomayunping.com/api/reportCenter/executeSql +huoMa.store.device.detail.url = https://www.huomayunping.com/api/terminal/search +huoMa.get.point.terminal.url = https://www.huoMayunping.com/api/terminal/getPointTerminalInfos +huoMa.get.tag.url = https://www.huomayunping.com/api/tag/search +huoMa.get.program.url = https://www.huomayunping.com/api/program/search +huoMa.get.publish.url = https://www.huomayunping.com/api/channelPublish/target/v2/quick-publish +huoMa.direct.stores.account = 18375320931 +huoMa.direct.stores.password = Huoma@123456. +huoMa.franchise.stores.account = 13345565081 +huoMa.franchise.stores.password = Huoma@123456. +huoMa.restaurant.stores.account = 15167817007 +huoMa.restaurant.stores.password = Huoma@123456. + + +wallet.url=https://zhengxin.wenmatech.com +wallet.api.yzt.key=375393764171845 +cool.api.rsa.private.key=MIIEoQIBAAKCAQEAleyT39qxm9Vi4d3f/pF4yI3EATtLlP870dFfk5Rwj1MEM4OVTUeoBrld5GwTARQYzuyZETTZPh9taFCVtLFVsQv4waTqDf/7vnfBbvrTZ2mvZv6H/M6BTQnTx5UmOIP1RsA933ce7v/hmG/DlMaHU3JVC840Ae1q7uJZ2yA6+r6aAGdTGMSH4oQ+U9omJOJbgbuti9DsBuGDDKZ1uMhrWW/l4El5y2Qdu/71wIQuI08kPegmuGl4+FLRJ2OnoGsp+BRXKpFbN0fq0YwPQhjzSHsKg64qimmzRRr5Ewd+4w1/27dJ6mopQd4zvf7+VQ4wEZgATTe/hjBw1njOOBD/WQIDAQABAoIBACSFU0ZSEzbXRbWoo0JzdF1Cb28vXwuGGy/S1XnxTHQVcG4ODSYcoPk2WYFltEFsgFiTuPvAiHUCGdgx3S39jtbIiEm/nwZXB5+Ps46RykKkM4ae1UiHk2bNUIoLMprMxkh8VvYjIeVtbqp/+0A4FkoFDWOJURDxIT3c5K+ky8k9mKz59SiOkNoiayPQTEjzZPgKSsT64286PGmE9v4BlpyxQ1bLXeZaQGAkQ7YVtU5XJgbMM86hgmFlTcHVMGeMoQvJTfcsLlRg8ucX/zzBTHR7fZP6i5OJl5CYLbzHbTyHN9KRYDYv066SvbGLNa+4NO2cY+L6NehiwAkkFxSGKkMCgYEAoVgEjOqLyL1CpeaW7ckWQSbcae0a6J61b6meCkRaKrwcWi7ut9OfmvkCae2qsMsHQlitFM8blrnhtJxMt3EhWKYHI1seZto6YR0mzEEz5IVM3OStIZN7RY4Fg6AyB0C5Gure3GgGHaSs5J8AbCpJyLjTWuOdcnThgHHe4Mw2dGsCgYEA7eF0TpAbdYn8xjqNEgeRSSXYpwtRQ1zrpH0b1KQBxx/fvoZPzWG0SYIi6eYV5bxV5EDnCKlXXFD3ztMfThPFUGt8hHAG6CKpsiVNvYDVhAzXN18JQJtRQRO/4S0f42C8os87ToL1nlM83c8hegrsGO+JnoTzKf8KkpYqTNrvrEsCf1HuYGEuuc02TqHwdrRJaQOsuEESJpf6ACiz+Y09KIyK+drR+mdfD62ixZcFGaitcQJABaSLh3cC7ZrJxCtjR4u8w+MwYj/Ykcy/APS4J6HkDyQc+84RFog7lpFAyCbmtxj0LDfAm1pyRVnTZGOJFe7X7Hw7GbkFoX2YVZXSHdUCgYEA6rCuYPxIOxSicKg/mfQhYLuYHmZKDF3WlnhgRtBweJZ31q8IeKbWild8PqukGv5O910ZEzCPYiL3+fPNROi4mPkS5k7oYYohRgMLydUb0qYghx6aMEWMStpDStOMTHaaZT5zUqhdz5Br0qKScqfn+0oIyn58sYhQVAMXRLAUGjUCgYAYiuiTme9S9gSt1pZrDbPxXlbVm6PjlkP/OKrmBj5gq8iYeKzmYKp66UKFo6ZeeRcKiXLWdQS0i0rKBPux8kmfIwbrfbuYAVGE0GmUdEMNsBQvEjxpwo3afyB5F70tdnm4EBo0qeqJxuBK8DLpBFka2yfzEo/3Z6i0X/XqIwq/7A== +cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAleyT39qxm9Vi4d3f/pF4yI3EATtLlP870dFfk5Rwj1MEM4OVTUeoBrld5GwTARQYzuyZETTZPh9taFCVtLFVsQv4waTqDf/7vnfBbvrTZ2mvZv6H/M6BTQnTx5UmOIP1RsA933ce7v/hmG/DlMaHU3JVC840Ae1q7uJZ2yA6+r6aAGdTGMSH4oQ+U9omJOJbgbuti9DsBuGDDKZ1uMhrWW/l4El5y2Qdu/71wIQuI08kPegmuGl4+FLRJ2OnoGsp+BRXKpFbN0fq0YwPQhjzSHsKg64qimmzRRr5Ewd+4w1/27dJ6mopQd4zvf7+VQ4wEZgATTe/hjBw1njOOBD/WQIDAQAB +wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB diff --git a/coolstore-partner-web/src/main/resources/application-test.properties b/coolstore-partner-web/src/main/resources/application-test.properties index 40fb95fc6..e4ab053cd 100644 --- a/coolstore-partner-web/src/main/resources/application-test.properties +++ b/coolstore-partner-web/src/main/resources/application-test.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege-open.redis.rds.aliyuncs.com:6379/0 @@ -124,7 +128,7 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c @@ -141,3 +145,33 @@ hqt.token.grant_type=client_credentials hqt.token.client.id=WrPffdGpcWkcPsbN hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD + +#fuwuhao appId +wechat.mp.appId=wx4a18ef8bb41aa55c +wechat.mp.appSecret=793904b58f4ecdead3bbe4312c5f5c45 +#xiaochengxu appid +wechat.miniapp.appId=wxd77a2761c1911ee1 + +zx.iot.appId=p-ts3PhNyf +zx.iot.appSecret=X4cVmfxM+ + + +huoMa.token.url = https://www.huoMayunping.com/api/SAASLogin/merchant +huoMa.id.url = https://www.huomayunping.com/api/reportCenter/executeSql +huoMa.store.device.detail.url = https://www.huomayunping.com/api/terminal/search +huoMa.get.point.terminal.url = https://www.huoMayunping.com/api/terminal/getPointTerminalInfos +huoMa.get.tag.url = https://www.huomayunping.com/api/tag/search +huoMa.get.program.url = https://www.huomayunping.com/api/program/search +huoMa.get.publish.url = https://www.huomayunping.com/api/channelPublish/target/v2/quick-publish +huoMa.direct.stores.account = 18375320931 +huoMa.direct.stores.password = Huoma@123456. +huoMa.franchise.stores.account = 13345565081 +huoMa.franchise.stores.password = Huoma@123456. +huoMa.restaurant.stores.account = 15167817007 +huoMa.restaurant.stores.password = Huoma@123456. + +wallet.url=https://api.dev.wenmatech.com:443 +wallet.api.yzt.key=360155690205317 +cool.api.rsa.private.key=MIIEpQIBAAKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQABAoIBACbBGi8I+CE77M+13wAu4RkD8xL7CQc3ic2ojGqIRPi7r5CuphD6mpzvXqtyfhd7DKr9h8bAxwBlnQ28ObjVgsI96/aM7dxvMs/uVPpqwIJyWuTDG5A05EPVC9REQnC6Mp09mnPL7rZz3Mfy6dIGY2YQWfwmWiPl1B45k+wZ+WPZPI0JVnvRzM881kf4aAhEAt08i9VoihylwVAjWIPmLuhf6ZcqI5q8iUsjfO22wZJsudVTCA/dsJdNxv+1RDKeYnSLJL79cZQcodqEhFqTy6vnn2dMsaHH7dpphU27barxUjeL482SR7kFfMqEXn5sltRn/3ep+3sf4Ph2vMtoZeECgYEA6gXzEtT9ZOeAMp4BRGmfNZ0TQLprPPVSwudz/uUBE4j/vyhfXkh9p7hqwyoxN+Z8b65yINvx8yP6hge6ek/MyAwBCZyfIRxZAPZu1eEGoYKl391ubFt2EIVqrN2DtAvzHMr5B/E2VHBq6AJm/rERFX5oKsg6zHS9tPLhgGnWVd0CgYEA5aFWOrtiqZJlp1MHQ4OeWBJatBSynkORdxCW7ic0CKbkYus0NSz1SsvskpbnfEXNB53x98qJxRhSopg/DC4m7XqxjSf9lY3HH4Y/9907olj33yGAnLWC88GivVndt577u/XhYRCk33vOQ3GoibEdjnpMOkWmOfwYG/FsRWWQvaECgYEA1N2siEisZIgel+wZAv2AD+hchtgKi1wqd5bIb+Yl4HsRBfPXK4+MnG6mzfcm5c4FCiEHNtRZc+waCKgm+vJzNtOUbgXEyP1cCAAgOPOCcI7CCqsDshRPhB+XNL4Y+kCUVnBZrNu/q3bGB1uIC8tL2t0sKx4OPcNCe8EhVQjwKRECgYEA4uothdhKRPtwDIsVsHfN74Yjr7SMVay7gIcaPrjqyGnzYnS+oJWOx50AaFNK6Rko5JAF3jF9NxE0B4yfMPAic6Y88hpEkpcJ4HMPn2Y1WdbFCu/WYgVUJICCys6VNLCcXj85umtyIY38Y9VbEMW/SV49GZBeFQqy4FoP/fvBrkECgYEAnfjTDYwgdmJdsUqyNzAocwcJXG2rVtYc7Txrl0TltcwuJmgoSywdzyOP2R9+NZsfoxWDzG0/yr15ApMvUcnnTwHN/8bGQ9SLatFLKqS4EtdwDKKS1JvNbs7V1myQGpt7jbShZOI0e6Fs4xP8ujxsLeGgiq9mZrS9UdRj5XKDoVM= +cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQAB +wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB \ No newline at end of file diff --git a/pom.xml b/pom.xml index 545c8d7fa..7ee22a7a9 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ cn.hutool hutool-all - 5.0.7 + 5.7.22 com.aliyun @@ -232,6 +232,12 @@ alibabacloud-dysmsapi20170525 2.0.24 + + org.bouncycastle + bcprov-jdk15on + 1.70 + +