推送金蝶调整

This commit is contained in:
andy 2025-07-26 09:55:57 +08:00
parent 6aa772715a
commit bb970a144a
7 changed files with 142 additions and 27 deletions

View File

@ -223,6 +223,12 @@
<scope>system</scope> <scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/k3cloud-webapi-sdk-java11-v8.2.0.jar</systemPath> <systemPath>${project.basedir}/src/main/resources/lib/k3cloud-webapi-sdk-java11-v8.2.0.jar</systemPath>
</dependency> </dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -1,6 +1,7 @@
package com.evo.kingdeeUtils; package com.evo.kingdeeUtils;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.evo.common.utils.DateUtils; import com.evo.common.utils.DateUtils;
import com.evo.common.utils.spring.SpringUtils; import com.evo.common.utils.spring.SpringUtils;
import com.evo.kingdeeUtils.exception.KingdeeException; import com.evo.kingdeeUtils.exception.KingdeeException;
@ -10,6 +11,7 @@ import com.evo.kingdeeUtils.mapper.LogKingDeeMapper;
import com.evo.kingdeeUtils.vo.LogKingDee; import com.evo.kingdeeUtils.vo.LogKingDee;
import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -39,17 +41,26 @@ public class KingdeeRequestUtils {
* FPostDept_FNumber_岗位所属部门编号 * FPostDept_FNumber_岗位所属部门编号
*/ */
public static void employeeSave(Map<String, String> params){ public static void employeeSave(Map<String, String> params){
// request(params, KingdeeParamsEnum.Employee.SAVE); request(params, KingdeeParamsEnum.Employee.SAVE);
} }
/*** /***
* 员工禁用接口 * 员工禁用接口
* @param params * @param params
* 参数说明对照关系: key-value * 参数说明对照关系: key-value
* Numbers-员工编码 (多个使用,分割, : 001,002,003) * userCode-员工编码 (多个使用,分割, : 001,002,003)
*/ */
public static void employeeDisabled(Map<String, String> params){ public static void employeeDisabled(Map<String, String> params){
// request(params, KingdeeParamsEnum.Employee.DISABLED); excuteOperation(params, KingdeeParamsEnum.Employee.DISABLED);
}
/***
* 员工反禁用接口
* @param params
* 参数说明对照关系: key-value
* userCode-员工编码 (多个使用,分割, : 001,002,003)
*/
public static void employeeReverseDisabled(Map<String, String> params){
excuteOperation(params, KingdeeParamsEnum.Employee.REVERSE_DISABLED);
} }
/*** /***
@ -58,15 +69,87 @@ public class KingdeeRequestUtils {
* 参数说明对照关系: key-value * 参数说明对照关系: key-value
* NeedUpDateFields-更新字段 (多个使用,分割, :FDept_FNumber,FPosition_FNumber ) * NeedUpDateFields-更新字段 (多个使用,分割, :FDept_FNumber,FPosition_FNumber )
* FNumber-员工编号 * FNumber-员工编号
* FDept_FNumber-部门编号 * deptCode-部门编号
* FPosition_FNumber-岗位编号 * jobCode-岗位编号
*
*
*/ */
public static void updateJobInfo(Map<String, String> params){ public static void updateJobInfo(Map<String, String> params){
// request(params, KingdeeParamsEnum.JobInfo.UPDATE); if(StringUtils.isNotEmpty(params.get("oldJobCode"))){
String result = executeBillQuery(params, KingdeeParamsEnum.JobInfo.DOCUMENT_INQUIRY);
JSONArray resJS = JSON.parseArray(result);
if(resJS.size() > 0){
params.put("FSTAFFID", resJS.getJSONArray(0).getString(0));
}
}
request(params, KingdeeParamsEnum.JobInfo.UPDATE);
} }
private static void request(Map<String, String> params, BaseEnum paramEnum){ private static void request(Map<String, String> params, BaseEnum paramEnum){
log.error("{}====> 接口调用, 参数为:{} ", paramEnum.getDes(), JSON.toJSONString(params)); log.error("{}====> 接口调用, 参数为:{} ", paramEnum.getDes(), JSON.toJSONString(params));
String requestParam = buildParams(params, paramEnum);
String resultJson = "";
try {
K3CloudApi client = new K3CloudApi();
resultJson = client.save(paramEnum.getFromId(), requestParam);
log.info("{}====>接口返回结果: {}", paramEnum.getDes(), resultJson);
} catch (Exception e) {
resultJson = e.getMessage();
log.error("{}====>请求错误: {}", paramEnum.getDes(), e.getMessage());
e.printStackTrace();
}finally {
//记录日志
instLog(paramEnum, params, requestParam, resultJson);
}
}
public static String executeBillQuery(Map<String, String> params, BaseEnum paramEnum){
K3CloudApi client = new K3CloudApi();
//请求参数要求为json字符串
String jsonData = buildParams(params, paramEnum);;
String resultJson = "";
try {
//调用接口
resultJson = String.valueOf(client.executeBillQuery(jsonData));
} catch (Exception e) {
resultJson = e.getMessage();
log.error("{}====>请求错误: {}", paramEnum.getDes(), e.getMessage());
}finally {
//记录日志
instLog(paramEnum, params, jsonData, resultJson);
}
return resultJson;
}
public static void excuteOperation(Map<String, String> params, BaseEnum paramEnum){
K3CloudApi client = new K3CloudApi();
//请求参数要求为json字符串
String jsonData = buildParams(params, paramEnum);;
String resultJson = "";
try {
//调用接口
resultJson = client.excuteOperation(paramEnum.getFromId(),paramEnum.getOperateNumber(),jsonData);
} catch (Exception e) {
resultJson = e.getMessage();
log.error("{}====>请求错误: {}", paramEnum.getDes(), e.getMessage());
}finally {
//记录日志
instLog(paramEnum, params, jsonData, resultJson);
}
}
private static String buildParams(Map<String, String> params, BaseEnum paramEnum){
List<String> keyList = params.entrySet().stream().map(Map.Entry<String, String>::getKey).collect(Collectors.toList()); List<String> keyList = params.entrySet().stream().map(Map.Entry<String, String>::getKey).collect(Collectors.toList());
Map<String,String> requiredParams = paramEnum.getRequiredParams(); Map<String,String> requiredParams = paramEnum.getRequiredParams();
for (String key : requiredParams.keySet()){ for (String key : requiredParams.keySet()){
@ -80,19 +163,8 @@ public class KingdeeRequestUtils {
} }
//更新时间 //更新时间
requestParam = requestParam.replaceAll("date"+KingdeeParamsEnum.REQUEST_PARAM_SUFFIX, DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date())); requestParam = requestParam.replaceAll("date"+KingdeeParamsEnum.REQUEST_PARAM_SUFFIX, DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date()));
String resultJson = "";
try {
K3CloudApi client = new K3CloudApi();
resultJson = client.save(paramEnum.getFromId(), requestParam);
log.info("{}====>接口返回结果: {}", paramEnum.getDes(), resultJson);
} catch (Exception e) { return requestParam;
resultJson = e.getMessage();
log.error("{}====>请求错误: {}", paramEnum.getDes(), e.getMessage());
}finally {
//记录日志
instLog(paramEnum, params, requestParam, resultJson);
}
} }

