From c52b8ac2645f803988846cc9591b361110cb49d4 Mon Sep 17 00:00:00 2001 From: "xiaodong.hu" <1075471126@qq.com> Date: Wed, 28 Jun 2023 17:56:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ec=E5=90=8C=E6=AD=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=B0=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/dao/EnterpriseUserDAO.java | 4 + .../store/mapper/EnterpriseUserMapper.java | 3 + .../mapper/HyPartnerUserChannelMapper.java | 25 ++ .../store/mapper/HyPartnerUserInfoMapper.java | 4 + .../resources/mapper/EnterpriseUserMapper.xml | 3 + .../mapper/HyPartnerLineInfoMapper.xml | 12 +- .../mapper/HyPartnerUserChannelMapper.xml | 93 ++++++ .../mapper/HyPartnerUserInfoMapper.xml | 12 + .../store/entity/HyPartnerBaseInfoDO.java | 2 + .../store/entity/HyPartnerLineInfoDO.java | 5 + .../store/entity/HyPartnerUserChannelDO.java | 43 +++ .../store/entity/HyPartnerUserInfoDO.java | 2 + .../cool/store/entity/SyncEcCustomerDO.java | 19 ++ .../store/request/CustomerInfoRequest.java | 26 ++ .../cool/store/http/UserSourceResponse.java | 29 ++ .../com/cool/store/job/EcSyncDataJob.java | 93 ++++++ .../java/com/cool/store/sdk/ec/EcClient.java | 37 +++ .../store/sdk/ec/bo/ChangeFollowUserBo.java | 24 ++ .../store/sdk/ec/bo/SyncEcCustomerBo.java | 9 + .../store/sdk/ec/bo/UpdateCustomerBo.java | 16 + .../com/cool/store/sdk/ec/core/EcRequest.java | 28 ++ .../cool/store/sdk/ec/core/EcRequestI.java | 28 ++ .../cool/store/sdk/ec/core/EcResponse.java | 14 + .../ec/request/ChangeFollowUserRequest.java | 19 ++ .../sdk/ec/request/SyncEcCustomerRequest.java | 26 ++ .../sdk/ec/request/UpdateCustomerRequest.java | 21 ++ .../ec/response/ChangeFollowUserResponse.java | 15 + .../ec/response/SyncEcCustomerResponse.java | 16 + .../ec/response/UpdateCustomerResponse.java | 16 + .../com/cool/store/service/EcSyncService.java | 11 + .../store/service/impl/EcSyncServiceImpl.java | 278 ++++++++++++++++++ .../java/com/cool/store/utils/Client.java | 164 +++++++++++ .../main/java/com/cool/store/utils/Get.java | 104 +++++++ .../java/com/cool/store/utils/MapUtil.java | 123 ++++++++ .../main/java/com/cool/store/utils/Post.java | 37 +++ .../store/config/TokenValidateFilter.java | 2 +- .../store/controller/EcSyncController.java | 31 ++ 37 files changed, 1392 insertions(+), 2 deletions(-) create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserChannelMapper.java create mode 100644 coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserChannelMapper.xml create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserChannelDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/SyncEcCustomerDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/CustomerInfoRequest.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/http/UserSourceResponse.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/job/EcSyncDataJob.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/EcClient.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/ChangeFollowUserBo.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/SyncEcCustomerBo.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/UpdateCustomerBo.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequest.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequestI.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcResponse.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/ChangeFollowUserRequest.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/SyncEcCustomerRequest.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/UpdateCustomerRequest.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/ChangeFollowUserResponse.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/SyncEcCustomerResponse.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/UpdateCustomerResponse.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/EcSyncService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/EcSyncServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/utils/Client.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/utils/Get.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/utils/MapUtil.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/utils/Post.java create mode 100644 coolstore-partner-webb/src/main/java/com/cool/store/controller/EcSyncController.java 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 0454438ca..bc0f82ac9 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 @@ -98,4 +98,8 @@ public class EnterpriseUserDAO { } return enterpriseUserMapper.getUserListByRegionIds(regionIds); } + + public String selectByMobile(String mobile) { + return enterpriseUserMapper.selectByMobile(mobile); + } } \ No newline at end of file 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 f83646ae2..ae2bf57bc 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 @@ -90,4 +90,7 @@ public interface EnterpriseUserMapper { * @return */ List getUserListByRegionIds(@Param("regionIds") List regionIds); + + String selectByMobile(@Param("mobile") String mobile); + } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserChannelMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserChannelMapper.java new file mode 100644 index 000000000..59631f995 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerUserChannelMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.HyPartnerUserChannelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +@Mapper +public interface HyPartnerUserChannelMapper { + int deleteByPrimaryKey(Long id); + + int insert(HyPartnerUserChannelDO record); + + int insertSelective(HyPartnerUserChannelDO record); + + HyPartnerUserChannelDO selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(HyPartnerUserChannelDO record); + + int updateByPrimaryKey(HyPartnerUserChannelDO record); + + HyPartnerUserChannelDO selectByChannelId(@Param("channelId") Long id); + + HyPartnerUserChannelDO selectByChannelName(@Param("channelName") String channelName); +} \ 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 5bf4ead72..b2dbe1142 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,6 +1,7 @@ package com.cool.store.mapper; import com.cool.store.entity.HyPartnerUserInfoDO; +import com.cool.store.entity.SyncEcCustomerDO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -43,4 +44,7 @@ public interface HyPartnerUserInfoMapper { int updateJoinKnowById(@Param("isWritePartnerKnow")Integer isWritePartnerKnow, @Param("id")Long id); + List selectByHourDate(@Param("selectTime") String hourDayDate, @Param("now") String now,@Param("limit1")Integer limit1,@Param("limit2")Integer limit2); + + int selectByHourDateCount(@Param("selectTime") String hourDayDate, @Param("now") String now); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml index 72c925596..79cc9bcb2 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml @@ -306,4 +306,7 @@ where deleted = 0 and user_region_ids like concat("%", #{regionId}, "%") + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerLineInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerLineInfoMapper.xml index 5c5c7c375..47e5b7e7e 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerLineInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerLineInfoMapper.xml @@ -20,12 +20,13 @@ + id, partner_id, workflow_stage, workflow_status, line_status, investment_manager, development_director, development_manager, deadline, pass_reason, reject_public_reason, reject_real_reason, certify_file, deleted, create_time, update_time, close_time, - close_user_id + close_user_id,user_channel_id + select + + from hy_partner_user_channel + where id = #{id,jdbcType=BIGINT} + + + + + delete from hy_partner_user_channel + where id = #{id,jdbcType=BIGINT} + + + insert into hy_partner_user_channel (channel_id, channel_name, create_time, + update_time) + values (#{channelId,jdbcType=BIGINT}, #{channelName,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, + #{updateTime,jdbcType=TIMESTAMP}) + + + insert into hy_partner_user_channel + + + channel_id, + + + channel_name, + + + create_time, + + + + + #{channelId,jdbcType=BIGINT}, + + + #{channelName,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + + + update hy_partner_user_channel + + + channel_id = #{channelId,jdbcType=BIGINT}, + + + channel_name = #{channelName,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update hy_partner_user_channel + set channel_id = #{channelId,jdbcType=BIGINT}, + channel_name = #{channelName,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + update_time = #{updateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ 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 a997ef69d..d3e544b7b 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml @@ -49,6 +49,18 @@ + + insert into hy_partner_user_info diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerBaseInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerBaseInfoDO.java index 97e46a056..ec307626f 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerBaseInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerBaseInfoDO.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; /** * @@ -17,6 +18,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor +@Accessors(chain = true) public class HyPartnerBaseInfoDO implements Serializable { @ApiModelProperty("") private Long id; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerLineInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerLineInfoDO.java index a4069904e..beda39416 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerLineInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerLineInfoDO.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; /** * @@ -17,6 +18,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor +@Accessors(chain = true) public class HyPartnerLineInfoDO implements Serializable { @ApiModelProperty("") private Long id; @@ -77,4 +79,7 @@ public class HyPartnerLineInfoDO implements Serializable { @ApiModelProperty("移除黑名单原因") private String removeBlackReason; + + @ApiModelProperty("hy_partner_user_channel.id") + private Integer userChannelId; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserChannelDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserChannelDO.java new file mode 100644 index 000000000..6485b4628 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserChannelDO.java @@ -0,0 +1,43 @@ +package com.cool.store.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.naming.Name; + +/** + * hy_partner_user_channel + * @author + */ +@Data +@Accessors(chain = true) +public class HyPartnerUserChannelDO implements Serializable { + + private Long id; + + /** + * 来源id + */ + private Long channelId; + + /** + * 来源名称 + */ + private String channelName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java index c1d88f267..c1f77aeae 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; /** * @@ -17,6 +18,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor +@Accessors(chain = true) public class HyPartnerUserInfoDO implements Serializable { @ApiModelProperty("") private Long id; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/SyncEcCustomerDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/SyncEcCustomerDO.java new file mode 100644 index 000000000..aeaaaaff5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/SyncEcCustomerDO.java @@ -0,0 +1,19 @@ +package com.cool.store.entity; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class SyncEcCustomerDO { + + private Long id; + + private String customername; + + private String customermobile; + + private String followname; + + private String followmobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/CustomerInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/CustomerInfoRequest.java new file mode 100644 index 000000000..a4088a6a8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/CustomerInfoRequest.java @@ -0,0 +1,26 @@ +package com.cool.store.request; + +import lombok.Data; + +/** + * @author hxd + * @since 2023/2/28 + */ +@Data +public class CustomerInfoRequest { + + + private Long crmId; + + private String mobile; + + private String name; + + private String channel; + + private String followUserMobile; + + private Long lastFollowUserId; + + private String followUserName; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/http/UserSourceResponse.java b/coolstore-partner-service/src/main/java/com/cool/store/http/UserSourceResponse.java new file mode 100644 index 000000000..2540b4974 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/http/UserSourceResponse.java @@ -0,0 +1,29 @@ +package com.cool.store.http; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class UserSourceResponse { + + private Integer code; + + private String msg; + + private List data; + + @Data + @Accessors(chain = true) + public static class ChannelSource{ + private String createTime; + + private Long id; + + private String name; + + private Integer userId; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/job/EcSyncDataJob.java b/coolstore-partner-service/src/main/java/com/cool/store/job/EcSyncDataJob.java new file mode 100644 index 000000000..f9e46fbc4 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/job/EcSyncDataJob.java @@ -0,0 +1,93 @@ +package com.cool.store.job; + +import cn.hutool.core.date.DateUtil; +import com.cool.store.entity.SyncEcCustomerDO; +import com.cool.store.mapper.HyPartnerLineInfoMapper; +import com.cool.store.mapper.HyPartnerUserInfoMapper; +import com.cool.store.sdk.ec.EcClient; +import com.cool.store.sdk.ec.request.SyncEcCustomerRequest; +import com.cool.store.service.EcSyncService; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +@Slf4j +@Component +public class EcSyncDataJob { + + @XxlJob("SyncUserSourceJob") + public void syncUserSourceJob() { + XxlJobHelper.log("-------------------------------定时同步客户来源开始-------------------------------"); + syncUserSourceExecute(); + XxlJobHelper.log("-------------------------------定时同步客户来源结束-------------------------------"); + XxlJobHelper.handleSuccess(); + } + + + @Value("${ec.baseUrl}") + private String baseUrl; + + @XxlJob("SyncAppletToEcJob") + public void syncAppletToEcJob() { + XxlJobHelper.log("-------------------------------定时同步小程序数据到ec开始-------------------------------"); + syncAppletToEcExecute(); + XxlJobHelper.log("-------------------------------定时同步小程序数据到ec结束-------------------------------"); + XxlJobHelper.handleSuccess(); + } + + @Resource + private EcSyncService ecSyncService; + + @Resource + private HyPartnerUserInfoMapper hyPartnerUserInfoMapper; + + + //定时同步用户来源开始 + private void syncUserSourceExecute() { + ecSyncService.getChannelSource(); + } + + private final Integer count=50; + + //定时同步小程序数据到ec + private void syncAppletToEcExecute() { + //获取总数 + int size = hyPartnerUserInfoMapper.selectByHourDateCount(getHourDayDate(-1, 0), DateUtil.now()); + //执行数 + int counts = size / count; + //取余,如果大于1,就再加一 + int yu = size % count; + if (yu > 0) { + counts += 1; + } + for (int i = 1; i <= counts; i++) { + List list = hyPartnerUserInfoMapper.selectByHourDate(getHourDayDate(-1, 0), DateUtil.now(),count * (i - 1),count); + SyncEcCustomerRequest syncEcCustomerRequest = new SyncEcCustomerRequest(); + syncEcCustomerRequest.setParameter(list); + EcClient ecClient = new EcClient(); + ecClient.exec(baseUrl,syncEcCustomerRequest); + } + } + + + private static String getHourDayDate(int hour, int day) { + Date today = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(today); + calendar.add(Calendar.HOUR, hour); + calendar.add(Calendar.DAY_OF_MONTH, day); + Date twoDay = calendar.getTime(); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(twoDay); + } + + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/EcClient.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/EcClient.java new file mode 100644 index 000000000..e1f55ccbc --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/EcClient.java @@ -0,0 +1,37 @@ +package com.cool.store.sdk.ec; + +import com.alibaba.fastjson.JSON; +import com.cool.store.sdk.ec.core.EcRequest; +import com.cool.store.sdk.ec.core.EcResponse; +import com.cool.store.utils.Get; +import com.cool.store.utils.MapUtil; +import com.cool.store.utils.Post; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Value; + +import java.util.HashMap; + +public class EcClient { + + + + + @SneakyThrows + public T exec(String baseUrl,EcRequest request) { + String apiUrl = request.getApiUrl(); +// if (accessToken != null) { +// apiUrl += "?token=" + accessToken; +// } + String method = request.getMethod(); + String result = ""; + if (method.equals("GET")) { + result = Get.send(baseUrl+apiUrl, MapUtil.entityToUrlParam(request.getParameter())); + } else { + HashMap headers = new HashMap<>(1); + headers.put("Content-Type", "application/json"); + result = Post.send(baseUrl+apiUrl, JSON.toJSONString(request.getParameter()), headers); + } + + return JSON.parseObject(result, request.getResponseClass()); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/ChangeFollowUserBo.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/ChangeFollowUserBo.java new file mode 100644 index 000000000..1b0e99df8 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/ChangeFollowUserBo.java @@ -0,0 +1,24 @@ +package com.cool.store.sdk.ec.bo; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author hxd + */ +@Data +@Accessors(chain = true) +public class ChangeFollowUserBo { + + //跟进人 + private Long crmId; + + private String username; + + private String mobile; + + private Long followUserId; + + //1:更新跟进人 2:创建跟进人并更改跟进人 + private Integer type; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/SyncEcCustomerBo.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/SyncEcCustomerBo.java new file mode 100644 index 000000000..848e6a5ed --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/SyncEcCustomerBo.java @@ -0,0 +1,9 @@ +package com.cool.store.sdk.ec.bo; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class SyncEcCustomerBo { +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/UpdateCustomerBo.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/UpdateCustomerBo.java new file mode 100644 index 000000000..225878d39 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/bo/UpdateCustomerBo.java @@ -0,0 +1,16 @@ +package com.cool.store.sdk.ec.bo; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class UpdateCustomerBo { + + private String username; + + private String mobile; + + private Long crmId; + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequest.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequest.java new file mode 100644 index 000000000..d555cb636 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequest.java @@ -0,0 +1,28 @@ +package com.cool.store.sdk.ec.core; + +/** + * @author hxd + */ +abstract public class EcRequest implements EcRequestI { + + private Object parameter; + + @Override + public String getMethod() { + return "POST"; + } + + @Override + public Object getParameter() { + return parameter; + } + + public void setParameter(Object parameter) { + this.parameter = parameter; + } + + @Override + public Class getResponseClass() { + return null; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequestI.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequestI.java new file mode 100644 index 000000000..1c9d1b849 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcRequestI.java @@ -0,0 +1,28 @@ +package com.cool.store.sdk.ec.core; + +public interface EcRequestI { + + /** + * 地址 + * @return - + */ + String getApiUrl(); + + /** + * 方法 + * @return - + */ + String getMethod(); + + /** + * 设置参数 + * @return - + */ + Object getParameter(); + + /** + * 响应类类型 + * @return - + */ + Class getResponseClass(); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcResponse.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcResponse.java new file mode 100644 index 000000000..19cb9c377 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/core/EcResponse.java @@ -0,0 +1,14 @@ +package com.cool.store.sdk.ec.core; + +import lombok.Data; + +@Data +public class EcResponse { + + private Integer code; + + private String msg; + + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/ChangeFollowUserRequest.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/ChangeFollowUserRequest.java new file mode 100644 index 000000000..1213d0527 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/ChangeFollowUserRequest.java @@ -0,0 +1,19 @@ +package com.cool.store.sdk.ec.request; + +import com.cool.store.sdk.ec.core.EcRequest; +import com.cool.store.sdk.ec.response.ChangeFollowUserResponse; + +public class ChangeFollowUserRequest extends EcRequest { + + + + @Override + public String getApiUrl() { + return "/ec/selectChangeUser"; + } + + @Override + public Class getResponseClass() { + return ChangeFollowUserResponse.class; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/SyncEcCustomerRequest.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/SyncEcCustomerRequest.java new file mode 100644 index 000000000..996c6bcd9 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/SyncEcCustomerRequest.java @@ -0,0 +1,26 @@ +package com.cool.store.sdk.ec.request; + +import com.cool.store.sdk.ec.core.EcRequest; +import com.cool.store.sdk.ec.response.SyncEcCustomerResponse; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author hxd + */ +@Data +@Accessors(chain = true) +public class SyncEcCustomerRequest extends EcRequest { + + @Override + public String getApiUrl() { + return "/ec/appletToEc"; + } + + + @Override + public Class getResponseClass() { + return SyncEcCustomerResponse.class; + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/UpdateCustomerRequest.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/UpdateCustomerRequest.java new file mode 100644 index 000000000..c2c30bb92 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/request/UpdateCustomerRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.sdk.ec.request; + +import com.cool.store.sdk.ec.core.EcRequest; +import com.cool.store.sdk.ec.response.UpdateCustomerResponse; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class UpdateCustomerRequest extends EcRequest { + + @Override + public String getApiUrl() { + return "/ec/updateCustomer"; + } + + @Override + public Class getResponseClass() { + return UpdateCustomerResponse.class; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/ChangeFollowUserResponse.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/ChangeFollowUserResponse.java new file mode 100644 index 000000000..7c9db1b32 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/ChangeFollowUserResponse.java @@ -0,0 +1,15 @@ +package com.cool.store.sdk.ec.response; + +import com.cool.store.sdk.ec.core.EcResponse; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author hxd + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ChangeFollowUserResponse extends EcResponse { + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/SyncEcCustomerResponse.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/SyncEcCustomerResponse.java new file mode 100644 index 000000000..80e7278a3 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/SyncEcCustomerResponse.java @@ -0,0 +1,16 @@ +package com.cool.store.sdk.ec.response; + +import com.cool.store.sdk.ec.core.EcResponse; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @author hxd + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class SyncEcCustomerResponse extends EcResponse { + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/UpdateCustomerResponse.java b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/UpdateCustomerResponse.java new file mode 100644 index 000000000..a18282a31 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/sdk/ec/response/UpdateCustomerResponse.java @@ -0,0 +1,16 @@ +package com.cool.store.sdk.ec.response; + +import com.cool.store.sdk.ec.core.EcResponse; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @author hxd + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class UpdateCustomerResponse extends EcResponse { + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/EcSyncService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/EcSyncService.java new file mode 100644 index 000000000..1901fd924 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/EcSyncService.java @@ -0,0 +1,11 @@ +package com.cool.store.service; + +import com.cool.store.request.CustomerInfoRequest; + +import java.util.List; + +public interface EcSyncService { + boolean ecToApplet(List queryListData); + + void getChannelSource(); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EcSyncServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EcSyncServiceImpl.java new file mode 100644 index 000000000..c8590dad6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EcSyncServiceImpl.java @@ -0,0 +1,278 @@ +package com.cool.store.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.HyPartnerBaseInfoDAO; +import com.cool.store.dao.HyPartnerLineInfoDAO; +import com.cool.store.dao.HyPartnerUserInfoDAO; +import com.cool.store.entity.*; +import com.cool.store.enums.LineStatusEnum; +import com.cool.store.enums.WorkflowStageEnum; +import com.cool.store.enums.WorkflowStatusEnum; +import com.cool.store.exception.ApiException; +import com.cool.store.http.UserSourceResponse; +import com.cool.store.mapper.HyPartnerUserChannelMapper; +import com.cool.store.request.CustomerInfoRequest; +import com.cool.store.sdk.ec.EcClient; +import com.cool.store.sdk.ec.bo.ChangeFollowUserBo; +import com.cool.store.sdk.ec.bo.UpdateCustomerBo; +import com.cool.store.sdk.ec.request.ChangeFollowUserRequest; +import com.cool.store.sdk.ec.request.UpdateCustomerRequest; +import com.cool.store.sdk.ec.response.ChangeFollowUserResponse; +import com.cool.store.sdk.ec.response.UpdateCustomerResponse; +import com.cool.store.service.EcSyncService; +import com.cool.store.utils.Post; +import com.cool.store.utils.StringUtil; +import com.cool.store.utils.UUIDUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +@Slf4j +@Service +public class EcSyncServiceImpl implements EcSyncService { + + + + @Value("${ec.baseUrl}") + private String baseUrl; + + @Resource + private HyPartnerLineInfoDAO hyPartnerLineInfoDAO; + + @Resource + private HyPartnerBaseInfoDAO hyPartnerBaseInfoDAO; + + @Resource + private HyPartnerUserInfoDAO hyPartnerUserInfoDAO; + + @Resource + private EnterpriseUserDAO enterpriseUserDAO; + + + @Resource + private HyPartnerUserChannelMapper hyPartnerUserChannelMapper; + + + @Override + public boolean ecToApplet(List queryListData) { + for (CustomerInfoRequest customerInfoItem : queryListData) { + try { + Thread.sleep(500L); + insertSelectiveSync(customerInfoItem); + } catch (Exception e) { + e.printStackTrace(); + sendFeiShuRobotMessage("推送:"+JSONObject.toJSONString(e),"27243d49-97ca-4981-8aec-7c3bf84eb660"); + } + } + return false; + } + + @Override + public void getChannelSource() { + String s = HttpUtil.get(baseUrl+"/ec/getChannelSource"); + UserSourceResponse userSourceResponse = JSONObject.parseObject(s, UserSourceResponse.class); + for (UserSourceResponse.ChannelSource channelSource : userSourceResponse.getData()) { + Long id = channelSource.getId(); + HyPartnerUserChannelDO selectByChannel = hyPartnerUserChannelMapper.selectByChannelId(id); + HyPartnerUserChannelDO hyPartnerUserChannel = new HyPartnerUserChannelDO(); + hyPartnerUserChannel.setChannelId(channelSource.getId()).setChannelName(channelSource.getName()); + //有就更新 没有插入 + if (ObjectUtil.isNotNull(selectByChannel)) { + hyPartnerUserChannel.setUpdateTime(new Date()).setId(selectByChannel.getId()); + hyPartnerUserChannelMapper.updateByPrimaryKeySelective(hyPartnerUserChannel); + }else { + hyPartnerUserChannel.setCreateTime(new Date()); + hyPartnerUserChannelMapper.insertSelective(hyPartnerUserChannel); + } + } + } + + /** + * 同步ec数据到表中 同时将部分数据同步到ec + * + * @param customerInfoItem + */ + @Transactional(rollbackFor = Exception.class) + public void insertSelectiveSync(CustomerInfoRequest customerInfoItem) throws ApiException { + if (StringUtil.isNotEmpty(customerInfoItem.getMobile())) { + customerInfoItem.setMobile(customerInfoItem.getMobile().split(" ")[1]); + } + //获取客户来源id + String channel = customerInfoItem.getChannel(); + HyPartnerUserChannelDO hyPartnerUserChannelDO = hyPartnerUserChannelMapper.selectByChannelName(channel); + Long channelId =null; + if (StringUtil.isNotEmpty(channel)) { + if (ObjectUtil.isNull(hyPartnerUserChannelDO)||ObjectUtil.isNull(hyPartnerUserChannelDO.getId())) { + getChannelSource(); + HyPartnerUserChannelDO channelDO = hyPartnerUserChannelMapper.selectByChannelName(channel); + channelId=channelDO.getId(); + }else { + HyPartnerUserChannelDO channelDO = hyPartnerUserChannelMapper.selectByChannelName(channel); + channelId=channelDO.getId(); + } + } + String newPartnerId = UUIDUtils.get32UUID(); + HyPartnerUserInfoDO resultUser = new HyPartnerUserInfoDO(); + resultUser.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile()); + + HyPartnerLineInfoDO resultLine = new HyPartnerLineInfoDO(); + String followUserName = customerInfoItem.getFollowUserName(); + String followUserMobile = customerInfoItem.getFollowUserMobile(); + //传递过来有跟进人的情况下查询跟进人是否存在 + if (StringUtil.isNotEmpty(followUserMobile)&&StringUtil.isNotEmpty(followUserMobile)) { + String userId = enterpriseUserDAO.selectByMobile("+86"+followUserMobile); + if (StringUtil.isEmpty(userId)) { + // 给飞书群发送消息 跟进人找不到 + sendFeiShuRobotMessage("推送:飞书架构中找不到该用户:【" + followUserName + "】,该用户电话号码为:" + followUserMobile,"27243d49-97ca-4981-8aec-7c3bf84eb660"); + throw new ApiException("飞书架构中找不到该用户:【" + followUserName + "】,该用户电话号码为:" + followUserMobile); + } + resultLine.setInvestmentManager(userId); + } + resultLine.setWorkflowStage(WorkflowStageEnum.INTENT.getCode()).setUserChannelId(Convert.toInt(channelId)) + .setLineStatus(StringUtil.isEmpty(customerInfoItem.getFollowUserName()) ? LineStatusEnum.PUBLIC_SEAS.getCode() : LineStatusEnum.PRIVATE_SEAS.getCode()); + + HyPartnerBaseInfoDO resultBase = new HyPartnerBaseInfoDO(); + resultBase.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile()); + + HyPartnerUserInfoDO newUserInfo = hyPartnerUserInfoDAO.selectByMobile(resultUser.getMobile()); + EcClient ecClient=new EcClient(); + //有就更新ec没有就插入 + if (newUserInfo != null) { + // EC与沪姨合伙人同时存在的线索用户,但用户姓名不同,将沪姨合伙人线索姓名同步至EC覆盖原EC线索姓名 + if (!newUserInfo.getUsername().equals(resultUser.getUsername())) { + UpdateCustomerRequest updateUserRequest=new UpdateCustomerRequest(); + UpdateCustomerBo updateCustomerBo = new UpdateCustomerBo(); + updateCustomerBo.setUsername(newUserInfo.getUsername()).setMobile(newUserInfo.getMobile()).setCrmId(customerInfoItem.getCrmId()); + updateUserRequest.setParameter(updateCustomerBo); + UpdateCustomerResponse updateUserExec = ecClient.exec(baseUrl,updateUserRequest); + } + String oldPartnerId = newUserInfo.getPartnerId(); + //线索表 + HyPartnerLineInfoDO partnerLine = hyPartnerLineInfoDAO.getByPartnerId(oldPartnerId); + if (partnerLine != null) { + // EC与沪姨合伙人同时存在的线索用户,但存在不同的跟进人,将沪姨合伙人跟进人信息同步至EC覆盖原EC跟进人信息 + if (StringUtil.isEmpty(partnerLine.getInvestmentManager())) { + if (StringUtil.isNotEmpty(resultLine.getInvestmentManager())) { + resultLine.setId(partnerLine.getId()).setUpdateTime(new Date()); + hyPartnerLineInfoDAO.updateByPrimaryKeySelective(resultLine); + } + }else { + EnterpriseUserDO enterpriseUser = enterpriseUserDAO.getUserInfoById(partnerLine.getInvestmentManager()); + enterpriseUser.setMobile(getNoWith86Number(enterpriseUser.getMobile())); + //电话相同但是名字不同 + if (enterpriseUser.getMobile().equals(followUserMobile) && !enterpriseUser.getName().equals(followUserName)) { + ChangeFollowUserRequest changeFollowUserRequest = new ChangeFollowUserRequest(); + ChangeFollowUserBo changeFollowUserBo = new ChangeFollowUserBo(); + changeFollowUserBo.setFollowUserId(customerInfoItem.getLastFollowUserId()).setCrmId(customerInfoItem.getCrmId()) + .setType(1).setUsername(enterpriseUser.getName()).setMobile(enterpriseUser.getMobile()); + changeFollowUserRequest.setParameter(changeFollowUserBo); + ChangeFollowUserResponse changeFollowUserExec = ecClient.exec(baseUrl,changeFollowUserRequest); + } + //电话不同 + if (!enterpriseUser.getMobile().equals(followUserMobile)) { + ChangeFollowUserRequest changeFollowUserRequest = new ChangeFollowUserRequest(); + ChangeFollowUserBo changeFollowUserBo = new ChangeFollowUserBo(); + changeFollowUserBo.setFollowUserId(customerInfoItem.getLastFollowUserId()).setCrmId(customerInfoItem.getCrmId()) + .setType(2).setUsername(enterpriseUser.getName()).setMobile(enterpriseUser.getMobile()); + changeFollowUserRequest.setParameter(changeFollowUserBo); + ChangeFollowUserResponse changeFollowUserExec = ecClient.exec(baseUrl,changeFollowUserRequest); + } + } + //base表 + HyPartnerBaseInfoDO partnerIdAndLine = hyPartnerBaseInfoDAO.getByPartnerIdAndLineId(partnerLine.getPartnerId(), partnerLine.getId()); + if (partnerIdAndLine == null) { + resultBase.setPartnerId(newPartnerId).setPartnerLineId(partnerLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())). + setCreateTime(new Date()); + hyPartnerBaseInfoDAO.insertSelective(resultBase); + } + } else { + resultLine.setPartnerId(newPartnerId).setCreateTime(new Date()); + hyPartnerLineInfoDAO.insertSelective(resultLine); + + resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())). + setCreateTime(new Date()); + hyPartnerBaseInfoDAO.insertSelective(resultBase); + } + } else { + resultUser.setPartnerId(newPartnerId).setCreateTime(new Date()); + hyPartnerUserInfoDAO.insertSelective(resultUser); + + resultLine.setPartnerId(newPartnerId).setCreateTime(new Date()); + hyPartnerLineInfoDAO.insertSelective(resultLine); + + resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())). + setCreateTime(new Date()); + hyPartnerBaseInfoDAO.insertSelective(resultBase); + } + } + + /** + * 得到不带86开头的号码 + * + * @param number + * @return + */ + public static String getNoWith86Number(String number) { + String regular = number; + if (StringUtils.isNotBlank(regular)) { + // 去掉+号 + while (regular.startsWith("+")) { + regular = regular.substring(1); + } + // 号码以0开始,去掉前缀 + while (regular.startsWith("0")) { + regular = regular.substring(1); + } + // 号码以86开始,去掉前缀 + while (regular.startsWith("86")) { + regular = regular.substring(2); + } + // 号码以0开始,去掉前缀 + while (regular.startsWith("0")) { + regular = regular.substring(1); + } + } + return regular; + } + + + /** + * 发送飞书机器人 + * + * @param text + * @param token + * @return + */ + public String sendFeiShuRobotMessage(String text, String token) { + HashMap map = new HashMap<>(4); + HashMap textMap = new HashMap(4); + textMap.put("text", text); + map.put("content", textMap); + map.put("msg_type", "text"); + String body = JSON.toJSONString(map); + String send = ""; + try { + send = Post.send("https://open.feishu.cn/open-apis/bot/v2/hook/" + token, body, new HashMap(4) {{ + put("Content-Type", "application/json"); + }}); + } catch (IOException e) { + e.printStackTrace(); + } + return send; + } + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/Client.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/Client.java new file mode 100644 index 000000000..17f4aeeb4 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/Client.java @@ -0,0 +1,164 @@ +package com.cool.store.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * @author leoxie + */ +public class Client { + + private String url; + private String method = "POST"; + private HashMap header; + private String data; + private Integer timeout = 8000; + private Integer maxLength = 10000; + + private static final Logger log = LoggerFactory.getLogger(Client.class); + + public String exec() throws IOException { + + HttpURLConnection connection = null; + OutputStreamWriter out = null; + BufferedReader reader = null; + StringBuilder res = null; + String result = null; + Long optTime = 0L; + InputStream is = null; + + LocalDateTime beginTime = LocalDateTime.now(); + + URL url = new URL(getUrl()); + connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + + //设置超时时间 + connection.setConnectTimeout(getTimeout()); + connection.setReadTimeout(getTimeout()); + + // 设置请求方式 + connection.setRequestMethod(getMethod()); + // 设置发送数据的格式 + if (!getHeader().isEmpty()) { + for (Map.Entry entry : getHeader().entrySet()) { + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + //发起连接 + connection.connect(); + + // utf-8编码[推送提交的参数] + if (!getData().isEmpty()) { + out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8); + out.append(getData()); + out.flush(); + out.close(); + } + + if(connection.getResponseCode() > 2000){ + is = connection.getErrorStream(); + }else{ + is = connection.getInputStream(); + } + // 读取响应 + reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + String line; + res = new StringBuilder(); + while ((line = reader.readLine()) != null) { + res.append(line); + } + reader.close(); + + result = res.toString(); + return result; + + }catch (Exception e){ + throw e; + }finally { + if (connection != null){ + connection.disconnect(); + } + + if(out != null){ + out.close(); + } + + if(reader != null){ + reader.close(); + } + +// log.info("request url is : " + getUrl()); +// log.info("request params is : " + getData()); +// if(result != null && result.length() < maxLength) { +// log.info("response : " + result); +// } +// optTime = Duration.between(beginTime,LocalDateTime.now()).toMillis(); +// log.info("response time: " + optTime.toString()); + } + } + + public String getUrl() { + assert !url.isEmpty(); + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMethod() { + assert !method.isEmpty(); + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public HashMap getHeader() { + return header; + } + + public void setHeader(HashMap header) { + this.header = header; + } + + public String getData() { + return data; + } + + /** + * 提交参数 + * + * 如果是json形式,那么就是json字符串, + * 如果是表单形式,就是name1=value1&name2=value2 的形式 + * @param data + */ + public void setData(String data) { + this.data = data; + } + + public Integer getTimeout() { + return timeout; + } + + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/Get.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/Get.java new file mode 100644 index 000000000..c1a6a810f --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/Get.java @@ -0,0 +1,104 @@ +package com.cool.store.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author leoxie + */ +public class Get { + + private static final Logger log = LoggerFactory.getLogger(Get.class); + + private static final Integer connectTimeout = 1000; + private static final Integer timeout = 5000; + + public static String send(String url, String param) throws IOException { + return send(url,param,true); + } + + /** + * 向指定URL发送GET方法的请求 + * + * @param url 发送请求的URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return URL 所代表远程资源的响应结果 + */ + public static String send(String url, String param,boolean hasLog) throws IOException { + return send(url, param, hasLog, null); + } + + public static String send(String url, String param, boolean hasLog, HashMap headers) throws IOException { + StringBuilder result = new StringBuilder(); + BufferedReader reader = null; + HttpURLConnection connection = null; + + try { + String urlNameString = url + (param.isEmpty()?"":"?" + param); + + log.info("url:"+url); + log.info("param:"+param); + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + connection = (HttpURLConnection)realUrl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + + //添加头部信息 + if(headers != null && !headers.isEmpty()){ + for (Map.Entry entry:headers.entrySet()) { + connection.setRequestProperty(entry.getKey(),entry.getValue()); + } + } + + connection.setConnectTimeout(connectTimeout); + connection.setReadTimeout(timeout); + // 建立实际的连接 + connection.connect(); + + // 获取所有响应头字段 + Map> responseHeader = connection.getHeaderFields(); + // 遍历所有的响应头字段 + if(hasLog) { + log.info("响应头"); + for (String key : responseHeader.keySet()) { + log.info(key + "--->" + responseHeader.get(key)); + } + } + + // 定义 BufferedReader输入流来读取URL的响应 + reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + result.append(line); + } + + if(hasLog) { + log.info("响应结果:" + result.toString()); + } + + return result.toString(); + } finally { + if (connection != null){ + connection.disconnect(); + } + + if (reader != null) { + reader.close(); + } + } + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/MapUtil.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/MapUtil.java new file mode 100644 index 000000000..d4fc55063 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/MapUtil.java @@ -0,0 +1,123 @@ +package com.cool.store.utils; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class MapUtil { + public static void setMapValue(Map hashMap, String name, T value) { + if (value == null) { + return; + } + hashMap.put(name, value); + } + + public static void setMapObjectValue(Map hashMap, T obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + if (obj == null) { + return; + } + Field[] fields = obj.getClass().getDeclaredFields(); + for (Field field : fields) { + String name = field.getName(); + String uName = name.substring(0, 1).toUpperCase() + name.substring(1); + + Method m = obj.getClass().getMethod("get" + uName); + Object value = m.invoke(obj); + if (value == null) { + continue; + } + // 基础类型 + if (isBaseType(value)) { + setMapValue(hashMap, name, value); + } else if (value instanceof List) { + if (((List) value).size() > 0) { + setMapObjectValue(hashMap, ((List) value).get(0)); + } + } else { + setMapObjectValue(hashMap, value); + } + } + + } + + public static boolean isBaseType(Object object) { + Class className = object.getClass(); + return className.equals(Integer.class) || + className.equals(Byte.class) || + className.equals(Long.class) || + className.equals(Double.class) || + className.equals(Float.class) || + className.equals(Character.class) || + className.equals(Short.class) || + className.equals(Boolean.class) || + className.equals(String.class); + } + + /** + * 实体类对象转URL参 + * @param t 实体类对象 + * @param callSuper 是否转换父类成员 + * @param 实体类泛型 + * @return a=1&b=2 + */ + public static String entityToUrlParam(T t, boolean callSuper){ + // URL 参数存储器 + StringBuffer urlParam = new StringBuffer(); + //扩展转换父类成员功能 + entitySuperclassToUrlParam(t, t.getClass(),callSuper,urlParam); + if(urlParam.length()>0){ + //去除最后一个&字符 + urlParam.deleteCharAt(urlParam.length() - 1); + } + return urlParam.toString(); + } + + public static String entityToUrlParam(T t) { + if (t == null) { + return null; + } + return entityToUrlParam(t, true); + } + + /** + * 实体类对象转URL参 + * @param t 实体类对象 + * @param clazz 实体类类型 + * @param callSuper 是否转换父类成员 + * @param urlParam URL 参数存储器 + * @param 实体类泛型 + * @return a=1&b=2 + */ + @Deprecated + public static void entitySuperclassToUrlParam(T t,Class clazz,boolean callSuper,StringBuffer urlParam){ + //如果实体类对象为Object类型,则不处理 + if(!clazz.equals(Object.class)) { + //获取实体类对象下的所有成员,并保存到 URL 参数存储器中 + Arrays.stream(clazz.getDeclaredFields()).forEach(field -> { + //设置可以操作私有成员 + field.setAccessible(true); + try { + //获取成员值 + Object value = field.get(t); + //成员值为 Null 时,则不处理 + if (Objects.nonNull(value)) { + urlParam.append(field.getName()).append("=").append(value).append("&"); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + }); + //是否转换父类成员 + if(callSuper){ + //获取父类类型 + clazz = clazz.getSuperclass(); + //递归调用,获取父类的处理结果 + entitySuperclassToUrlParam(t,clazz,callSuper,urlParam); + } + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/Post.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/Post.java new file mode 100644 index 000000000..b1a393f5b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/Post.java @@ -0,0 +1,37 @@ +package com.cool.store.utils; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * @author leoxie + */ +public class Post { + + /** + * 向指定 URL 发送POST方法的请求 + * @param url 发送请求的 URL + * @param data 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String send(String url, String data,HashMap headers) throws IOException { + Client client = new Client(); + client.setData(data); + client.setUrl(url); + + HashMap headerMap = new HashMap<>(16); + headerMap.put("Content-Type","application/x-www-form-urlencoded"); + + //添加头部信息 + if(!headers.isEmpty()){ + for (Map.Entry entry:headers.entrySet()) { + headerMap.put(entry.getKey(),entry.getValue()); + } + } + client.setHeader(headerMap); + + return client.exec(); + } + +} diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-webb/src/main/java/com/cool/store/config/TokenValidateFilter.java index aeb9c1d94..ebf870094 100644 --- a/coolstore-partner-webb/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-webb/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -44,7 +44,7 @@ public class TokenValidateFilter implements Filter { Lists.newArrayList("/web/check/ok","/check/ok", "/partner/pc/doc.html","/partner/pc/v2/api-docs","/**/test/**","/partner/pc/feiShuLogin","/partner/pc/oss/getUploadFileConfig", - "/**/swagger*/**", "/**/webjars/**"); + "/**/swagger*/**", "/**/webjars/**","/**/ecSync/ecToApplet/**"); /** diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/controller/EcSyncController.java b/coolstore-partner-webb/src/main/java/com/cool/store/controller/EcSyncController.java new file mode 100644 index 000000000..4cebd591d --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/controller/EcSyncController.java @@ -0,0 +1,31 @@ +package com.cool.store.controller; + + +import com.cool.store.request.CustomerInfoRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.EcSyncService; +import com.cool.store.vo.InterviewScheduleInfoVO; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + + +@RestController +@RequestMapping("/ecSync") +@Slf4j +public class EcSyncController { + + + @Resource + private EcSyncService ecSyncService; + + @PostMapping(path = "/ecToApplet") + @ApiOperation("ec同步数据到小程序") + public ResponseResult ecToApplet(@RequestBody List queryListData){ + return ResponseResult.success(ecSyncService.ecToApplet(queryListData)); + } + +}