提交 7fbb5aec authored 作者: 李秋林's avatar 李秋林

1、开发功能:通过有效的经销商,查询有效的门店,更新门店的大区、战区、大区总监、战区经理、城市经理(经销商的客户经理);2:代码封版

上级 3f3cfd34
package com.sfa.job.domain.qince.dao;
import com.sfa.job.pojo.qince.response.QinceClienteleStoreDto;
import java.util.List;
/**
* @author : liqiulin
* @date : 2025-05-09 10
* @describe :
*/
public interface IQinceClienteleStoreDao {
List<QinceClienteleStoreDto> findListByDealerId(String dealerId);
}
......@@ -14,4 +14,5 @@ public interface IQinceDealerDao {
List<QinceDealerDto> getPushQinceDealers();
List<QinceDealerDto> findModifyList(String dateStr);
}
package com.sfa.job.domain.qince.dao;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.job.domain.qince.entity.QinceClienteleStore;
import com.sfa.job.domain.qince.mapper.QinceClienteleStoreMapper;
import com.sfa.job.pojo.qince.response.QinceClienteleStoreDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : liqiulin
* @date : 2025-05-09 10
* @describe :
*/
@DS("promotion")
@Service
public class QinceClienteleStoreDaoImpl implements IQinceClienteleStoreDao {
@Autowired
private QinceClienteleStoreMapper qinceClienteleStoreMapper;
@Override
public List<QinceClienteleStoreDto> findListByDealerId(String dealerId) {
List<QinceClienteleStore> storelist = qinceClienteleStoreMapper.findListByDealerId(dealerId);
return BeanUtils.transitionDtos(storelist, QinceClienteleStoreDto.class);
}
}
......@@ -29,4 +29,10 @@ public class QinceDealerDaoImpl implements IQinceDealerDao{
List<QinceDealer> qinceDealers = qinceDealerMapper.pushQinceDealers(today);
return BeanUtils.transitionDtos(qinceDealers, QinceDealerDto.class);
}
@Override
public List<QinceDealerDto> findModifyList(String dateStr) {
List<QinceDealer> qinceDealers = qinceDealerMapper.findModifyList(dateStr);
return BeanUtils.transitionDtos(qinceDealers, QinceDealerDto.class);
}
}
......@@ -51,6 +51,10 @@ public class QinceDealer implements Serializable {
*/
private String dealerDeptName;
private String dealerManagerCode;
private String dealerManager;
/**
* 经销商编码
*/
......
......@@ -2,6 +2,7 @@ package com.sfa.job.domain.qince.mapper;
import com.sfa.job.domain.qince.entity.QinceDealer;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.pojo.qince.response.QinceDealerDto;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -17,6 +18,8 @@ public interface QinceDealerMapper extends BaseMapper<QinceDealer> {
List<QinceDealer> pushQinceDealers(String today);
List<QinceDealer> findModifyList(String dateStr);
}
......
......@@ -15,7 +15,7 @@ import org.springframework.stereotype.Service;
*/
@DS("bi")
@Service
public class FeishuSheetRecordDaoImpl implements FeishuSheetRecordDao{
public class FeishuSheetRecordDaoImpl implements IFeishuSheetRecordDao {
@Autowired
private FeishuSheetRecordMapper feishuSheetRecordMapper;
......
......@@ -7,6 +7,6 @@ import com.sfa.job.pojo.response.FeishuSheetRecordDto;
* @date : 2025-04-08 17
* @describe :
*/
public interface FeishuSheetRecordDao {
public interface IFeishuSheetRecordDao {
FeishuSheetRecordDto selectOne(Integer type);
}
......@@ -35,6 +35,11 @@ public class FeishuSheetRecord implements Serializable {
*/
private String createMonth;
/**
* sheet页中的数据范围
*/
private String ranges;
/**
* 1:axmr005_战区(每天);2:axmr005_战区(每月);
*/
......
......@@ -13,7 +13,10 @@ public enum FSRecordEnum {
* 1:axmr005_战区(每天)
*/
AXMR005_1(1),
AXMR005_2(2),
/**
* 营销中心-区域销售-逻辑组织架构
*/
XS_USER_RELATION(2),
;
private Integer type;
......
package com.sfa.job.pojo.qince.response;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 勤策-客户管理-终端
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class QinceClienteleStoreDto implements Serializable {
/**
* 主键id
*/
private Long id;
/**
* 勤策的门店唯一ID
*/
private String qcId;
/**
* 门店名称
*/
private String storeName;
/**
* 门店编码
*/
private String storeCode;
/**
* 城市经理
*/
private String managerName;
/**
*
* 战区经理
*/
private String zqManagerName;
/**
* 大区总监
*/
private String dqManagerName;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
public QinceClienteleStoreDto(String managerName, String zqManagerName, String dqManagerName) {
this.managerName = managerName;
this.zqManagerName = zqManagerName;
this.dqManagerName = dqManagerName;
}
}
\ No newline at end of file
......@@ -45,6 +45,10 @@ public class QinceDealerDto implements Serializable {
*/
private String dealerDeptName;
private String dealerManagerCode;
private String dealerManager;
/**
* 经销商编码
*/
......
......@@ -33,6 +33,11 @@ public class FeishuSheetRecordDto {
*/
private String createMonth;
/**
* sheet页中的数据范围
*/
private String ranges;
/**
* 1:axmr005_战区(每天);2:axmr005_战区(每月);
*/
......
package com.sfa.job.service.erp.impl;
import com.alibaba.fastjson2.JSONObject;
import com.sfa.common.core.utils.DateUtils;
import com.sfa.job.domain.erp.dao.ErpAxmr005ShippingDetailsDao;
import com.sfa.job.pojo.response.FeishuSheetRecordDto;
import com.sfa.job.service.erp.ErpAxmr005Service;
import com.sfa.job.util.FeiShuUtil;
import com.sfa.job.domain.use.dao.FeishuSheetRecordDao;
import com.sfa.job.domain.use.dao.IFeishuSheetRecordDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -25,7 +24,7 @@ public class ErpAxmr005ServiceImpl implements ErpAxmr005Service {
@Autowired
private ErpAxmr005ShippingDetailsDao erpAxmr005ShippingDetailsDao;
@Autowired
private FeishuSheetRecordDao feishuSheetRecordDao;
private IFeishuSheetRecordDao feishuSheetRecordDao;
@Autowired
private FeiShuUtil feiShuUtil;
......@@ -42,8 +41,7 @@ public class ErpAxmr005ServiceImpl implements ErpAxmr005Service {
* 将结果推送到飞书表格,每次推100条
*/
String range = recordDto.getSheetId() + "!A:H";
JSONObject botToken1 = feiShuUtil.getBotToken1();
String tenantAccessToken = botToken1.getString("tenant_access_token");
String tenantAccessToken = feiShuUtil.getBotToken1();
int batchSize = 100;
for (int i = 0; i < zhanquDataset.size(); i+=batchSize) {
// 计算当前批次的结束位置
......
package com.sfa.job.service.feishu;
/**
* @author : liqiulin
* @date : 2025-05-09 16
* @describe :
*/
public interface IPullSheetService {
void qinceSotreManage();
}
package com.sfa.job.service.feishu;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.sfa.job.domain.use.dao.IFeishuSheetRecordDao;
import com.sfa.job.enums.FSRecordEnum;
import com.sfa.job.pojo.response.FeishuSheetRecordDto;
import com.sfa.job.util.FeiShuUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.stream.DoubleStream;
/**
* @author : liqiulin
* @date : 2025-05-09 16
* @describe :
*/
@Service
public class PullSheetServiceImpl implements IPullSheetService{
@Autowired
private IFeishuSheetRecordDao feishushetRecordDao;
@Autowired
private FeiShuUtil feiShuUtil;
/**
* 拉取表格 - 勤策门店的城市经理、省区经理、大区总监
* https://wangxiaolu.feishu.cn/sheets/I076slXhlhY2RdtDetEc17ornYd?sheet=49e4ba
*/
@Override
public void qinceSotreManage() {
FeishuSheetRecordDto recordDto = feishushetRecordDao.selectOne(FSRecordEnum.XS_USER_RELATION.getType());
JSONObject jsonObject = feiShuUtil.pullSheetOneRange(recordDto.getSheetToken(), feiShuUtil.getBotToken1(), recordDto.getRanges());
JSONArray values = jsonObject.getJSONArray("values");
// 创建逻辑构架人员关系表
// 创建逻辑构架人员关系对象
// 遍历values数组,获取每个对象的values数组
values.forEach(item -> {
JSONArray jsonArray = (JSONArray) item;
});
}
}
......@@ -7,4 +7,10 @@ package com.sfa.job.service.qince;
*/
public interface IQinceDealerQueryService {
void updateQinceDealerInfo();
void queryCusVisitRecord();
void updateQinceStore();
}
package com.sfa.job.service.qince.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sfa.job.domain.qince.dao.IQinceClienteleStoreDao;
import com.sfa.job.domain.qince.dao.IQinceDealerDao;
import com.sfa.job.pojo.qince.response.QinceClienteleStoreDto;
import com.sfa.job.pojo.qince.response.QinceDealerDto;
import com.sfa.job.service.qince.IQinceDealerQueryService;
import com.sfa.job.util.QinCeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.groovy.util.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* @author : liqiulin
......@@ -26,6 +29,8 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
@Autowired
private IQinceDealerDao qinceDealerDao;
@Autowired
private IQinceClienteleStoreDao qinceClienteleStoreDao;
@Autowired
private QinCeUtils qinCeUtils;
@Override
......@@ -65,6 +70,57 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
}
}
log.info("更新勤策经销商战区、大区信息完成,更新量:{}",pushQinceDealers.size());
log.info("更新勤策经销商战区、大区信息完成,更新量:{}", pushQinceDealers.size());
}
@Override
public void queryCusVisitRecord() {
try {
// 获取t-1日期
String queryDate = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
Map<String, Object> params = qinCeUtils.queryCusVisitRecordParams(queryDate);
String url = qinCeUtils.builderUrl(QinCeUtils.QUERY_CUS_VISIT_RECORD, params);
JSONArray recordsJson = qinCeUtils.postArray(url, params);
System.out.println(recordsJson);
} catch (Exception e) {
log.error("查询城市经理客户拜访失败:{}", e.getMessage());
}
}
@Override
public void updateQinceStore() {
String dateStr = DateUtil.today();
List<QinceDealerDto> dealers = qinceDealerDao.findModifyList(dateStr);
for (QinceDealerDto dealer : dealers) {
List<QinceClienteleStoreDto> storeDtoList = qinceClienteleStoreDao.findListByDealerId(dealer.getDealerId());
// 查询客户经理的上级、上上级
String managerCode = dealer.getDealerManagerCode();
QinceClienteleStoreDto storeInfo = new QinceClienteleStoreDto(dealer.getDealerManager(),"","");
pushQinceStoreInfo(storeDtoList,storeInfo);
break;
}
}
private void pushQinceStoreInfo(List<QinceClienteleStoreDto> storeDtoList,QinceClienteleStoreDto storeInfo) {
for (QinceClienteleStoreDto storeDto : storeDtoList) {
try {
System.out.println(storeDto.getQcId() + " ---- " + storeDto.getStoreName());
Map<String, Object> params = new HashMap<>();
params.put("store_waiqin_id", storeDto.getQcId());
params.put("store_name", storeDto.getStoreName());
List<Map<String, String>> exts = new ArrayList<>();
exts.add(Maps.of("store_ext_key", "城市经理", "store_ext_value", storeInfo.getManagerName()));
exts.add(Maps.of("store_ext_key", "战区经理", "store_ext_value", ""));
exts.add(Maps.of("store_ext_key", "大区总监", "store_ext_value", ""));
params.put("exts", exts);
// String url = qinCeUtils.builderUrl(QinCeUtils.MODIFY_STORE, params);
// JSONObject jsonObject = qinCeUtils.postQC(url, params);
}catch (Exception e) {
log.error("更新勤策门店失败:{}", e.getMessage());
}
break;
}
}
}
......@@ -47,6 +47,7 @@ public class FeiShuUtil {
private static final String TENANT_ACCESS_TOKEN_URL = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";
private static final String VALUES_APPEND = "/values_append";
private static final String VALUES_IMAGE = "/values_image";
private static final String VALUES_BATCH_GET = "/values_batch_get";
private static final String VALUES = "/values";
private static final String STYLE = "/style";
......@@ -103,6 +104,27 @@ public class FeiShuUtil {
return null;
}
/**
* 获取表格数据
*/
public JSONArray pullSheet(String sheetToken, String autoToken, String ranges) {
try {
Map<String, Object> params = new HashMap<>();
params.put("ranges", ranges);
String result = HttpUtil.createGet(SHEET_URL + sheetToken + VALUES_BATCH_GET).form(params).auth("Bearer " + autoToken).contentType(CONTENT_TYPE).execute().body();
JSONObject resultJson = JSONObject.parseObject(result);
System.out.println(resultJson);
int code = resultJson.getInteger("code");
if (code != 0) {
throw new RuntimeException("获取飞书表格范围数据错误:"+resultJson.getString("msg"));
}
return resultJson.getJSONObject("data").getJSONArray("valueRanges");
}catch (Exception e) {
log.error("拉取表格数据失败,停止执行!", e);
}
return new JSONArray();
}
private Client getClient() {
return Client.newBuilder(appId, appSecret).build();
}
......@@ -128,7 +150,7 @@ public class FeiShuUtil {
}
public JSONObject getBotToken1() {
public String getBotToken1() {
Map<String, Object> bodyMap = new HashMap<>();
bodyMap.put("app_id", botAppId1);
bodyMap.put("app_secret", botAppSecret1);
......@@ -144,7 +166,7 @@ public class FeiShuUtil {
if (code != 0) {
throw new RuntimeException("获取tenant_access_token错误");
}
return resultJson;
return resultJson.getString("tenant_access_token");
}
public void appendStyle(String sheetToken, Map<String, Object> body,String autoToken) {
......@@ -154,4 +176,8 @@ public class FeiShuUtil {
.body(JSONObject.toJSONString(body))
.execute().body();
}
public JSONObject pullSheetOneRange(String sheetToken, String botToken1, String ranges) {
return pullSheet(sheetToken, botToken1, ranges).getJSONObject(0);
}
}
package com.sfa.job.util;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
......@@ -8,6 +9,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
......@@ -36,6 +38,8 @@ public class QinCeUtils {
*/
// 修改经销商
public static final String MODIFY_DEALER = "/api/dealer/v1/modifyDealer/";
public static final String MODIFY_STORE = "/api/store/v1/modifyStore/";
public static final String QUERY_CUS_VISIT_RECORD = "/api/cusVisit/v1/queryCusVisitRecord/";
public String builderUrl(String sidepath, Map<String, Object> params) {
String msgId = UUID.randomUUID().toString();
......@@ -45,8 +49,13 @@ public class QinCeUtils {
return builder.toString();
}
public Map<String, Object> modifyDealerParams(){
return null;
public Map<String, Object> queryCusVisitRecordParams(String visitDate){
Map<String,Object> params = new HashMap<>();
params.put("date_start",visitDate);
params.put("date_end",visitDate);
params.put("page","1");
params.put("rows","1000");
return params;
}
......@@ -56,6 +65,7 @@ public class QinCeUtils {
JSONObject resultJson = JSONObject.parseObject(requestBody);
String returnCode = resultJson.getString("return_code");
if (!"0".equals(returnCode)) {
log.error("请求错误,返回结果:{}", requestBody);
throw new RuntimeException("OkHttp.post请求error,详情:" + requestBody);
}
return resultJson;
......@@ -69,4 +79,9 @@ public class QinCeUtils {
String digest = DigestUtils.md5Hex(json + "|" + APP_KEY + "|" + currentTimeMillis);
return digest;
}
public JSONArray postArray(String url, Map<String, Object> params) throws Exception {
JSONObject jsonObject = postQC(url, params);
return jsonObject.getJSONArray("response_data");
}
}
......@@ -33,13 +33,6 @@ public class shippingTask {
axmr005ZQToFSByDate(date,type);
}
@XxlJob("axmr005_zhanqu_month")
public void axmr005ZQByMonth() {
Date date = DateUtils.addDays(new Date(), -4);
Integer type = FSRecordEnum.AXMR005_2.getType();
axmr005ZQToFSByDate(date,type);
}
private void axmr005ZQToFSByDate(Date date,Integer type) {
erpAxmr005Service.axmr005ZQToFS(date, type);
}
......
package com.sfa.job.xxljob.feishu;
import com.sfa.job.service.feishu.IPullSheetService;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author : liqiulin
* @date : 2025-05-09 15
* @describe :
*/
@Component
public class PullSheet {
@Autowired
private IPullSheetService pullSheetService;
@XxlJob("PullSheetSotreManage")
public void qinceSotreManage(){
pullSheetService.qinceSotreManage();
}
}
......@@ -23,4 +23,18 @@ public class QinceCoreTask {
qinceCoreService.updateQinceDealerInfo();
log.info("回写勤策经销商大区、战区信息 end");
}
public void qinceCoreStore(){
log.info("回写勤策门店城市经理、战区经理、大区总监 start");
qinceCoreService.updateQinceStore();
log.info("回写勤策门店城市经理、战区经理、大区总监 end");
}
@XxlJob("qince_cus_visit_record")
public void queryCusVisitRecord() {
log.info("查询勤策客户拜访记录 start");
qinceCoreService.queryCusVisitRecord();
log.info("查询勤策客户拜访记录 start");
}
}
......@@ -32,6 +32,15 @@
<result property="dealerName" column="dealer_name" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="PushQince_2" type="com.sfa.job.domain.qince.entity.QinceDealer">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="dealerId" column="dealer_id" jdbcType="VARCHAR"/>
<result property="dealerName" column="dealer_name" jdbcType="VARCHAR"/>
<result property="dealerManagerCode" column="dealer_manager_code" jdbcType="VARCHAR"/>
<result property="dealerManager" column="dealer_manager" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,dq_org_qc_id,dq_org_name,
zq_org_qc_id,zq_org_name,dealer_dept_waiqin365_id,
......@@ -57,4 +66,15 @@
and DATE (mt) = #{today}
</select>
<!--
and DATE(mt) = #{dateStr};-->
<select id="findModifyList" resultMap="PushQince_2">
select dealer_id, dealer_name, dealer_manager, dealer_manager_code
from qince_dealer
where dealer_type = '经销商'
and dealer_cooperate_status = '1'
and dealer_status = '1'
and dealer_id = '000324'
</select>
</mapper>
......@@ -9,12 +9,13 @@
<result property="sheetToken" column="sheet_token" jdbcType="VARCHAR"/>
<result property="sheetId" column="sheet_id" jdbcType="VARCHAR"/>
<result property="createMonth" column="create_month" jdbcType="VARCHAR"/>
<result property="ranges" column="ranges" jdbcType="VARCHAR"/>
<result property="type" column="type" jdbcType="INTEGER"/>
</resultMap>
<sql id="Base_Column_List">
id,sheet_token,sheet_id,
create_month,type
create_month,ranges,type
</sql>
<select id="findOne" resultMap="BaseResultMap">
......
package com.sfa.job.service.feishu;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.*;
/**
* @author : liqiulin
* @date : 2025-05-09 17
* @describe :
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class PullSheetServiceImplTest {
@Autowired
private PullSheetServiceImpl pullSheetService;
@Test
public void qinceSotreManage() {
pullSheetService.qinceSotreManage();
}
}
\ No newline at end of file
......@@ -25,4 +25,14 @@ public class QinceDealerQueryServiceImplTest {
public void updateQinceDealerInfo() {
qinceDealerQueryService.updateQinceDealerInfo();
}
@Test
public void queryCusVisitRecord() {
qinceDealerQueryService.queryCusVisitRecord();
}
@Test
public void updateQinceStore() {
qinceDealerQueryService.updateQinceStore();
}
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论