View File

@ -21,4 +21,6 @@ public interface BaseEnum {
abstract String getFromId(); abstract String getFromId();
abstract String getDes(); abstract String getDes();
abstract String getOperateNumber();
} }

View File

@ -30,7 +30,8 @@ public enum KingdeeParamsEnum {
public static final String REQUEST_PARAM_SUFFIX="_param"; public static final String REQUEST_PARAM_SUFFIX="_param";
public enum JobInfo implements BaseEnum{ public enum JobInfo implements BaseEnum{
UPDATE("岗位信息修改", "BD_NEWSTAFF", Collections.asMap("FNumber","员工编号不能为空","FDept_FNumber","部门编号不能为空","FPosition_FNumber","岗位编号不能为空"),"{\"NeedUpDateFields\":[NeedUpDateFields"+REQUEST_PARAM_SUFFIX+"],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"true\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"true\",\"ValidateFlag\":\"true\",\"NumberSearch\":\"true\",\"IsAutoAdjustField\":\"true\",\"InterationFlags\":\"\",\"IgnoreInterationFlag\":\"\",\"IsControlPrecision\":\"false\",\"ValidateRepeatJson\":\"false\",\"Model\":{\"FSTAFFID\":0,\"FNumber\":\"FNumber"+REQUEST_PARAM_SUFFIX+"\",\"FPerson\":{\"FNumber\":\"FNumber"+REQUEST_PARAM_SUFFIX+"\"},\"FDept\":{\"FNumber\":\"FDept_FNumber"+REQUEST_PARAM_SUFFIX+"\"},\"FPosition\":{\"FNumber\":\"FPosition_FNumber"+REQUEST_PARAM_SUFFIX+"\"},\"FStartDate\":\"date"+REQUEST_PARAM_SUFFIX+"\",\"FEmpInfoId\":{\"FNumber\":\"FNumber"+REQUEST_PARAM_SUFFIX+"\"},\"FPOSTBILLEntity\":{\"FIsFirstPost\":false},\"FOtherEntity\":{},\"FSHRMapEntity\":{}}}"), UPDATE("岗位信息修改", "BD_NEWSTAFF", Collections.asMap("userCode","员工编号不能为空","deptCode","部门编号不能为空","jobCode","岗位编号不能为空", "FSTAFFID","修改的业务单据DI不能为空"),"{\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"true\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"true\",\"ValidateFlag\":\"true\",\"NumberSearch\":\"true\",\"IsAutoAdjustField\":\"true\",\"InterationFlags\":\"\",\"IgnoreInterationFlag\":\"\",\"IsControlPrecision\":\"false\",\"ValidateRepeatJson\":\"false\",\"Model\":{\"FSTAFFID\":FSTAFFID"+REQUEST_PARAM_SUFFIX+",\"FNumber\":\"userCode"+REQUEST_PARAM_SUFFIX+"\",\"FPerson\":{\"FNumber\":\"userCode"+REQUEST_PARAM_SUFFIX+"\"},\"FDept\":{\"FNumber\":\"deptCode"+REQUEST_PARAM_SUFFIX+"\"},\"FPosition\":{\"FNumber\":\"jobCode"+REQUEST_PARAM_SUFFIX+"\"},\"FStartDate\":\"date"+REQUEST_PARAM_SUFFIX+"\",\"FEmpInfoId\":{\"FNumber\":\"userCode"+REQUEST_PARAM_SUFFIX+"\"},\"FPOSTBILLEntity\":{\"FIsFirstPost\":false},\"FOtherEntity\":{},\"FSHRMapEntity\":{}}}"),
DOCUMENT_INQUIRY("单据查询", "BD_NEWSTAFF", Collections.asMap("userCode","员工编号不能为空","oldJobCode","岗位编号不能为空"),"{\"FormId\":\"BD_NEWSTAFF\",\"FieldKeys\":\"FSTAFFID\",\"FilterString\":[{\"Left\":\"\",\"FieldName\":\"FNumber\",\"Compare\":\"17\",\"Value\":\"userCode"+REQUEST_PARAM_SUFFIX+"\",\"Right\":\"\",\"Logic\":0},{\"Left\":\"\",\"FieldName\":\"FStaffNumber\",\"Compare\":\"17\",\"Value\":\"oldJobCode"+REQUEST_PARAM_SUFFIX+"\",\"Right\":\"\",\"Logic\":0}],\"OrderString\":\"\",\"TopRowCount\":0,\"StartRow\":0,\"Limit\":2000,\"SubSystemId\":\"\"}"),
; ;
String des; String des;
String fromId; String fromId;
@ -58,21 +59,30 @@ public enum KingdeeParamsEnum {
public String getDes() { public String getDes() {
return this.des; return this.des;
} }
@Override
public String getOperateNumber() {return "";}
} }
/*** /***
* 金蝶请求参数, 员工 * 金蝶请求参数, 员工
*/ */
public enum Employee implements BaseEnum { public enum Employee implements BaseEnum {
SAVE("员工保存", "BD_Empinfo", Collections.asMap("FName","员工姓名不能为空","FStaffNumber","员工编号不能为空","FNumber","岗位编号不能为空"),"{\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"true\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"true\",\"ValidateFlag\":\"true\",\"NumberSearch\":\"true\",\"IsAutoAdjustField\":\"true\",\"InterationFlags\":\"\",\"IgnoreInterationFlag\":\"\",\"IsControlPrecision\":\"false\",\"ValidateRepeatJson\":\"false\",\"Model\":{\"FID\":0,\"FName\":\"FName"+REQUEST_PARAM_SUFFIX+"\",\"FStaffNumber\":\"FStaffNumber"+REQUEST_PARAM_SUFFIX+"\",\"FCreateSaler\":false,\"FCreateUser\":false,\"FCreateCashier\":false,\"FJoinDate\":\"date"+REQUEST_PARAM_SUFFIX+"\",\"FSHRMapEntity\":{},\"FPostEntity\":[{\"FPostDept\":{\"FNumber\":\"FPostDept_FNumber"+REQUEST_PARAM_SUFFIX+"\"},\"FPost\":{\"FNumber\":\"FNumber"+REQUEST_PARAM_SUFFIX+"\"},\"FStaffStartDate\":\"date"+REQUEST_PARAM_SUFFIX+"\",\"FIsFirstPost\":true,\"FStaffDetails\":0}]}}"), SAVE("员工保存", "BD_Empinfo", "",Collections.asMap("userName","员工姓名不能为空","userCode","员工编号不能为空","jobCode","岗位编号不能为空"),"{\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"true\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"true\",\"ValidateFlag\":\"true\",\"NumberSearch\":\"true\",\"IsAutoSubmitAndAudit\":\"true\",\"IsAutoAdjustField\":\"true\",\"InterationFlags\":\"\",\"IgnoreInterationFlag\":\"\",\"IsControlPrecision\":\"false\",\"ValidateRepeatJson\":\"false\",\"Model\":{\"FID\":0,\"FName\":\"userName"+REQUEST_PARAM_SUFFIX+"\",\"FStaffNumber\":\"userCode"+REQUEST_PARAM_SUFFIX+"\",\"FCreateSaler\":false,\"FCreateUser\":false,\"FCreateCashier\":false,\"FJoinDate\":\"date"+REQUEST_PARAM_SUFFIX+"\",\"FSHRMapEntity\":{},\"FPostEntity\":[{\"FPostDept\":{\"FNumber\":\"deptCode"+REQUEST_PARAM_SUFFIX+"\"},\"FPost\":{\"FNumber\":\"jobCode"+REQUEST_PARAM_SUFFIX+"\"},\"FStaffStartDate\":\"date"+REQUEST_PARAM_SUFFIX+"\",\"FIsFirstPost\":true,\"FStaffDetails\":0}]}}"),
DISABLED("员工禁用","BD_Empinfo", Collections.asMap("Numbers","员工编码不能为空"),"{\"Numbers\":[Numbers"+REQUEST_PARAM_SUFFIX+"],\"Ids\":\"\",\"PkEntryIds\":[],\"UseOrgId\":0,\"NetworkCtrl\":\"\",\"IgnoreInterationFlag\":\"\"}") DISABLED("员工禁用","BD_Empinfo", "Forbid", Collections.asMap("userCode","员工编码不能为空"),"{\"Numbers\":[userCode"+REQUEST_PARAM_SUFFIX+"],\"Ids\":\"\",\"PkEntryIds\":[],\"UseOrgId\":0,\"NetworkCtrl\":\"\",\"IgnoreInterationFlag\":\"\"}"),
REVERSE_DISABLED("员工反禁用","BD_Empinfo", "Enable", Collections.asMap("userCode","员工编码不能为空"),"{\"Numbers\":[userCode"+REQUEST_PARAM_SUFFIX+"],\"Ids\":\"\",\"PkEntryIds\":[],\"UseOrgId\":0,\"NetworkCtrl\":\"\",\"IgnoreInterationFlag\":\"\"}"),
; ;
String des; String des;
String fromId; String fromId;
String operateNumber;
Map<String,String> requiredParams; Map<String,String> requiredParams;
String paramJson; String paramJson;
Employee(String des, String fromId, Map<String,String> requiredParams, String paramJson) {
Employee(String des, String fromId, String operateNumber, Map<String,String> requiredParams, String paramJson) {
this.des = des; this.des = des;
this.fromId = fromId; this.fromId = fromId;
this.operateNumber = operateNumber;
this.requiredParams = requiredParams; this.requiredParams = requiredParams;
this.paramJson = paramJson; this.paramJson = paramJson;
} }
@ -92,6 +102,8 @@ public enum KingdeeParamsEnum {
public String getDes() { public String getDes() {
return this.des; return this.des;
} }
@Override
public String getOperateNumber() {return this.operateNumber;}
} }
} }

View File

@ -161,7 +161,7 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
initCheckDevice(sysStaff); initCheckDevice(sysStaff);
//新增员工信息到金蝶 //新增员工信息到金蝶
if(StringUtils.isNotEmpty(sysStaff.getJobCode())){ if(StringUtils.isNotEmpty(sysStaff.getJobCode())){
KingdeeRequestUtils.employeeSave(Collections.asMap("FName", sysStaff.getName(), "FStaffNumber", sysStaff.getCode(), "FNumber", sysStaff.getJobCode().split("_")[0])); KingdeeRequestUtils.employeeSave(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode(), "jobCode", sysStaff.getJobCode().split("_")[0],"deptCode", sysStaff.getJobCode().split("_")[1]));
} }
return AjaxResult.success(); return AjaxResult.success();
} }
@ -190,7 +190,7 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共 dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共
dkj_list.add(sysStaff.getTimeClock()); dkj_list.add(sysStaff.getTimeClock());
//下发照片 //下发照片
eqSnDetailService.sendPhoto(dkj_list, Collections.asList(Collections.asMap("userId", String.valueOf(sysStaff.getUserId()), "name", sysStaff.getName(), "photoUrl", ParamUtils.getGlobalStaticUrl()+upload.getFileName()))); //eqSnDetailService.sendPhoto(dkj_list, Collections.asList(Collections.asMap("userId", String.valueOf(sysStaff.getUserId()), "name", sysStaff.getName(), "photoUrl", ParamUtils.getGlobalStaticUrl()+upload.getFileName())));
} }
} }
@ -235,8 +235,8 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
return AjaxResult.error(); return AjaxResult.error();
} }
//如果是离职, 推送金蝶禁用 //如果是离职, 推送金蝶禁用
if(StringUtils.isNotEmpty(sysStaff.getJobCode())){ if(StringUtils.isNotEmpty(sysStaff.getCode())){
KingdeeRequestUtils.employeeDisabled(Collections.asMap("Numbers",sysStaff.getJobCode().split("_")[0])); KingdeeRequestUtils.employeeDisabled(Collections.asMap("userCode","\""+sysStaff.getCode()+"\""));
} }
return AjaxResult.success(); return AjaxResult.success();
@ -263,7 +263,11 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
deptNum = sysStaff.getJobCode().split("_")[1]; deptNum = sysStaff.getJobCode().split("_")[1];
positionNum = sysStaff.getJobCode().split("_")[0]; positionNum = sysStaff.getJobCode().split("_")[0];
} }
KingdeeRequestUtils.updateJobInfo(Collections.asMap("NeedUpDateFields","FDept,FPosition", "FNumber", sysStaff.getCode(), "FDept_FNumber", deptNum, "FPosition_FNumber", positionNum)); String oldPositionNum = "";
if(StringUtils.isNotEmpty(old_staff.getJobCode())){
oldPositionNum = old_staff.getJobCode().split("_")[0];
}
KingdeeRequestUtils.updateJobInfo(Collections.asMap( "userCode", sysStaff.getCode(), "deptCode", deptNum, "jobCode", positionNum, "oldJobCode", oldPositionNum));
} }
//判断员工更换公司 //判断员工更换公司
if(!old_staff.getCompanyName().equals(sysStaff.getCompanyName())) { if(!old_staff.getCompanyName().equals(sysStaff.getCompanyName())) {
@ -741,6 +745,11 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
try { try {
update(new UpdateWrapper<SysStaff>().set("status", Constants.JOB_STATIS_1).set("quit_date", null).eq("user_id", userId)); update(new UpdateWrapper<SysStaff>().set("status", Constants.JOB_STATIS_1).set("quit_date", null).eq("user_id", userId));
SysStaff sysStaff = getBaseMapper().selectById(userId); SysStaff sysStaff = getBaseMapper().selectById(userId);
//恢复金蝶
if(StringUtils.isNotEmpty(sysStaff.getCode())){
KingdeeRequestUtils.employeeReverseDisabled(Collections.asMap("userCode","\""+sysStaff.getCode()+"\""));
}
//打卡统计打卡详情 //打卡统计打卡详情
rzAttendanceStatisticalService.createRzAttendance(sysStaff, Collections.emptyList(), null); rzAttendanceStatisticalService.createRzAttendance(sysStaff, Collections.emptyList(), null);
//处理餐饮信息 //处理餐饮信息

View File

@ -0,0 +1,13 @@
#??ID-PROD
X-KDApi-AcctID = 670768a85463de
#X-KDApi-AcctID = 6723465a38c722
X-KDApi-UserName = Administrator
#??IDID
X-KDApi-AppID = 288012_Rc0C0zCG2lga0/Vs2Y4pzYSL6hQcWOko
# ??
X-KDApi-AppSec = 8a76cd746fa24636b2c65ef9f313c640
X-KDApi-ServerUrl =http://192.168.5.8/K3Cloud/
X-KDApi-LCID = 2052
X-KDApi-OrgNum = 100
X-KDApi-ConnectTimeout = 120
X-KDApi-RequestTimeout = 120

View File

@ -229,6 +229,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="imageUrl != null">image_url = #{imageUrl},</if> <if test="imageUrl != null">image_url = #{imageUrl},</if>
<if test="timeClock != null">time_clock = #{timeClock},</if> <if test="timeClock != null">time_clock = #{timeClock},</if>
<if test="subsidys != null">subsidys = #{subsidys},</if> <if test="subsidys != null">subsidys = #{subsidys},</if>
<if test="jobCode != null">job_Code=#{jobCode},</if>
</trim> </trim>
where user_id = #{userId} where user_id = #{userId}
</update> </update>