Commit b1e0a158 by 徐高华

Merge branch 'master' into 'feature/xgh/240625上线'

Master

See merge request !1953
parents 6927181a 7377271d
......@@ -21,7 +21,7 @@ public class WxUserAddLogQDTO implements Serializable{
private String staffName;
private String clerkId;
private Integer addWay ;
private Date qwAddTime ;
private Long qwAddTime ;
private String friendClerkId ;
private String friendStoreId ;
......@@ -41,11 +41,11 @@ public class WxUserAddLogQDTO implements Serializable{
this.friendStoreId = friendStoreId;
}
public Date getQwAddTime() {
public Long getQwAddTime() {
return qwAddTime;
}
public void setQwAddTime(Date qwAddTime) {
public void setQwAddTime(Long qwAddTime) {
this.qwAddTime = qwAddTime;
}
......
......@@ -16,7 +16,8 @@ public enum TriggerCustomerChannelType {
CUSTOMER_GROUP(2, "客户群"),
DIALOG_BOX(3, "对话框"),
CONTENT_COPY(4, "复制文案"),
CONTENT_DOWNLOAD(5, "下载素材")
CONTENT_DOWNLOAD(5, "下载素材"),
RECOMMEND(6, "潜客推荐")
;
/**
......@@ -24,7 +25,7 @@ public enum TriggerCustomerChannelType {
* @return
*/
public static List<Integer> showDescChannel(){
return Arrays.asList(PYQ.code, CUSTOMER_GROUP.code, DIALOG_BOX.code);
return Arrays.asList(PYQ.code, CUSTOMER_GROUP.code, DIALOG_BOX.code,RECOMMEND.code);
}
public static TriggerCustomerChannelType getInstance(Integer code) {
......
......@@ -199,7 +199,9 @@ public interface ExternalClerkRelatedApiService {
List<String> listMemberAndStaff(List<String> memberIdList , String StaffId , String enterpriseId) ;
List<String> listMemberAndStaff(List<String> memberIdList , String StaffId , String enterpriseId) ;
List<ExternalClerkRelatedDTO> listRelationMemberAndStaff(List<String> memberIdList , String StaffId , String enterpriseId) ;
/**
*
......
......@@ -18,7 +18,7 @@ public interface TabHaobanExternalClerkRelatedMapper {
int updateByPrimaryKeySelective(TabHaobanExternalClerkRelated record);
int selectByClerkIdAndExternalUserId(@Param("clerkId") String clerkId,
int selectByClerkIdAndExternalUserId(@Param("staffId") String staffId,
@Param("externalUserId") String externalUserId);
int delByUserIdAndExternalUserId(@Param("externalUserId") String externalUserId , @Param("staffId") String staffId);
......@@ -397,6 +397,8 @@ public interface TabHaobanExternalClerkRelatedMapper {
List<String> listMemberAndStaff(@Param("memberIdList")List<String> memberIdList, @Param("staffId")String staffId, @Param("enterpriseId")String enterpriseId);
List<TabHaobanExternalClerkRelated> listRelationMemberAndStaff(@Param("memberIdList")List<String> memberIdList, @Param("staffId")String staffId, @Param("enterpriseId")String enterpriseId);
/**
* 查询成员的好友列表
*/
......
package com.gic.haoban.manage.service.dao.mapper.content.holo;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import com.alibaba.hologres.client.HoloClient;
import com.alibaba.hologres.client.HoloConfig;
import com.ctrip.framework.apollo.Config;
......@@ -9,6 +18,12 @@ import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @Author MUSI
* @Date 2023/9/4 4:11 PM
......@@ -19,22 +34,34 @@ import org.springframework.stereotype.Component;
@Component
public class HoloDataSource implements InitializingBean, DisposableBean {
HoloClient client;
private volatile HoloClient client;
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public synchronized void init() {
public synchronized void init() {
try {
Config appConfig = ConfigService.getAppConfig();
String holoUrl = appConfig.getProperty("holo.url", "");
String holoUserName = appConfig.getProperty("holo.username", "");
String holoPassword = appConfig.getProperty("holo.password", "");
Pair<String, String> holoAuth = getHoloAuth();
if (holoAuth == null) {
log.info("holo链接初始化获取授权信息失败");
return;
}
String holoUserName = holoAuth.getKey();
String holoPassword = holoAuth.getValue();
HoloConfig holoConfig = new HoloConfig();
holoConfig.setJdbcUrl(holoUrl);
holoConfig.setUsername(holoUserName);
holoConfig.setPassword(holoPassword);
holoConfig.setConnectionMaxIdleMs(13000);
this.client = new HoloClient(holoConfig);
this.client.setAsyncCommit(false);
HoloClient newClient = new HoloClient(holoConfig);
newClient.setAsyncCommit(false);
if (this.client != null) {
this.client.close();
this.client = null;
}
this.client = newClient;
log.info("holo链接初始化完成");
}catch (Exception ex) {
log.info("初始化client 异常 >>>", ex);
......@@ -46,6 +73,7 @@ public class HoloDataSource implements InitializingBean, DisposableBean {
if (client != null) {
client.close();
}
scheduler.shutdown();
}
@Override
......@@ -53,13 +81,42 @@ public class HoloDataSource implements InitializingBean, DisposableBean {
if (client == null) {
this.init();
}
DateTime now = DateUtil.date();
Date todayTwo = DateUtil.beginOfDay(now).offset(DateField.HOUR_OF_DAY, 2);
if (now.after(todayTwo)) {
todayTwo = DateUtil.offsetDay(todayTwo, 1);
}
scheduler.scheduleAtFixedRate(this::reinitialize, DateUtil.between(now,todayTwo, DateUnit.SECOND,true), 24 * 60 * 60, TimeUnit.SECONDS);
}
public HoloClient getClient() {
if (this.client == null) {
this.init();
synchronized (this) {
if (this.client == null) {
this.init();
}
}
}
return this.client;
}
// 重新初始化方法
public synchronized void reinitialize() {
this.init();
}
private Pair<String, String> getHoloAuth() {
//{"appId":"ops_key","cluster":"default","namespaceName":"key_config","configurations":{"demo_aliyun_key":"{\n \"LTAI5tMF2pZGShdULEYbyntc\": \"pC16FjCeklpXg18duNhJsEF91FvxpE\"\n}"},"releaseKey":"20240604165817-7632f04ffbe11f53"}
String result = HttpUtil.get("http://10.0.100.2:7080/configs/ops_key/default/key_config",10000);
JSON json = JSONUtil.parse(result);
String authInfo = json.getByPath("configurations.demo_aliyun_key", String.class);
JSON authJson = JSONUtil.parseObj(authInfo);
Map<String, String> map = authJson.toBean(new TypeReference<Map<String, String>>() {});
for (Map.Entry<String, String> entry : map.entrySet()) {
return new Pair<>(entry.getKey(), entry.getValue());
}
return null;
}
}
......@@ -46,7 +46,7 @@ public class TabHaobanInteractRecord implements Serializable {
*/
private String storeId;
/**
* 线索来源 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材
* 线索来源 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材;6 潜客推荐
* @see TriggerCustomerChannelType
*/
private Integer channelSource;
......
......@@ -48,7 +48,7 @@ public class TabHaobanTriggerCustomerDetail implements Serializable {
private String storeId;
/**
* 渠道类型 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材
* 渠道类型 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材;6 潜客推荐
*/
private Integer channelType;
/**
......
......@@ -59,7 +59,7 @@ public class TabWxUserAddLog implements Serializable {
private java.util.Date updateTime;
/**是否所有好友删除 1是0否*/
private Integer allDelFlag;
private Date qwAddTime ;
private Long qwAddTime ;
private String friendClerkId ;
private String friendStoreId ;
......@@ -80,11 +80,11 @@ public class TabWxUserAddLog implements Serializable {
this.friendStoreId = friendStoreId;
}
public Date getQwAddTime() {
public Long getQwAddTime() {
return qwAddTime;
}
public void setQwAddTime(Date qwAddTime) {
public void setQwAddTime(Long qwAddTime) {
this.qwAddTime = qwAddTime;
}
......
......@@ -44,7 +44,7 @@ public class TriggerCustomerDetailBO implements Serializable {
*/
private String storeId;
/**
* 渠道类型 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材
* 渠道类型 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材;6 潜客推荐
*/
private Integer channelType;
/**
......
......@@ -41,7 +41,7 @@ public class InteractRecordMessageBO implements Serializable {
private String materialId;
/**
* 来源渠道
* 线索来源 1朋友圈; 2客户群; 3 对话框; 0其他
* 线索来源 1朋友圈; 2客户群; 3 对话框; 6 潜客推荐; 0其他
*/
private Integer channelSource;
/**
......@@ -120,4 +120,9 @@ public class InteractRecordMessageBO implements Serializable {
* 3 基础线下单
*/
private Integer orderType;
/**
* 商品类型 微盟、达摩
*/
private String goodsChannel;
}
......@@ -9,6 +9,8 @@ import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* @Author MUSI
* @Date 2023/9/4 3:14 PM
......@@ -71,6 +73,8 @@ public class MessageConvertHelper {
String weimoFlag = cuspJson.getString("is_weiMob");
interactRecordMessageBO.setWeimoGoodsFlag(this.convertWeimoFlag(weimoFlag));
String goodsChannel = cuspJson.getString("goods_channel");
interactRecordMessageBO.setGoodsChannel(goodsChannel);
String goodsId = cuspJson.getString("goods_id");
interactRecordMessageBO.setGoodsId(goodsId);
String goodsCode = cuspJson.getString("goods_code");
......@@ -93,6 +97,7 @@ public class MessageConvertHelper {
String refUrl = syspJson.getString("ref_url");
interactRecordMessageBO.setRefUrl(refUrl);
dealRecordFilter(eventCode, interactRecordMessageBO);
return interactRecordMessageBO;
}
......@@ -110,11 +115,24 @@ public class MessageConvertHelper {
return 2;
case "对话框":
return 3;
case "潜客推荐":
return 6;
default:
return 0;
}
}
private void dealRecordFilter(String eventCode,InteractRecordMessageBO interactRecordMessageBO) {
if (StringUtils.isBlank(eventCode) || interactRecordMessageBO == null) {
return;
}
// 商品详情页埋点如果是微盟类型商品不计算页面停留时长
if (Objects.equals("store_goods_detail", eventCode)
&& Objects.equals("微盟", interactRecordMessageBO.getGoodsChannel())) {
interactRecordMessageBO.setDurationTime(0);
}
}
private Integer convertEventType(String eventCode) {
if (StringUtils.isBlank(eventCode)) {
return null;
......
......@@ -87,15 +87,15 @@ public class ExternalClerkRelatedServiceImpl implements ExternalClerkRelatedServ
@Override
public void insert(TabHaobanExternalClerkRelated related) {
String clerkId = related.getClerkId();
String staffId = related.getStaffId() ;
String externalUserId = related.getExternalUserId();
String lockKey = "addExternalUser:"+externalUserId+clerkId ;
int num1 = mapper.selectByClerkIdAndExternalUserId(clerkId, externalUserId);
String lockKey = "addExternalUser:"+externalUserId+staffId ;
int num1 = mapper.selectByClerkIdAndExternalUserId(staffId, externalUserId);
if(num1 > 0) {
return ;
}
RedisUtil.lock(lockKey,2L);
int num2 = mapper.selectByClerkIdAndExternalUserId(clerkId, externalUserId);
int num2 = mapper.selectByClerkIdAndExternalUserId(staffId, externalUserId);
logger.info("好友数={},{},{}",num1,num2,externalUserId);
if (num2 == 0) {
String uuId = StringUtil.randomUUID();
......@@ -168,7 +168,7 @@ public class ExternalClerkRelatedServiceImpl implements ExternalClerkRelatedServ
wxUserAddLogQDTO.setStaffId(related.getStaffId());
wxUserAddLogQDTO.setClerkId(related.getClerkId());
if(null != related.getAddTime()) {
wxUserAddLogQDTO.setQwAddTime(new Date(related.getAddTime()*1000));
wxUserAddLogQDTO.setQwAddTime(related.getAddTime());
}
wxUserAddLogQDTO.setFriendClerkId(related.getClerkId());
wxUserAddLogQDTO.setFriendStoreId(related.getStoreId());
......
......@@ -99,14 +99,32 @@ public class StaffClerkRelationServiceImpl implements StaffClerkRelationService
public List<StaffClerkRelationDTO> listBindCodeByStaffId(List<String> enterpriseIdList, String staffId) {
return this.filterDelClerkList(mapper.listBindCodeByStaffId(enterpriseIdList, staffId));
}
private String changeExistClerk(String wxEnterpriseId , String staffId , String newClerkId) {
if(StringUtils.isBlank(newClerkId)) {
return newClerkId ;
}
ClerkDTO clerkDTO = this.clerkService.getclerkById(newClerkId) ;
String storeId = clerkDTO.getStoreId() ;
List<StaffClerkRelationDTO> relationList = this.listByStaffId(wxEnterpriseId, staffId) ;
if(CollectionUtils.isEmpty(relationList)) {
return newClerkId ;
}
relationList = relationList.stream().filter(o->o.getStoreId().equals(storeId)).collect(Collectors.toList()) ;
if(CollectionUtils.isEmpty(relationList)) {
return newClerkId ;
}
return relationList.get(0).getClerkId() ;
}
/*
* 导购进行解绑/换导购,更新好友和导购关联关系
*/
@Override
public boolean delBind(String oldClerkId, String optStaffId, int channelCode, String newClerkId, String wxEnterpriseId) {
boolean changeClerkFlag = StringUtils.isNotEmpty(newClerkId) ;
logger.info("导购解绑/换导购={},oldClerkId={},optStaffId={}",changeClerkFlag,oldClerkId,optStaffId);
logger.info("导购解绑/换导购={},oldClerkId={},optStaffId={},newClerkId={},channelCode={}",changeClerkFlag,oldClerkId,optStaffId,newClerkId,channelCode);
if(StringUtils.isNotEmpty(optStaffId) && !"-1".equals(optStaffId)) {
TabHaobanStaff staff = this.staffService.selectById(optStaffId) ;
if(null != staff) {
......@@ -119,6 +137,8 @@ public class StaffClerkRelationServiceImpl implements StaffClerkRelationService
logger.info("老的绑定关联不存在,oldClerkId={}", oldClerkId);
return true;
}
newClerkId = this.changeExistClerk(clerkRelation.getWxEnterpriseId() ,clerkRelation.getStaffId() , newClerkId) ;
logger.info("转换后的新导购={}",newClerkId);
// 如果是区经
if(clerkRelation.getManageFlag()==1) {
this.mapper.changeStatusByClerkId(oldClerkId, 0);
......
......@@ -524,6 +524,12 @@ public class ExternalClerkRelatedApiServiceImpl implements ExternalClerkRelatedA
}
@Override
public List<ExternalClerkRelatedDTO> listRelationMemberAndStaff(List<String> memberIdList, String staffId, String enterpriseId) {
List<TabHaobanExternalClerkRelated> list = tabHaobanExternalClerkRelatedMapper.listRelationMemberAndStaff(memberIdList, staffId, enterpriseId);
return EntityUtil.changeEntityListNew(ExternalClerkRelatedDTO.class, list);
}
@Override
public Map<String, List<ClerkStaffWxUserDTO>> listMemberStaffRel(List<String> memberIdList, List<String> clerkIdList, String enterpriseId, String wxEnterpriseId) {
if (CollectionUtils.isEmpty(memberIdList) || CollectionUtils.isEmpty(clerkIdList)) {
// 2个列表都为空查不了关系
......
......@@ -250,7 +250,7 @@ public class MemberUnionidRelatedApiServiceImpl implements MemberUnionidRelatedA
wxUserAddLogQDTO.setClerkId(related.getClerkId());
wxUserAddLogQDTO.setDelClerkFlag(true);
if(null != related.getAddTime()) {
wxUserAddLogQDTO.setQwAddTime(new Date(related.getAddTime()*1000));
wxUserAddLogQDTO.setQwAddTime(related.getAddTime());
}
wxUserAddLogQDTO.setFriendClerkId(related.getClerkId());
wxUserAddLogQDTO.setFriendStoreId(related.getStoreId());
......@@ -678,7 +678,7 @@ public class MemberUnionidRelatedApiServiceImpl implements MemberUnionidRelatedA
wxUserAddLogQDTO.setClerkId(hyClerkId);
wxUserAddLogQDTO.setAddWay(dto.getAddWay());
if(StringUtils.isNotBlank(dto.getAddCreateTime())) {
wxUserAddLogQDTO.setQwAddTime(new Date(Long.valueOf(createTime)*1000));
wxUserAddLogQDTO.setQwAddTime(Long.valueOf(createTime));
}
wxUserAddLogQDTO.setFriendClerkId(staffClerkRelationDTO.getClerkId());
wxUserAddLogQDTO.setFriendStoreId(staffClerkRelationDTO.getStoreId());
......
......@@ -231,7 +231,7 @@
select
count(*)
from tab_haoban_external_clerk_related
where clerk_id = #{clerkId,jdbcType=VARCHAR}
where staff_id = #{staffId}
and external_user_id = #{externalUserId}
and status_flag = 1
</select>
......@@ -848,6 +848,18 @@
AND status_flag = 1
</select>
<select id="listRelationMemberAndStaff" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from tab_haoban_external_clerk_related
where member_id in
<foreach collection="memberIdList" item="item" separator="," open="(" close=")">
#{item}
</foreach>
and staff_id = #{staffId}
and enterprise_id = #{enterpriseId}
AND status_flag = 1
</select>
<select id="listByWxEnterpriseId" resultType="java.lang.String">
select staff_id
from tab_haoban_external_clerk_related
......@@ -918,7 +930,7 @@
<select id="halfDelFriendPage" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> from tab_haoban_external_clerk_related
where wx_enterprise_id = #{wxEnterpriseId} and status_flag in (1,3,4) and external_status = 3
and half_del_time is null limit ${startItem}, 1000
and half_del_time is null limit 1000
</select>
<update id="updateHalfTime">
......
......@@ -169,4 +169,11 @@ public class GlobalExceptionHandler extends WebBaseController {
return RestResponse.failure(ex.getCode(), ex.getMessage());
}
@ResponseBody
@ExceptionHandler(com.gic.commons.exception.DataApiException.class)
public RestResponse dataApiExceptionCommon(HttpServletResponse response, com.gic.commons.exception.DataApiException ex) {
logger.info("DataApiException common异常信息:{}", ex);
return RestResponse.failure(ex.getCode(), ex.getMessage());
}
}
package com.gic.haoban.manage.web.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.DataApiUtils;
import com.gic.enterprise.api.dto.security.DownloadReportDTO;
import com.gic.haoban.manage.web.vo.eventtracking.WechatEventTrackingClerkVO;
import com.gic.web.common.download.DownloadHandlerAbstract;
import com.gic.web.common.download.context.Context;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 数据-登录数据-好办使用详情
*/
@Component
public class WechatEventTrackingClerkDetailHandle extends DownloadHandlerAbstract<WechatEventTrackingClerkVO> {
private static final Logger LOGGER = LogManager.getLogger(WechatEventTrackingClerkDetailHandle.class);
@Override
public List<WechatEventTrackingClerkVO> getData(Context context, String searchDataParams, Integer currentPage) {
boolean isFirst = currentPage != null && currentPage == 1;
if (isFirst) {
LOGGER.info("数据-登录数据-好办使用导购详情导出日志");
}
JSONObject jsonObject = JSON.parseObject(searchDataParams);
jsonObject.put("pageNum", currentPage);
jsonObject.put("pageSize", getPageSize());
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), "data_point_anal_hb_app_clerk");
List<JSONObject> list = DataApiUtils.getPageList(res);
if (CollectionUtils.isNotEmpty(list)) {
List<WechatEventTrackingClerkVO> result = JSONObject.parseArray(JSON.toJSONString(list), WechatEventTrackingClerkVO.class);
return result;
}
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames(Context context){
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("indexList");
return list;
}
@Override
public LinkedHashMap<String, List<String>> doubleColumnNames() {
return null;
}
@Override
public List<String> getColumns() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumns(Context context) {
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("fieldList");
return list;
}
}
package com.gic.haoban.manage.web.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.enterprise.api.dto.security.DownloadReportDTO;
import com.gic.haoban.manage.web.utils.data.StoreAuthUtils;
import com.gic.haoban.manage.web.vo.eventtracking.WechatEventTrackingStoreGroupVO;
import com.gic.web.common.download.DownloadHandlerAbstract;
import com.gic.web.common.download.context.Context;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 数据-登录数据-好办使用详情
*/
@Component
public class WechatEventTrackingStoreGroupHandle extends DownloadHandlerAbstract<WechatEventTrackingStoreGroupVO> {
@Autowired
private StoreAuthUtils storeAuthUtils;
@Override
public List<WechatEventTrackingStoreGroupVO> getData(Context context, String searchDataParams, Integer currentPage) {
List<JSONObject> list = storeAuthUtils.getDataCommonParent(searchDataParams, currentPage,
"数据-登录数据-好办使用详情导出日志进来", getPageSize(), false, true).getRows();
if (CollectionUtils.isNotEmpty(list)) {
List<WechatEventTrackingStoreGroupVO> result = JSONObject.parseArray(JSON.toJSONString(list), WechatEventTrackingStoreGroupVO.class);
return result;
}
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames(Context context){
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("indexList");
return list;
}
@Override
public LinkedHashMap<String, List<String>> doubleColumnNames() {
return null;
}
@Override
public List<String> getColumns() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumns(Context context) {
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("fieldList");
return list;
}
}
package com.gic.haoban.manage.web.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.Page;
import com.gic.commons.util.DataApiUtils;
import com.gic.enterprise.api.dto.security.DownloadReportDTO;
import com.gic.haoban.manage.web.utils.data.StoreAuthUtils;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkLostClerkVO;
import com.gic.web.common.download.DownloadHandlerAbstract;
import com.gic.web.common.download.context.Context;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* 数据-企微数据-流失好友-导购
*/
@Component
public class WechatWorkLostClerkHandle extends DownloadHandlerAbstract<WechatWorkLostClerkVO> {
private static final Logger LOGGER = LogManager.getLogger(WechatWorkLostClerkHandle.class);
@Autowired
private StoreAuthUtils storeAuthUtils;
@Override
public List<WechatWorkLostClerkVO> getData(Context context, String searchDataParams, Integer currentPage) {
boolean isFirst = currentPage != null && currentPage == 1;
if (isFirst) {
LOGGER.info("数据-企微数据-流失好友-导购导出日志");
}
JSONObject jsonObject = JSON.parseObject(searchDataParams);
jsonObject.put("pageNum", currentPage);
jsonObject.put("pageSize", getPageSize());
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), "data_mbr_scale_haoban_background_loss_statisti");
List<JSONObject> list = DataApiUtils.getPageList(res);
jsonObject.put("groupType", 1);
jsonObject.put("storeGroup", 8);
if (list == null) {
list = new ArrayList<>();
}
if (isFirst) {
Map<String, Object> totalRes = DataApiUtils.http(jsonObject.toJSONString(), "data_mbr_scale_haoban_background_loss_statisti");
Page page = DataApiUtils.getPageData(totalRes);
if (page != null) {
List<JSONObject> totalList = page.getResult();
if (CollectionUtils.isNotEmpty(totalList)) {
JSONObject total = totalList.get(0);
total.put("clerkName", "合计(" + page.getTotalCount() + ")");
list.add(0, total);
}
}
}
if (CollectionUtils.isNotEmpty(list)) {
List<WechatWorkLostClerkVO> result = JSONObject.parseArray(JSON.toJSONString(list), WechatWorkLostClerkVO.class);
return result;
}
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames(Context context){
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("indexList");
return list;
}
@Override
public LinkedHashMap<String, List<String>> doubleColumnNames() {
return null;
}
@Override
public List<String> getColumns() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumns(Context context) {
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("fieldList");
return list;
}
}
package com.gic.haoban.manage.web.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.DataApiUtils;
import com.gic.enterprise.api.dto.security.DownloadReportDTO;
import com.gic.haoban.manage.web.utils.data.StoreAuthUtils;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkLostDetailVO;
import com.gic.web.common.download.DownloadHandlerAbstract;
import com.gic.web.common.download.context.Context;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 数据-企微数据-流失好友-明细
*/
@Component
public class WechatWorkLostDetailHandle extends DownloadHandlerAbstract<WechatWorkLostDetailVO> {
private static final Logger LOGGER = LogManager.getLogger(WechatWorkLostDetailHandle.class);
@Autowired
private StoreAuthUtils storeAuthUtils;
@Override
public List<WechatWorkLostDetailVO> getData(Context context, String searchDataParams, Integer currentPage) {
boolean isFirst = currentPage != null && currentPage == 1;
if (isFirst) {
LOGGER.info("数据-企微数据-流失好友-明细导出日志");
}
JSONObject jsonObject = JSON.parseObject(searchDataParams);
jsonObject.put("pageNum", currentPage);
jsonObject.put("pageSize", getPageSize());
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), "data_mbr_scale_haoban_background_loss_detail");
List<JSONObject> list = DataApiUtils.getPageList(res);
if (CollectionUtils.isNotEmpty(list)) {
List<WechatWorkLostDetailVO> result = JSONObject.parseArray(JSON.toJSONString(list), WechatWorkLostDetailVO.class);
return result;
}
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames(Context context){
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("indexList");
return list;
}
@Override
public LinkedHashMap<String, List<String>> doubleColumnNames() {
return null;
}
@Override
public List<String> getColumns() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumns(Context context) {
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("fieldList");
return list;
}
}
package com.gic.haoban.manage.web.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.enterprise.api.dto.security.DownloadReportDTO;
import com.gic.haoban.manage.web.utils.data.StoreAuthUtils;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkLostStoreGroupVO;
import com.gic.web.common.download.DownloadHandlerAbstract;
import com.gic.web.common.download.context.Context;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 数据-企微数据-流失好友
*/
@Component
public class WechatWorkLostStoreGroupHandle extends DownloadHandlerAbstract<WechatWorkLostStoreGroupVO> {
private static final Logger LOGGER = LogManager.getLogger(WechatWorkLostStoreGroupHandle.class);
@Autowired
private StoreAuthUtils storeAuthUtils;
@Override
public List<WechatWorkLostStoreGroupVO> getData(Context context, String searchDataParams, Integer currentPage) {
List<JSONObject> list = storeAuthUtils.getDataCommon(searchDataParams, currentPage,
"数据-企微数据-流失好友导出日志进来", getPageSize(), false).getRows();
if (CollectionUtils.isNotEmpty(list)) {
List<WechatWorkLostStoreGroupVO> result = JSONObject.parseArray(JSON.toJSONString(list), WechatWorkLostStoreGroupVO.class);
return result;
}
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames(Context context){
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("indexList");
return list;
}
@Override
public LinkedHashMap<String, List<String>> doubleColumnNames() {
return null;
}
@Override
public List<String> getColumns() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumns(Context context) {
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("fieldList");
return list;
}
}
package com.gic.haoban.manage.web.qo.eventtracking;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @Author guojx
* @Date 2024/5/21 14:12
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatEventTrackingClerkDetailQO implements Serializable {
/**
* yyyy-MM-dd
*/
private String startDate;
/**
* yyyy-MM-dd
*/
private String endDate;
/**
* 导购名称/code
*/
private String vagueQueryClerk;
/**
* 数据类型 1天 2近7天 3近30天 4周 5月
*/
private Integer dateType;
/**
* 排序类型 1 正序 2 倒序
*/
private Integer orderByType;
/**
* 排序字段名称
*/
private String orderByFields;
/**
* 分组ID,可为空
*/
private String storeGroupId;
/**
* 0:未登录
*/
private Integer isLogin;
/**
* 门店ID。可为空
*/
private String storeId;
private Integer pageNum;
private Integer pageSize;
/**
* 下载导出参数:数据脱敏 1:脱敏 2:完整
*/
private Integer dataType = 1;
/**
* 下载导出参数:为了兼容前端传参
*/
private String requestProject;
public Integer getDataApiOrderField() {
Map<String, Integer> map = new HashMap<>(8);
map.put("avgVisitTime", 1);
map.put("lastVisitTime", 2);
return map.get(orderByFields) == null ? 1 : map.get(orderByFields);
}
public void dealWithParam(JSONObject jsonObject) {
if (jsonObject == null) {
jsonObject = new JSONObject();
}
if (StringUtils.isNotBlank(startDate)) {
jsonObject.put("startDate", startDate);
}
if (StringUtils.isNotBlank(endDate)) {
jsonObject.put("endDate", endDate);
}
if (dateType != null) {
jsonObject.put("dateType", dateType);
}
if (orderByType != null) {
jsonObject.put("orderByType", orderByType);
}
if (orderByFields != null) {
jsonObject.put("orderByFields", orderByFields);
}
if (isLogin != null) {
jsonObject.put("isLogin", isLogin);
}
jsonObject.put("pageNum", pageNum);
jsonObject.put("pageSize", pageSize);
if (StringUtils.isNotBlank(vagueQueryClerk)) {
jsonObject.put("vagueQueryClerk", vagueQueryClerk);
}
}
}
package com.gic.haoban.manage.web.qo.eventtracking;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.gic.haoban.manage.web.qo.wechatwork.StoreGroupCommonQO;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @Author guojx
* @Date 2024/5/22 9:27
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatEventTrackingStoreGroupQO extends StoreGroupCommonQO implements Serializable {
/**
* 周期起始时间
*/
private String startDate;
/**
* 结束时间
*/
private String endDate;
/**
* 数据类型 1天 2近7天 3近30天 4周 5月
*/
private Integer dateType;
/**
* 排序类型 1 正序 2 倒序
*/
private Integer orderByType;
/**
* 排序字段名称
*/
private String orderByFields;
private Integer pageNum;
private Integer pageSize;
/**
* 下载导出参数:数据脱敏 1:脱敏 2:完整
*/
private Integer dataType = 1;
/**
* 下载导出参数:为了兼容前端传参
*/
private String requestProject;
public Integer getDataApiOrderField() {
Map<String, Integer> map = new HashMap<>(8);
map.put("clerkNum", 1);
map.put("bindingNum", 2);
map.put("bindingRate", 3);
map.put("visitNum", 4);
map.put("visitRate", 5);
map.put("visitCnt", 6);
return map.get(orderByFields) == null ? 1 : map.get(orderByFields);
}
public void dealWithParam(JSONObject jsonObject) {
if (jsonObject == null) {
jsonObject = new JSONObject();
}
if (StringUtils.isNotBlank(startDate)) {
jsonObject.put("startDate", startDate);
}
if (dateType != null) {
jsonObject.put("dateType", dateType);
}
if (orderByType != null) {
jsonObject.put("orderByType", orderByType);
}
if (orderByFields != null) {
jsonObject.put("orderByFields", orderByFields);
}
jsonObject.put("pageNum", pageNum);
jsonObject.put("pageSize", pageSize);
}
}
package com.gic.haoban.manage.web.qo.eventtracking;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/30 9:14
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatOverviewQO implements Serializable {
/**
* yyyy-MM-dd
*/
private String startDate;
private String endDate;
/**
* 数据类型 1天 2近7天 3近30天 4周 5月
*/
private Integer dateType;
/**
* 分组ID,可为空
*/
private String storeGroupId;
/**
* 门店ID。可为空
*/
private String storeId;
}
package com.gic.haoban.manage.web.qo.wechatwork;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* @Author guojx
* @Date 2024/5/22 9:16
*/
@Data
@Accessors(chain = true)
public class StoreGroupCommonQO implements Serializable {
/**
* 门店code/名称
*/
private String storeSearchParam;
/**
* 可以多选,英文逗号隔开。优先级高于storeId
*/
private String storeGroupId;
/**
* 可以多选,英文逗号隔开
*/
private String storeId;
/**
* 分组下钻的时候,当前点击的分组id参数.如果是无归属,则值是-1
* @return
*/
private String nextStoreGroupId;
/**
* 因为存在nextStoreGroupId = -1的无归属分组。当下钻无归属,值为无归属上一层级的分组id。如果为空,说明上一层级是所有哦门店,否则必有值
*/
private String preStoreGroupId;
/**
* 分组维度查询,勾选展示门店 1:是
*/
private Integer showStore;
/**
* 门店状态
*/
private List<String> statusList;
public boolean isRecycle() {
return "-3".equals(nextStoreGroupId);
}
public boolean isNoBelongStoreGroup() {
return "-1".equals(nextStoreGroupId);
}
public boolean isSelectStore() {
return showStore != null && showStore == 1;
}
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @Author guojx
* @Date 2024/5/21 14:12
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkLostClerkQO implements Serializable {
/**
* yyyy-MM-dd
*/
private String startDate;
/**
* yyyy-MM-dd
*/
private String endDate;
/**
* 门店名称/code
*/
private String vagueQueryStore;
/**
* 导购名称/code
*/
private String vagueQueryClerk;
/**
* 排序类型 1 正序 2 倒序
*/
private Integer orderByType;
/**
* 排序字段名称
*/
private String orderByFields;
private Integer pageNum;
private Integer pageSize;
/**
* 下载导出参数:数据脱敏 1:脱敏 2:完整
*/
private Integer dataType = 1;
/**
* 下载导出参数:为了兼容前端传参
*/
private String requestProject;
public Integer getDataApiOrderField() {
Map<String, Integer> map = new HashMap<>(8);
map.put("onewayFriendNum", 1);
map.put("totalLostNum", 2);
map.put("deleteSalesNum", 3);
map.put("salesDeleteNum", 4);
return map.get(orderByFields) == null ? 1 : map.get(orderByFields);
}
public void dealWithParam(JSONObject jsonObject) {
if (jsonObject == null) {
jsonObject = new JSONObject();
}
if (StringUtils.isNotBlank(startDate)) {
jsonObject.put("startDate", startDate);
}
if (StringUtils.isNotBlank(endDate)) {
jsonObject.put("endDate", endDate);
}
if (orderByType != null) {
jsonObject.put("orderByType", orderByType);
}
if (orderByFields != null) {
jsonObject.put("orderByFields", getDataApiOrderField());
}
jsonObject.put("pageNum", pageNum);
jsonObject.put("pageSize", pageSize);
if (StringUtils.isNotBlank(vagueQueryClerk)) {
jsonObject.put("vagueQueryClerk", vagueQueryClerk);
}
if (StringUtils.isNotBlank(vagueQueryStore)) {
jsonObject.put("vagueQueryStore", vagueQueryStore);
}
}
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @Author guojx
* @Date 2024/5/21 14:12
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkLostDetailQO implements Serializable {
/**
* yyyy-MM-dd
*/
private String startDate;
/**
* yyyy-MM-dd
*/
private String endDate;
/**
* 用户模糊
*/
private String vagueQueryUser;
/**
* 导购名称/code
*/
private String vagueQueryClerk;
/**
* 是/否
* 是否已解除双向好友
*/
private String isDelete;
/**
* 导购删除好友/好友删除导购
* 删除类型
*/
private String deleteType;
/**
* 排序类型 1 正序 2 倒序
*/
private Integer orderByType;
/**
* 排序字段名称
*/
private String orderByFields;
private Integer pageNum;
private Integer pageSize;
/**
* 下载导出参数:数据脱敏 1:脱敏 2:完整
*/
private Integer dataType = 1;
/**
* 下载导出参数:为了兼容前端传参
*/
private String requestProject;
public Integer getDataApiOrderField() {
Map<String, Integer> map = new HashMap<>(8);
map.put("remainDays", 9);
return map.get(orderByFields) == null ? 1 : map.get(orderByFields);
}
public void dealWithParam(JSONObject jsonObject) {
if (jsonObject == null) {
jsonObject = new JSONObject();
}
if (StringUtils.isNotBlank(startDate)) {
jsonObject.put("startDate", startDate);
}
if (StringUtils.isNotBlank(endDate)) {
jsonObject.put("endDate", endDate);
}
if (orderByType != null) {
jsonObject.put("orderByType", orderByType);
}
if (orderByFields != null) {
jsonObject.put("orderByFields", getDataApiOrderField());
}
jsonObject.put("pageNum", pageNum);
jsonObject.put("pageSize", pageSize);
if (StringUtils.isNotBlank(vagueQueryClerk)) {
jsonObject.put("vagueQueryClerk", vagueQueryClerk);
}
if (StringUtils.isNotBlank(vagueQueryUser)) {
jsonObject.put("vagueQueryUser", vagueQueryUser);
}
if (StringUtils.isNotBlank(isDelete)) {
jsonObject.put("isDelete", isDelete);
}
if (StringUtils.isNotBlank(deleteType)) {
jsonObject.put("deleteType", deleteType);
}
}
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 14:12
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkLostOverviewQO implements Serializable {
/**
* yyyy-MM-dd
*/
private String startDate;
/**
* yyyy-MM-dd
*/
private String endDate;
/**
* 分组ID,支持多选,英文逗号隔开
*/
private String storeGroupId;
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @Author guojx
* @Date 2024/5/22 9:27
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkLostStoreGroupQO extends StoreGroupCommonQO implements Serializable {
/**
* 开始日期, 非日类型的时候。根据数据组api文档
*/
private String startDate;
/**
* 结束日期, 非日类型的时候。根据数据组api文档
*/
private String endDate;
/**
* 排序类型 1 正序 2 倒序
*/
private Integer orderByType;
/**
* 排序字段名称
*/
private String orderByFields;
private Integer pageNum;
private Integer pageSize;
/**
* 下载导出参数:数据脱敏 1:脱敏 2:完整
*/
private Integer dataType = 1;
/**
* 下载导出参数:为了兼容前端传参
*/
private String requestProject;
public Integer getDataApiOrderField() {
Map<String, Integer> map = new HashMap<>(8);
map.put("onewayFriendNum", 1);
map.put("totalLostNum", 2);
map.put("deleteSalesNum", 3);
map.put("salesDeleteNum", 4);
return map.get(orderByFields) == null ? 1 : map.get(orderByFields);
}
public void dealWithParam(JSONObject jsonObject) {
if (jsonObject == null) {
jsonObject = new JSONObject();
}
if (StringUtils.isNotBlank(startDate)) {
jsonObject.put("startDate", startDate);
}
if (StringUtils.isNotBlank(endDate)) {
jsonObject.put("endDate", endDate);
}
if (orderByType != null) {
jsonObject.put("orderByType", orderByType);
}
if (orderByFields != null) {
jsonObject.put("orderByFields", getDataApiOrderField());
}
jsonObject.put("pageNum", pageNum);
jsonObject.put("pageSize", pageSize);
}
}
package com.gic.haoban.manage.web.utils;
import com.gic.clerk.api.dto.AuthorizedUser;
import com.gic.haoban.base.api.common.pojo.dto.WebLoginDTO;
import com.gic.haoban.common.utils.AuthWebRequestUtil;
/**
* @Author guojx
* @Date 2024/5/30 10:59
*/
public class AuthorizedUserUtils {
public static AuthorizedUser getUserInfo() {
WebLoginDTO loginUser = AuthWebRequestUtil.getLoginUser();
AuthorizedUser user = new AuthorizedUser();
user.setUserId(loginUser.getClerkId());
user.setEnterpriseId(loginUser.getEnterpriseId());
user.setRealName(loginUser.getClerkName());
return user;
}
}
package com.gic.haoban.manage.web.utils.data;
import com.alibaba.fastjson.JSONObject;
import com.gic.dubbo.entity.ProviderLocalTag;
import com.gic.web.common.utils.ExecutorPoolSingleton;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
/**
* @Author guojx
* @Date 2024/1/12 13:41
*/
@Slf4j
public class ConcurrencyUtils {
public static Map<String, List<JSONObject>> concurrencyDataForMap(List<MapThreadHandlerRequest> list) {
Map<String, List<JSONObject>> resultMap = new HashMap<>();
if (CollectionUtils.isEmpty(list)) {
return resultMap;
}
ProviderLocalTag providerLocalTag = ProviderLocalTag.tag.get();
String traceId = providerLocalTag.traceId;
for (MapThreadHandlerRequest temp : list) {
temp.setTraceId(traceId);
}
long startTime = System.currentTimeMillis();
try {
List<Future<Map<String, List<JSONObject>>>> futures2 = ExecutorPoolSingleton.getInstance().getExecutorService().invokeAll(list);
log.info("调用API耗时 : " + (System.currentTimeMillis() - startTime));
for (Future<Map<String, List<JSONObject>>> future : futures2) {
try {
Map<String, List<JSONObject>> map = future.get();
if (map != null) {
map.forEach((k, v) -> {
resultMap.put(k, v);
});
}
} catch (Exception e) {
log.warn("remote Api failed : {}", e.getCause().getMessage());
}
}
long endTime = System.currentTimeMillis();
log.info("耗时 : " + (endTime - startTime));
} catch (Exception e) {
log.warn("并发调用错误:{}", e.getMessage(), e);
}
return resultMap;
}
public static List<JSONObject> concurrencyData(List<ThreadHandlerRequest> list) {
List<JSONObject> resultList = new ArrayList<>();
if (CollectionUtils.isEmpty(list)) {
return resultList;
}
List<MapThreadHandlerRequest> mapParam = new ArrayList<>();
for (int i = 0, len = list.size(); i < len; i++) {
MapThreadHandlerRequest res = new MapThreadHandlerRequest(list.get(i).getJsonObject(),
list.get(i).getApolloKey(), "data" + i);
mapParam.add(res);
}
Map<String, List<JSONObject>> map = concurrencyDataForMap(mapParam);
if (map != null) {
map.forEach((k, v) -> {
if (CollectionUtils.isNotEmpty(v)) {
resultList.addAll(v);
}
});
}
return resultList;
}
}
package com.gic.haoban.manage.web.utils.data;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.exception.DataApiException;
import com.gic.commons.util.DataApiUtils;
import com.gic.dubbo.entity.ProviderLocalTag;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* @Author guojx
* @Date 2024/1/11 15:33
*/
@Slf4j
public class MapThreadHandlerRequest implements Callable<Map<String, List<JSONObject>>> {
private JSONObject jsonObject;
private String apolloKey;
private String webObjName;
private String traceId;
public MapThreadHandlerRequest(JSONObject jsonObject, String apolloKey, String webObjName) {
this.jsonObject = JSONObject.parseObject(jsonObject.toJSONString());
this.apolloKey = apolloKey;
this.webObjName = webObjName;
}
@Override
public Map<String, List<JSONObject>> call() throws Exception {
try {
//log.info("并发调用入口:{}-{}", apolloKey, webObjName);
ProviderLocalTag providerLocalTag = ProviderLocalTag.tag.get();
providerLocalTag.traceId = traceId;
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), apolloKey);
List<JSONObject> list = DataApiUtils.getDataList(res);
Map<String, List<JSONObject>> map = new HashMap<>(2);
map.put(webObjName, list);
return map;
} catch (DataApiException e) {
// if (DataApiException.OVER_HANDLE_ERROR.equals(e.getCode())) {
// throw new DataApiException(e.getCode(), e.getMessage());
// }
log.info("{}调用错误:{}", apolloKey, e.getMessage(), e);
} catch (Exception e) {
log.info("{}调用错误:{}", apolloKey, e.getMessage(), e);
}
return null;
}
public String getTraceId() {
return traceId;
}
public MapThreadHandlerRequest setTraceId(String traceId) {
this.traceId = traceId;
return this;
}
}
package com.gic.haoban.manage.web.utils.data;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
/**
* @Author guojx
* @Date 2024/1/11 15:33
*/
@Slf4j
public class ThreadHandlerRequest {
private JSONObject jsonObject;
private String apolloKey;
public ThreadHandlerRequest(JSONObject jsonObject, String apolloKey) {
this.jsonObject = JSONObject.parseObject(jsonObject.toJSONString());
this.apolloKey = apolloKey;
}
public JSONObject getJsonObject() {
return jsonObject;
}
public ThreadHandlerRequest setJsonObject(JSONObject jsonObject) {
this.jsonObject = jsonObject;
return this;
}
public String getApolloKey() {
return apolloKey;
}
public ThreadHandlerRequest setApolloKey(String apolloKey) {
this.apolloKey = apolloKey;
return this;
}
}
package com.gic.haoban.manage.web.utils.eventtracking;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.DataApiUtils;
import com.gic.commons.util.DateUtil;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author guojx
* @Date 2024/5/30 15:34
*/
public class DateExpandUtils {
public static List<String> getDateList(String startDate, String endDate, Integer dateType) {
//数据类型 1天 2近7天 3近30天 4周 5月
List<String> list = new ArrayList<>();
if (dateType == null) {
dateType = 1;
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
try {
switch (dateType) {
case 1:
case 2:
case 3:
calendar.setTime(dateType == 1 ? df.parse(startDate) : df.parse(endDate));
calendar.add(Calendar.DAY_OF_YEAR, -29);
list = DateUtil.getBetweenDates(df.format(calendar.getTime()), dateType == 1 ? startDate : endDate);
break;
case 4:
calendar.setTime(DateUtil.strToDate(startDate, "yyyy-MM-dd"));
calendar.add(Calendar.WEEK_OF_YEAR, -11);
JSONObject jsonObject = new JSONObject();
jsonObject.put("startDate", df.format(calendar.getTime()));
jsonObject.put("endDate", startDate);
jsonObject.put("pageNum", 1);
jsonObject.put("pageSize", 100);
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), "data_pub_date_week");
List<JSONObject> data = DataApiUtils.getPageList(res);
list = data.stream().map(e ->e.getString("weekYear")).collect(Collectors.toList());
break;
case 5:
//月
SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM");
calendar.setTime(df.parse(startDate));
calendar.add(Calendar.MONTH, -11);
for (int i = 1; i <= 12; i++) {
list.add(monthFormat.format(calendar.getTime()));
calendar.add(Calendar.MONTH, 1);
}
break;
default:
}
} catch (Exception e) {
}
return list;
}
public static String getVisitTimeStr(Long avgVisitTime) {
if (avgVisitTime != null) {
int hour = (int) (avgVisitTime / 3600);
String str = getTimeStr(hour);
if (hour > 0) {
avgVisitTime = avgVisitTime - (3600 * hour);
}
int minute = (int) (avgVisitTime / 60);
str = str + ":" + getTimeStr(minute);
if (minute > 0) {
avgVisitTime = avgVisitTime - (60 * minute);
}
str = str +":"+ getTimeStr(avgVisitTime.shortValue());
return str;
}
return null;
}
private static String getTimeStr(int time) {
String str = "";
if (time == 0) {
str = "00";
} else if (time < 10) {
str = "0" + time + "";
} else {
str = "" + time;
}
return str;
}
}
package com.gic.haoban.manage.web.vo.eventtracking;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/30 9:24
*/
@Data
public class TrendVO implements Serializable {
private Integer avgVisitTime;
/**
* 员工总人数
*/
private Integer clerkNum;
/**
* 绑定人数
*/
private Integer bindingNum;
/**
* 绑定率
*/
private Double bindingRate;
/**
* 活跃人数
*/
private Integer visitNum;
/**
* 活跃率
*/
private Double visitRate;
/**
* 访问次数
*/
private Integer visitCnt;
/**
* 业务日期
*/
private String bizDate;
}
package com.gic.haoban.manage.web.vo.eventtracking;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/30 9:44
*/
@Data
public class ViewModuleVO implements Serializable {
/**
* 模块code
*/
private String moduleCode;
/**
* 模块名称
*/
private String moduleName;
/**
* 数值
*/
private Long data;
/**
* 1:访问次数 2:访问人数 3:访问时长 (单位秒)
*/
private Integer dataType;
}
package com.gic.haoban.manage.web.vo.eventtracking;
import com.gic.haoban.manage.web.utils.eventtracking.DateExpandUtils;
import com.gic.haoban.manage.web.vo.wechatwork.StoreGroupCommonVO;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatEventTrackingClerkVO extends StoreGroupCommonVO implements Serializable {
/**
* 1访问时长 单位秒
*/
private Long avgVisitTime;
/**
* 访问时长 00:00:00格式
*/
private String visitTimeStr;
/**
* 2最后一次登陆时间
*/
private String lastVisitTime;
/**
* 是否绑定
*/
private String isBinding;
/**
* 是否登陆
*/
private String isLogin;
/**
* 登陆次数
*/
private Integer visitCnt;
/**
* 导购id
*/
private String clerkId;
private String clerkName;
private String clerkCode;
public String getVisitTimeStr() {
return DateExpandUtils.getVisitTimeStr(avgVisitTime);
}
}
package com.gic.haoban.manage.web.vo.eventtracking;
import com.gic.haoban.manage.web.utils.eventtracking.DateExpandUtils;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatEventTrackingOverviewVO implements Serializable {
/**
* 次均访问时长 单位秒
*/
private Long avgVisitTime;
/**
* 次均访问时长较前一期
*/
private Double avgVisitTimeSply;
/**
* 次均访问时长 00:00:00格式
*/
private String visitTimeStr;
/**
* 访问次数
*/
private Integer visitCnt;
/**
* 访问次数较前一期
*/
private Double visitCntSply;
/**
* 活跃率
*/
private Double visitRate;
/**
* 活跃率较前一期
*/
private Double visitRateSply;
/**
* 活跃人数
*/
private Integer visitNum;
/**
* 活跃人数较前一期
*/
private Double visitNumSply;
/**
* 绑定率
*/
private Double bindingRate;
/**
* 绑定率较前一期
*/
private Double bindingRateSply;
/**
* 绑定人数
*/
private Integer bindingNum;
/**
* 绑定人数较前一期
*/
private Double bindingSply;
/**
* 员工总人数
*/
private Integer clerkNum;
public String getVisitTimeStr() {
return DateExpandUtils.getVisitTimeStr(avgVisitTime);
}
}
package com.gic.haoban.manage.web.vo.eventtracking;
import com.gic.haoban.manage.web.vo.wechatwork.StoreGroupCommonVO;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatEventTrackingStoreGroupVO extends StoreGroupCommonVO implements Serializable {
/**
* 1员工总人数
*/
private Integer clerkNum;
/**
* 2绑定人数
*/
private Integer bindingNum;
/**
* 3绑定率
*/
private Double bindingRate;
/**
* 4活跃人数
*/
private Integer visitNum;
/**
* 5活跃率
*/
private Double visitRate;
/**
* 6访问次数
*/
private Integer visitCnt;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Author guojx
* @Date 2024/1/11 14:22
*/
@Data
public class DataPageVO<T> implements Serializable {
private Integer pageNum;
private Integer pageSize;
private List<T> rows;
private Integer totalNum;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/22 9:35
*/
@Data
public class StoreGroupCommonVO implements Serializable {
private String storeGroupId;
private String storeGroupName;
private String storeId;
private String storeName;
private String storeCode;
private String parentStoreGroupName;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkLostClerkVO extends StoreGroupCommonVO implements Serializable {
/**
* 单向好友人数
*/
private Integer onewayFriendNum;
/**
* 总流失人数
*/
private Integer totalLostNum;
/**
* 删除导购人数
*/
private Integer deleteSalesNum;
/**
* 导购删除好友人数
*/
private Integer salesDeleteNum;
private String clerkCode;
private String clerkName;
private String clerkId;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.gic.web.common.jsonSeralizer.PhoneNumberJsonSeralizer;
import com.gic.web.common.jsonSeralizer.UserNameJsonSeralizer;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkLostDetailVO extends StoreGroupCommonVO implements Serializable {
/**
* 删除类型
*/
private String deleteType;
/**
* 留存天数
*/
private Integer remainDays;
/**
* 是否已经解除双向好友
*/
private String isDelete;
/**
* 添加好友时间
*/
private String addTime;
/**
* 最近消费时间
*/
private String lastCsmeDate;
/**
* 删除时间
*/
private String deleteTime;
private String clerkCode;
private String clerkName;
private String clerkId;
/**
* 客户姓名
*/
@JsonSerialize(using = UserNameJsonSeralizer.class)
private String memberName;
/**
* 客户手机号
*/
@JsonSerialize(using = PhoneNumberJsonSeralizer.class)
private String memberPhone;
/**
* 会员昵称
*/
private String memberNick;
/**
* 会员id -1:不存在
*/
private String memberId;
private String staffCode;
private String staffName;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkLostStoreGroupVO extends StoreGroupCommonVO implements Serializable {
/**
* 单向好友人数
*/
private Integer onewayFriendNum;
/**
* 总流失人数
*/
private Integer totalLostNum;
/**
* 删除导购人数
*/
private Integer deleteSalesNum;
/**
* 导购删除好友人数
*/
private Integer salesDeleteNum;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkLostVO implements Serializable {
/**
* 单向好友数
*/
private Integer onewayFriendNum = 0;
/**
* 总流失人数
*/
private Integer totalLostNum = 0;
/**
* 删除导购人数
*/
private Integer deleteSalesNum = 0;
/**
* 导购删除好友人数
*/
private Integer salesDeleteNum = 0;
/**
*
*/
private String bizDate;
}
......@@ -11,7 +11,7 @@
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
<context:component-scan base-package="com.gic.haoban.*" />
<context:component-scan base-package="com.gic.haoban.*, com.gic.web.common.*" />
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy />
......
package com.gic.haoban.manage.web.controller.coupon;
import com.gic.api.base.commons.BasePageInfo;
import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.PageHelperUtils;
import com.gic.commons.webapi.reponse.RestResponse;
import com.gic.haoban.manage.web.vo.coupon.CoupCardClerkLogCountVO;
import com.gic.haoban.manage.web.vo.coupon.CoupCardClerkLogVO;
import com.gic.haoban.manage.web.vo.coupon.CoupCardVO;
import com.gic.marketing.api.dto.CoupCardDTO;
import com.gic.marketing.api.dto.card.CoupCardClerkLogDTO;
import com.gic.marketing.api.out.service.CouponHBOuterService;
import com.gic.marketing.api.qdto.card.HaobanWriteOffCardQDTO;
import org.apache.logging.log4j.LogManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 卡券
*/
@RestController
@RequestMapping("/coupon")
public class CouponController {
private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(CouponController.class);
@Autowired
private CouponHBOuterService couponHBOuterService;
/**
* 卡券导购核销
* @param cardLogId 卡券日志id
* @param enterpriseId 企业id
* @param clerkId 导购id
* @return
*/
@RequestMapping("/clerk-write-off")
public RestResponse<CoupCardVO> writeOff(String cardLogId,
String enterpriseId,String clerkId) {
HaobanWriteOffCardQDTO writeOffCardQDTO = new HaobanWriteOffCardQDTO();
writeOffCardQDTO.setEnterpriseId(enterpriseId);
writeOffCardQDTO.setCardLogId(cardLogId);
writeOffCardQDTO.setClerkId(clerkId);
writeOffCardQDTO.setCardType(2);
ServiceResponse<CoupCardClerkLogDTO> response = couponHBOuterService.scanWriteOff(writeOffCardQDTO);
if (!response.isSuccess()) {
return RestResponse.failure(response.getCode(), response.getMessage());
}
CoupCardVO cardVO = getCardVO(response.getResult());
return RestResponse.successResult(cardVO);
}
/**
* 卡券导购核销列表
* @param pageInfo 分页参数
* @param enterpriseId 企业id
* @param clerkId 导购id
* @param writeOffType 核销类型 1客户核销2导购核销
* @return
*/
@RequestMapping("/clerk-list")
public RestResponse<Page<CoupCardClerkLogVO>> list(BasePageInfo pageInfo,
String enterpriseId,String clerkId,Integer writeOffType) {
Page<CoupCardClerkLogDTO> page = new Page<>();
page.setCurrentPage(pageInfo.getPageNum());
page.setPageSize(pageInfo.getPageSize());
Map<String, Object> params = new HashMap<>();
params.put("clerkId", clerkId);
params.put("writeOffType", writeOffType);
page.setParams(params);
ServiceResponse<Page<CoupCardClerkLogDTO>> response = couponHBOuterService.pageClerkLog(enterpriseId, page);
if (!response.isSuccess()) {
return RestResponse.failure(response.getCode(), response.getMessage());
}
Page<CoupCardClerkLogVO> retPage = PageHelperUtils.changePageToCurrentPage(response.getResult(), CoupCardClerkLogVO.class);
return RestResponse.successResult(retPage);
}
/**
* 卡券导购核销详情
* @param clerkLogId
* @return
*/
@RequestMapping("/clerk-get")
public RestResponse<CoupCardVO> get(String clerkLogId) {
ServiceResponse<CoupCardClerkLogDTO> response = couponHBOuterService.getClerkLogById(clerkLogId);
if (!response.isSuccess()) {
return RestResponse.failure(response.getCode(), response.getMessage());
}
if (response.getResult() == null) {
return RestResponse.successResult();
}
CoupCardVO coupCardVO = getCardVO(response.getResult());
return RestResponse.successResult(coupCardVO);
}
private static CoupCardVO getCardVO(CoupCardClerkLogDTO result) {
if (result == null) {
return null;
}
CoupCardVO coupCardVO = EntityUtil.changeEntityNew(CoupCardVO.class, result);
CoupCardDTO coupCardDTO = result.getCoupCardDTO();
if (coupCardDTO != null) {
coupCardVO.setUseCondition(coupCardDTO.getUseCondition());
coupCardVO.setEffectTime(coupCardDTO.getEffectTime());
coupCardVO.setLimitTime(coupCardDTO.getLimitTime());
coupCardVO.setStatus(coupCardDTO.getStatus());
coupCardVO.setThirdName(coupCardDTO.getThirdName());
coupCardVO.setMemberName(coupCardDTO.getMemberName());
coupCardVO.setPhoneNum(coupCardDTO.getPhoneNum());
coupCardVO.setCardNum(coupCardDTO.getCardNum());
}
coupCardVO.setUseTime(result.getCreateTime());
return coupCardVO;
}
/**
* 卡券核销数量
* @param enterpriseId 企业id
* @param clerkId 导购id
* @return
*/
@RequestMapping("/clerk-count")
public RestResponse<CoupCardClerkLogCountVO> get(String enterpriseId, String clerkId) {
ServiceResponse<Integer> memberResponse = couponHBOuterService.countClerkLog(enterpriseId, clerkId, 1);
ServiceResponse<Integer> clerkResponse = couponHBOuterService.countClerkLog(enterpriseId, clerkId, 2);
Integer memberCount = memberResponse.getResult();
Integer clerkCount = clerkResponse.getResult();
CoupCardClerkLogCountVO countVO = new CoupCardClerkLogCountVO();
countVO.setMemberCount(memberCount == null ? 0 :memberCount);
countVO.setClerkCount(clerkCount == null ? 0 :clerkCount);
return RestResponse.successResult(countVO);
}
}
......@@ -11,6 +11,10 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSON;
import com.gic.business.order.dto.ordermanage.ListOrderDTO;
import com.gic.business.order.qdto.ordermanage.ListOrderManageQDTO;
import com.gic.business.order.service.ordermanage.WebOrderManageApiService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -92,15 +96,21 @@ public class MemberMarketingController extends WebBaseController {
private AchievementService achievementService;
@Autowired
private IntegralmallService integralMallService;
@Autowired
private WebOrderManageApiService webOrderManageApiService;
// 会员积分商城订单数
@RequestMapping("/member/integral-order-num")
private RestResponse<Object> getIntegralOrderNum(String enterpriseId, String memberId) {
Page<IntegralMallExchangeLogDTO> page = new Page<>();
page.setCurrentPage(1);
page.setPageSize(20);
page = integralMallService.findExchangeLogFromMember(enterpriseId, memberId, null, null, "1,2,3", null, page);
return RestResponse.successResult(page.getTotalCount());
ListOrderManageQDTO qdto = new ListOrderManageQDTO();
qdto.setEnterpriseId(enterpriseId);
qdto.setMemberId(memberId);
qdto.setBusinessType(2);
logger.info("积分商城订单查询,qdto={}", JSON.toJSONString(qdto));
qdto.setPageNum(1);
qdto.setPageSize(1);
ServiceResponse<Page<ListOrderDTO>> ret = webOrderManageApiService.listOrder(qdto);
return RestResponse.successResult(ret.getResult().getTotalCount()) ;
}
/**
......
......@@ -88,6 +88,22 @@ public class GicOrderController {
@Autowired
private EvaluateDataApiService evaluateDataApiService;
// 1 虚拟商品; 2实物商品 3优惠券
// -1 全部 1 2 待发货 3已发货 4完成 关闭 0
@RequestMapping("list-member-integral-order")
public RestResponse<Object> listMemberIntegralOrder(String enterpriseId, String memberId,
@RequestParam(defaultValue = "2") Integer type,
@RequestParam(defaultValue = "-1") int status, BasePageInfo pageInfo) {
ListOrderManageQDTO qdto = new ListOrderManageQDTO();
qdto.setEnterpriseId(enterpriseId);
qdto.setOrderStep(status+"");
qdto.setGoodsType(type);
qdto.setMemberId(memberId);
qdto.setBusinessType(2);
logger.info("积分商城订单查询,qdto={}", JSON.toJSONString(qdto));
return this.orderListSelect(qdto, pageInfo, false);
}
// 发货订单列表 (0全部,待发货2+待收货3,部分发货7)
@RequestMapping("list-order")
public RestResponse<Object> orderList(String enterpriseId, String storeId, String clerkId, String search,
......@@ -479,7 +495,7 @@ public class GicOrderController {
}
// 订单详情
private OrderDetailVO getOrderDetail(String enterpriseId, OrderInfoDTO orderInfo,
public OrderDetailVO getOrderDetail(String enterpriseId, OrderInfoDTO orderInfo,
List<ListOrderItemDTO> orderItemDTOList, String storeId) {
OrderDetailVO orderDetailVO = EntityUtil.changeEntityByJSON(OrderDetailVO.class, orderInfo);
orderDetailVO.setUsePoint(orderInfo.getUsePoints());
......
package com.gic.haoban.manage.web.controller.scan;
import com.alibaba.fastjson.JSON;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.business.order.dto.ordermanage.OrderDetailDTO;
import com.gic.business.order.qdto.ordermanage.QueryOrderDetailQDTO;
import com.gic.business.order.service.ordermanage.WebOrderManageApiService;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.GlobalInfo;
import com.gic.commons.webapi.reponse.RestResponse;
import com.gic.haoban.manage.web.controller.order.GicOrderController;
import com.gic.haoban.manage.web.vo.coupon.CoupCardVO;
import com.gic.haoban.manage.web.vo.order.OrderDetailVO;
import com.gic.haoban.manage.web.vo.scan.ScanDetailVO;
import com.gic.marketing.api.dto.CoupCardDTO;
import com.gic.marketing.api.out.service.CouponHBOuterService;
import com.gic.marketing.api.qdto.card.HaobanWriteOffCardQDTO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 工作台
*/
@RestController
@RequestMapping("/scan")
public class ScanController {
private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(ScanController.class);
@Autowired
GicOrderController getOrderDetail;
@Autowired
private WebOrderManageApiService webOrderManageApiService;
@Autowired
private CouponHBOuterService couponHBOuterService;
@Autowired
private ClerkService clerkService;
/**
* 原有扫码接口聚合
* @see GicOrderController#scan(String, String, String)
* @param enterpriseId 企业id
* @param writeOffCode 核销码
* @param storeId 门店id
* @param clerkId 导购id
* @param analysisFlag 是否扫码 1是 0否
* @return
*/
@RequestMapping("/all")
public RestResponse<ScanDetailVO> scan(String enterpriseId, String writeOffCode, String storeId,String clerkId,Integer analysisFlag) {
if (StringUtils.isEmpty(writeOffCode)) {
return RestResponse.failure("9999", "核销码为空");
}
ScanDetailVO scanDetailVO = new ScanDetailVO();
// 通过核销码查询
QueryOrderDetailQDTO qdto = new QueryOrderDetailQDTO();
qdto.setEnterpriseId(enterpriseId);
qdto.setWriteOffCode(writeOffCode);
ServiceResponse<OrderDetailDTO> ret = webOrderManageApiService.getOrderDetail(qdto);
OrderDetailDTO detail = ret.getResult();
logger.info("订单信息={}", JSON.toJSONString(ret));
//订单
if (ret.isSuccess() && detail != null) {
// 已核销,且不是好办核销的
if (null != detail.getOrderInfo().getDeliveryOptType()
&& detail.getOrderInfo().getDeliveryOptType() != 1) {
logger.info("已核销,且不是好办核销的={}", writeOffCode);
scanDetailVO.setOrderError("此自提点无法核销");
}
if (!storeId.equals(detail.getOrderInfo().getPickUpStoreId())) {
scanDetailVO.setOrderError("此自提点无法核销");
}
OrderDetailVO orderDetailVO = getOrderDetail.getOrderDetail(enterpriseId, ret.getResult().getOrderInfo(),
ret.getResult().getOrderItemList(), storeId);
if (!(orderDetailVO.getOrderStep().equals("2") || orderDetailVO.getOrderStep().equals("4"))) {
scanDetailVO.setOrderError("核销订单不存在");
}
Date pickOverTime = detail.getOrderInfo().getPickUpOverTime();
if (null != pickOverTime && pickOverTime.before(new Date())) {
scanDetailVO.setOrderError("此订单自提时间已截止");
}
scanDetailVO.setOrderDetailVO(orderDetailVO);
}
//卡券
HaobanWriteOffCardQDTO writeOffCardQDTO = new HaobanWriteOffCardQDTO();
writeOffCardQDTO.setEnterpriseId(enterpriseId);
writeOffCardQDTO.setCardCode(writeOffCode);
writeOffCardQDTO.setClerkId(clerkId);
writeOffCardQDTO.setCardType(2);
writeOffCardQDTO.setAnalysisFlag(analysisFlag);
ServiceResponse<List<CoupCardDTO>> couponRet = couponHBOuterService.getCardLogByCode(writeOffCardQDTO);
if (couponRet.isSuccess() && CollectionUtils.isNotEmpty(couponRet.getResult())) {
List<CoupCardDTO> couponList = couponRet.getResult();
CoupCardDTO coupCardDTO = couponList.get(0);
if (couponList.size() > 1) {
scanDetailVO.setCouponError("识别到多张兑换券,为防止核销错误,请协助会员,在会员小程序中进行兑换券核销");
scanDetailVO.setCouponErrorType(1);
}else {
boolean checkStore = coupCardDTO.isCheckStore();
if (!checkStore) {
scanDetailVO.setCouponError("兑换券在本店不可用");
}
Integer verificationType = coupCardDTO.getVerificationType();
if (!Objects.equals(verificationType, 0)) {
scanDetailVO.setCouponError("请通过收银台核销此兑换券");
}
}
CoupCardVO cardVO = EntityUtil.changeEntityNew(CoupCardVO.class, coupCardDTO);
if (Objects.equals(GlobalInfo.COUPON_STATUS_USED, coupCardDTO.getStatus())) {
cardVO.setStoreName(coupCardDTO.getOrderStoreName());
cardVO.setClerkName(coupCardDTO.getOrderClerkName());
}else {
ClerkDTO clerkDTO = clerkService.getclerkById(clerkId);
if (clerkDTO != null) {
cardVO.setStoreName(clerkDTO.getStoreName());
cardVO.setClerkName(clerkDTO.getClerkName());
}
}
cardVO.setUseTime(coupCardDTO.getUseTime());
scanDetailVO.setCardVO(cardVO);
}
return RestResponse.successResult(scanDetailVO);
}
}
......@@ -43,10 +43,15 @@ public class ContentMaterialShareQO implements Serializable {
private String storeCode;
/**
* 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材
* 1朋友圈; 2客户群; 3 对话框; 4 复制文案; 5 下载素材;6 潜客推荐
*/
private Integer channelSource;
/**
* 喜好推荐、商品中心、商品素材、其他
*/
private String goodsDetailSource;
public String getEnterpriseId() {
return enterpriseId;
}
......@@ -102,4 +107,12 @@ public class ContentMaterialShareQO implements Serializable {
public void setChannelSource(Integer channelSource) {
this.channelSource = channelSource;
}
public String getGoodsDetailSource() {
return goodsDetailSource;
}
public void setGoodsDetailSource(String goodsDetailSource) {
this.goodsDetailSource = goodsDetailSource;
}
}
package com.gic.haoban.manage.web.vo.coupon;
import java.io.Serializable;
import java.util.Date;
public class CoupCardClerkLogCountVO implements Serializable {
private static final long serialVersionUID = 707322017107902L;
/**
* 导购核销数量
*/
private Integer clerkCount = 0 ;
/**
* 会员核销数量
*/
private Integer memberCount = 0;
/**
* 总核销数量
*/
private Integer totalCount = 0;
public Integer getClerkCount() {
return clerkCount;
}
public void setClerkCount(Integer clerkCount) {
this.clerkCount = clerkCount;
}
public Integer getMemberCount() {
return memberCount;
}
public void setMemberCount(Integer memberCount) {
this.memberCount = memberCount;
}
public Integer getTotalCount() {
return this.memberCount + clerkCount;
}
public void setTotalCount(Integer totalCount) {
this.totalCount = totalCount;
}
}
\ No newline at end of file
package com.gic.haoban.manage.web.vo.coupon;
import java.io.Serializable;
import java.util.Date;
public class CoupCardClerkLogVO implements Serializable {
private static final long serialVersionUID = 707322017107902L;
/**主键*/
private String clerkLogId;
/**企业id*/
private String enterpriseId;
/** 会员id */
private String memberId;
/** 卡券日志id */
private String cardLogId;
/**
* 卡券编码
*/
private String cardCode;
/**
* 卡券名称
*/
private String cardName;
/** 卡券id */
private String coupCardId;
/** 门店id */
private String storeId;
/** 门店code */
private String storeCode;
/** 门店名称 */
private String storeName;
/** 导购id */
private String clerkId;
/** 导购名称 */
private String clerkName;
/** 导购code */
private String clerkCode;
/**
* 核销类型1客户核销2导购核销
*/
private Integer writeOffType;
private Date updateTime;
private Date createTime;
/**
* 核销时间
*/
private Date useTime;
public String getClerkLogId() {
return clerkLogId;
}
public void setClerkLogId(String clerkLogId) {
this.clerkLogId = clerkLogId;
}
public String getEnterpriseId() {
return enterpriseId;
}
public void setEnterpriseId(String enterpriseId) {
this.enterpriseId = enterpriseId;
}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getCardLogId() {
return cardLogId;
}
public void setCardLogId(String cardLogId) {
this.cardLogId = cardLogId;
}
public String getCardName() {
return cardName;
}
public void setCardName(String cardName) {
this.cardName = cardName;
}
public String getCardCode() {
return cardCode;
}
public void setCardCode(String cardCode) {
this.cardCode = cardCode;
}
public String getCoupCardId() {
return coupCardId;
}
public void setCoupCardId(String coupCardId) {
this.coupCardId = coupCardId;
}
public String getStoreId() {
return storeId;
}
public void setStoreId(String storeId) {
this.storeId = storeId;
}
public String getStoreCode() {
return storeCode;
}
public void setStoreCode(String storeCode) {
this.storeCode = storeCode;
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getClerkId() {
return clerkId;
}
public void setClerkId(String clerkId) {
this.clerkId = clerkId;
}
public String getClerkName() {
return clerkName;
}
public void setClerkName(String clerkName) {
this.clerkName = clerkName;
}
public String getClerkCode() {
return clerkCode;
}
public void setClerkCode(String clerkCode) {
this.clerkCode = clerkCode;
}
public Integer getWriteOffType() {
return writeOffType;
}
public void setWriteOffType(Integer writeOffType) {
this.writeOffType = writeOffType;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUseTime() {
return createTime;
}
public void setUseTime(Date useTime) {
this.useTime = useTime;
}
}
\ No newline at end of file
package com.gic.haoban.manage.web.vo.coupon;
import java.io.Serializable;
import java.util.Date;
public class CoupCardVO implements Serializable {
private static final long serialVersionUID = -5868328668312616015L;
/**
* 卡券日志id
*/
private String cardLogId;
/**
* 卡券id
*/
private String coupCardId;
/**
* 卡券名称
*/
private String cardName;
/**
* 使用条件
*/
private String useCondition;
/**
* 券号
*/
private String cardCode;
/**
* 生效时间
*/
private Date effectTime;
/**
* 截止时间
*/
private Date limitTime;
/**
* 状态 待领取:3; 待核销:4; 已核销:5; 已过期:6; 已销毁:7; 已占用:8; 转赠中:9 ;已转赠:10
*/
private Integer status;
/**
* 会员昵称
*/
private String thirdName;
/**
* 会员名称
*/
private String memberName;
/**
* 会员手机号码
*/
private String phoneNum;
/**
* 会员卡号
*/
private String cardNum;
/**
* 门店名称
*/
private String storeName;
/**
* 导购名称
*/
private String clerkName;
/**
* 核销时间
*/
private Date useTime;
public String getCardLogId() {
return cardLogId;
}
public void setCardLogId(String cardLogId) {
this.cardLogId = cardLogId;
}
public String getCoupCardId() {
return coupCardId;
}
public void setCoupCardId(String coupCardId) {
this.coupCardId = coupCardId;
}
public String getCardName() {
return cardName;
}
public void setCardName(String cardName) {
this.cardName = cardName;
}
public String getUseCondition() {
return useCondition;
}
public void setUseCondition(String useCondition) {
this.useCondition = useCondition;
}
public String getCardCode() {
return cardCode;
}
public void setCardCode(String cardCode) {
this.cardCode = cardCode;
}
public Date getEffectTime() {
return effectTime;
}
public void setEffectTime(Date effectTime) {
this.effectTime = effectTime;
}
public Date getLimitTime() {
return limitTime;
}
public void setLimitTime(Date limitTime) {
this.limitTime = limitTime;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getThirdName() {
return thirdName;
}
public void setThirdName(String thirdName) {
this.thirdName = thirdName;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getClerkName() {
return clerkName;
}
public void setClerkName(String clerkName) {
this.clerkName = clerkName;
}
public Date getUseTime() {
return useTime;
}
public void setUseTime(Date useTime) {
this.useTime = useTime;
}
}
package com.gic.haoban.manage.web.vo.scan;
import com.gic.haoban.manage.web.vo.coupon.CoupCardVO;
import com.gic.haoban.manage.web.vo.order.OrderDetailVO;
import com.gic.marketing.api.dto.CoupCardDTO;
import java.io.Serializable;
public class ScanDetailVO implements Serializable {
private static final long serialVersionUID = 5215230055823016992L;
/**
* 订单详情
*/
private OrderDetailVO orderDetailVO;
/**
* 卡券详情
*/
private CoupCardVO cardVO;
/**
* 订单错误信息
*/
private String orderError;
/**
* 卡券错误信息
*/
private String couponError;
/**
* 错误信息类型 1弹窗
*/
private Integer couponErrorType = 0;
public OrderDetailVO getOrderDetailVO() {
return orderDetailVO;
}
public void setOrderDetailVO(OrderDetailVO orderDetailVO) {
this.orderDetailVO = orderDetailVO;
}
public CoupCardVO getCardVO() {
return cardVO;
}
public void setCardVO(CoupCardVO cardVO) {
this.cardVO = cardVO;
}
public String getOrderError() {
return orderError;
}
public void setOrderError(String orderError) {
this.orderError = orderError;
}
public String getCouponError() {
return couponError;
}
public void setCouponError(String couponError) {
this.couponError = couponError;
}
public Integer getCouponErrorType() {
return couponErrorType;
}
public void setCouponErrorType(Integer couponErrorType) {
this.couponErrorType = couponErrorType;
}
}
......@@ -21,6 +21,7 @@
<dubbo:reference interface="com.gic.marketing.api.service.WechatMarketingService" id="wechatMarketingService" />
<dubbo:reference interface="com.gic.marketing.pro.api.service.ai.AiMemberLogApiService" id="aiMemberLogApiService" />
<dubbo:reference interface="com.gic.marketing.api.service.CouponCardService" id="couponCardService" />
<dubbo:reference interface="com.gic.marketing.api.out.service.CouponHBOuterService" id="couponHBOuterService" />
<dubbo:reference interface="com.gic.game.api.service.GameService" id="gameService" />
<dubbo:reference interface="com.gic.enterprise.service.CustomSettingApiService" id="customSettingApiService" />
<dubbo:reference interface="com.gic.marketing.pro.api.service.game.GameApiService" id="gameApiService" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment