帝品仕外出和差旅同步
This commit is contained in:
parent
05f6e112c8
commit
15d941b70f
|
|
@ -12,6 +12,11 @@ public enum ChannelEnum implements IFinFilingChannelService {
|
||||||
GE_YUAN("geyuan"),
|
GE_YUAN("geyuan"),
|
||||||
|
|
||||||
DI_PIN_SHI("dipinshi"),
|
DI_PIN_SHI("dipinshi"),
|
||||||
|
|
||||||
|
DI_PIN_SHI_GO_OUT("dipinshi_goOut"),
|
||||||
|
|
||||||
|
DI_PIN_SHI_TRAVEL("dipinshi_travel"),
|
||||||
|
|
||||||
HOSECLOUD("hosecloud");
|
HOSECLOUD("hosecloud");
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.constants;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public enum BusinessTypeEnum {
|
||||||
|
|
||||||
|
GO_OUT("ID01ErfUV64viD", "公出"),
|
||||||
|
|
||||||
|
TRAVEL_IN("ID01DLQ36ToAB9", "国内出差"),
|
||||||
|
|
||||||
|
TRAVEL_OUT("ID01DLQ21tIZeD", "国际出差"),
|
||||||
|
|
||||||
|
TRAVEL_OUT_NOT_USA("ID01ErfRpaaLYH", "国际出差非美国");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final String code;
|
||||||
|
|
||||||
|
BusinessTypeEnum(String code, String name) {
|
||||||
|
this.code = code;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.constants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公类型code
|
||||||
|
*/
|
||||||
|
public class OfficeTypeCodeConstants {
|
||||||
|
/**
|
||||||
|
* 居家办公code
|
||||||
|
*/
|
||||||
|
public static final String HOME_OFFICE = "ID01ErluqEalOv";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 外出办公
|
||||||
|
*/
|
||||||
|
public static final String OUTSIDE_OFFICE = "ID01Erln0ddpNR";
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.constants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模板和费用相关信息
|
||||||
|
*/
|
||||||
|
public class TemplateAndCostConstants {
|
||||||
|
|
||||||
|
//模板id
|
||||||
|
public static final String TEMPLATE_ID = "ID01DlW0k33Ekv:PRESET_REQUISITION_TEAM_BUILDING";
|
||||||
|
|
||||||
|
//模板详情id
|
||||||
|
public static final String TEMPLATE_DETAIL_ID = "ID01DlW0k33Ekv:PRESET_REQUISITION_TEAM_BUILDING:e323d4114a633cb4efda5b4334f4d5c7676029dd";
|
||||||
|
|
||||||
|
//费用类型id
|
||||||
|
public static final String FEE_TYPE_ID = "ID01Ernsfgh5Vl";
|
||||||
|
|
||||||
|
//费用详情id
|
||||||
|
public static final String FEE_TYPE_DETAIL_ID = "ID01Ernsfgh5Vl:requisition:c4a34dd1b7cf550ad7c30627ebc58f75d8967e02";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.constants;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public enum TravelPurposeEnum {
|
||||||
|
|
||||||
|
BUYING_TRIP("ID01ErpJZbpaCX","Buying Trip"),
|
||||||
|
|
||||||
|
GENERAL_FACTORY_REVISIT("ID01ErpLbD47Pp","General Factory Revisit"),
|
||||||
|
|
||||||
|
NEW_VENDOR_EXPLORE("ID01ErpSiLBSdF","New Vendor Explore"),
|
||||||
|
|
||||||
|
PRE_BUYING_TRIP("ID01ErpKMI8Brh","Pre-buying Trip"),
|
||||||
|
|
||||||
|
PRE_PRODUCTION_SCHEDULE_CHECK("ID01ErpOUH2JPx","Pre-production Schedule Check"),
|
||||||
|
|
||||||
|
SAMPLE_CHECK("ID01ErpFhrPoOH","Sample Check"),
|
||||||
|
|
||||||
|
TRADE_SHOW_VISIT("ID01ErpLi7Xszt","Trade Show Visit")
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
private final String code;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
|
||||||
|
TravelPurposeEnum(String code, String name) {
|
||||||
|
this.code = code;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getCodeByName(String name) {
|
||||||
|
for (TravelPurposeEnum purpose : values()) {
|
||||||
|
if (purpose.getName().equals(name)) {
|
||||||
|
return purpose.getCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.constants;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public enum VendorTypeEnum {
|
||||||
|
|
||||||
|
EXISTING_VENDOR_WITH_SHIPMENT("ID01ErpISmXg3J","EXISTING_VENDOR_WITH_SHIPMENT"),
|
||||||
|
|
||||||
|
KNOWN_VENDOR_WITHOUT_SHIPMENT("ID01ErpK7BfKUL","KNOWN_VENDOR_WITHOUT_SHIPMENT"),
|
||||||
|
|
||||||
|
NEW_VENDOR("ID01Erpz4ea3W7","NEW_VENDOR");
|
||||||
|
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final String code;
|
||||||
|
|
||||||
|
VendorTypeEnum(String code, String name) {
|
||||||
|
this.code = code;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -34,25 +34,17 @@ public class DiPinShiFinFilingService extends AbstractDiPinShiBaseService implem
|
||||||
//构建请求体
|
//构建请求体
|
||||||
JSONObject reqBody = buildReqBody(start,end,type);
|
JSONObject reqBody = buildReqBody(start,end,type);
|
||||||
String url = getAccessToken(BATCH_APPROVAL_NO, ChannelEnum.DI_PIN_SHI.getChannelId(), ChannelTypeEnum.IN);
|
String url = getAccessToken(BATCH_APPROVAL_NO, ChannelEnum.DI_PIN_SHI.getChannelId(), ChannelTypeEnum.IN);
|
||||||
|
|
||||||
|
String newNextCursor = "";
|
||||||
|
|
||||||
|
do {
|
||||||
String result = OkHttpClientUtil.doPostJson(url, reqBody.toJSONString());
|
String result = OkHttpClientUtil.doPostJson(url, reqBody.toJSONString());
|
||||||
JSONObject res = JSONObject.parseObject(JSONObject.toJSONString(result));
|
JSONObject res = JSONObject.parseObject(JSONObject.toJSONString(result));
|
||||||
|
|
||||||
JSONArray jsonArray = res.getJSONArray("sp_no_list");
|
JSONArray jsonArray = res.getJSONArray("sp_no_list");
|
||||||
for (Object spNo : jsonArray) {
|
spNoList.addAll(jsonArray.toJavaList(String.class));
|
||||||
spNoList.add((String) spNo);
|
|
||||||
}
|
|
||||||
|
|
||||||
//判断后面还有没有数据
|
|
||||||
String newNextCursor = res.getString("new_next_cursor");
|
|
||||||
while (StringUtils.isNotBlank(newNextCursor)){
|
|
||||||
result = OkHttpClientUtil.doPostJson(url, reqBody.toJSONString());
|
|
||||||
res = JSONObject.parseObject(JSONObject.toJSONString(result));
|
|
||||||
jsonArray = res.getJSONArray("sp_no_list");
|
|
||||||
for (Object spNo : jsonArray) {
|
|
||||||
spNoList.add((String) spNo);
|
|
||||||
}
|
|
||||||
newNextCursor = res.getString("new_next_cursor");
|
newNextCursor = res.getString("new_next_cursor");
|
||||||
}
|
} while (StringUtils.isNotBlank(newNextCursor));
|
||||||
|
|
||||||
return spNoList;
|
return spNoList;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance;
|
|
||||||
|
|
||||||
import cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.DiPinShiAttendanceGoOutReqVO;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
@Slf4j
|
|
||||||
public class DiPinShiAttendanceService implements IDiPinShiAttendanceService{
|
|
||||||
@Override
|
|
||||||
public void attendanceGoOut(DiPinShiAttendanceGoOutReqVO goOut) {
|
|
||||||
log.info("外出申请单号:{}", goOut.getApprovalNo());
|
|
||||||
//获取合思token
|
|
||||||
|
|
||||||
//构建请求体
|
|
||||||
|
|
||||||
//发送请求
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void attenancedTravel(HashMap<String, Object> map) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance;
|
|
||||||
|
|
||||||
import cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.DiPinShiAttendanceGoOutReqVO;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public interface IDiPinShiAttendanceService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步外出
|
|
||||||
*/
|
|
||||||
void attendanceGoOut(DiPinShiAttendanceGoOutReqVO goOut);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步出差
|
|
||||||
*/
|
|
||||||
void attenancedTravel(HashMap<String, Object> map);
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@Data
|
|
||||||
public class DiPinShiAttendanceGoOutReqVO extends DiPinShiAttendanceReqVO{
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@Data
|
|
||||||
public class DiPinShiAttendanceTravelInReqVO extends DiPinShiAttendanceReqVO{
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@Data
|
|
||||||
public class DiPinShiAttendanceTravelOutNotUSAReqVO extends DiPinShiAttendanceReqVO{
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class DiPinShiAttendanceGoOutReqVO extends DiPinShiAttendanceReqVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公类型
|
||||||
|
*/
|
||||||
|
private String officeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公出时长
|
||||||
|
*/
|
||||||
|
private String goOutHours;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公出事由
|
||||||
|
*/
|
||||||
|
private String goOutReason;
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo;
|
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
@ -35,4 +35,9 @@ public class DiPinShiAttendanceReqVO {
|
||||||
*/
|
*/
|
||||||
private String data;
|
private String data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出差类型
|
||||||
|
*/
|
||||||
|
private String travelType;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class DiPinShiAttendanceTravelInReqVO extends DiPinShiAttendanceReqVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出差天数
|
||||||
|
*/
|
||||||
|
private String travelDays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拜访日期
|
||||||
|
*/
|
||||||
|
private String visitDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 供应商名称
|
||||||
|
*/
|
||||||
|
private String vendorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 供应商类型
|
||||||
|
*/
|
||||||
|
private String vendorType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出差目的
|
||||||
|
*/
|
||||||
|
private String travelPurpose;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class DiPinShiAttendanceTravelOutNotUSAReqVO extends DiPinShiAttendanceReqVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拜访日期
|
||||||
|
*/
|
||||||
|
private String visitDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 国家、地区
|
||||||
|
*/
|
||||||
|
private String address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 供应商名称
|
||||||
|
*/
|
||||||
|
private String vendorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 供应商类型
|
||||||
|
*/
|
||||||
|
private String vendorType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出差目的
|
||||||
|
*/
|
||||||
|
private String travelPurpose;
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,13 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo;
|
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
public class DiPinShiAttendanceTravelOutReqVO extends DiPinShiAttendanceReqVO{
|
public class DiPinShiAttendanceTravelOutReqVO extends DiPinShiAttendanceReqVO {
|
||||||
|
/**
|
||||||
|
* 出差目的
|
||||||
|
*/
|
||||||
|
private String travelPurpose;
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo;
|
package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.resp;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
@ -1,19 +1,221 @@
|
||||||
package cn.jiutqy.finfiling.quartz.hosecloud;
|
package cn.jiutqy.finfiling.quartz.hosecloud;
|
||||||
|
|
||||||
|
import cn.jiutqy.finfiling.common.domain.FinFilingSyncLog;
|
||||||
import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;
|
import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;
|
||||||
import cn.jiutqy.finfiling.common.factory.FinFilingAccessTokenFactory;
|
import cn.jiutqy.finfiling.common.factory.FinFilingAccessTokenFactory;
|
||||||
import cn.jiutqy.finfiling.common.service.IFinFilingAccessTokenService;
|
import cn.jiutqy.finfiling.common.service.IFinFilingAccessTokenService;
|
||||||
|
import cn.jiutqy.finfiling.common.service.IFinFilingSyncLogService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.constants.*;
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.IHoseCloudPersonnelService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HoseCloudPersonnelVO;
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
@Slf4j
|
||||||
public abstract class AbstractHoseCloudBaseService {
|
public abstract class AbstractHoseCloudBaseService {
|
||||||
|
|
||||||
protected final String BASE_URL = "https://app.ekuaibao.com";
|
protected final String BASE_URL = "https://app.ekuaibao.com";
|
||||||
|
|
||||||
|
|
||||||
|
private static final String LEGAL_ENTITY = "帝品仕商务信息咨询(上海)有限公司";
|
||||||
|
|
||||||
|
private static final String LEGAL_ENTITY_ID = "ID01Dnd2qUASmj";
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IFinFilingSyncLogService finFilingSyncLogService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IHoseCloudPersonnelService personnelService;
|
||||||
|
|
||||||
protected String getAccessToken(String url, String channelId, ChannelTypeEnum channelTypeEnum){
|
protected String getAccessToken(String url, String channelId, ChannelTypeEnum channelTypeEnum){
|
||||||
IFinFilingAccessTokenService accessTokenService = FinFilingAccessTokenFactory.getContainer(channelId);
|
IFinFilingAccessTokenService accessTokenService = FinFilingAccessTokenFactory.getContainer(channelId);
|
||||||
String accessToken = accessTokenService.getAccessToken(channelId, channelTypeEnum).getAccessToken();
|
String accessToken = accessTokenService.getAccessToken(channelId, channelTypeEnum).getAccessToken();
|
||||||
return StringUtils.replace(url, "{accessToken}", accessToken);
|
return StringUtils.replace(url, "{accessToken}", accessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected JSONObject mapping(Map<String,String> data){
|
||||||
|
//填充审批单号
|
||||||
|
FinFilingSyncLog finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputDataId("审批单号");
|
||||||
|
if (finFilingSyncLog != null){
|
||||||
|
log.info("输入数据[{}]已同步", "审批单号");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject form = new JSONObject();
|
||||||
|
form.put("specificationId", TemplateAndCostConstants.TEMPLATE_DETAIL_ID);
|
||||||
|
//先填充公用的数据
|
||||||
|
//需要调用接口查询员工id
|
||||||
|
List<String> strings = new ArrayList<>();
|
||||||
|
HoseCloudPersonnelVO personnelVO = personnelService.queryUser(strings);
|
||||||
|
form.put("submitterId",personnelVO.getId());
|
||||||
|
//申请日期需要转成时间戳 --看是什么样子的时间,然后转成时间戳
|
||||||
|
form.put("requisitionDate","申请日期");
|
||||||
|
//法人实体不确定填写中文还是公司id
|
||||||
|
form.put("法人实体",LEGAL_ENTITY_ID);
|
||||||
|
//需要调用接口查询员工部门
|
||||||
|
form.put("expenseDepartment",personnelVO.getDefaultDepartment());
|
||||||
|
//需要转成时间戳
|
||||||
|
form.put("u_开始时间","u_开始时间");
|
||||||
|
form.put("u_结束时间","u_结束时间");
|
||||||
|
|
||||||
|
//根据类型填充详情
|
||||||
|
if (BusinessTypeEnum.GO_OUT.getName().equals(data.get("applicationType"))){
|
||||||
|
hoseGoOutMapping(data, form);
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_IN.getName().equals(data.get("travelType"))){
|
||||||
|
hoseTravelInMapping(data, form);
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(data.get("travelType"))){
|
||||||
|
hoseTravelOutMapping(data, form);
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(data.get("travelType"))){
|
||||||
|
hoseTravelOutNotUSAMapping(data, form);
|
||||||
|
}
|
||||||
|
|
||||||
|
return form;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hoseGoOutMapping(Map<String,String> data, JSONObject form) {
|
||||||
|
form.put("u_出差类型", BusinessTypeEnum.GO_OUT.getCode());
|
||||||
|
String officeType = data.get("officeType");
|
||||||
|
|
||||||
|
form.put("u_办公类型",officeType.equals("居家办公") ? OfficeTypeCodeConstants.HOME_OFFICE : OfficeTypeCodeConstants.OUTSIDE_OFFICE);
|
||||||
|
//要么直接有时间,要么需要算时间
|
||||||
|
form.put("公出时长","");
|
||||||
|
|
||||||
|
//可能会有多个详情 需要遍历填充数据
|
||||||
|
JSONArray details = new JSONArray();
|
||||||
|
|
||||||
|
JSONObject detail = new JSONObject();
|
||||||
|
detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
|
||||||
|
detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
|
||||||
|
|
||||||
|
JSONObject feeTypeForm = new JSONObject();
|
||||||
|
//填充公出事由
|
||||||
|
feeTypeForm.put("u_公出事由","");
|
||||||
|
detail.put("feeTypeForm",feeTypeForm);
|
||||||
|
details.add(detail);
|
||||||
|
|
||||||
|
form.put("details",details);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void hoseTravelInMapping(Map<String,String> data, JSONObject form) {
|
||||||
|
form.put("u_出差类型",BusinessTypeEnum.TRAVEL_IN.getCode());
|
||||||
|
//要么直接有时间,要么需要算时间
|
||||||
|
form.put("出差天数","");
|
||||||
|
|
||||||
|
//可能会有多个详情 需要遍历填充数据
|
||||||
|
JSONArray details = new JSONArray();
|
||||||
|
|
||||||
|
JSONObject detail = new JSONObject();
|
||||||
|
detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
|
||||||
|
detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
|
||||||
|
|
||||||
|
JSONObject feeTypeForm = new JSONObject();
|
||||||
|
//填充数据
|
||||||
|
feeTypeForm.put("u_拜访日期","");
|
||||||
|
feeTypeForm.put("u_VendorName","");
|
||||||
|
|
||||||
|
if (VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getName().equals(data.get("供应商类型"))){
|
||||||
|
feeTypeForm.put("u_供应商类型",VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getCode());
|
||||||
|
}else if (VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getName().equals(data.get("供应商类型"))){
|
||||||
|
feeTypeForm.put("u_供应商类型",VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getCode());
|
||||||
|
}else if (VendorTypeEnum.NEW_VENDOR.getName().equals(data.get("供应商类型"))){
|
||||||
|
feeTypeForm.put("u_供应商类型",VendorTypeEnum.NEW_VENDOR.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
//取出data里的出差目的,data里的出差目前有多个,用分号隔开,
|
||||||
|
feeTypeForm.put("u_出差",assemblePurpose(data));
|
||||||
|
detail.put("feeTypeForm",feeTypeForm);
|
||||||
|
details.add(detail);
|
||||||
|
|
||||||
|
form.put("details",details);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hoseTravelOutMapping(Map<String,String> data, JSONObject form) {
|
||||||
|
form.put("u_出差类型",BusinessTypeEnum.TRAVEL_OUT.getCode());
|
||||||
|
//要么直接有时间,要么需要算时间
|
||||||
|
form.put("出差天数","");
|
||||||
|
|
||||||
|
//可能会有多个详情 需要遍历填充数据
|
||||||
|
JSONArray details = new JSONArray();
|
||||||
|
|
||||||
|
JSONObject detail = new JSONObject();
|
||||||
|
detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
|
||||||
|
detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
|
||||||
|
|
||||||
|
JSONObject feeTypeForm = new JSONObject();
|
||||||
|
//填充数据
|
||||||
|
feeTypeForm.put("u_出差",assemblePurpose(data));
|
||||||
|
detail.put("feeTypeForm",feeTypeForm);
|
||||||
|
details.add(detail);
|
||||||
|
|
||||||
|
form.put("details",details);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void hoseTravelOutNotUSAMapping(Map<String,String> data, JSONObject form) {
|
||||||
|
form.put("u_出差类型",BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getCode());
|
||||||
|
//要么直接有时间,要么需要算时间
|
||||||
|
form.put("出差天数","");
|
||||||
|
|
||||||
|
//可能会有多个详情 需要遍历填充数据
|
||||||
|
JSONArray details = new JSONArray();
|
||||||
|
|
||||||
|
JSONObject detail = new JSONObject();
|
||||||
|
detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
|
||||||
|
detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
|
||||||
|
|
||||||
|
JSONObject feeTypeForm = new JSONObject();
|
||||||
|
//填充数据
|
||||||
|
feeTypeForm.put("u_拜访日期","");
|
||||||
|
feeTypeForm.put("u_出差目的地","");
|
||||||
|
feeTypeForm.put("u_VendorName","");
|
||||||
|
|
||||||
|
if (VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getName().equals(data.get("供应商类型"))){
|
||||||
|
feeTypeForm.put("u_供应商类型",VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getCode());
|
||||||
|
}else if (VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getName().equals(data.get("供应商类型"))){
|
||||||
|
feeTypeForm.put("u_供应商类型",VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getCode());
|
||||||
|
}else if (VendorTypeEnum.NEW_VENDOR.getName().equals(data.get("供应商类型"))){
|
||||||
|
feeTypeForm.put("u_供应商类型",VendorTypeEnum.NEW_VENDOR.getCode());
|
||||||
|
}
|
||||||
|
feeTypeForm.put("u_供应商类型","");
|
||||||
|
feeTypeForm.put("u_出差",assemblePurpose(data));
|
||||||
|
detail.put("feeTypeForm",feeTypeForm);
|
||||||
|
details.add(detail);
|
||||||
|
|
||||||
|
form.put("details",details);
|
||||||
|
}
|
||||||
|
|
||||||
|
//填充出差目的
|
||||||
|
private List<String> assemblePurpose(Map<String,String> data){
|
||||||
|
String purpose = data.get("出差目的");
|
||||||
|
List<String> purposes = Arrays.asList(purpose.split(";"));
|
||||||
|
return covertPurposesToCodes(purposes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> covertPurposesToCodes(List<String> purposes) {
|
||||||
|
List<String> codes = new ArrayList<>();
|
||||||
|
for (String purpose : purposes) {
|
||||||
|
String code = TravelPurposeEnum.getCodeByName(purpose);
|
||||||
|
if (code != null) {
|
||||||
|
codes.add(code);
|
||||||
|
} else {
|
||||||
|
log.warn("未找到对应的出差目的: {}", purpose);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codes;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud;
|
||||||
|
|
||||||
|
import cn.jiutqy.archives.common.exception.ServiceException;
|
||||||
|
import cn.jiutqy.archives.common.utils.http.OkHttpClientUtil;
|
||||||
|
import cn.jiutqy.finfiling.common.enums.ChannelEnum;
|
||||||
|
import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class DiPinShiAttendanceService extends AbstractHoseCloudBaseService implements IDiPinShiAttendanceService {
|
||||||
|
|
||||||
|
private final static String CREATE_DOCUMENT = "https://app.ekuaibao.com/api/openapi/v2.2/flow/data?accessToken={accessToken}";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void attendanceGoOut(Map<String,String> data) {
|
||||||
|
if (data == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//构建请求体,如果返回的数据是null,说明数据已经同步过了,就返回
|
||||||
|
JSONObject object = mapping(data);
|
||||||
|
if (object == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//发送请求
|
||||||
|
String reqBody = String.valueOf(object);
|
||||||
|
String url = getAccessToken(CREATE_DOCUMENT, ChannelEnum.HOSECLOUD.getChannelId(), ChannelTypeEnum.OUT);
|
||||||
|
String result = OkHttpClientUtil.doPostJson(url, reqBody);
|
||||||
|
|
||||||
|
if (!isSuccess(result)){
|
||||||
|
log.info("创建公出单据失败,失败原因:{}", result);
|
||||||
|
throw new ServiceException(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void attendanceTravel(Map<String,String> data) {
|
||||||
|
//判断data是否为空,为空就直接返回
|
||||||
|
if (data == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//构建请求体
|
||||||
|
JSONObject object = mapping(data);
|
||||||
|
if (object == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String reqBody = String.valueOf(object);
|
||||||
|
String url = getAccessToken(CREATE_DOCUMENT, ChannelEnum.HOSECLOUD.getChannelId(), ChannelTypeEnum.OUT);
|
||||||
|
String result = OkHttpClientUtil.doPostJson(url, reqBody);
|
||||||
|
|
||||||
|
if (!isSuccess(result)){
|
||||||
|
log.info("创建出差单据失败,失败原因:{}", result);
|
||||||
|
throw new ServiceException(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isSuccess(String result){
|
||||||
|
JSONObject res = JSON.parseObject(result);
|
||||||
|
return res.containsKey("type") && res.getInteger("type") == -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud;
|
||||||
|
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HeSiVO;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface IDiPinShiAttendanceService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步外出
|
||||||
|
*/
|
||||||
|
void attendanceGoOut(Map<String,String> data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步出差
|
||||||
|
*/
|
||||||
|
void attendanceTravel(Map<String,String> data);
|
||||||
|
}
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.hosecloud;
|
|
||||||
|
|
||||||
import cn.jiutqy.finfiling.quartz.hosecloud.vo.HoseCloudPersonnelVO;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface IHoseCloudPersonnelService {
|
|
||||||
|
|
||||||
List<HoseCloudPersonnelVO> queryUser(List<String> ids);
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
package cn.jiutqy.finfiling.quartz.hosecloud;
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize;
|
||||||
|
|
||||||
import cn.jiutqy.archives.common.utils.StringUtils;
|
import cn.jiutqy.archives.common.utils.StringUtils;
|
||||||
import cn.jiutqy.archives.common.utils.http.OkHttpClientUtil;
|
import cn.jiutqy.archives.common.utils.http.OkHttpClientUtil;
|
||||||
import cn.jiutqy.finfiling.common.enums.ChannelEnum;
|
import cn.jiutqy.finfiling.common.enums.ChannelEnum;
|
||||||
import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;;
|
import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;;
|
||||||
import cn.jiutqy.finfiling.quartz.hosecloud.vo.HoseCloudPersonnelVO;
|
import cn.jiutqy.finfiling.quartz.hosecloud.AbstractHoseCloudBaseService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HoseCloudPersonnelVO;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
|
@ -17,7 +18,7 @@ import java.util.Map;
|
||||||
public class HoseCloudPersonnelService extends AbstractHoseCloudBaseService implements IHoseCloudPersonnelService {
|
public class HoseCloudPersonnelService extends AbstractHoseCloudBaseService implements IHoseCloudPersonnelService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<HoseCloudPersonnelVO> queryUser(List<String> ids) {
|
public HoseCloudPersonnelVO queryUser(List<String> ids) {
|
||||||
Map<String, Object> body = new HashMap<>();
|
Map<String, Object> body = new HashMap<>();
|
||||||
//STAFFID : 员工ID
|
//STAFFID : 员工ID
|
||||||
//CODE : 工号
|
//CODE : 工号
|
||||||
|
|
@ -35,6 +36,6 @@ public class HoseCloudPersonnelService extends AbstractHoseCloudBaseService impl
|
||||||
if (StringUtils.isNotBlank(result)){
|
if (StringUtils.isNotBlank(result)){
|
||||||
list = JSON.parseArray(JSON.parseObject(result).getString("items"), HoseCloudPersonnelVO.class);
|
list = JSON.parseArray(JSON.parseObject(result).getString("items"), HoseCloudPersonnelVO.class);
|
||||||
}
|
}
|
||||||
return list.isEmpty() ? null : list;
|
return list.isEmpty() ? null : list.get(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize;
|
||||||
|
|
||||||
|
import cn.jiutqy.archives.common.utils.StringUtils;
|
||||||
|
import cn.jiutqy.archives.common.utils.http.OkHttpClientUtil;
|
||||||
|
import cn.jiutqy.finfiling.common.enums.ChannelEnum;
|
||||||
|
import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.AbstractHoseCloudBaseService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HoseCloudTemplateVO;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class HoseCloudTemplateService extends AbstractHoseCloudBaseService implements IHoseCloudTemplateService{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HoseCloudTemplateVO getHoseCloudTemplateById(String id) {
|
||||||
|
//请求链接
|
||||||
|
String url = BASE_URL + "/api/openapi/v2/specifications/byIds/[{templateId}]?accessToken={accessToken}";
|
||||||
|
url = url.replace("{templateId}", id);
|
||||||
|
String result = OkHttpClientUtil.doGet(getAccessToken(url, ChannelEnum.HOSECLOUD.getChannelId(), ChannelTypeEnum.OUT));
|
||||||
|
List<HoseCloudTemplateVO> list = new ArrayList<>();
|
||||||
|
if (StringUtils.isNotBlank(result)){
|
||||||
|
JSONArray ja = JSON.parseObject(result).getJSONArray("items");
|
||||||
|
JSONObject jo = ja.getJSONObject(0);
|
||||||
|
list = JSON.parseArray(jo.toJSONString(), HoseCloudTemplateVO.class);
|
||||||
|
}
|
||||||
|
return list.isEmpty() ? null : list.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HoseCloudTemplateVO getHoseCloudFeeTypeTemplateById(String id) {
|
||||||
|
String url = BASE_URL + "/api/openapi/v2/specifications/feeType/byIdsAndCodes?accessToken={accessToken}";
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
List<String> ids = new ArrayList<>();
|
||||||
|
ids.add(id);
|
||||||
|
params.put("ids", ids);
|
||||||
|
String result = OkHttpClientUtil.doPostJson(getAccessToken(url, ChannelEnum.HOSECLOUD.getChannelId(), ChannelTypeEnum.OUT),
|
||||||
|
JSONObject.toJSONString(params), null);
|
||||||
|
HoseCloudTemplateVO vo = null;
|
||||||
|
if (StringUtils.isNotBlank(result)){
|
||||||
|
JSONArray ja = JSON.parseObject(result).getJSONArray("items");
|
||||||
|
JSONObject jo = ja.getJSONObject(0);
|
||||||
|
vo = new HoseCloudTemplateVO();
|
||||||
|
vo.setName(jo.getString("name"));
|
||||||
|
vo.setId(jo.getString("requisitionSpecificationId"));
|
||||||
|
}
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize;
|
||||||
|
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HoseCloudPersonnelVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface IHoseCloudPersonnelService {
|
||||||
|
|
||||||
|
HoseCloudPersonnelVO queryUser(List<String> ids);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize;
|
||||||
|
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HoseCloudTemplateVO;
|
||||||
|
|
||||||
|
public interface IHoseCloudTemplateService {
|
||||||
|
/**
|
||||||
|
* 获取模板ID
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
HoseCloudTemplateVO getHoseCloudTemplateById(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取费用类型模板
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
HoseCloudTemplateVO getHoseCloudFeeTypeTemplateById(String id);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class HeSiGoOutVO extends HeSiVO{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class HeSiTravelInVO extends HeSiVO{
|
||||||
|
|
||||||
|
|
||||||
|
private String vendorName;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class HeSiTravelOutNotUSAVO extends HeSiVO{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class HeSiTravelOutVO extends HeSiVO{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class HeSiVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 申请人
|
||||||
|
*/
|
||||||
|
private String applicant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 申请类型
|
||||||
|
*/
|
||||||
|
private String applicationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始时间
|
||||||
|
*/
|
||||||
|
private String startTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束时间
|
||||||
|
*/
|
||||||
|
private String endTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审批单号
|
||||||
|
*/
|
||||||
|
private String approvalNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出差类型
|
||||||
|
*/
|
||||||
|
private String travelType;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.jiutqy.finfiling.quartz.hosecloud.vo;
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.hosecloud.organize.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class HoseCloudTemplateVO {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,249 @@
|
||||||
|
package cn.jiutqy.finfiling.quartz.sync;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import cn.jiutqy.archives.common.utils.ExceptionUtil;
|
||||||
|
import cn.jiutqy.finfiling.common.domain.FinFilingSyncLog;
|
||||||
|
import cn.jiutqy.finfiling.common.enums.ChannelEnum;
|
||||||
|
import cn.jiutqy.finfiling.common.enums.SyncStateEnum;
|
||||||
|
import cn.jiutqy.finfiling.common.service.IFinFilingSyncLogService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.constants.BusinessTypeEnum;
|
||||||
|
import cn.jiutqy.finfiling.quartz.dipinshi.IDiPinShiFinFilingService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.hosecloud.IDiPinShiAttendanceService;
|
||||||
|
import cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req.*;
|
||||||
|
import cn.jiutqy.finfiling.quartz.enums.GeYuanOutboundTypeEnum;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class OutboundSyncDiPinShiService implements IOutboundSyncDiPinShiService{
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IFinFilingSyncLogService finFilingSyncLogService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IDiPinShiFinFilingService diPinShiFinFilingService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IDiPinShiAttendanceService attendanceService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSyncTravel(String start, String end) {
|
||||||
|
//批量获取数据单号
|
||||||
|
List<String> approvalNos = diPinShiFinFilingService.getBatchApprovalNoTravel(start, end , "TRAVEL");
|
||||||
|
|
||||||
|
List<DiPinShiAttendanceReqVO> travelReps = new ArrayList<>();
|
||||||
|
|
||||||
|
//根据单号查询详情 取出有效数据x
|
||||||
|
for (String approvalNo : approvalNos) {
|
||||||
|
String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
|
||||||
|
|
||||||
|
//根据类型判断:外出、国内出差、国际出差、国际出差非美国
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(detail));
|
||||||
|
|
||||||
|
//取出出差类型,根据类型分别映射到不同VO --这里的类型应该没这么好取
|
||||||
|
String type = jsonObject.getString("type");
|
||||||
|
if (BusinessTypeEnum.TRAVEL_IN.getName().equals(type)){
|
||||||
|
//如果层级结构太多就手动取值然后塞进里
|
||||||
|
DiPinShiAttendanceTravelInReqVO travelIn = JSONObject.parseObject(detail, DiPinShiAttendanceTravelInReqVO.class);
|
||||||
|
travelReps.add(travelIn);
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(type)){
|
||||||
|
DiPinShiAttendanceTravelOutReqVO travelOut = JSONObject.parseObject(detail, DiPinShiAttendanceTravelOutReqVO.class);
|
||||||
|
travelReps.add(travelOut);
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(type)){
|
||||||
|
DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSA = JSONObject.parseObject(detail, DiPinShiAttendanceTravelOutNotUSAReqVO.class);
|
||||||
|
travelReps.add(travelOutNotUSA);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FinFilingSyncLog finFilingSyncLog;
|
||||||
|
|
||||||
|
if (CollectionUtil.isNotEmpty(travelReps)) {
|
||||||
|
for (DiPinShiAttendanceReqVO travelRep : travelReps) {
|
||||||
|
// 区分出差类型
|
||||||
|
String tripType = travelRep.getTravelType();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 记录同步日志
|
||||||
|
finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputChannelAndInputDataId(ChannelEnum.DI_PIN_SHI_TRAVEL.getChannelId(), travelRep.getApprovalNo());
|
||||||
|
if (finFilingSyncLog == null){
|
||||||
|
finFilingSyncLog = new FinFilingSyncLog();
|
||||||
|
finFilingSyncLog.setInputChannelId(ChannelEnum.DI_PIN_SHI_TRAVEL.getChannelId());
|
||||||
|
finFilingSyncLog.setInputDataId(travelRep.getApprovalNo());
|
||||||
|
finFilingSyncLog.setInputData(JSON.toJSONString(travelRep.getData()));
|
||||||
|
finFilingSyncLog.setSyncState(SyncStateEnum.INIT.value());
|
||||||
|
finFilingSyncLog.setCreateTime(new Date());
|
||||||
|
finFilingSyncLogService.save(finFilingSyncLog);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("写入同步日志失败:{}-{}", ChannelEnum.DI_PIN_SHI_TRAVEL.getChannelId() , JSON.toJSONString(travelRep));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据出差类型组装数据
|
||||||
|
Map<String,String> dataToSend = assembleTravelData(travelRep, tripType);
|
||||||
|
|
||||||
|
try {
|
||||||
|
//数据同步到合思,更改同步状态
|
||||||
|
attendanceService.attendanceTravel(dataToSend);
|
||||||
|
finFilingSyncLog.setOutputChannelId(ChannelEnum.HOSECLOUD.getChannelId());
|
||||||
|
finFilingSyncLog.setOutputDataId(travelRep.getApprovalNo());
|
||||||
|
finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
|
||||||
|
log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("输出异常",e);
|
||||||
|
finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
|
||||||
|
finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
|
||||||
|
log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
finFilingSyncLog.setUpdateTime(new Date());
|
||||||
|
finFilingSyncLogService.updateById(finFilingSyncLog);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("修改同步日志失败",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSyncGoOut(String start, String end) {
|
||||||
|
//批量获取数据单号
|
||||||
|
List<String> approvalNos = diPinShiFinFilingService.getBatchApprovalNoTravel(start, end , "GoOut");
|
||||||
|
|
||||||
|
List<DiPinShiAttendanceGoOutReqVO> goOuts = new ArrayList<>();
|
||||||
|
//根据单号查询单号详情
|
||||||
|
for (String approvalNo : approvalNos) {
|
||||||
|
String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
|
||||||
|
DiPinShiAttendanceGoOutReqVO goOut = JSONObject.parseObject(detail, DiPinShiAttendanceGoOutReqVO.class);
|
||||||
|
goOuts.add(goOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
FinFilingSyncLog finFilingSyncLog;
|
||||||
|
if (CollectionUtil.isNotEmpty(goOuts)){
|
||||||
|
for (DiPinShiAttendanceGoOutReqVO goOut : goOuts) {
|
||||||
|
//记录同步日志
|
||||||
|
try {
|
||||||
|
finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputChannelAndInputDataId(ChannelEnum.DI_PIN_SHI_GO_OUT.getChannelId(), goOut.getApprovalNo());
|
||||||
|
if (finFilingSyncLog == null){
|
||||||
|
finFilingSyncLog = new FinFilingSyncLog();
|
||||||
|
finFilingSyncLog.setInputChannelId(ChannelEnum.DI_PIN_SHI_GO_OUT.getChannelId());
|
||||||
|
finFilingSyncLog.setInputDataId(goOut.getApprovalNo());
|
||||||
|
finFilingSyncLog.setInputData(JSON.toJSONString(goOut.getData()));
|
||||||
|
finFilingSyncLog.setSyncState(SyncStateEnum.INIT.value());
|
||||||
|
finFilingSyncLog.setCreateTime(new Date());
|
||||||
|
finFilingSyncLogService.save(finFilingSyncLog);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("写入同步日志失败:{}-{}", ChannelEnum.DI_PIN_SHI_GO_OUT.getChannelId() , JSON.toJSONString(goOut));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//字段映射
|
||||||
|
Map<String,String> dataToSend = goOutMapping(goOut);
|
||||||
|
|
||||||
|
try {
|
||||||
|
//数据同步到合思,更改同步状态
|
||||||
|
attendanceService.attendanceGoOut(dataToSend);
|
||||||
|
finFilingSyncLog.setOutputChannelId(ChannelEnum.HOSECLOUD.getChannelId());
|
||||||
|
finFilingSyncLog.setOutputDataId(goOut.getApprovalNo());
|
||||||
|
finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
|
||||||
|
log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("输出异常",e);
|
||||||
|
finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
|
||||||
|
finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
|
||||||
|
log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
finFilingSyncLog.setUpdateTime(new Date());
|
||||||
|
finFilingSyncLogService.updateById(finFilingSyncLog);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("修改同步日志失败",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> goOutMapping(DiPinShiAttendanceGoOutReqVO goOut) {
|
||||||
|
//字段映射
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> assembleTravelData(DiPinShiAttendanceReqVO travelRep, String tripType) {
|
||||||
|
Map<String,String> sendData = null;
|
||||||
|
if (BusinessTypeEnum.TRAVEL_IN.getName().equals(tripType)){
|
||||||
|
if (travelRep instanceof DiPinShiAttendanceTravelInReqVO){
|
||||||
|
DiPinShiAttendanceTravelInReqVO travelInRep = (DiPinShiAttendanceTravelInReqVO) travelRep;
|
||||||
|
sendData = travelInMapping(travelInRep);
|
||||||
|
}
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(tripType)){
|
||||||
|
if (travelRep instanceof DiPinShiAttendanceTravelOutReqVO){
|
||||||
|
DiPinShiAttendanceTravelOutReqVO travelOutRep = (DiPinShiAttendanceTravelOutReqVO) travelRep;
|
||||||
|
sendData = travelOutMapping(travelOutRep);
|
||||||
|
}
|
||||||
|
}else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(tripType)){
|
||||||
|
if (travelRep instanceof DiPinShiAttendanceTravelOutNotUSAReqVO){
|
||||||
|
DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSARep = (DiPinShiAttendanceTravelOutNotUSAReqVO) travelRep;
|
||||||
|
sendData = travelOutNotUSAMapping(travelOutNotUSARep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sendData;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> travelInMapping(DiPinShiAttendanceTravelInReqVO travelInRep) {
|
||||||
|
//将企微的数据 转成保存到合思同步时需要的数据,一个一个取出来塞进map里
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> travelOutMapping(DiPinShiAttendanceTravelOutReqVO travelOutRep) {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> travelOutNotUSAMapping(DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSARep) {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void retry(Date beforeTime) {
|
||||||
|
List<FinFilingSyncLog> list = finFilingSyncLogService.listFailFinFiling(beforeTime);
|
||||||
|
list.forEach(item -> {
|
||||||
|
GeYuanOutboundTypeEnum typeEnum = GeYuanOutboundTypeEnum.getByType(item.getInputChannelId());
|
||||||
|
if (typeEnum == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, Object> map = JSON.parseObject(item.getInputData());
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//转成日期格式yyyy-mm-dd mm:ss
|
||||||
|
public String convertDateFormat(String stamp){
|
||||||
|
long timestamp = Long.parseLong(stamp);
|
||||||
|
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||||
|
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
|
||||||
|
|
||||||
|
Date date = new Date(timestamp);
|
||||||
|
return sdf.format(date);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,208 +0,0 @@
|
||||||
package cn.jiutqy.finfiling.quartz.sync;
|
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
|
||||||
import cn.jiutqy.archives.common.utils.ExceptionUtil;
|
|
||||||
import cn.jiutqy.archives.common.utils.email.EmailSendUtil;
|
|
||||||
import cn.jiutqy.finfiling.common.domain.FinFilingSyncLog;
|
|
||||||
import cn.jiutqy.finfiling.common.enums.ChannelEnum;
|
|
||||||
import cn.jiutqy.finfiling.common.enums.SyncStateEnum;
|
|
||||||
import cn.jiutqy.finfiling.common.service.IFinFilingSyncLogService;
|
|
||||||
import cn.jiutqy.finfiling.quartz.dipinshi.IDiPinShiFinFilingService;
|
|
||||||
import cn.jiutqy.finfiling.quartz.dipinshi.attendance.IDiPinShiAttendanceService;
|
|
||||||
import cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.*;
|
|
||||||
import cn.jiutqy.finfiling.quartz.enums.GeYuanOutboundTypeEnum;
|
|
||||||
import cn.jiutqy.finfiling.quartz.hosecloud.HoseCloudPersonnelService;
|
|
||||||
import com.alibaba.fastjson2.JSON;
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
public class OutboundSyncGeYuanService implements IOutboundSyncDiPinShiService{
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IFinFilingSyncLogService finFilingSyncLogService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IDiPinShiFinFilingService diPinShiFinFilingService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IDiPinShiAttendanceService attendanceService;
|
|
||||||
|
|
||||||
private final static String TRAVEL_IN = "国内出差";
|
|
||||||
|
|
||||||
private final static String TRAVEL_OUT = "国际出差";
|
|
||||||
|
|
||||||
private final static String TRAVEL_OUT_NOT_USA = "国际出差非美国";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateSyncTravel(String start, String end) {
|
|
||||||
//批量获取数据单号
|
|
||||||
List<String> approvalNos = diPinShiFinFilingService.getBatchApprovalNoTravel(start, end , "TRAVEL");
|
|
||||||
|
|
||||||
HashMap<String, Object> map = new HashMap<>();
|
|
||||||
List<DiPinShiAttendanceTravelInReqVO> travelIns = new ArrayList<>();
|
|
||||||
List<DiPinShiAttendanceTravelOutNotUSAReqVO> travelOutNotUSAs = new ArrayList<>();
|
|
||||||
List<DiPinShiAttendanceTravelOutReqVO> travelOuts = new ArrayList<>();
|
|
||||||
|
|
||||||
//根据单号查询详情 取出有效数据x
|
|
||||||
for (String approvalNo : approvalNos) {
|
|
||||||
String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
|
|
||||||
|
|
||||||
//根据类型判断:外出、国内出差、国际出差、国际出差非美国
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//记录同步结果
|
|
||||||
if (CollectionUtil.isNotEmpty(travelIns)){
|
|
||||||
travelIns.forEach(this::recordSyncData);
|
|
||||||
}
|
|
||||||
if (CollectionUtil.isNotEmpty(travelOutNotUSAs)){
|
|
||||||
travelOutNotUSAs.forEach(this::recordSyncData);
|
|
||||||
}
|
|
||||||
if (CollectionUtil.isNotEmpty(travelOuts)){
|
|
||||||
travelOuts.forEach(this::recordSyncData);
|
|
||||||
}
|
|
||||||
|
|
||||||
map.put(TRAVEL_IN,travelIns);
|
|
||||||
map.put(TRAVEL_OUT,travelOuts);
|
|
||||||
map.put(TRAVEL_OUT_NOT_USA,travelOutNotUSAs);
|
|
||||||
|
|
||||||
//数据的字段进行映射
|
|
||||||
HashMap<String, Object> reqBodys = travelMapping(map);
|
|
||||||
|
|
||||||
//数据同步到合思
|
|
||||||
attendanceService.attenancedTravel(reqBodys);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateSyncGoOut(String start, String end) {
|
|
||||||
//批量获取数据单号
|
|
||||||
List<String> approvalNos = diPinShiFinFilingService.getBatchApprovalNoTravel(start, end , "GoOut");
|
|
||||||
|
|
||||||
List<DiPinShiAttendanceGoOutReqVO> goOuts = new ArrayList<>();
|
|
||||||
//根据单号查询单号详情
|
|
||||||
for (String approvalNo : approvalNos) {
|
|
||||||
String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
|
|
||||||
DiPinShiAttendanceGoOutReqVO goOut = JSONObject.parseObject(detail, DiPinShiAttendanceGoOutReqVO.class);
|
|
||||||
goOuts.add(goOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
FinFilingSyncLog finFilingSyncLog;
|
|
||||||
if (CollectionUtil.isNotEmpty(goOuts)){
|
|
||||||
for (DiPinShiAttendanceGoOutReqVO goOut : goOuts) {
|
|
||||||
//记录同步日志
|
|
||||||
try {
|
|
||||||
finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputChannelAndInputDataId(ChannelEnum.DI_PIN_SHI.getChannelId(), goOut.getApprovalNo());
|
|
||||||
if (finFilingSyncLog == null){
|
|
||||||
finFilingSyncLog = new FinFilingSyncLog();
|
|
||||||
finFilingSyncLog.setInputChannelId(ChannelEnum.DI_PIN_SHI.getChannelId());
|
|
||||||
finFilingSyncLog.setInputDataId(goOut.getApprovalNo());
|
|
||||||
finFilingSyncLog.setInputData(JSON.toJSONString(goOut.getData()));
|
|
||||||
finFilingSyncLog.setSyncState(SyncStateEnum.INIT.value());
|
|
||||||
finFilingSyncLog.setCreateTime(new Date());
|
|
||||||
finFilingSyncLogService.save(finFilingSyncLog);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("写入同步日志失败:{}-{}", ChannelEnum.DI_PIN_SHI.getChannelId() , JSON.toJSONString(goOut));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
//数据同步到合思,更改同步状态
|
|
||||||
attendanceService.attendanceGoOut(goOut);
|
|
||||||
finFilingSyncLog.setOutputChannelId(ChannelEnum.HOSECLOUD.getChannelId());
|
|
||||||
finFilingSyncLog.setOutputDataId(goOut.getApprovalNo());
|
|
||||||
finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
|
|
||||||
log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("输出异常",e);
|
|
||||||
finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
|
|
||||||
finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
|
|
||||||
log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
finFilingSyncLog.setUpdateTime(new Date());
|
|
||||||
finFilingSyncLogService.updateById(finFilingSyncLog);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("修改同步日志失败",e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashMap<String, Object> travelMapping(HashMap<String, Object> map) {
|
|
||||||
HashMap<String, Object> reqBodys = new HashMap<>();
|
|
||||||
List<String> travelInList = new ArrayList<>();
|
|
||||||
List<String> travelOutList = new ArrayList<>();
|
|
||||||
List<String> travelOutNotUSAList = new ArrayList<>();
|
|
||||||
|
|
||||||
//字段映射
|
|
||||||
|
|
||||||
reqBodys.put(TRAVEL_IN,travelInList);
|
|
||||||
reqBodys.put(TRAVEL_OUT,travelOutList);
|
|
||||||
reqBodys.put(TRAVEL_OUT_NOT_USA,travelOutNotUSAList);
|
|
||||||
return reqBodys;
|
|
||||||
}
|
|
||||||
|
|
||||||
//记录同步数据
|
|
||||||
private void recordSyncData(DiPinShiAttendanceReqVO reqVO){
|
|
||||||
FinFilingSyncLog finFilingSyncLog;
|
|
||||||
|
|
||||||
try {
|
|
||||||
finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputChannelAndInputDataId(ChannelEnum.DI_PIN_SHI.getChannelId(), "审批单号");
|
|
||||||
if (finFilingSyncLog == null){
|
|
||||||
finFilingSyncLog = new FinFilingSyncLog();
|
|
||||||
finFilingSyncLog.setInputChannelId(ChannelEnum.DI_PIN_SHI.getChannelId());
|
|
||||||
finFilingSyncLog.setInputDataId("审批单号");
|
|
||||||
finFilingSyncLog.setInputData(JSON.toJSONString("获取的数据"));
|
|
||||||
finFilingSyncLog.setSyncState(SyncStateEnum.INIT.value());
|
|
||||||
finFilingSyncLog.setCreateTime(new Date());
|
|
||||||
finFilingSyncLogService.save(finFilingSyncLog);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("写入同步日志失败:{}-{}", ChannelEnum.DI_PIN_SHI.getChannelId(), reqVO.getData());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void retry(Date beforeTime) {
|
|
||||||
List<FinFilingSyncLog> list = finFilingSyncLogService.listFailFinFiling(beforeTime);
|
|
||||||
list.forEach(item -> {
|
|
||||||
GeYuanOutboundTypeEnum typeEnum = GeYuanOutboundTypeEnum.getByType(item.getInputChannelId());
|
|
||||||
if (typeEnum == null){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Map<String, Object> map = JSON.parseObject(item.getInputData());
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//转成日期格式yyyy-mm-dd mm:ss
|
|
||||||
public String convertDateFormat(String stamp){
|
|
||||||
long timestamp = Long.parseLong(stamp);
|
|
||||||
|
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
|
|
||||||
|
|
||||||
Date date = new Date(timestamp);
|
|
||||||
return sdf.format(date);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue