提交 cd9ebbda authored 作者: 000516's avatar 000516 提交者: Coding

回写勤策有效门店的城市经理、省区经理、大区总监、战区、大区

Merge Request: 回写勤策有效门店的城市经理、省区经理、大区总监、战区、大区 Created By: @李秋林 Accepted By: @李秋林 URL: https://g-pkkp8204.coding.net/p/wangxiaolu-sfa/d/wangxiaolu-sfa-module-job/git/merge/137?initial=true
......@@ -15,7 +15,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableRyFeignClients
@SpringBootApplication
@MapperScan("com.sfa.job.domain.*.mapper")
//@MapperScan({"com.sfa.job.domain.job.mapper","com.sfa.job.domain.system.mapper","com.sfa.job.domain.order.mapper","com.sfa.job.domain.erp.mapper","com.sfa.job.domain.use.mapper"})
public class SfaJobApplication
{
public static void main(String[] args) {
......
package com.sfa.job.domain.feishu.dao;
import com.alibaba.fastjson2.JSONArray;
import com.sfa.job.pojo.feishu.response.QinceMarketEmployeeDto;
import java.util.List;
/**
* @author : liqiulin
* @date : 2025-05-20 16
* @describe :
*/
public interface IQinceMarketEmployeeDao {
void insert(JSONArray jsonArray);
List<QinceMarketEmployeeDto> selectByMd(String dateStr);
}
package com.sfa.job.domain.feishu.dao;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.job.domain.feishu.entity.QinceMarketEmployee;
import com.sfa.job.domain.feishu.mapper.QinceMarketEmployeeMapper;
import com.sfa.job.pojo.feishu.response.QinceMarketEmployeeDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author : liqiulin
* @date : 2025-05-20 16
* @describe :
*/
@DS("promotion")
@Service
public class QinceMarketEmployeeDaoImpl implements IQinceMarketEmployeeDao{
@Autowired
QinceMarketEmployeeMapper qinceMarketEmployeeMapper;
@Override
public void insert(JSONArray jsonArray) {
// jsonArray = 大区总监工号 大区总监姓名 省区经理工号 省区经理姓名 城市经理工号 城市经理姓名
String dqEmpNo = jsonArray.getString(0);
String dqEmpName = jsonArray.getString(1);
String zqEmpNo = jsonArray.getString(2);
String zqEmpName = jsonArray.getString(3);
String csEmpNo = jsonArray.getString(4);
String csEmpName = jsonArray.getString(5);
List<QinceMarketEmployee> dos = new ArrayList<>();
if (!Objects.isNull(dqEmpNo)) {
QinceMarketEmployee dqDo = new QinceMarketEmployee().setEmpNo(dqEmpNo).setEmpName(dqEmpName)
.setDqEmpNo(dqEmpNo).setDqEmpName(dqEmpName);
dos.add(dqDo);
}
if (!Objects.isNull(zqEmpNo)){
QinceMarketEmployee zqDo = new QinceMarketEmployee().setEmpNo(zqEmpNo).setEmpName(zqEmpName)
.setZqEmpNo(zqEmpNo).setZqEmpName(zqEmpName).setDqEmpNo(dqEmpNo).setDqEmpName(dqEmpName);
dos.add(zqDo);
}
if (!Objects.isNull(csEmpNo)) {
QinceMarketEmployee csDo = new QinceMarketEmployee().setEmpNo(csEmpNo).setEmpName(csEmpName)
.setCsEmpNo(csEmpNo).setCsEmpName(csEmpName).setZqEmpNo(zqEmpNo).setZqEmpName(zqEmpName).setDqEmpNo(dqEmpNo).setDqEmpName(dqEmpName);
dos.add(csDo);
}
if (CollectionUtils.isEmpty(dos)){
return;
}
qinceMarketEmployeeMapper.batchInsert(dos);
}
@Override
public List<QinceMarketEmployeeDto> selectByMd(String dateStr) {
List<QinceMarketEmployee> dos = qinceMarketEmployeeMapper.selectByMd(dateStr);
return BeanUtils.transitionDtos(dos, QinceMarketEmployeeDto.class);
}
}
package com.sfa.job.domain.feishu.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 勤策-区域销售人员架构表,来源:https://wangxiaolu.feishu.cn/sheets/I076slXhlhY2RdtDetEc17ornYd?sheet=49e4ba
* @TableName qince_market_employee
*/
@Accessors(chain = true)
@TableName(value ="qince_market_employee")
@Data
public class QinceMarketEmployee implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 大区总监
*/
private String dqEmpNo;
/**
* 大区总监
*/
private String dqEmpName;
/**
* 战区负责人
*/
private String zqEmpNo;
/**
* 战区负责人
*/
private String zqEmpName;
/**
* 城市经理
*/
private String csEmpNo;
/**
* 城市经理
*/
private String csEmpName;
/**
* 员工
*/
private String empNo;
/**
* 员工
*/
private String empName;
/**
* CP系统修改时间
*/
private Date modifyTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.sfa.job.domain.feishu.mapper;
import com.sfa.job.domain.feishu.entity.QinceMarketEmployee;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author a02200059
* @description 针对表【qince_market_employee(勤策-区域销售人员架构表,来源:https://wangxiaolu.feishu.cn/sheets/I076slXhlhY2RdtDetEc17ornYd?sheet=49e4ba)】的数据库操作Mapper
* @createDate 2025-05-20 16:10:09
* @Entity com.sfa.job.domain.feishu.entity.QinceMarketEmployee
*/
@Repository
public interface QinceMarketEmployeeMapper extends BaseMapper<QinceMarketEmployee> {
void batchInsert(@Param("dos") List<QinceMarketEmployee> dos);
List<QinceMarketEmployee> selectByMd(String dateStr);
}
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,7 @@ public interface IQinceDealerDao {
List<QinceDealerDto> getPushQinceDealers();
List<QinceDealerDto> findModifyList(String dateStr);
List<QinceDealerDto> findListByManagerCode(String empNo);
}
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,16 @@ 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);
}
@Override
public List<QinceDealerDto> findListByManagerCode(String empNo) {
List<QinceDealer> qinceDealers = qinceDealerMapper.findListByManagerCode(empNo);
return BeanUtils.transitionDtos(qinceDealers, QinceDealerDto.class);
}
}
package com.sfa.job.domain.qince.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
* 勤策-客户管理-终端
* @TableName qince_clientele_store
*/
@TableName(value ="qince_clientele_store")
@Data
public class QinceClienteleStore implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 勤策的门店唯一ID
*/
private String qcId;
/**
* 创建人id,来源勤策员工唯一ID
*/
private String creatorWaiqinId;
/**
* 创建人名称
*/
private String creatorName;
/**
* 系统名称
*/
private String lineName;
/**
* 门店名称
*/
private String storeName;
/**
* 门店编码
*/
private String storeCode;
/**
* 门店经理,多门店经理名称间以“,”分隔
*/
private String storeManager;
/**
* 门店类型名称
*/
private String storeType;
/**
* 是否连锁;是/否
*/
private String chain;
/**
* 勤策门店所属部门ID
*/
private String storeDeptWaiqin365Id;
/**
* 门店部门名称
*/
private String storeDeptName;
/**
* 是否双T门店
*/
private String bothT;
/**
* 门店所属行政区域-省份名称,如:北京市、江苏省
*/
private String storeMssProvince;
/**
* 门店所属行政区域-城市名称,如:南京市
*/
private String storeMssCity;
/**
* 门店所属行政区域-区县名称,如:鼓楼区
*/
private String storeMssArea;
/**
* 门店所属行政区域-乡镇街道名称,如:宁海路街道
*/
private String storeMssStreet;
/**
* 门店所在地址
*/
private String storeAddr;
/**
* 店铺经纬度
*/
private String coordinates;
/**
* 合作状态编码。0:终止合作,1:合作中,2:未合作,3:有意向
*/
private String storeCooperateStatus;
/**
* 门店分层标签名称。多分层标签名称以“,”分隔
*/
private String storeLabel;
/**
* 门店分层标签id。多分层标签id以“,”分隔
*/
private String storeLabelId;
/**
* 是否直接交易客户。0:是,1:否
*/
private String storeSaleDirect;
/**
* 门店修改时间。格式:yyyy-MM-dd HH:mm:ss
*/
private String storeModifyTime;
/**
* 门店修改人名称
*/
private String storeModifyierName;
/**
* 创建方式
*/
private String storeSourceType;
/**
* 门店门头照信息,多个以“,”号隔开
*/
private String storePictures;
/**
* 门店客户经理编码,即为员工登录账号,多客户经理唯一标识间以英文“,”隔开
*/
private String storeManagerCode;
/**
* 创建人编码
*/
private String storeCreatorCode;
/**
* 修改人编码,取最新修改记录操作人
*/
private String storeModifierCode;
/**
* 门店审批状态。1:待审批,2:审批打回,3:审批通过
*/
private String storeApprovalStatus;
/**
* 门店删除状态。0:删除,1:正常
*/
private String storeStatus;
/**
* 创建日期。格式:yyyy-MM-dd HH:mm:ss
*/
private String createTime;
/**
*
*/
private String dealersName;
/**
* 经销商编码
*/
private String dealerId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -51,6 +51,10 @@ public class QinceDealer implements Serializable {
*/
private String dealerDeptName;
private String dealerManagerCode;
private String dealerManager;
/**
* 经销商编码
*/
......
package com.sfa.job.domain.qince.mapper;
import com.sfa.job.domain.qince.entity.QinceClienteleStore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author a02200059
* @description 针对表【qince_clientele_store(勤策-客户管理-终端)】的数据库操作Mapper
* @createDate 2025-05-09 10:45:54
* @Entity com.sfa.job.domain.qince.entity.QinceClienteleStore
*/
@Repository
public interface QinceClienteleStoreMapper extends BaseMapper<QinceClienteleStore> {
List<QinceClienteleStore> findListByDealerId(String dealerId);
}
......@@ -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,10 @@ public interface QinceDealerMapper extends BaseMapper<QinceDealer> {
List<QinceDealer> pushQinceDealers(String today);
List<QinceDealer> findModifyList(String dateStr);
List<QinceDealer> findListByManagerCode(String empNo);
}
......
......@@ -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.feishu.response;
import lombok.Data;
import lombok.experimental.Accessors;
@Accessors(chain = true)
@Data
public class QinceMarketEmployeeDto{
/**
* 大区总监
*/
private String dqEmpNo;
/**
* 大区总监
*/
private String dqEmpName;
/**
* 战区负责人
*/
private String zqEmpNo;
/**
* 战区负责人
*/
private String zqEmpName;
/**
* 城市经理
*/
private String csEmpNo;
/**
* 城市经理
*/
private String csEmpName;
/**
* 员工
*/
private String empNo;
/**
* 员工
*/
private String empName;
}
\ No newline at end of file
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,13 +41,11 @@ 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) {
// 计算当前批次的结束位置
int end = Math.min(i + batchSize, zhanquDataset.size());
System.out.println(end);
List<Object> batch = zhanquDataset.subList(i, end);
feiShuUtil.pushSetToSheet(range,batch,recordDto.getSheetToken(),tenantAccessToken);
}
......
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.feishu.dao.IQinceMarketEmployeeDao;
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 IQinceMarketEmployeeDao qinceMarketEmployeeDao;
@Autowired
private FeiShuUtil feiShuUtil;
/**
* 拉取表格 - 勤策门店的城市经理、省区经理、大区总监
*/
@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");
for (int i = 0; i < values.size(); i++) {
JSONArray jsonArray = values.getJSONArray(i);
qinceMarketEmployeeDao.insert(jsonArray);
}
}
}
......@@ -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.feishu.dao.IQinceMarketEmployeeDao;
import com.sfa.job.domain.qince.dao.IQinceClienteleStoreDao;
import com.sfa.job.domain.qince.dao.IQinceDealerDao;
import com.sfa.job.pojo.feishu.response.QinceMarketEmployeeDto;
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 +31,10 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
@Autowired
private IQinceDealerDao qinceDealerDao;
@Autowired
private IQinceClienteleStoreDao qinceClienteleStoreDao;
@Autowired
private IQinceMarketEmployeeDao qinceMarketEmployeeDao;
@Autowired
private QinCeUtils qinCeUtils;
@Override
......@@ -65,6 +74,62 @@ 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);
} catch (Exception e) {
log.error("查询城市经理客户拜访失败:{}", e.getMessage());
}
}
@Override
public void updateQinceStore() {
// 第一步:查询有变动的人员信息:营销中心-逻辑组织架构表
// 第二步:根据每个人员信息,查询出所负责的经销商
// 第三步:根据每家经销商,查询出归属的有效门店
// 第四步:更新每家门店信息:大区、战区取经销商的;城市经理、战区经理、大区总监取人员架构表的
String dateStr = DateUtil.today();
List<QinceMarketEmployeeDto> empDtos = qinceMarketEmployeeDao.selectByMd(dateStr);
for (QinceMarketEmployeeDto empDto : empDtos) {
List<QinceDealerDto> dealers = qinceDealerDao.findListByManagerCode(empDto.getEmpNo());
for (QinceDealerDto dealer : dealers) {
List<QinceClienteleStoreDto> storeDtoList = qinceClienteleStoreDao.findListByDealerId(dealer.getDealerId());
pushQinceStoreInfo(storeDtoList, dealer,empDto);
}
}
}
private void pushQinceStoreInfo(List<QinceClienteleStoreDto> storeDtoList,QinceDealerDto dealer,QinceMarketEmployeeDto empDto) {
for (QinceClienteleStoreDto storeDto : storeDtoList) {
Map<String, Object> params = new HashMap<>();
try {
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", empDto.getCsEmpName()));
exts.add(Maps.of("store_ext_key", "战区经理", "store_ext_value", empDto.getZqEmpName()));
exts.add(Maps.of("store_ext_key", "大区总监", "store_ext_value", empDto.getDqEmpName()));
exts.add(Maps.of("store_ext_key", "大区", "store_ext_value", dealer.getDqOrgName()));
exts.add(Maps.of("store_ext_key", "战区", "store_ext_value", dealer.getZqOrgName()));
params.put("exts", exts);
String url = qinCeUtils.builderUrl(QinCeUtils.MODIFY_STORE, params);
qinCeUtils.postQC(url, params);
} catch (Exception e) {
log.error("勤策门店更新失败:{}\n{}", JSONObject.toJSONString(params), e.getMessage());
}
}
}
}
......@@ -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,26 @@ 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);
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 +149,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 +165,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 +175,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;
}
......@@ -69,4 +78,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;
/**
* 拉取表格 - 勤策门店的城市经理、省区经理、大区总监
* https://wangxiaolu.feishu.cn/sheets/I076slXhlhY2RdtDetEc17ornYd?sheet=49e4ba
*/
@XxlJob("pull_sheet_store_manage")
public void qinceSotreManage(){
pullSheetService.qinceSotreManage();
}
}
......@@ -19,8 +19,26 @@ public class QinceCoreTask {
@XxlJob("qince_modify_dealer")
public void qinceCoreTask() {
log.info("回写勤策经销商大区、战区信息 start");
log.info("回写勤策-经销商大区、战区信息 start");
qinceCoreService.updateQinceDealerInfo();
log.info("回写勤策经销商大区、战区信息 end");
log.info("回写勤策-经销商大区、战区信息 end");
}
@XxlJob("qince_modify_store")
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");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfa.job.domain.feishu.mapper.QinceMarketEmployeeMapper">
<resultMap id="BaseResultMap" type="com.sfa.job.domain.feishu.entity.QinceMarketEmployee">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="dqEmpNo" column="dq_emp_no" jdbcType="VARCHAR"/>
<result property="dqEmpName" column="dq_emp_name" jdbcType="VARCHAR"/>
<result property="zqEmpNo" column="zq_emp_no" jdbcType="VARCHAR"/>
<result property="zqEmpName" column="zq_emp_name" jdbcType="VARCHAR"/>
<result property="csEmpNo" column="cs_emp_no" jdbcType="VARCHAR"/>
<result property="csEmpName" column="cs_emp_name" jdbcType="VARCHAR"/>
<result property="empNo" column="emp_no" jdbcType="VARCHAR"/>
<result property="empName" column="emp_name" jdbcType="VARCHAR"/>
<result property="modifyTime" column="modify_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id,dq_emp_no,dq_emp_name,
zq_emp_no,zq_emp_name,cs_emp_no,
cs_emp_name,emp_no,emp_name,
modify_time
</sql>
<insert id="batchInsert" parameterType="java.util.List">
insert into qince_market_employee (emp_no, emp_name, dq_emp_no, dq_emp_name, zq_emp_no, zq_emp_name, cs_emp_no,
cs_emp_name) values
<foreach collection="dos" item="item" separator=",">
(#{item.empNo},#{item.empName},#{item.dqEmpNo},#{item.dqEmpName},#{item.zqEmpNo},#{item.zqEmpName},#{item.csEmpNo},#{item.csEmpName})
</foreach>
on duplicate key update emp_name = values(emp_name),dq_emp_no = values(dq_emp_no),dq_emp_name =
values(dq_emp_name),zq_emp_no = values(zq_emp_no),zq_emp_name = values(zq_emp_name),cs_emp_no = values(cs_emp_no),cs_emp_name =
values(cs_emp_name)
</insert>
<select id="selectByMd" resultMap="BaseResultMap">
select dq_emp_no,dq_emp_name,
zq_emp_no,zq_emp_name,cs_emp_no,
cs_emp_name,emp_no,emp_name
from qince_market_employee where DATE(modify_time) = #{dateStr}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfa.job.domain.qince.mapper.QinceClienteleStoreMapper">
<resultMap id="BaseResultMap" type="com.sfa.job.domain.qince.entity.QinceClienteleStore">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="qcId" column="qc_id" jdbcType="VARCHAR"/>
<result property="creatorWaiqinId" column="creator_waiqin_id" jdbcType="VARCHAR"/>
<result property="creatorName" column="creator_name" jdbcType="VARCHAR"/>
<result property="lineName" column="line_name" jdbcType="VARCHAR"/>
<result property="storeName" column="store_name" jdbcType="VARCHAR"/>
<result property="storeCode" column="store_code" jdbcType="VARCHAR"/>
<result property="storeManager" column="store_manager" jdbcType="VARCHAR"/>
<result property="storeType" column="store_type" jdbcType="VARCHAR"/>
<result property="chain" column="chain" jdbcType="CHAR"/>
<result property="storeDeptWaiqin365Id" column="store_dept_waiqin365_id" jdbcType="VARCHAR"/>
<result property="storeDeptName" column="store_dept_name" jdbcType="VARCHAR"/>
<result property="bothT" column="both_t" jdbcType="VARCHAR"/>
<result property="storeMssProvince" column="store_mss_province" jdbcType="VARCHAR"/>
<result property="storeMssCity" column="store_mss_city" jdbcType="VARCHAR"/>
<result property="storeMssArea" column="store_mss_area" jdbcType="VARCHAR"/>
<result property="storeMssStreet" column="store_mss_street" jdbcType="VARCHAR"/>
<result property="storeAddr" column="store_addr" jdbcType="VARCHAR"/>
<result property="coordinates" column="coordinates" jdbcType="VARCHAR"/>
<result property="storeCooperateStatus" column="store_cooperate_status" jdbcType="CHAR"/>
<result property="storeLabel" column="store_label" jdbcType="VARCHAR"/>
<result property="storeLabelId" column="store_label_id" jdbcType="VARCHAR"/>
<result property="storeSaleDirect" column="store_sale_direct" jdbcType="VARCHAR"/>
<result property="storeModifyTime" column="store_modify_time" jdbcType="VARCHAR"/>
<result property="storeModifyierName" column="store_modifyier_name" jdbcType="VARCHAR"/>
<result property="storeSourceType" column="store_source_type" jdbcType="VARCHAR"/>
<result property="storePictures" column="store_pictures" jdbcType="VARCHAR"/>
<result property="storeManagerCode" column="store_manager_code" jdbcType="VARCHAR"/>
<result property="storeCreatorCode" column="store_creator_code" jdbcType="VARCHAR"/>
<result property="storeModifierCode" column="store_modifier_code" jdbcType="VARCHAR"/>
<result property="storeApprovalStatus" column="store_approval_status" jdbcType="CHAR"/>
<result property="storeStatus" column="store_status" jdbcType="CHAR"/>
<result property="createTime" column="create_time" jdbcType="CHAR"/>
<result property="dealersName" column="dealers_name" jdbcType="VARCHAR"/>
<result property="dealerId" column="dealer_id" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="Base_1" type="com.sfa.job.domain.qince.entity.QinceClienteleStore">
<result property="qcId" column="qc_id" jdbcType="VARCHAR"/>
<result property="storeName" column="store_name" jdbcType="VARCHAR"/>
<result property="storeCode" column="store_code" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,qc_id,creator_waiqin_id,
creator_name,line_name,store_name,
store_code,store_manager,store_type,
chain,store_dept_waiqin365_id,store_dept_name,
both_t,store_mss_province,store_mss_city,
store_mss_area,store_mss_street,store_addr,
coordinates,store_cooperate_status,store_label,
store_label_id,store_sale_direct,store_modify_time,
store_modifyier_name,store_source_type,store_pictures,
store_manager_code,store_creator_code,store_modifier_code,
store_approval_status,store_status,create_time,
dealers_name,dealer_id
</sql>
<select id="findListByDealerId" resultMap="Base_1">
select qc_id, store_name, store_code
from qince_clientele_store
where dealer_id = #{dealerId}
and store_cooperate_status = '1'
and store_approval_status = 3
and store_status = '1'
</select>
</mapper>
......@@ -32,6 +32,14 @@
<result property="dealerName" column="dealer_name" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="PushQince_2" type="com.sfa.job.domain.qince.entity.QinceDealer">
<result property="dqOrgName" column="dq_org_name" jdbcType="VARCHAR"/>
<result property="zqOrgName" column="zq_org_name" jdbcType="VARCHAR"/>
<result property="dealerId" column="dealer_id" jdbcType="VARCHAR"/>
<result property="dealerName" column="dealer_name" 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 +65,23 @@
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>
<select id="findListByManagerCode" resultMap="PushQince">
select dq_org_name, zq_org_name, dealer_id, dealer_name
from qince_dealer
where dealer_type = '经销商'
and dealer_cooperate_status = '1'
and dealer_status = '1'
and dealer_manager_code = #{empNo}
</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
测试钩子
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论