diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java index 993bfff..6fc503c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java @@ -21,4 +21,9 @@ public class RedisConstants { */ public static final String MULTIPLE_TABLE_RECORD = "MULTIPLE_TABLE_RECORD"; + /** + * 畅捷通ticket缓存key + */ + public static final String CJT_TICKET_CACHE_KEY = "TICKET_KEY"; + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 22a610d..bff2234 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -49,6 +49,10 @@ public class RedisCache redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } + public Long getExpireTime(String key){ + return redisTemplate.getExpire(key); + } + /** * 设置有效时间 * diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EdiController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EdiController.java index 4ab1f5e..9e61d4d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EdiController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EdiController.java @@ -1,7 +1,9 @@ package com.ruoyi.flyingbook.controller; import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.PdfUtils; import com.ruoyi.flyingbook.LarkHelper.LarkFileHelper; import com.ruoyi.flyingbook.domain.EventLog; @@ -20,6 +22,7 @@ import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.concurrent.TimeUnit; @Slf4j @RestController @@ -35,7 +38,8 @@ public class EdiController extends BaseController { ResourceLoader resourceLoader; @Autowired private IEventLogService iEventLogService; - + @Autowired + private RedisCache redisCache; /** * 同步数据到飞书表格 */ @@ -65,7 +69,11 @@ public class EdiController extends BaseController { byte[] bytes = Base64.decodeBase64(request.getEncryptMsg()); bytes = cipher.doFinal(bytes); String encryptMsg = new String(bytes, StandardCharsets.UTF_8); - log.error("receiveWscTicket encryptMsg:{}",encryptMsg); + log.info("receiveWscTicket encryptMsg:{}",encryptMsg); + JSONObject jsonObject = JSONObject.parseObject(encryptMsg); + JSONObject bizContent = jsonObject.getJSONObject("bizContent"); + String appTicket = bizContent.getString("appTicket"); + redisCache.setCacheObject(RedisConstants.CJT_TICKET_CACHE_KEY,appTicket,10, TimeUnit.MINUTES); }catch (Exception e){ log.error("receiveWscTicket error request:{}",JSONObject.toJSONString(request),e); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkRelation.java new file mode 100644 index 0000000..1dded70 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkRelation.java @@ -0,0 +1,22 @@ +package com.ruoyi.flyingbook.domain; + +import lombok.Data; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 erp_lark_relation + * + * @author ruoyi + * @date 2023-07-17 + */ +@Data +public class ErpLarkRelation extends BaseEntity { + + private Long id; + + private String key; + + private String method; + + private Long flag; +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java new file mode 100644 index 0000000..7c6680e --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java @@ -0,0 +1,67 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.flyingbook.domain.ErpLarkRelation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface ErpLarkRelationMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public ErpLarkRelation selectErpLarkRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectErpLarkRelationList(ErpLarkRelation erpLarkRelation); + + /** + * 新增【请填写功能名称】 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertErpLarkRelation(ErpLarkRelation erpLarkRelation); + + /** + * 修改【请填写功能名称】 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateErpLarkRelation(ErpLarkRelation erpLarkRelation); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteErpLarkRelationById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteErpLarkRelationByIds(Long[] ids); + + + public List queryListByKeyList(@Param("keyList") List keyList,@Param("method") String method); +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkRelationService.java new file mode 100644 index 0000000..4e4d270 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkRelationService.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.flyingbook.domain.ErpLarkRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface IErpLarkRelationService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public ErpLarkRelation selectErpLarkRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectErpLarkRelationList(ErpLarkRelation erpLarkRelation); + + /** + * 新增【请填写功能名称】 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertErpLarkRelation(ErpLarkRelation erpLarkRelation); + + /** + * 修改【请填写功能名称】 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateErpLarkRelation(ErpLarkRelation erpLarkRelation); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteErpLarkRelationByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteErpLarkRelationById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkRelationServiceImpl.java new file mode 100644 index 0000000..8e46b2b --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkRelationServiceImpl.java @@ -0,0 +1,97 @@ +package com.ruoyi.flyingbook.service.impl; + +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.flyingbook.domain.ErpLarkRelation; +import com.ruoyi.flyingbook.mapper.ErpLarkRelationMapper; +import com.ruoyi.flyingbook.service.IErpLarkRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-07-17 + */ +@Service +public class ErpLarkRelationServiceImpl implements IErpLarkRelationService +{ + @Autowired + private ErpLarkRelationMapper erpLarkRelationMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public ErpLarkRelation selectErpLarkRelationById(Long id) + { + return erpLarkRelationMapper.selectErpLarkRelationById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectErpLarkRelationList(ErpLarkRelation erpLarkRelation) + { + return erpLarkRelationMapper.selectErpLarkRelationList(erpLarkRelation); + } + + /** + * 新增【请填写功能名称】 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertErpLarkRelation(ErpLarkRelation erpLarkRelation) + { + erpLarkRelation.setCreateTime(DateUtils.getNowDate()); + return erpLarkRelationMapper.insertErpLarkRelation(erpLarkRelation); + } + + /** + * 修改【请填写功能名称】 + * + * @param erpLarkRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateErpLarkRelation(ErpLarkRelation erpLarkRelation) + { + erpLarkRelation.setUpdateTime(DateUtils.getNowDate()); + return erpLarkRelationMapper.updateErpLarkRelation(erpLarkRelation); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteErpLarkRelationByIds(Long[] ids) + { + return erpLarkRelationMapper.deleteErpLarkRelationByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteErpLarkRelationById(Long id) + { + return erpLarkRelationMapper.deleteErpLarkRelationById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml new file mode 100644 index 0000000..b8e62b4 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + select id, key, method, create_by, create_time, update_by, update_time, flag, remark + from erp_lark_relation + + + + + + + + + insert into erp_lark_relation + + key, + method, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{key}, + #{method}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update erp_lark_relation + + key = #{key}, + method = #{method}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete + from erp_lark_relation + where id = #{id} + + + + delete from erp_lark_relation where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index ef0004a..e75a8d9 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -98,7 +98,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .authorizeRequests() // 对于登录login 验证码captchaImage 允许匿名访问 .antMatchers("/login", "/captchaImage", "/approval","/syncEmail","/scheduledReminders", - "/robot/callback", "/sync2Table", "/createPdf", "/cjtTicket").anonymous() + "/robot/callback", "/sync2Table", "/createPdf", "/cjtTicket").anonymous() .antMatchers( HttpMethod.GET, "/*.html", diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTJobContext.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTJobContext.java new file mode 100644 index 0000000..d908300 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTJobContext.java @@ -0,0 +1,41 @@ +package com.ruoyi.quartz.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author yuxiangyong + * @create 2023-07-17 20:31 + */ +@Data +@NoArgsConstructor +public class CJTJobContext implements Serializable { + + private String appKey; + private String appSecret; + private String contentType; + + public CJTJobContext(String appKey, String appSecret) { + this.appKey = appKey; + this.appSecret = appSecret; + this.contentType = "application/json"; + } + + /** + * 用于获取ticket信息 + */ + private String ticket; + /** + * 调用接口的token信息 + */ + private String openToken; + + /** + * 唯一键集合,区分创建或更新 + */ + private List keyList; +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTJobRequest.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTJobRequest.java new file mode 100644 index 0000000..6c5751a --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTJobRequest.java @@ -0,0 +1,8 @@ +package com.ruoyi.quartz.domain; + +/** + * @author yuxiangyong + * @create 2023-07-17 20:31 + */ +public class CJTJobRequest extends JobRequest{ +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTRequest.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTRequest.java new file mode 100644 index 0000000..b13d4db --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/CJTRequest.java @@ -0,0 +1,93 @@ +package com.ruoyi.quartz.domain; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.NoArgsConstructor; +import okhttp3.Headers; +import org.springframework.util.StringUtils; + +import java.io.Serializable; + +/** + * @author yuxiangyong + * @create 2023-07-17 20:31 + */ +@Data +@NoArgsConstructor +public class CJTRequest implements Serializable { + + /** + * 请求地址 + */ + private String url; + /** + * 应用密钥 + */ + private String appKey; + private String appSecret; + /** + * 应用ticket和certificate 用于换取token + */ + private String appTicket; + private String certificate; + /** + * token,用于请求接口 + */ + private String openToken; + /** + * 请求体 + */ + private JSONObject body; + + /** + * 重置ticket + */ + public CJTRequest(String url, String appKey, String appSecret) { + this.url = url; + this.appKey = appKey; + this.appSecret = appSecret; + } + + /** + * 换取token + */ + public CJTRequest(String url, String appKey, String appSecret, String appTicket, String certificate) { + this.url = url; + this.appKey = appKey; + this.appSecret = appSecret; + this.appTicket = appTicket; + this.certificate = certificate; + } + + + /** + * 请求接口 + */ + public CJTRequest(String url, String appKey, String appSecret, String openToken) { + this.url = url; + this.appKey = appKey; + this.appSecret = appSecret; + this.openToken = openToken; + } + + public Headers buildHeaders(){ + Headers.Builder builder = new Headers.Builder(); + builder.add("appKey",appKey); + builder.add("appSecret",appSecret); + builder.add("Content-Type","application/json"); + if (!StringUtils.isEmpty(openToken)) { + builder.add("openToken", appKey); + } + return builder.build(); + } + + /** + * 构建查询token的body + */ + public void buildGenerateBody(){ + JSONObject body = new JSONObject(); + body.put("appTicket",appKey); + body.put("certificate",certificate); + this.body = body; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/JobRequest.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/JobRequest.java new file mode 100644 index 0000000..47ee555 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/JobRequest.java @@ -0,0 +1,10 @@ +package com.ruoyi.quartz.domain; + +import java.io.Serializable; + +/** + * @author yuxiangyong + * @create 2023-07-17 20:30 + */ +public class JobRequest implements Serializable { +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/helper/OkHttpHelper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/helper/OkHttpHelper.java index 3874ff0..677048b 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/helper/OkHttpHelper.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/helper/OkHttpHelper.java @@ -1,11 +1,10 @@ package com.ruoyi.quartz.helper; -import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.quartz.domain.CJTRequest; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import okhttp3.*; -import org.springframework.stereotype.Component; - -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; @@ -25,26 +24,53 @@ public class OkHttpHelper { - public static void post(String url, String body) { + public static JSONObject post(CJTRequest req) { + String body = req.getBody() == null ? "{}" : req.getBody().toJSONString(); Request request = new Request.Builder() - .method("POST", RequestBody.create(MediaType.get("application/json"),body.getBytes(StandardCharsets.UTF_8))) - .url(url) + .headers(req.buildHeaders()) + .method("POST", + RequestBody.create(MediaType.get("application/json"), + body.getBytes(StandardCharsets.UTF_8))) + .url(req.getUrl()) .build(); try { - client.newCall(request).execute(); + Response execute = client.newCall(request).execute(); + ResponseBody responseBody = execute.body(); + if (responseBody != null){ + return JSONObject.parseObject(responseBody.string()); + } } catch (Exception e) { log.error("http get 请求失败--{}", e); } + return null; } - public static void main(String[] args) { - post("https://open.feishu.cn/open-apis/bot/v2/hook/77f1c976-2418-4e03-bc96-7f14c2c2898e", - "{\n" + - "\t\"msg_type\": \"text\",\n" + - "\t\"content\": {\n" + - "\t\t\"text\": \"YXY text content\"\n" + - "\t}\n" + - "}"); + resetTicket(); +// getToken(); + } + + private static void resetTicket(){ + CJTRequest cjtRequest = new CJTRequest("https://openapi.chanjet.com/auth/appTicket/resend" + ,"wwjSb5Vl" + ,"C661F71361CC4C5636396480FF08BBA4"); + JSONObject post = post(cjtRequest); + int i = 0; + } + + /** + * {"result":false,"error":{"code":"4041","msg":"appTicket已失效","hint":""},"value":null,"traceId":null} + * @return + */ + @SneakyThrows + private static String getToken(){ + CJTRequest cjtRequest = new CJTRequest("https://openapi.chanjet.com/v1/common/auth/selfBuiltApp/generateToken" + ,"wwjSb5Vl" + ,"C661F71361CC4C5636396480FF08BBA4" + ,"t-57e995a18de84b588349084cb4e5dc68" + ,"OXYwHSWAc22UPHxfIUM0SSFZwziCLmBfOzBaN+PCNp0SNfV3ewYIaWLJCCrYToCU46x3PJO8t4TXV57bGpbiqClld5DiAkQ3EX1qqxoyaE9J0HAsfnp/PkPurKMQewBHICM2oEPRyLU5GUQjTCucfLvO4xT3DKlelbjBsIkKLqs="); + cjtRequest.buildGenerateBody(); + JSONObject post = post(cjtRequest); + return null; } } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java new file mode 100644 index 0000000..879535b --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java @@ -0,0 +1,41 @@ +package com.ruoyi.quartz.task.CJT; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.CJTRequest; +import com.ruoyi.quartz.helper.OkHttpHelper; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 生产加工单 + * @author yuxiangyong + * @create 2023-07-17 21:21 + */ +@Component("ManufactureOrder") +public class ManufactureOrderSyncJob extends SyncAccountsJobAbstract{ + + private static final String urlPath = "/tplus/api/v2/ManufactureOrderOpenApi/FindVoucherList"; + + @Override + protected void sync(CJTJobContext context) { + CJTRequest cjtRequest = buildCJTRequest(context); + JSONObject post = OkHttpHelper.post(cjtRequest); + List result = new ArrayList<>(); + List keyList = new ArrayList<>(); + Map existKeyMap = getExistKeyMap(keyList); + } + + @Override + protected void fieldMapping() { + + } + + @Override + protected String getRequestUrl() { + return REQUEST_ROOT_PATH + urlPath; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java new file mode 100644 index 0000000..ac489c6 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java @@ -0,0 +1,41 @@ +package com.ruoyi.quartz.task.CJT; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.CJTRequest; +import com.ruoyi.quartz.helper.OkHttpHelper; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 进货单 + * @author yuxiangyong + * @create 2023-07-17 21:21 + */ +@Component("PurchaseArrivalOpen") +public class PurchaseArrivalOpenSyncJob extends SyncAccountsJobAbstract{ + + private static final String urlPath = "/tplus/api/v2/PurchaseArrivalOpenApi/FindVoucherList"; + + @Override + protected void sync(CJTJobContext context) { + CJTRequest cjtRequest = buildCJTRequest(context); + JSONObject post = OkHttpHelper.post(cjtRequest); + List result = new ArrayList<>(); + List keyList = new ArrayList<>(); + Map existKeyMap = getExistKeyMap(keyList); + } + + @Override + protected void fieldMapping() { + + } + + @Override + protected String getRequestUrl() { + return REQUEST_ROOT_PATH + urlPath; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java new file mode 100644 index 0000000..5fafcdb --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java @@ -0,0 +1,41 @@ +package com.ruoyi.quartz.task.CJT; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.CJTRequest; +import com.ruoyi.quartz.helper.OkHttpHelper; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 采购订单 + * @author yuxiangyong + * @create 2023-07-17 21:21 + */ +@Component("PurchaseOrder") +public class PurchaseOrderSyncJob extends SyncAccountsJobAbstract{ + + private static final String urlPath = "/tplus/api/v2/PurchaseOrderOpenApi/FindVoucherList"; + + @Override + protected void sync(CJTJobContext context) { + CJTRequest cjtRequest = buildCJTRequest(context); + JSONObject post = OkHttpHelper.post(cjtRequest); + List result = new ArrayList<>(); + List keyList = new ArrayList<>(); + Map existKeyMap = getExistKeyMap(keyList); + } + + @Override + protected void fieldMapping() { + + } + + @Override + protected String getRequestUrl() { + return REQUEST_ROOT_PATH + urlPath; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java new file mode 100644 index 0000000..89ac7ff --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java @@ -0,0 +1,41 @@ +package com.ruoyi.quartz.task.CJT; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.CJTRequest; +import com.ruoyi.quartz.helper.OkHttpHelper; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 销货单 + * @author yuxiangyong + * @create 2023-07-17 21:21 + */ +@Component("SaleDelivery") +public class SaleDeliverySyncJob extends SyncAccountsJobAbstract{ + + private static final String urlPath = "/tplus/api/v2/SaleDeliveryOpenApi/FindVoucherList"; + + @Override + protected void sync(CJTJobContext context) { + CJTRequest cjtRequest = buildCJTRequest(context); + JSONObject post = OkHttpHelper.post(cjtRequest); + List result = new ArrayList<>(); + List keyList = new ArrayList<>(); + Map existKeyMap = getExistKeyMap(keyList); + } + + @Override + protected void fieldMapping() { + + } + + @Override + protected String getRequestUrl() { + return REQUEST_ROOT_PATH + urlPath; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java new file mode 100644 index 0000000..8c0b6f1 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java @@ -0,0 +1,41 @@ +package com.ruoyi.quartz.task.CJT; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.CJTRequest; +import com.ruoyi.quartz.helper.OkHttpHelper; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 销售订单 + * @author yuxiangyong + * @create 2023-07-17 21:21 + */ +@Component("SaleOrderSync") +public class SaleOrderSyncJob extends SyncAccountsJobAbstract{ + + private static final String urlPath = "/tplus/api/v2/SaleOrderOpenApi/FindVoucherList"; + + @Override + protected void sync(CJTJobContext context) { + CJTRequest cjtRequest = buildCJTRequest(context); + JSONObject post = OkHttpHelper.post(cjtRequest); + List result = new ArrayList<>(); + List keyList = new ArrayList<>(); + Map existKeyMap = getExistKeyMap(keyList); + } + + @Override + protected void fieldMapping() { + + } + + @Override + protected String getRequestUrl() { + return REQUEST_ROOT_PATH + urlPath; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java new file mode 100644 index 0000000..6904234 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java @@ -0,0 +1,155 @@ +package com.ruoyi.quartz.task.CJT; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.constant.RedisConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.flyingbook.domain.ErpLarkRelation; +import com.ruoyi.flyingbook.mapper.ErpLarkRelationMapper; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.CJTJobRequest; +import com.ruoyi.quartz.domain.CJTRequest; +import com.ruoyi.quartz.helper.OkHttpHelper; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static com.ruoyi.quartz.helper.OkHttpHelper.post; + +/** + * 同步畅捷通账套信息 + * @author yuxiangyong + * @create 2023-07-17 20:29 + */ +@Slf4j +public abstract class SyncAccountsJobAbstract { + + @Autowired + protected ErpLarkRelationMapper erpLarkRelationMapper; + @Autowired + private RedisCache redisCache; + + private static final String CJT_APP_KEY = "wwjSb5Vl"; + private static final String CJT_APP_SECRET = "C661F71361CC4C5636396480FF08BBA4"; + /** + * 畅捷通域名 + */ + protected static final String REQUEST_ROOT_PATH = "https://openapi.chanjet.com"; + /** + * 重置畅捷通ticket的接口 + */ + private static final String REQUEST_RESET_TICKET_PATH = REQUEST_ROOT_PATH + "/auth/appTicket/resend"; + /** + * 生成调用畅捷通接口的token信息 + */ + private static final String REQUEST_GENERATE_TOKEN_PATH = REQUEST_ROOT_PATH + "/v1/common/auth/selfBuiltApp/generateToken"; + + /** + * 畅捷通 证书 + */ + private static final String CERTIFICATE = "OXYwHSWAc22UPHxfIUM0SSFZwziCLmBfOzBaN+PCNp0SNfV3ewYIaWLJCCrYToCU46x3PJO8t4TXV57bGpbiqClld5DiAkQ3EX1qqxoyaE9J0HAsfnp/PkPurKMQewBHICM2oEPRyLU5GUQjTCucfLvO4xT3DKlelbjBsIkKLqs="; + + public void executeSync(CJTJobRequest req){ + CJTJobContext context = new CJTJobContext(CJT_APP_KEY,CJT_APP_SECRET); + try { + //重置ticket + resetTicket(context); + //获取token + generateToken(context); + //执行分页同步 + sync(context); + }catch (Exception e){ + log.error("{} 执行失败 request:{}" + ,getClassName() + , JSONObject.toJSONString(req) + ,e); + } + } + + /** + * 获取请求url的地址 + */ + protected abstract String getRequestUrl(); + + /** + * 获取当前执行类名 + */ + protected String getClassName(){ + return this.getClass().getSimpleName(); + }; + + protected abstract void sync(CJTJobContext context); + + /** + * 使用唯一key区分创建或更新 + */ + protected Map getExistKeyMap(List keyList){ + if (CollectionUtils.isEmpty(keyList)){ + return new HashMap<>(); + } + return erpLarkRelationMapper.queryListByKeyList(keyList, getRequestUrl()) + .stream().collect(Collectors.toMap(ErpLarkRelation::getKey, ErpLarkRelation::getMethod, (k1, k2) -> k1)); + } + + /** + * 执行字段映射 + */ + protected abstract void fieldMapping(); + + /** + * 获取ticket,失效前重置 + */ + private void resetTicket(CJTJobContext context){ + Long expireTime = redisCache.getExpireTime(RedisConstants.CJT_TICKET_CACHE_KEY); + //重置ticket存在响应时间,提前十秒重置 + if (expireTime == null || expireTime < 10){ + CJTRequest cjtRequest = new CJTRequest(REQUEST_RESET_TICKET_PATH + ,context.getAppKey() + ,context.getAppSecret()); + post(cjtRequest); + } + String ticket = (String)redisCache.getCacheObject(RedisConstants.CJT_TICKET_CACHE_KEY); + context.setTicket(ticket); + } + + /** + * 生成调用接口的token信息 + */ + private void generateToken(CJTJobContext context){ + CJTRequest cjtRequest = new CJTRequest(REQUEST_GENERATE_TOKEN_PATH + ,context.getAppKey() + ,context.getAppSecret() + ,context.getTicket() + ,CERTIFICATE); + cjtRequest.buildGenerateBody(); + JSONObject body = post(cjtRequest); + JSONObject value = body.getJSONObject("value"); + String token = value.getString("accessToken"); + context.setOpenToken(token); + } + + /** + * 构建畅捷通请求对象 + */ + protected CJTRequest buildCJTRequest(CJTJobContext context){ + CJTRequest req = new CJTRequest(getRequestUrl(), context.getAppKey(), context.getAppSecret(), context.getOpenToken()); + buildCJTRequestBody(req); + return req; + } + + /** + * 构建畅捷通请求体 + */ + protected void buildCJTRequestBody(CJTRequest request){ + JSONObject jsonObject = new JSONObject(); + request.setBody(jsonObject); + } +}