提交 48f07d50 authored 作者: 000516's avatar 000516

1、飞书部门、人员同步T100;2、飞书回调事件;3、CP活动审核功能;4、`finance_base_zbj_type`添加表声明;`QinceCliente…

1、飞书部门、人员同步T100;2、飞书回调事件;3、CP活动审核功能;4、`finance_base_zbj_type`添加表声明;`QinceClienteleStoreMapper`删除未使用的`resultMap`;5、bootstrap配置文件中,添加nacos共享yml配置
...@@ -108,10 +108,6 @@ ...@@ -108,10 +108,6 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.larksuite.oapi</groupId>
<artifactId>oapi-sdk</artifactId>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
......
...@@ -5,12 +5,14 @@ import com.sfa.common.security.annotation.EnableRyFeignClients; ...@@ -5,12 +5,14 @@ import com.sfa.common.security.annotation.EnableRyFeignClients;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
/** /**
* 定时任务 * 定时任务
* *
* @author ruoyi * @author ruoyi
*/ */
@ComponentScan(basePackages = {"com.sfa.common.core.utils.sdk","com.sfa.job"})
@EnableCustomConfig @EnableCustomConfig
@EnableRyFeignClients @EnableRyFeignClients
@SpringBootApplication @SpringBootApplication
......
...@@ -16,7 +16,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; ...@@ -16,7 +16,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
* @date : 2024-10-28 17 * @date : 2024-10-28 17
* @describe :自动封装 * @describe :自动封装
*/ */
@RestControllerAdvice @RestControllerAdvice(basePackages = {"com.sfa.job.controller"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object>{ public class ControllerResponseAdvice implements ResponseBodyAdvice<Object>{
/** /**
......
...@@ -5,4 +5,15 @@ public class Constants { ...@@ -5,4 +5,15 @@ public class Constants {
* 采集数据方式 * 采集数据方式
*/ */
public static final String SYNC_TYPE_XXL_JOB = "xxl-job"; public static final String SYNC_TYPE_XXL_JOB = "xxl-job";
public static final String ENCRYPT = "encrypt";
public static final String FEISHU_EVENT_CALLBACK = "event_callback";
public static final String FEISHU_APPROVAL_INSTANCE = "approval_instance";
public static final String FEISHU_EVENT_DEPT_CREATE = "corehr.department.created_v1";
public static final String FEISHU_EVENT_DEPT_PUT = "corehr.department.updated_v1";
public static final String FEISHU_EVENT_USER_CREATE = "corehr.job_data.employed_v1";
public static final String FEISHU_EVENT_USER_PUT = "corehr.job_data.changed_v1";
} }
package com.sfa.job.constants;
/**
* @author : liqiulin
* @date : 2024-11-22 11
* @describe :
*/
public interface RedisKeyJob {
String FEISHU_EVENT_CREATE_DEPT = "job:feishu_event:create_dept_";
}
package com.sfa.job.consumer.feishu;
import com.alibaba.fastjson2.JSONObject;
import com.lark.oapi.ws.Constant;
import com.sfa.common.core.enums.ECode;
import com.sfa.common.core.enums.promotion.PlanStatus;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.redis.service.RedisService;
import com.sfa.job.constants.Constants;
import com.sfa.job.constants.RedisKeyJob;
import com.sfa.job.pojo.feishu.event.EventCallBackDto;
import com.sfa.job.service.feishu.IEventCallbackService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author : liqiulin
* @date : 2025-06-04 13
* @describe : 飞书事件订阅 - 来自应用【王小卤链路中心】
* 订阅方式:https://open.feishu.cn/api-explorer/cli_a7dbe3ec7d9e5013?apiName=subscribe&from=op_doc_tab&project=approval&resource=approval&version=v4
*/
@Slf4j
@RestController
@RequestMapping("/event_callback/fs/luzx")
public class EventCallbackLuzx {
@Value("${feishu.luzx.encrypt_key}")
private String encryptKeyP;
@Value("${feishu.approval.scfy}")
private String scfyCode;
@Autowired
private IEventCallbackService eventCallbackService;
@Autowired
private RedisService redisService;
@RequestMapping(method = RequestMethod.POST)
public JSONObject handleEvent(@RequestBody JSONObject eventObj) {
String encrypt = eventObj.getString(Constants.ENCRYPT);
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] keyBs = digest.digest(encryptKeyP.getBytes(StandardCharsets.UTF_8));
String decrypt = decrypt(encrypt,keyBs);
JSONObject req = JSONObject.parseObject(decrypt);
log.info("飞书事件回调数据:{}\n解析:{}",eventObj,req);
/**
* 审批实例 状态变更 事件处理
*/
String type = req.getString("type");
if (Objects.nonNull(type) && Constants.FEISHU_EVENT_CALLBACK.equals(type)){
eventCallback(decrypt);
}
/**
* 组织(部门/人员)变更 事件处理
*/
if (req.containsKey("header")){
deptOrUserEvent(req);
}
return req;
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException(ECode.DB_TABLE_UPDATE_ERROR.getMsg(),ECode.DB_TABLE_UPDATE_ERROR.getCode());
}
}
/**
* 部门、人员变更事件
*/
private void deptOrUserEvent(JSONObject req) {
if (!req.containsKey("event")){
return;
}
String eventType = req.getJSONObject("header").getString("event_type");
String departmentId = req.getJSONObject("event").getString("department_id");
String rk = RedisKeyJob.FEISHU_EVENT_CREATE_DEPT + (Objects.isNull(departmentId) ? "departmentId" : departmentId);
// 部门新建
if (Constants.FEISHU_EVENT_DEPT_CREATE.equals(eventType) && !redisService.hasKey(rk)){
redisService.setCacheObject(rk,departmentId,1L, TimeUnit.HOURS);
eventCallbackService.deptCreate(departmentId);
}
// 部门更新/停用
if (Constants.FEISHU_EVENT_DEPT_PUT.equals(eventType)){
eventCallbackService.deptUpdate(departmentId);
}
// 员工入职
if (Constants.FEISHU_EVENT_USER_CREATE.equals(eventType)){
eventCallbackService.userCreate(req.getJSONObject("event").getString("employment_id"));
}
// 员工信息修改
if (Constants.FEISHU_EVENT_USER_PUT.equals(eventType)){
eventCallbackService.userUpdate(req.getJSONObject("event").getString("employment_id"));
}
}
/**
* 订阅审批
*/
private void eventCallback(String decrypt){
EventCallBackDto eventCallBackDto = JSONObject.parseObject(decrypt, EventCallBackDto.class);
EventCallBackDto.Event event = eventCallBackDto.getEvent();
// 市场推广费用申请(审批实例CODE:258B4D93-96D4-49E4-B9E1-DA6AB45740B0)
if (Constants.FEISHU_APPROVAL_INSTANCE.equals(event.getType()) && scfyCode.equals(event.getApprovalCode())){
if (!event.getStatus().equals(PlanStatus.PENDING.name())){
eventCallbackService.planCP(event);
}
}
}
/**
* 解析encrypt_key加密数据
*/
private String decrypt(String base64,byte[] keyBs) throws Exception {
byte[] decode = Base64.getDecoder().decode(base64);
Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
byte[] iv = new byte[16];
System.arraycopy(decode, 0, iv, 0, 16);
byte[] data = new byte[decode.length - 16];
System.arraycopy(decode, 16, data, 0, data.length);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBs, "AES"), new IvParameterSpec(iv));
byte[] r = cipher.doFinal(data);
if (r.length > 0) {
int p = r.length - 1;
for (; p >= 0 && r[p] <= 16; p--) {
}
if (p != r.length - 1) {
byte[] rr = new byte[p + 1];
System.arraycopy(r, 0, rr, 0, p + 1);
r = rr;
}
}
return new String(r, StandardCharsets.UTF_8);
}
}
...@@ -2,6 +2,7 @@ package com.sfa.job.domain.order.entity; ...@@ -2,6 +2,7 @@ package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -12,6 +13,7 @@ import java.time.LocalDateTime; ...@@ -12,6 +13,7 @@ import java.time.LocalDateTime;
* @author lvbcai * @author lvbcai
* @date 2025年01月07日10:04:25 * @date 2025年01月07日10:04:25
*/ */
@TableName(value = "finance_base_zbj_type")
@Data @Data
public class FinanceBaseZbjType { public class FinanceBaseZbjType {
// 唯一键 // 唯一键
......
package com.sfa.job.domain.promotion.dao;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.job.domain.promotion.entity.ActivityPlanApproval;
import com.sfa.job.domain.promotion.mapper.ActivityPlanApprovalMapper;
import com.sfa.job.domain.promotion.mapper.ActivityPlanInfoMapper;
import com.sfa.job.pojo.promotion.response.ActivityPlanApprovalDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author : liqiulin
* @date : 2025-06-04 19
* @describe :
*/
@DS("promotion")
@Service
public class ActivityPlanDaoImpl implements IActivityPlanDao{
@Autowired
private ActivityPlanApprovalMapper activityPlanApprovalMapper;
@Autowired
private ActivityPlanInfoMapper activityPlanInfoMapper;
@Override
public ActivityPlanApprovalDto findPlanApproval(String instanceId) {
ActivityPlanApproval planApproval = activityPlanApprovalMapper.findPlanApproval(instanceId);
return BeanUtils.transitionDto(planApproval, ActivityPlanApprovalDto.class);
}
@Override
public void updateApprovalStatusById(Long id, String status) {
activityPlanApprovalMapper.updateApprovalStatusById(id,status);
}
@Override
public void updateActivityPlanStatusByInstanceId(String instanceId, Integer planStatusCode) {
activityPlanInfoMapper.updateStatusByInstanceId(instanceId,planStatusCode);
}
}
package com.sfa.job.domain.promotion.dao;
import com.sfa.job.pojo.promotion.response.ActivityPlanApprovalDto;
/**
* @author : liqiulin
* @date : 2025-06-04 19
* @describe :
*/
public interface IActivityPlanDao {
ActivityPlanApprovalDto findPlanApproval(String instanceId);
void updateApprovalStatusById(Long id, String status);
void updateActivityPlanStatusByInstanceId(String instanceId, Integer planStatusCode);
}
package com.sfa.job.domain.promotion.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;
/**
*
* @TableName activity_plan_approval
*/
@TableName(value ="activity_plan_approval")
@Data
public class ActivityPlanApproval implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 活动计划表上传记录id
*/
private Long planFileId;
/**
* 姓名
*/
private String employeeName;
/**
* 员工工号
*/
private String employeeNo;
/**
* 计划月份
*/
private String planMonth;
/**
* 飞书审批实例ID
*/
private String fsInstanceId;
/**
* 审批单号
*/
private String serialNumber;
/**
* 审批状态
*/
private String approvalStatus;
/**
* 审批内容
*/
private String form;
/**
* 创建人
*/
private String createBy;
/**
*
*/
private Date createTime;
/**
*
*/
private Date modifyTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.sfa.job.domain.promotion.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.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 活动计划列表
* @TableName activity_plan_info
*/
@TableName(value ="activity_plan_info")
@Data
public class ActivityPlanInfo implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 活动计划表上传记录id
*/
private Long planFileId;
/**
* promotion_manage_employee表id
*/
private Integer employeeId;
/**
* 姓名
*/
private String employeeName;
/**
* 员工工号
*/
private String employeeNo;
/**
* 年份
*/
private Integer year;
/**
* 月份
*/
private Integer month;
/**
* 日期
*/
private Date date;
/**
* 系统名称
*/
private String lineName;
/**
* 门店名称
*/
private String storeName;
/**
* 门店编码
*/
private String storeCode;
/**
* 战区-勤策ID
*/
private String orgQcId;
/**
* 战区名称
*/
private String orgName;
/**
* 活动模式id
*/
private Integer patternId;
/**
* 活动模式
*/
private String pattern;
/**
* 经销商编码
*/
private String dealerId;
/**
* 经销商名称
*/
private String dealerName;
/**
* 是否双T门店
*/
private String bothT;
/**
* 门店所属行政区域-省份名称,如:北京市、江苏省
*/
private String province;
/**
* 门店所属行政区域-城市名称,如:南京市
*/
private String city;
/**
* 门店所属行政区域-区县名称,如:鼓楼区
*/
private String area;
/**
* 门店所在地址
*/
private String addr;
/**
* 上班时间
*/
private Date clockInTime;
/**
* 下班时间
*/
private Date clockOutTime;
/**
* 工资
*/
private BigDecimal salary;
/**
* 杂费
*/
private BigDecimal incidentals;
/**
* 是否执行:1:执行;0:未执行;2:审批中;3:审批拒绝;4:未审批;
*/
private Integer planStatus;
/**
* 飞书审批实例Code
*/
private String fsInstanceId;
/**
* 飞书审批单编号
*/
private String serialNumber;
/**
* 审批人
*/
private String approvalEmpName;
/**
*
*/
private Date createTime;
/**
*
*/
private Date modifyTime;
/**
* 1:有效;0:删除;
*/
private Integer isDelete;
/**
* 创建人
*/
private String createBy;
/**
* 修改人
*/
private String modifyBy;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.sfa.job.domain.promotion.mapper;
import com.sfa.job.domain.promotion.entity.ActivityPlanApproval;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @author a02200059
* @description 针对表【activity_plan_approval】的数据库操作Mapper
* @createDate 2025-06-04 19:01:10
* @Entity com.sfa.job.domain.promotion.entity.ActivityPlanApproval
*/
@Repository
public interface ActivityPlanApprovalMapper extends BaseMapper<ActivityPlanApproval> {
ActivityPlanApproval findPlanApproval(String instanceId);
void updateApprovalStatusById(@Param("id") Long id,@Param("status") String status);
}
package com.sfa.job.domain.promotion.mapper;
import com.sfa.job.domain.promotion.entity.ActivityPlanInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @author a02200059
* @description 针对表【activity_plan_info(活动计划列表)】的数据库操作Mapper
* @createDate 2025-06-04 19:01:10
* @Entity com.sfa.job.domain.promotion.entity.ActivityPlanInfo
*/
@Repository
public interface ActivityPlanInfoMapper extends BaseMapper<ActivityPlanInfo> {
void updateStatusByInstanceId(@Param("fsInstanceId") String instanceId,@Param("planStatus") Integer planStatusCode);
}
package com.sfa.job.pojo.feishu.event;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
/**
* @author : liqiulin
* @date : 2025-06-04 18
* @describe :
*/
@Data
public class EventCallBackDto {
// 事件的唯一标识。
@JSONField(name = "uuid")
private String uuid;
// 事件 Token,即应用的 Verification Token。
@JSONField(name = "token")
private String token;
// 事件发送时间。包含小数的秒级时间戳。
@JSONField(name = "ts")
private String ts;
// 固定取值 event_callback。
@JSONField(name = "type")
private String type;
@JSONField(name = "event")
private Event event;
@Data
public class Event {
// 应用的 App ID。可调用获取应用信息接口查询应用详细信息。
@JSONField(name = "app_id")
private String appId;
// 审批定义 Code
@JSONField(name = "approval_code")
private String approvalCode;
// 审批实例 Code
@JSONField(name = "instance_code")
private String fsInstanceId;
// 事件发生事件,毫秒级时间戳。
@JSONField(name = "instance_operate_time")
private String instanceOperateTime;
// 事件发生时间,毫秒级时间戳。
@JSONField(name = "operate_time")
private String operateTime;
/**
* 审批实例状态。可能值有:
* PENDING:审批中
* APPROVED:已通过
* REJECTED:已拒绝
* CANCELED:已撤回
* DELETED:已删除
* REVERTED:已撤销
* OVERTIME_CLOSE:超时被关闭
* OVERTIME_RECOVER:超时实例被恢复
*/
@JSONField(name = "status")
private String status;
// 企业唯一标识。
@JSONField(name = "tenant_key")
private String tenantKey;
// 事件类型。固定取值
@JSONField(name = "type")
private String type;
// 如果创建审批实例时传入了 uuid,则此处返回该实例的 uuid。
@JSONField(name = "uuid")
private String uuid;
}
}
package com.sfa.job.pojo.promotion.response;
import lombok.Data;
import java.util.Date;
/**
* @author : liqiulin
* @date : 2025-06-04 19
* @describe :
*/
@Data
public class ActivityPlanApprovalDto {
/**
* 主键id
*/
private Long id;
/**
* 活动计划表上传记录id
*/
private Long planFileId;
/**
* 姓名
*/
private String employeeName;
/**
* 员工工号
*/
private String employeeNo;
/**
* 计划月份
*/
private String planMonth;
/**
* 飞书审批实例ID
*/
private String fsInstanceId;
/**
* 审批单号
*/
private String serialNumber;
/**
* 审批状态
*/
private String approvalStatus;
/**
* 审批内容
*/
private String form;
/**
* 创建人
*/
private String createBy;
/**
*
*/
private Date createTime;
/**
*
*/
private Date modifyTime;
}
package com.sfa.job.service.erp.impl; package com.sfa.job.service.erp.impl;
import com.alibaba.fastjson2.JSONObject; import com.sfa.common.core.utils.sdk.FeiShuUtil;
import com.sfa.job.domain.erp.dao.ErpAxmr005ShippingDetailsDao; import com.sfa.job.domain.erp.dao.ErpAxmr005ShippingDetailsDao;
import com.sfa.job.domain.use.dao.IFeishuSheetRecordDao;
import com.sfa.job.pojo.response.FeishuSheetRecordDto; import com.sfa.job.pojo.response.FeishuSheetRecordDto;
import com.sfa.job.service.erp.ErpAxmr005Service; import com.sfa.job.service.erp.ErpAxmr005Service;
import com.sfa.job.util.FeiShuUtil;
import com.sfa.job.domain.use.dao.IFeishuSheetRecordDao;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
......
package com.sfa.job.service.feishu;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONObject;
import com.lark.oapi.service.corehr.v2.model.*;
import com.sfa.common.core.enums.promotion.PlanStatus;
import com.sfa.common.core.utils.DateUtils;
import com.sfa.common.core.utils.sdk.FeiShuUtil;
import com.sfa.job.domain.promotion.dao.IActivityPlanDao;
import com.sfa.job.pojo.feishu.event.EventCallBackDto;
import com.sfa.job.pojo.promotion.response.ActivityPlanApprovalDto;
import com.sfa.job.util.T100Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Objects;
/**
* @author : liqiulin
* @date : 2025-06-04 17
* @describe :
*/
@Slf4j
@Service
public class EventCallbackServiceImpl implements IEventCallbackService{
@Autowired
private IActivityPlanDao activityPlanDao;
@Autowired
private FeiShuUtil feiShuUtil;
@Autowired
private T100Util t100Util;
@Override
public void planCP(EventCallBackDto.Event event) {
String status = event.getStatus();
String instanceId = event.getFsInstanceId();
ActivityPlanApprovalDto planApproval = activityPlanDao.findPlanApproval(instanceId);
if (planApproval == null){
log.error("审批实例不存在:{}",event);
}
activityPlanDao.updateApprovalStatusById(planApproval.getId(),status);
// 校验状态:已通过=已通过;非已通过=审批未通过
PlanStatus planStatus = PlanStatus.APPROVED.name().equals(status) ? PlanStatus.NOT_EXECUTION : PlanStatus.REJECTED;
Integer planStatusCode = planStatus.getCode();
activityPlanDao.updateActivityPlanStatusByInstanceId(instanceId,planStatusCode);
}
@Override
public void deptCreate(String departmentId) {
JSONObject deptT100 = new JSONObject();
Department dept = feiShuUtil.getDepartmentCorehr(departmentId);
String deptCode = dept.getCode();
I18n[] departmentName = dept.getDepartmentName();
String deptName = departmentName[0].getValue();
customFields(dept.getCustomFields(),deptT100);
String parentDepartmentId = dept.getParentDepartmentId();
Department parentdept = feiShuUtil.getDepartmentCorehr(parentDepartmentId);
deptT100.put("data_status","A");
deptT100.put("enterprise_no","80");
deptT100.put("status","Y");
deptT100.put("department_no",deptCode);
deptT100.put("top_level_department_no", Objects.nonNull(parentdept.getIsRoot()) && parentdept.getIsRoot() ? "BJHQ" : parentdept.getCode());
deptT100.put("effective_date", DateUtils.datePath());
deptT100.put("expiration_date",null);
deptT100.put("corporation","ALL");
deptT100.put("department_name_name",deptName);
deptT100.put("department_shortname",deptName);
deptT100.put("top_organization_no","ALL");
deptT100.put("department_heads_employee_no","");
deptT100.put("ooeg005","Y");
createOrUpdateDept(deptT100);
}
@Override
public void deptUpdate(String departmentId) {
JSONObject deptT100 = new JSONObject();
Department dept = feiShuUtil.getDepartmentCorehr(departmentId);
// 部门启用状态,true为启用,false为停用
Boolean active = dept.getActive();
String deptCode = dept.getCode();
I18n[] departmentName = dept.getDepartmentName();
String deptName = active ? departmentName[0].getValue() : "(失效)"+departmentName[0].getValue();
customFields(dept.getCustomFields(),deptT100);
String parentDepartmentId = dept.getParentDepartmentId();
Department parentdept = feiShuUtil.getDepartmentCorehr(parentDepartmentId);
deptT100.put("data_status","AU");
deptT100.put("enterprise_no","80");
deptT100.put("status","Y");
deptT100.put("department_no",deptCode);
deptT100.put("top_level_department_no", Objects.nonNull(parentdept.getIsRoot()) && parentdept.getIsRoot() ? "BJHQ" : parentdept.getCode());
deptT100.put("effective_date", DateUtils.datePath());
deptT100.put("expiration_date",null);
deptT100.put("corporation","ALL");
deptT100.put("department_name_name",deptName);
deptT100.put("department_shortname",deptName);
deptT100.put("top_organization_no","ALL");
deptT100.put("department_heads_employee_no","");
deptT100.put("ooeg005","Y");
createOrUpdateDept(deptT100);
}
/**
* 员工入职
*/
@Override
public void userCreate(String employmentId) {
Employee emp = feiShuUtil.getEmployeeReq(employmentId);
String departmentIdV2 = emp.getDepartmentIdV2();
Department dept = feiShuUtil.getDepartmentCorehr(departmentIdV2);
String employeeNumber = emp.getEmployeeNumber();
String deptCode = dept.getCode();
BankAccount bankAccount = emp.getPersonInfo().getBankAccountList()[0];
String branchIdV2 = bankAccount.getBranchIdV2();
String bankAccountNumber = bankAccount.getBankAccountNumber();
String preferredName = emp.getPersonInfo().getPreferredName();
JSONObject userT100 = new JSONObject();
userT100.put("data_status","AU");
userT100.put("status","Y");
userT100.put("employee_no",employeeNumber);
userT100.put("department_no",deptCode);
userT100.put("site_no","ALL");
userT100.put("title","");
userT100.put("bank_no",branchIdV2);
userT100.put("account",bankAccountNumber);
userT100.put("employee_name",preferredName);
userT100.put("employee_nickname",preferredName);
userT100.put("phone","");
userT100.put("mobilephone","ALL");
userT100.put("email","");
createOrUpdateUser(userT100);
}
@Override
public void userUpdate(String employmentId) {
userCreate(employmentId);
}
private void customFields(CustomFieldData[] customFields,JSONObject deptT100){
for (CustomFieldData customField : customFields) {
String customName = customField.getName().getZhCn();
String customValue = JSONObject.parse(customField.getValue()).getString("zh-CN");
switch (customName) {
case "责任中心":
deptT100.put("responsibility_center_type",customValue.substring(0,1));
break;
case "费用类别":
deptT100.put("fee_type",customValue.substring(0,1));
break;
default:
break;
}
}
}
private void createOrUpdateDept(JSONObject deptT100){
JSONObject service = new JSONObject();
service.put("name","department.create");
JSONObject datakey = new JSONObject();
datakey.put("CompanyId","BJHQ");
datakey.put("EntId","80");
JSONObject host = new JSONObject();
host.put("acct","tiptop");
host.put("ip","192.168.100.20");
host.put("lang","zh_CN");
host.put("prod","CRM");
host.put("timestamp",DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
JSONObject payload = new JSONObject();
payload.putObject("std_data").putObject("parameter").putArray("master_data").add(deptT100);
JSONObject deptJson = new JSONObject();
deptJson.put("service",service);
deptJson.put("datakey",datakey);
deptJson.put("host",host);
deptJson.put("payload",payload);
t100Util.createOrUpdateDept(deptJson);
}
private void createOrUpdateUser(JSONObject userT100){
JSONObject service = new JSONObject();
service.put("name","employee.create");
JSONObject datakey = new JSONObject();
datakey.put("CompanyId","BJHQ");
datakey.put("EntId","80");
JSONObject host = new JSONObject();
host.put("acct","tiptop");
host.put("ip","192.168.100.20");
host.put("lang","zh_CN");
host.put("prod","CRM");
host.put("timestamp",DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
JSONObject payload = new JSONObject();
payload.putObject("std_data").putObject("parameter").putArray("master_data").add(userT100);
JSONObject userJson = new JSONObject();
userJson.put("service",service);
userJson.put("datakey",datakey);
userJson.put("host",host);
userJson.put("payload",payload);
t100Util.createOrUpdateUser(userJson);
}
}
package com.sfa.job.service.feishu;
import com.sfa.job.pojo.feishu.event.EventCallBackDto;
/**
* @author : liqiulin
* @date : 2025-06-04 17
* @describe :
*/
public interface IEventCallbackService {
void planCP(EventCallBackDto.Event event);
void deptCreate(String departmentId);
void deptUpdate(String departmentId);
void userCreate(String employmentId);
void userUpdate(String employmentId);
}
...@@ -2,16 +2,14 @@ package com.sfa.job.service.feishu; ...@@ -2,16 +2,14 @@ package com.sfa.job.service.feishu;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.sfa.common.core.utils.sdk.FeiShuUtil;
import com.sfa.job.domain.feishu.dao.IQinceMarketEmployeeDao; import com.sfa.job.domain.feishu.dao.IQinceMarketEmployeeDao;
import com.sfa.job.domain.use.dao.IFeishuSheetRecordDao; import com.sfa.job.domain.use.dao.IFeishuSheetRecordDao;
import com.sfa.job.enums.FSRecordEnum; import com.sfa.job.enums.FSRecordEnum;
import com.sfa.job.pojo.response.FeishuSheetRecordDto; import com.sfa.job.pojo.response.FeishuSheetRecordDto;
import com.sfa.job.util.FeiShuUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.stream.DoubleStream;
/** /**
* @author : liqiulin * @author : liqiulin
* @date : 2025-05-09 16 * @date : 2025-05-09 16
......
...@@ -2,10 +2,10 @@ package com.sfa.job.service.system; ...@@ -2,10 +2,10 @@ package com.sfa.job.service.system;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.sfa.common.core.utils.sdk.FeiShuUtil;
import com.sfa.job.domain.system.dao.ISysDeptDao; import com.sfa.job.domain.system.dao.ISysDeptDao;
import com.sfa.job.domain.system.dao.ISysUserDao; import com.sfa.job.domain.system.dao.ISysUserDao;
import com.sfa.job.domain.system.entity.SysDept; import com.sfa.job.domain.system.entity.SysDept;
import com.sfa.job.util.FeiShuUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
......
package com.sfa.job.util;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.google.gson.JsonParser;
import com.lark.oapi.Client;
import com.lark.oapi.core.utils.Jsons;
import com.lark.oapi.service.contact.v3.enums.ChildrenDepartmentDepartmentIdTypeEnum;
import com.lark.oapi.service.contact.v3.enums.FindByDepartmentUserDepartmentIdTypeEnum;
import com.lark.oapi.service.contact.v3.enums.FindByDepartmentUserUserIdTypeEnum;
import com.lark.oapi.service.contact.v3.model.ChildrenDepartmentReq;
import com.lark.oapi.service.contact.v3.model.ChildrenDepartmentResp;
import com.lark.oapi.service.contact.v3.model.FindByDepartmentUserReq;
import com.lark.oapi.service.contact.v3.model.FindByDepartmentUserResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author : liqiulin
* @date : 2024-12-06 16
* @describe :
*/
@Slf4j
@Component
public class FeiShuUtil {
@Value("${feishu.luzx.app_id}")
private String appId;
@Value("${feishu.luzx.app_secret}")
private String appSecret;
@Value("${feishu.bot_1.app_id}")
private String botAppId1;
@Value("${feishu.bot_1.app_secret}")
private String botAppSecret1;
private static final String CONTENT_TYPE = "application/json; charset=utf-8";
private static final String SHEET_URL = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/";
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";
/**
* 根据部门父编码获取子部门
* 公司编码:"0"
*/
public JSONArray getDeptByParentId(String parentId) {
try {
Client client = getClient();
ChildrenDepartmentReq req = ChildrenDepartmentReq.newBuilder()
.departmentId(parentId)
.departmentIdType(ChildrenDepartmentDepartmentIdTypeEnum.DEPARTMENT_ID)
.pageSize(50)
.build();
ChildrenDepartmentResp resp = client.contact().department().children(req);
if (!resp.success()) {
log.error(String.format("code:%s,msg:%s,reqId:%s, resp:%s",
resp.getCode(), resp.getMsg(), resp.getRequestId(), Jsons.createGSON(true, false).toJson(JsonParser.parseString(new String(resp.getRawResponse().getBody(), "UTF-8")))));
return null;
}
JSONArray items = JSONObject.parse(Jsons.DEFAULT.toJson(resp.getData())).getJSONArray("items");
return items;
} catch (Exception e) {
log.error("获取子部门列表失败,停止执行!");
}
return null;
}
/**
* 获取部门用户
*/
public JSONArray getUsersByDeptId(String deptCode) {
try {
Client client = getClient();
FindByDepartmentUserReq req = FindByDepartmentUserReq.newBuilder()
.userIdType(FindByDepartmentUserUserIdTypeEnum.OPEN_ID)
.departmentIdType(FindByDepartmentUserDepartmentIdTypeEnum.DEPARTMENT_ID)
.departmentId(deptCode)
.pageSize(50)
.build();
FindByDepartmentUserResp resp = client.contact().user().findByDepartment(req);
if(!resp.success()) {
log.warn(String.format("code:%s,msg:%s,reqId:%s, resp:%s",
resp.getCode(), resp.getMsg(), resp.getRequestId(), Jsons.createGSON(true, false).toJson(JsonParser.parseString(new String(resp.getRawResponse().getBody(), "UTF-8")))));
return null;
}
JSONArray items = JSONObject.parse(Jsons.DEFAULT.toJson(resp.getData())).getJSONArray("items");
return items;
} catch (Exception e) {
log.error("获取部门用户失败,停止执行!部门id:{}", deptCode);
}
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();
}
public Integer pushSetToSheet(String range, List<Object> datas, String sheetToken, String autoToken) {
// 组装参数
Map<String, Map<String, Object>> bodyMap = new HashMap<>();
Map<String, Object> valueRange = new HashMap<>();
valueRange.put("range", range);
valueRange.put("values", datas);
bodyMap.put("valueRange", valueRange);
String bodyJson = JSONObject.toJSONString(bodyMap);
// body上传
String result = HttpUtil.createPost(SHEET_URL + sheetToken + VALUES_APPEND)
.auth("Bearer " + autoToken).contentType(CONTENT_TYPE)
.body(bodyJson)
.execute().body();
// 上传结果判断
JSONObject resultJson = JSONObject.parseObject(result);
return resultJson.getInteger("code");
}
public String getBotToken1() {
Map<String, Object> bodyMap = new HashMap<>();
bodyMap.put("app_id", botAppId1);
bodyMap.put("app_secret", botAppSecret1);
String bodyJson = JSONObject.toJSONString(bodyMap);
String result = HttpUtil.createPost(TENANT_ACCESS_TOKEN_URL)
.contentType(CONTENT_TYPE)
.body(bodyJson)
.execute().body();
JSONObject resultJson = JSONObject.parseObject(result);
int code = resultJson.getInteger("code");
if (code != 0) {
throw new RuntimeException("获取tenant_access_token错误");
}
return resultJson.getString("tenant_access_token");
}
public void appendStyle(String sheetToken, Map<String, Object> body,String autoToken) {
// body上传
String result = HttpUtil.createRequest(Method.PUT,SHEET_URL + sheetToken + STYLE)
.auth("Bearer " + autoToken).contentType(CONTENT_TYPE)
.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.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
/**
* @author : liqiulin
* @date : 2025-06-19 17
* @describe : T100接口对接
*/
@Slf4j
@Component
public class T100Util {
@Value("${t100.url}")
private String url;
public void createOrUpdateDept(JSONObject deptJson){
HashMap<String,String> header = new HashMap<>();
header.put("Content-Type","application/json;charset=utf-8");
header.put("digi-protocol","raw");
header.put("digi-srvver","1.0");
header.put("digi-srvcode","000");
header.put("digi-type","sync");
header.put("digi-key","f63b06af224e90ea3f9f08e0226fc91e");
String body = HttpUtil.createPost(url).addHeaders(header).body(deptJson.toString()).execute().body();
log.info("\nT100-创建/修改部门\n参数:{}\n结果:{}",deptJson,body);
}
public void createOrUpdateUser(JSONObject userJson) {
HashMap<String,String> header = new HashMap<>();
header.put("Content-Type","application/json;charset=utf-8");
header.put("digi-protocol","raw");
header.put("digi-srvver","1.0");
header.put("digi-srvcode","000");
header.put("digi-type","sync");
header.put("digi-key","f63b06af224e90ea3f9f08e0226fc91e");
String body = HttpUtil.createPost(url).addHeaders(header).body(userJson.toString()).execute().body();
log.info("\nT100-创建/修改人员\n参数:{}\n结果:{}",userJson,body);
}
}
...@@ -13,3 +13,5 @@ spring: ...@@ -13,3 +13,5 @@ spring:
file-extension: yaml file-extension: yaml
group: sfa group: sfa
namespace: 9fb64726-e415-43e4-9e79-9be8d2666671 namespace: 9fb64726-e415-43e4-9e79-9be8d2666671
shared-configs:
- data-id: wangxiaolu-sfa-shared.yaml
\ No newline at end of file
spring:
application:
name: wangxiaolu-sfa-job
cloud:
nacos:
discovery:
server-addr: 192.168.100.38:8848
group: sfa
namespace: 5ae12140-31d8-490a-9798-f923cb0e30d4
config:
server-addr: 192.168.100.38:8848
file-extension: yaml
group: sfa
namespace: 5ae12140-31d8-490a-9798-f923cb0e30d4
...@@ -13,3 +13,5 @@ spring: ...@@ -13,3 +13,5 @@ spring:
file-extension: yaml file-extension: yaml
group: sfa group: sfa
namespace: e2996044-6ddc-4988-8810-602e05d01ccf namespace: e2996044-6ddc-4988-8810-602e05d01ccf
shared-configs:
- data-id: wangxiaolu-sfa-shared.yaml
...@@ -13,3 +13,5 @@ spring: ...@@ -13,3 +13,5 @@ spring:
file-extension: yaml file-extension: yaml
group: sfa group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265 namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
shared-configs:
- data-id: wangxiaolu-sfa-shared.yaml
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
class="ch.qos.logback.core.rolling.RollingFileAppender"> class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder> <encoder>
<pattern>${FILE_LOG_PATTERN}</pattern> <pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder> </encoder>
<file>${LOG_PATH}/${MODEL_NAME}-today.log</file> <file>${LOG_PATH}/${MODEL_NAME}-today.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
...@@ -56,6 +57,7 @@ ...@@ -56,6 +57,7 @@
class="ch.qos.logback.core.rolling.RollingFileAppender"> class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder> <encoder>
<pattern>${FILE_LOG_PATTERN}</pattern> <pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder> </encoder>
<file>${LOG_PATH}/${MODEL_NAME}-error-today.log</file> <file>${LOG_PATH}/${MODEL_NAME}-error-today.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
......
<?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.promotion.mapper.ActivityPlanApprovalMapper">
<resultMap id="BaseResultMap" type="com.sfa.job.domain.promotion.entity.ActivityPlanApproval">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="planFileId" column="plan_file_id" jdbcType="BIGINT"/>
<result property="employeeName" column="employee_name" jdbcType="VARCHAR"/>
<result property="employeeNo" column="employee_no" jdbcType="VARCHAR"/>
<result property="planMonth" column="plan_month" jdbcType="VARCHAR"/>
<result property="fsInstanceId" column="fs_instance_id" jdbcType="VARCHAR"/>
<result property="serialNumber" column="serial_number" jdbcType="VARCHAR"/>
<result property="approvalStatus" column="approval_status" jdbcType="VARCHAR"/>
<result property="form" column="form" jdbcType="VARCHAR"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="modifyTime" column="modify_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id,plan_file_id,employee_name,
employee_no,plan_month,fs_instance_id,
serial_number,approval_status,form,
create_by,create_time,modify_time
</sql>
<select id="findPlanApproval" resultMap="BaseResultMap">
select *
from activity_plan_approval where fs_instance_id = #{instanceId};
</select>
<update id="updateApprovalStatusById">
update activity_plan_approval
set approval_status = #{status}
where id = #{id}
</update>
</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.promotion.mapper.ActivityPlanInfoMapper">
<resultMap id="BaseResultMap" type="com.sfa.job.domain.promotion.entity.ActivityPlanInfo">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="planFileId" column="plan_file_id" jdbcType="BIGINT"/>
<result property="employeeId" column="employee_id" jdbcType="INTEGER"/>
<result property="employeeName" column="employee_name" jdbcType="VARCHAR"/>
<result property="employeeNo" column="employee_no" jdbcType="VARCHAR"/>
<result property="year" column="year" jdbcType="INTEGER"/>
<result property="month" column="month" jdbcType="INTEGER"/>
<result property="date" column="date" jdbcType="DATE"/>
<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="orgQcId" column="org_qc_id" jdbcType="VARCHAR"/>
<result property="orgName" column="org_name" jdbcType="VARCHAR"/>
<result property="patternId" column="pattern_id" jdbcType="INTEGER"/>
<result property="pattern" column="pattern" jdbcType="VARCHAR"/>
<result property="dealerId" column="dealer_id" jdbcType="VARCHAR"/>
<result property="dealerName" column="dealer_name" jdbcType="VARCHAR"/>
<result property="bothT" column="both_t" jdbcType="VARCHAR"/>
<result property="province" column="province" jdbcType="VARCHAR"/>
<result property="city" column="city" jdbcType="VARCHAR"/>
<result property="area" column="area" jdbcType="VARCHAR"/>
<result property="addr" column="addr" jdbcType="VARCHAR"/>
<result property="clockInTime" column="clock_in_time" jdbcType="TIMESTAMP"/>
<result property="clockOutTime" column="clock_out_time" jdbcType="TIMESTAMP"/>
<result property="salary" column="salary" jdbcType="DECIMAL"/>
<result property="incidentals" column="incidentals" jdbcType="DECIMAL"/>
<result property="planStatus" column="plan_status" jdbcType="INTEGER"/>
<result property="fsInstanceId" column="fs_instance_id" jdbcType="VARCHAR"/>
<result property="serialNumber" column="serial_number" jdbcType="VARCHAR"/>
<result property="approvalEmpName" column="approval_emp_name" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="modifyTime" column="modify_time" jdbcType="TIMESTAMP"/>
<result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="modifyBy" column="modify_by" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,plan_file_id,employee_id,
employee_name,employee_no,year,
month,date,line_name,
store_name,store_code,org_qc_id,
org_name,pattern_id,pattern,
dealer_id,dealer_name,both_t,
province,city,area,
addr,clock_in_time,clock_out_time,
salary,incidentals,plan_status,
instance_code,serial_number,approval_emp_name,
create_time,modify_time,is_delete,
create_by,modify_by
</sql>
<update id="updateStatusByInstanceId">
update activity_plan_info set plan_status = #{planStatus} where fs_instance_id = #{fsInstanceId}
</update>
</mapper>
...@@ -4,66 +4,46 @@ ...@@ -4,66 +4,46 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfa.job.domain.qince.mapper.QinceClienteleStoreMapper"> <mapper namespace="com.sfa.job.domain.qince.mapper.QinceClienteleStoreMapper">
<resultMap id="BaseResultMap" type="com.sfa.job.domain.qince.entity.QinceClienteleStore"> <!-- <resultMap id="BaseResultMap" type="com.sfa.job.domain.qince.entity.QinceClienteleStore">-->
<id property="id" column="id" jdbcType="BIGINT"/> <!-- <id property="id" column="id" jdbcType="BIGINT"/>-->
<result property="qcId" column="qc_id" jdbcType="VARCHAR"/> <!-- <result property="qcId" column="qc_id" jdbcType="VARCHAR"/>-->
<result property="creatorWaiqinId" column="creator_waiqin_id" jdbcType="VARCHAR"/> <!-- <result property="creatorWaiqinId" column="creator_waiqin_id" jdbcType="VARCHAR"/>-->
<result property="creatorName" column="creator_name" jdbcType="VARCHAR"/> <!-- <result property="creatorName" column="creator_name" jdbcType="VARCHAR"/>-->
<result property="lineName" column="line_name" jdbcType="VARCHAR"/> <!-- <result property="lineName" column="line_name" jdbcType="VARCHAR"/>-->
<result property="storeName" column="store_name" jdbcType="VARCHAR"/> <!-- <result property="storeName" column="store_name" jdbcType="VARCHAR"/>-->
<result property="storeCode" column="store_code" jdbcType="VARCHAR"/> <!-- <result property="storeCode" column="store_code" jdbcType="VARCHAR"/>-->
<result property="storeManager" column="store_manager" jdbcType="VARCHAR"/> <!-- <result property="storeManager" column="store_manager" jdbcType="VARCHAR"/>-->
<result property="storeType" column="store_type" jdbcType="VARCHAR"/> <!-- <result property="storeType" column="store_type" jdbcType="VARCHAR"/>-->
<result property="chain" column="chain" jdbcType="CHAR"/> <!-- <result property="chain" column="chain" jdbcType="CHAR"/>-->
<result property="storeDeptWaiqin365Id" column="store_dept_waiqin365_id" jdbcType="VARCHAR"/> <!-- <result property="storeDeptWaiqin365Id" column="store_dept_waiqin365_id" jdbcType="VARCHAR"/>-->
<result property="storeDeptName" column="store_dept_name" jdbcType="VARCHAR"/> <!-- <result property="storeDeptName" column="store_dept_name" jdbcType="VARCHAR"/>-->
<result property="bothT" column="both_t" jdbcType="VARCHAR"/> <!-- <result property="bothT" column="both_t" jdbcType="VARCHAR"/>-->
<result property="storeMssProvince" column="store_mss_province" jdbcType="VARCHAR"/> <!-- <result property="storeMssProvince" column="store_mss_province" jdbcType="VARCHAR"/>-->
<result property="storeMssCity" column="store_mss_city" jdbcType="VARCHAR"/> <!-- <result property="storeMssCity" column="store_mss_city" jdbcType="VARCHAR"/>-->
<result property="storeMssArea" column="store_mss_area" jdbcType="VARCHAR"/> <!-- <result property="storeMssArea" column="store_mss_area" jdbcType="VARCHAR"/>-->
<result property="storeMssStreet" column="store_mss_street" jdbcType="VARCHAR"/> <!-- <result property="storeMssStreet" column="store_mss_street" jdbcType="VARCHAR"/>-->
<result property="storeAddr" column="store_addr" jdbcType="VARCHAR"/> <!-- <result property="storeAddr" column="store_addr" jdbcType="VARCHAR"/>-->
<result property="coordinates" column="coordinates" jdbcType="VARCHAR"/> <!-- <result property="coordinates" column="coordinates" jdbcType="VARCHAR"/>-->
<result property="storeCooperateStatus" column="store_cooperate_status" jdbcType="CHAR"/> <!-- <result property="storeCooperateStatus" column="store_cooperate_status" jdbcType="CHAR"/>-->
<result property="storeLabel" column="store_label" jdbcType="VARCHAR"/> <!-- <result property="storeLabel" column="store_label" jdbcType="VARCHAR"/>-->
<result property="storeLabelId" column="store_label_id" jdbcType="VARCHAR"/> <!-- <result property="storeLabelId" column="store_label_id" jdbcType="VARCHAR"/>-->
<result property="storeSaleDirect" column="store_sale_direct" jdbcType="VARCHAR"/> <!-- <result property="storeSaleDirect" column="store_sale_direct" jdbcType="VARCHAR"/>-->
<result property="storeModifyTime" column="store_modify_time" jdbcType="VARCHAR"/> <!-- <result property="storeModifyTime" column="store_modify_time" jdbcType="VARCHAR"/>-->
<result property="storeModifyierName" column="store_modifyier_name" jdbcType="VARCHAR"/> <!-- <result property="storeModifyierName" column="store_modifyier_name" jdbcType="VARCHAR"/>-->
<result property="storeSourceType" column="store_source_type" jdbcType="VARCHAR"/> <!-- <result property="storeSourceType" column="store_source_type" jdbcType="VARCHAR"/>-->
<result property="storePictures" column="store_pictures" jdbcType="VARCHAR"/> <!-- <result property="storePictures" column="store_pictures" jdbcType="VARCHAR"/>-->
<result property="storeManagerCode" column="store_manager_code" jdbcType="VARCHAR"/> <!-- <result property="storeManagerCode" column="store_manager_code" jdbcType="VARCHAR"/>-->
<result property="storeCreatorCode" column="store_creator_code" jdbcType="VARCHAR"/> <!-- <result property="storeCreatorCode" column="store_creator_code" jdbcType="VARCHAR"/>-->
<result property="storeModifierCode" column="store_modifier_code" jdbcType="VARCHAR"/> <!-- <result property="storeModifierCode" column="store_modifier_code" jdbcType="VARCHAR"/>-->
<result property="storeApprovalStatus" column="store_approval_status" jdbcType="CHAR"/> <!-- <result property="storeApprovalStatus" column="store_approval_status" jdbcType="CHAR"/>-->
<result property="storeStatus" column="store_status" jdbcType="CHAR"/> <!-- <result property="storeStatus" column="store_status" jdbcType="CHAR"/>-->
<result property="createTime" column="create_time" jdbcType="CHAR"/> <!-- <result property="createTime" column="create_time" jdbcType="CHAR"/>-->
<result property="dealersName" column="dealers_name" jdbcType="VARCHAR"/> <!-- <result property="dealersName" column="dealers_name" jdbcType="VARCHAR"/>-->
<result property="dealerId" column="dealer_id" jdbcType="VARCHAR"/> <!-- <result property="dealerId" column="dealer_id" jdbcType="VARCHAR"/>-->
</resultMap> <!-- </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"> <select id="findListByDealerId" resultType="com.sfa.job.domain.qince.entity.QinceClienteleStore">
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 select qc_id, store_name, store_code
from qince_clientele_store from qince_clientele_store
where dealer_id = #{dealerId} where dealer_id = #{dealerId}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论