From b3839a0f70927243c0ba797cb64777c8a53c9f3b Mon Sep 17 00:00:00 2001
From: tjx <t2856754968@163.com>
Date: 星期五, 19 十二月 2025 13:31:18 +0800
Subject: [PATCH] 整合钉钉和企业微信
---
src/main/java/com/gs/dingtalk/task/ScheduledTasks.java | 96 ++-
src/main/resources/mapper/DingtalkMsgMapper.xml | 8
pom.xml | 3
src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbService.java | 19
src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBbMonth.java | 83 +++
src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMapper.java | 18
src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java | 34 +
src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbMonthServiceImpl.java | 22
src/main/resources/mapper/VwCjScSjTsBbMonthMapper.xml | 7
src/main/java/com/gs/dingtalk/entity/MesStaff.java | 125 ++++
src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMonthMapper.java | 18
src/main/resources/mapper/MesStaffMapper.xml | 22
src/main/java/com/gs/dingtalk/entity/DingtalkInfo.java | 43 +
src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbMonthService.java | 13
src/main/resources/mapper/DingtalkInfoMapper.xml | 7
src/main/java/com/gs/dingtalk/dto/NumbericalDto.java | 14
src/main/java/com/gs/dingtalk/mapper/MesStaffMapper.java | 23
src/main/resources/mapper/VwCjScSjTsBbMapper.xml | 8
src/main/java/com/gs/dingtalk/service/DingtalkInfoService.java | 25
src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbServiceImpl.java | 193 +++++++
src/main/java/com/gs/dingtalk/service/impl/DingtalkInfoServiceImpl.java | 552 ++++++++++++++++++++
src/main/java/com/gs/dingtalk/controller/DingtalkController.java | 62 ++
src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBb.java | 83 +++
src/main/java/com/gs/dingtalk/mapper/DingtalkInfoMapper.java | 18
src/main/java/com/gs/dingtalk/entity/DingtalkMsg.java | 54 ++
src/main/java/com/gs/dingtalk/mapper/DingtalkMsgMapper.java | 18
src/main/resources/application.yml | 6
27 files changed, 1,535 insertions(+), 39 deletions(-)
diff --git a/pom.xml b/pom.xml
index b1bc3de..317b8c5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -102,10 +102,11 @@
<version>5.8.18</version>
</dependency>
+ <!-- Apache POI for Excel (required by Hutool) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
- <version>4.1.2</version> <!-- 鎴栨洿楂樼増鏈� -->
+ <version>5.2.3</version>
</dependency>
</dependencies>
diff --git a/src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java b/src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java
index 7ad8e45..e482c06 100644
--- a/src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java
+++ b/src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java
@@ -3,24 +3,48 @@
public class DataAcquisitionConfiguration {
+ //娴嬭瘯鐜
+ public static final String TEST_COMPANY_CODE = "55958795";
+
+ public static final String TEST_APP_KEY = "ab2d86b6dffabcc81dca6855c727c246";
+
+ public static final String TEST_APP_SECRET = "01b17babe2a96d5ebd802e67709f33d1";
+
+ public static final String TEST_ERP_CODE = "Z106";
+
+ //姝e紡鐜
+ public static final String COMPANY_CODE = "72505985";
+
+ public static final String APP_KEY = "a2866f03bb7f76387bfb1a98001f0e31";
+
+ public static final String APP_SECRET = "f13bd1bcb130f0090ed92dc021e5f4e1";
+
+ public static final String ERP_CODE = "Z106";
+
+
/**
* 搴旂敤鐨� AgentId
*/
- public static final Long AGENT_ID = 3303296035L;
+ public static final Long AGENT_ID = 4104598880L;
/**
* 搴旂敤鐨� AppKey
*/
- public static final String APP_KEY = "dingyfqkfjecy4cjfyxa";
+ public static final String TALK_APP_KEY = "dinggglb3pttl1x0gn0c";
/**
* 搴旂敤鐨� AppSecret
*/
- public static final String APP_SECRET = "nCwmyBw8K-EqAvkuhrhhqFonbLp455awtMa4D4Q-VRaY8U2EDEVsnYSYYfPvjiAX";
-
- public static final String CORP_ID = "ding1dd72cd1d6adf70aa1320dcb25e91351";
+ public static final String TALK_APP_SECRET = "Zc7r0Mb7bPsC_xy7ryrWoEnE5OzHEXibUMPDCA2LBusJ9pYzIolRk_OdZuLvNExf";
//缇よ亰鏈哄櫒浜虹浉鍏�
public static final String CUSTOM_ROBOT_TOKEN = "c2849e46cb0d91b0721c377742938b8ac5ef57e3c9eeab918e2cd5dd9c3aad2a";
public static final String SECRET = "SEC382027a5c81ea5152b71b687fb2c1ebf26acbde035355da6ab2fb37306454134";
+
+ //浼佷笟寰俊
+ public static final String CORPID = "wwabe21b935901a7d8";
+
+ public static final String CORPSECRET = "Z-7fNbZjrd80ypz69U14j8FMxI_fpUxcT6PksxlvKaY";
+
+ public static final String TXL_CORPSECRET = "T64bdcV7fo0hvW10W3NJYmGUmlBYxYMfiW6EiUJ9VPM";
}
diff --git a/src/main/java/com/gs/dingtalk/controller/DingtalkController.java b/src/main/java/com/gs/dingtalk/controller/DingtalkController.java
new file mode 100644
index 0000000..eb048c1
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/controller/DingtalkController.java
@@ -0,0 +1,62 @@
+package com.gs.dingtalk.controller;
+
+
+import com.gs.dingtalk.config.ResultMessage;
+import com.gs.dingtalk.dto.NumbericalDto;
+import com.gs.dingtalk.service.DingtalkInfoService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 閽夐拤娑堟伅鍙戦�佹帶鍒跺櫒
+ *
+ * @author 28567
+ * @description 鎻愪緵閽夐拤娑堟伅鍙戦�佺浉鍏崇殑REST鎺ュ彛
+ * @createDate 2025-01-27
+ */
+@RestController
+@RequestMapping("/api/dingtalk")
+@RequiredArgsConstructor
+@Slf4j
+public class DingtalkController {
+
+ private final DingtalkInfoService dingtalkInfoService;
+
+ /**
+ * 鍙戦�侀拤閽夋秷鎭�
+ *
+ * @param numbericalDto 鍖呭惈妫�楠屽崟鍙风殑璇锋眰鍙傛暟
+ * @return ResultMessage 鎿嶄綔缁撴灉
+ */
+ @PostMapping("/sendMessage")
+ public ResultMessage sendMessage(@RequestBody NumbericalDto numbericalDto) {
+ try {
+ log.info("寮�濮嬪彂閫侀拤閽夋秷鎭紝妫�楠屽崟鍙凤細{}", numbericalDto.getReleaseNo());
+
+ // 鍙傛暟鏍¢獙
+ if (numbericalDto == null || numbericalDto.getReleaseNo() == null || numbericalDto.getReleaseNo().trim().isEmpty()) {
+ log.warn("妫�楠屽崟鍙蜂笉鑳戒负绌�");
+ return ResultMessage.error("妫�楠屽崟鍙蜂笉鑳戒负绌�");
+ }
+
+ // 璋冪敤鏈嶅姟灞傚彂閫佹秷鎭�
+ boolean result = dingtalkInfoService.sendMessage(numbericalDto.getReleaseNo());
+
+ if (result) {
+ log.info("閽夐拤娑堟伅鍙戦�佹垚鍔燂紝妫�楠屽崟鍙凤細{}", numbericalDto.getReleaseNo());
+ return ResultMessage.ok();
+ } else {
+ log.warn("閽夐拤娑堟伅鍙戦�佸け璐ワ紝妫�楠屽崟鍙凤細{}", numbericalDto.getReleaseNo());
+ return ResultMessage.error("閽夐拤娑堟伅鍙戦�佸け璐�");
+ }
+
+ } catch (Exception e) {
+ log.error("鍙戦�侀拤閽夋秷鎭椂鍙戠敓寮傚父锛屾楠屽崟鍙凤細{}", numbericalDto != null ? numbericalDto.getReleaseNo() : "null", e);
+ return ResultMessage.error(e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/dingtalk/dto/NumbericalDto.java b/src/main/java/com/gs/dingtalk/dto/NumbericalDto.java
new file mode 100644
index 0000000..c14060f
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/dto/NumbericalDto.java
@@ -0,0 +1,14 @@
+package com.gs.dingtalk.dto;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NumbericalDto {
+
+ private String releaseNo;
+}
diff --git a/src/main/java/com/gs/dingtalk/entity/DingtalkInfo.java b/src/main/java/com/gs/dingtalk/entity/DingtalkInfo.java
new file mode 100644
index 0000000..c6e21e5
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/entity/DingtalkInfo.java
@@ -0,0 +1,43 @@
+package com.gs.dingtalk.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @TableName DINGTALK_INFO
+ */
+@TableName(value = "DINGTALK_INFO")
+@Data
+public class DingtalkInfo implements Serializable {
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+ /**
+ * SEQ_DingTalk
+ */
+ @TableId
+ private Long id;
+ /**
+ * 鑱屽伐id
+ */
+ private Long sid;
+ /**
+ * 鐢佃瘽
+ */
+ private String phone;
+ /**
+ * 閽夐拤id
+ */
+ private String dingtalkId;
+ /**
+ * 閽夐拤閫氱煡
+ */
+ private Integer isSendDingtalk;
+ /**
+ * 鍥哄畾鎺ㄩ�侊紝1琛ㄧず鏄浐瀹氭帹閫佺殑
+ */
+ private Integer isHead;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/dingtalk/entity/DingtalkMsg.java b/src/main/java/com/gs/dingtalk/entity/DingtalkMsg.java
new file mode 100644
index 0000000..2e47022
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/entity/DingtalkMsg.java
@@ -0,0 +1,54 @@
+package com.gs.dingtalk.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @TableName DINGTALK_MSG
+ */
+@TableName(value = "DINGTALK_MSG")
+@Data
+public class DingtalkMsg implements Serializable {
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+ /**
+ * 妫�楠屽崟鍙�
+ */
+ private String releaseNo;
+ /**
+ * 渚涘簲鍟�
+ */
+ private String suppName;
+ /**
+ * 鏉ユ枡鏃ユ湡
+ */
+ private Date createDate;
+ /**
+ * 椤圭洰
+ */
+ private String projectCodes;
+ /**
+ * 鏂欏彿
+ */
+ private String itemNo;
+ /**
+ * 瀹℃牳浜轰腑鏂�
+ */
+ private String fname;
+ /**
+ * 澶勭悊鏂瑰紡
+ */
+ private String fngHandle;
+ /**
+ * 閲囪喘浜哄憳
+ */
+ private String employeeName;
+ /**
+ * 瀹℃牳浜�
+ */
+ private String modify1By;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/dingtalk/entity/MesStaff.java b/src/main/java/com/gs/dingtalk/entity/MesStaff.java
new file mode 100644
index 0000000..5d6b147
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/entity/MesStaff.java
@@ -0,0 +1,125 @@
+package com.gs.dingtalk.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鍛樺伐淇℃伅琛�
+ *
+ * @TableName MES_STAFF
+ */
+@TableName(value = "MES_STAFF")
+@Data
+@KeySequence(value = "SEQ_MES_STAFF", dbType = DbType.ORACLE)
+public class MesStaff implements Serializable {
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+ /**
+ * ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 鍛樺伐缂栫爜
+ */
+ private String staffNo;
+ /**
+ * 鍛樺伐濮撳悕
+ */
+ private String staffName;
+ /**
+ * 閮ㄩ棬缂栫爜
+ */
+ private String departmentNo;
+ /**
+ * 閮ㄩ棬鍚嶇О
+ */
+ private String departmentName;
+ /**
+ * 宀椾綅缂栫爜
+ */
+ private String positionCode;
+ /**
+ * 宀椾綅鍚嶇О
+ */
+ private String positionName;
+ /**
+ * 鎵嬫満鍙�
+ */
+ private String phoneNumber;
+ /**
+ * 浠诲矖寮�濮嬫棩鏈�
+ */
+ private Date startDate;
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+ /**
+ * 鍒涘缓缁勭粐
+ */
+ private Long createOrg;
+ /**
+ * 浣跨敤缁勭粐
+ */
+ private String useOrg;
+ /**
+ * 鑷畾涔夊瓧娈�3
+ */
+ private String remark3;
+ /**
+ * 鑷畾涔夊瓧娈�4
+ */
+ private String remark4;
+ /**
+ * 鑷畾涔夊瓧娈�5
+ */
+ private String remark5;
+ /**
+ * 鍒涘缓浜�
+ */
+ private String createBy;
+ /**
+ * 鍒涘缓鏃堕棿
+ */
+ private Date createDate;
+ /**
+ * 鏇存柊浜�
+ */
+ private String lastupdateBy;
+ /**
+ * 鏇存柊鏃堕棿
+ */
+ private Date lastupdateDate;
+ /**
+ * 澶囨敞
+ */
+ private String memo;
+ /**
+ * 鐢熶骇绾�
+ */
+ private String lineNo;
+ /**
+ * 鐢熶骇鍛樺伐鏍囪瘑
+ */
+ private Long workMk;
+ /**
+ * 鏄惁绂佺敤
+ */
+ private String fforbidStatus;
+ /**
+ * 涓氬姟鍛樼被鍨�
+ */
+ private String operatorType;
+ /**
+ * 绂昏亴鏃堕棿
+ */
+ private Date separationTime;
+ /**
+ * 鏄惁鏄叧閿矖浣� 0锛氬惁锛�1锛氭槸
+ */
+ private String keyPosts;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBb.java b/src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBb.java
new file mode 100644
index 0000000..02997f6
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBb.java
@@ -0,0 +1,83 @@
+package com.gs.dingtalk.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @TableName VW_CJ_SC_SJ_TS_BB
+ */
+@TableName(value ="VW_CJ_SC_SJ_TS_BB")
+@Data
+public class VwCjScSjTsBb implements Serializable {
+ /**
+ * 鐗╂枡鍚嶇О
+ */
+ private String itemName;
+
+ /**
+ * 鐗╂枡缂栫爜
+ */
+ private String itemNo;
+
+ /**
+ * 杞﹂棿鍚嶇О
+ */
+ private String departmentname;
+
+ /**
+ * 杞﹂棿缂栫爜
+ */
+ private String daa001;
+
+ /**
+ * 宸ュ崟鍙�
+ */
+ private String lineName;
+
+ /**
+ * 绾夸綋鍚嶇О
+ */
+ private String daa008;
+
+ /**
+ * 棰勮寮�宸�
+ */
+ private String yjkg;
+
+ /**
+ * 瀹為檯寮�宸�
+ */
+ private String sjkg;
+
+ /**
+ *
+ */
+ private String sq;
+
+ /**
+ * 鍏ュ簱
+ */
+ private String rk;
+
+ /**
+ * 鐢宠鏈畬宸ユ暟
+ */
+ private String sqwwg;
+
+ /**
+ * 鍏ュ簱鏈畬宸�
+ */
+ private String rkwwg;
+
+ /**
+ * 鐢宠鏈叆搴�
+ */
+ private String sqwrk;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBbMonth.java b/src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBbMonth.java
new file mode 100644
index 0000000..4d7da3f
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/entity/VwCjScSjTsBbMonth.java
@@ -0,0 +1,83 @@
+package com.gs.dingtalk.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @TableName VW_CJ_SC_SJ_TS_BB_MONTH
+ */
+@TableName(value ="VW_CJ_SC_SJ_TS_BB_MONTH")
+@Data
+public class VwCjScSjTsBbMonth implements Serializable {
+ /**
+ *
+ */
+ private String itemName;
+
+ /**
+ *
+ */
+ private String itemNo;
+
+ /**
+ *
+ */
+ private String departmentname;
+
+ /**
+ *
+ */
+ private String daa001;
+
+ /**
+ *
+ */
+ private String lineName;
+
+ /**
+ *
+ */
+ private String daa008;
+
+ /**
+ *
+ */
+ private String yjkg;
+
+ /**
+ *
+ */
+ private String sjkg;
+
+ /**
+ *
+ */
+ private String sq;
+
+ /**
+ *
+ */
+ private String rk;
+
+ /**
+ *
+ */
+ private String sqwwg;
+
+ /**
+ *
+ */
+ private String rkwwg;
+
+ /**
+ *
+ */
+ private String sqwrk;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/gs/dingtalk/mapper/DingtalkInfoMapper.java b/src/main/java/com/gs/dingtalk/mapper/DingtalkInfoMapper.java
new file mode 100644
index 0000000..9d96052
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/mapper/DingtalkInfoMapper.java
@@ -0,0 +1,18 @@
+package com.gs.dingtalk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gs.dingtalk.entity.DingtalkInfo;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怐INGTALK_INFO銆戠殑鏁版嵁搴撴搷浣淢apper
+ * @createDate 2025-06-20 16:12:48
+ * @Entity com.gs.xky.entity.DingtalkInfo
+ */
+public interface DingtalkInfoMapper extends BaseMapper<DingtalkInfo> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/mapper/DingtalkMsgMapper.java b/src/main/java/com/gs/dingtalk/mapper/DingtalkMsgMapper.java
new file mode 100644
index 0000000..6d402ec
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/mapper/DingtalkMsgMapper.java
@@ -0,0 +1,18 @@
+package com.gs.dingtalk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gs.dingtalk.entity.DingtalkMsg;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怐INGTALK_MSG銆戠殑鏁版嵁搴撴搷浣淢apper
+ * @createDate 2025-06-21 10:07:15
+ * @Entity com.gs.xky.entity.DingtalkMsg
+ */
+public interface DingtalkMsgMapper extends BaseMapper<DingtalkMsg> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/mapper/MesStaffMapper.java b/src/main/java/com/gs/dingtalk/mapper/MesStaffMapper.java
new file mode 100644
index 0000000..b5ef0d9
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/mapper/MesStaffMapper.java
@@ -0,0 +1,23 @@
+package com.gs.dingtalk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gs.dingtalk.entity.MesStaff;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怣ES_STAFF(鍛樺伐淇℃伅琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+ * @createDate 2025-02-17 20:59:36
+ * @Entity com.gs.xky.entity.MesStaff
+ */
+public interface MesStaffMapper extends BaseMapper<MesStaff> {
+
+ long getNextVal();
+
+ int updateStaff();
+
+ int deleteStaff();
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMapper.java b/src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMapper.java
new file mode 100644
index 0000000..148f14a
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMapper.java
@@ -0,0 +1,18 @@
+package com.gs.dingtalk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gs.dingtalk.entity.VwCjScSjTsBb;
+
+/**
+* @author Administrator
+* @description 閽堝琛ㄣ�怴W_CJ_SC_SJ_TS_BB銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-11-12 19:44:46
+* @Entity generator.domain.VwCjScSjTsBb
+*/
+public interface VwCjScSjTsBbMapper extends BaseMapper<VwCjScSjTsBb> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMonthMapper.java b/src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMonthMapper.java
new file mode 100644
index 0000000..4489aa5
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/mapper/VwCjScSjTsBbMonthMapper.java
@@ -0,0 +1,18 @@
+package com.gs.dingtalk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gs.dingtalk.entity.VwCjScSjTsBbMonth;
+
+/**
+* @author Administrator
+* @description 閽堝琛ㄣ�怴W_CJ_SC_SJ_TS_BB_MONTH銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-11-12 19:45:00
+* @Entity com.gs.xky.entity.VwCjScSjTsBbMonth
+*/
+public interface VwCjScSjTsBbMonthMapper extends BaseMapper<VwCjScSjTsBbMonth> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/service/DingtalkInfoService.java b/src/main/java/com/gs/dingtalk/service/DingtalkInfoService.java
new file mode 100644
index 0000000..242f6db
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/service/DingtalkInfoService.java
@@ -0,0 +1,25 @@
+package com.gs.dingtalk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gs.dingtalk.entity.DingtalkInfo;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怐INGTALK_INFO銆戠殑鏁版嵁搴撴搷浣淪ervice
+ * @createDate 2025-06-20 16:12:48
+ */
+public interface DingtalkInfoService extends IService<DingtalkInfo> {
+
+ boolean sendMessage(String releaseNo);
+
+ boolean sendActionCardMessage() throws Exception;
+
+ /**
+ * 鍙戦�佹枃浠舵秷鎭�
+ *
+ * @param filePath 鏈湴鏂囦欢璺緞
+ * @return 鏄惁鍙戦�佹垚鍔�
+ * @throws Exception 寮傚父
+ */
+ boolean sendFileMessage(String filePath) throws Exception;
+}
diff --git a/src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbMonthService.java b/src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbMonthService.java
new file mode 100644
index 0000000..e6f27ce
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbMonthService.java
@@ -0,0 +1,13 @@
+package com.gs.dingtalk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gs.dingtalk.entity.VwCjScSjTsBbMonth;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�怴W_CJ_SC_SJ_TS_BB_MONTH銆戠殑鏁版嵁搴撴搷浣淪ervice
+ * @createDate 2025-11-12 19:45:00
+ */
+public interface VwCjScSjTsBbMonthService extends IService<VwCjScSjTsBbMonth> {
+
+}
diff --git a/src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbService.java b/src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbService.java
new file mode 100644
index 0000000..542ed36
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/service/VwCjScSjTsBbService.java
@@ -0,0 +1,19 @@
+package com.gs.dingtalk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gs.dingtalk.entity.VwCjScSjTsBb;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�怴W_CJ_SC_SJ_TS_BB銆戠殑鏁版嵁搴撴搷浣淪ervice
+ * @createDate 2025-11-12 19:44:46
+ */
+public interface VwCjScSjTsBbService extends IService<VwCjScSjTsBb> {
+
+ /**
+ * 瀵煎嚭鏁版嵁鍒癊xcel骞跺彂閫侀拤閽夋秷鎭�
+ *
+ * @return 鏄惁鎴愬姛
+ */
+ boolean exportAndSendToDingtalk() throws Exception;
+}
diff --git a/src/main/java/com/gs/dingtalk/service/impl/DingtalkInfoServiceImpl.java b/src/main/java/com/gs/dingtalk/service/impl/DingtalkInfoServiceImpl.java
new file mode 100644
index 0000000..7968c25
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/service/impl/DingtalkInfoServiceImpl.java
@@ -0,0 +1,552 @@
+package com.gs.dingtalk.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
+import com.gs.dingtalk.entity.DingtalkInfo;
+import com.gs.dingtalk.entity.DingtalkMsg;
+import com.gs.dingtalk.entity.MesStaff;
+import com.gs.dingtalk.mapper.DingtalkInfoMapper;
+import com.gs.dingtalk.mapper.DingtalkMsgMapper;
+import com.gs.dingtalk.mapper.MesStaffMapper;
+import com.gs.dingtalk.service.DingtalkInfoService;
+import com.gs.dingtalk.service.SimpleExample;
+import com.taobao.api.FileItem;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怐INGTALK_INFO銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2025-06-20 16:12:48
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class DingtalkInfoServiceImpl extends ServiceImpl<DingtalkInfoMapper, DingtalkInfo>
+ implements DingtalkInfoService {
+
+ private final SimpleExample simpleExample;
+ private final DingtalkMsgMapper dingtalkMsgMapper;
+ private final MesStaffMapper mesStaffMapper;
+
+ @Override
+ public boolean sendMessage(String releaseNo) {
+ try {
+ // 鏌ヨ閽夐拤娑堟伅鍐呭
+ LambdaQueryWrapper<DingtalkMsg> msgWrapper = new LambdaQueryWrapper<>();
+ msgWrapper.eq(DingtalkMsg::getReleaseNo, releaseNo);
+ DingtalkMsg dingtalkMsg = dingtalkMsgMapper.selectOne(msgWrapper);
+
+ if (dingtalkMsg == null) {
+ log.error("鏈壘鍒版楠屽崟鍙蜂负 {} 鐨勯拤閽夋秷鎭唴瀹�", releaseNo);
+ return false;
+ }
+
+ // 鏍煎紡鍖栨棩鏈�
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ String createDateStr = (dingtalkMsg.getCreateDate() != null) ?
+ dateFormat.format(dingtalkMsg.getCreateDate()) : "鏈煡";
+
+ // 鏋勫缓娑堟伅鍐呭
+// String message = String.format("渚涘簲鍟哰%s] 鏉ユ枡鏃ユ湡[%s] 椤圭洰[%s] 鏂欏彿[%s]鐨勪笉鍚堟牸妫�楠屽崟琚玔%s]瀹℃壒涓篬%s]锛岃鏌ユ敹!",
+// dingtalkMsg.getSuppName(), createDateStr, dingtalkMsg.getProjectCodes(),
+// dingtalkMsg.getItemNo(), dingtalkMsg.getFname(), dingtalkMsg.getFngHandle());
+
+ String message = String.format(
+ "渚涘簲鍟哰%s] 鏉ユ枡鏃ユ湡[%s] 椤圭洰[%s] 鏂欏彿[%s]鐨勪笉鍚堟牸妫�楠屽崟琚玔%s]瀹℃壒涓篬%s]锛岃鏌ユ敹!",
+ Optional.ofNullable(dingtalkMsg.getSuppName()).orElse(" 鏈煡渚涘簲鍟�"),
+ createDateStr,
+ Optional.ofNullable(dingtalkMsg.getProjectCodes()).orElse(" 鏈煡椤圭洰"),
+ Optional.ofNullable(dingtalkMsg.getItemNo()).orElse(" 鏈煡鏂欏彿"),
+ Optional.ofNullable(dingtalkMsg.getFname()).orElse(" 鏈煡瀹℃壒浜�"),
+ Optional.ofNullable(dingtalkMsg.getFngHandle()).orElse(" 鏈煡瀹℃壒缁撴灉"));
+
+ // 鏀堕泦闇�瑕佹帹閫佺殑浜哄憳sid
+ List<Long> sidList = new ArrayList<>();
+
+ // 1. 鍥哄畾鎺ㄩ�佷汉鍛橈紙isSendDingtalk=1锛�
+ List<DingtalkInfo> fixedList = baseMapper.selectList(
+ new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getIsSendDingtalk, 1)
+ );
+ for (DingtalkInfo info : fixedList) {
+ sidList.add(info.getSid());
+ }
+
+ // 2. 閲囪喘浜哄憳锛坋mployeeName锛�
+ if (StringUtils.hasText(dingtalkMsg.getEmployeeName())) {
+ MesStaff buyer = mesStaffMapper.selectOne(
+ new LambdaQueryWrapper<MesStaff>().eq(MesStaff::getStaffName, dingtalkMsg.getEmployeeName()), false
+ );
+ if (buyer != null) {
+ DingtalkInfo buyerInfo = baseMapper.selectOne(
+ new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getSid, buyer.getId()), false
+ );
+ if (buyerInfo != null) sidList.add(buyerInfo.getSid());
+ }
+ }
+
+ // 3. 瀹℃牳浜猴紙modify1By锛�
+ if (StringUtils.hasText(dingtalkMsg.getModify1By())) {
+ MesStaff auditor = mesStaffMapper.selectOne(
+ new LambdaQueryWrapper<MesStaff>().eq(MesStaff::getStaffNo, dingtalkMsg.getModify1By())
+ );
+ if (auditor != null) {
+ DingtalkInfo auditorInfo = baseMapper.selectOne(
+ new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getSid, auditor.getId())
+ );
+ if (auditorInfo != null) sidList.add(auditorInfo.getSid());
+ }
+ }
+
+ // 4. 鏍规嵁鏀堕泦鐨剆id鑾峰彇dingtalkId (澶嶇敤getDingtalkUserIdList鐨勫叧閿�昏緫)
+ List<String> userIdList = getDingtalkUserIdListBySids(sidList);
+
+ if (userIdList == null || userIdList.isEmpty()) {
+ log.warn("娌℃湁闇�瑕佸彂閫侀拤閽夋秷鎭殑鐢ㄦ埛");
+ return false;
+ }
+
+ // 閫氳繃閽夐拤鍙戦�佹秷鎭�
+ String userIdListStr = String.join(",", userIdList);
+
+ OapiMessageCorpconversationAsyncsendV2Response rsp = sendMessage(userIdListStr, message);
+ System.out.println(rsp.getBody());
+ log.info("鎴愬姛鍙戦�侀拤閽夋秷鎭�: {}", message);
+ return true;
+ } catch (Exception e) {
+ log.error("鍙戦�侀拤閽夋秷鎭け璐�", e);
+ return false;
+ }
+ }
+
+ @Override
+ public boolean sendActionCardMessage() {
+ try {
+ // 1. 鑾峰彇闇�瑕佹帹閫佺殑鐢ㄦ埛鍒楄〃锛堝彲浠ユ槸鍥哄畾鎺ㄩ�佺敤鎴凤級
+ List<DingtalkInfo> fixedList = baseMapper.selectList(
+ new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getIsHead, 1)
+ );
+
+ List<Long> sidList = fixedList.stream()
+ .map(DingtalkInfo::getSid)
+ .collect(Collectors.toList());
+
+ List<String> userIdList = getDingtalkUserIdListBySids(sidList);
+
+ if (userIdList == null || userIdList.isEmpty()) {
+ log.warn("娌℃湁闇�瑕佸彂閫侀拤閽夋秷鎭殑鐢ㄦ埛");
+ return false;
+ }
+
+ String userIdListStr = String.join(",", userIdList);
+
+ // 2. 鏋勫缓娑堟伅鍐呭
+ String title = "鐢熶骇鏁版嵁鐪嬫澘";
+ String markdown = "璇风偣鍑讳笅鏂规寜閽煡鐪嬭缁咮I鎶ヨ〃";
+ String singleTitle = "鏌ョ湅鎶ヨ〃";
+ String singleUrl = "http://192.168.1.22:8081/design?fid=rpte6045ab079b211f0824bd3cfd50c6b93&fserid=4b198960bedd11f09f6f792bfe147b64&fsharetype=3";
+
+ // 3. 鍙戦�佹秷鎭�
+ OapiMessageCorpconversationAsyncsendV2Response rsp =
+ sendActionCardMessage(userIdListStr, title, markdown, singleTitle, singleUrl);
+
+ log.info("鎴愬姛鍙戦�丄ctionCard娑堟伅: {}", rsp.getBody());
+ return true;
+ } catch (Exception e) {
+ log.error("鍙戦�丄ctionCard娑堟伅澶辫触", e);
+ return false;
+ }
+ }
+
+ @Override
+ public boolean sendFileMessage(String filePath) throws Exception {
+ try {
+ // 1. 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦�
+ File file = new File(filePath);
+ if (!file.exists()) {
+ log.error("鏂囦欢涓嶅瓨鍦�: {}", filePath);
+ return false;
+ }
+
+ // 2. 鑾峰彇闇�瑕佹帹閫佺殑鐢ㄦ埛鍒楄〃锛堝彲鏍规嵁瀹為檯闇�姹傝皟鏁达紝杩欓噷浣跨敤isHead=1鐨勭敤鎴凤級
+ List<DingtalkInfo> fixedList = baseMapper.selectList(
+ new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getIsHead, 1)
+ );
+
+ if (fixedList == null || fixedList.isEmpty()) {
+ log.warn("娌℃湁闇�瑕佸彂閫佹枃浠剁殑鐢ㄦ埛锛坕sHead=1锛�");
+ return false;
+ }
+
+ List<String> sidList = fixedList.stream()
+ .map(DingtalkInfo::getPhone)
+ .collect(Collectors.toList());
+
+ List<String> userIdList = getDingtalkUserIdListByPhones(sidList);
+
+ if (userIdList == null || userIdList.isEmpty()) {
+ log.warn("娌℃湁鏈夋晥鐨勯拤閽夌敤鎴稩D");
+ return false;
+ }
+
+ String userIdListStr = String.join(",", userIdList);
+
+ // 3. 涓婁紶鏂囦欢鍒伴拤閽夋湇鍔″櫒
+ log.info("寮�濮嬩笂浼犳枃浠�: {}", filePath);
+ String mediaId = uploadMedia(filePath, "file");
+
+ // 4. 鍙戦�佹枃浠舵秷鎭�
+ log.info("寮�濮嬪彂閫佹枃浠舵秷鎭紝mediaId: {}", mediaId);
+ OapiMessageCorpconversationAsyncsendV2Response response = sendFileMessageByMediaId(userIdListStr, mediaId);
+
+ log.info("鏂囦欢娑堟伅鍙戦�佸搷搴�: {}", response.getBody());
+ return response.getErrcode() == 0;
+
+ } catch (Exception e) {
+ log.error("鍙戦�佹枃浠舵秷鎭け璐�", e);
+ throw e;
+ }
+ }
+
+ /**
+ * 鏍规嵁鎸囧畾鐨剆id鍒楄〃鑾峰彇閽夐拤鐢ㄦ埛ID鍒楄〃
+ *
+ * @param sidList sid鍒楄〃
+ * @return 閽夐拤鐢ㄦ埛ID鍒楄〃
+ */
+ private List<String> getDingtalkUserIdListBySids(List<Long> sidList) {
+ try {
+ if (sidList == null || sidList.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // 鍘婚噸
+ sidList = sidList.stream().distinct().collect(Collectors.toList());
+
+ // 鏍规嵁sid鏌ヨDingtalkInfo
+ List<DingtalkInfo> list = baseMapper.selectList(
+ new LambdaQueryWrapper<DingtalkInfo>().in(DingtalkInfo::getSid, sidList)
+ );
+
+ if (list == null || list.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // 浣跨敤stream娴佽繃婊ゅ嚭list涓璬ingtalkId涓虹┖鐨勬暟鎹�
+ List<DingtalkInfo> emptyDingtalkIdList = list.stream()
+ .filter(info -> !StringUtils.hasText(info.getDingtalkId()))
+ .collect(Collectors.toList());
+
+ // 濡傛灉瀛樺湪涓虹┖鐨勬暟鎹氨閫氳繃閽夐拤鐨勬帴鍙h幏鍙栵紝涓篸ingtalkId璧嬪�硷紝骞朵笖鏇存柊鏁版嵁搴�
+ if (!emptyDingtalkIdList.isEmpty()) {
+ String accessToken = simpleExample.getAccessToken();
+
+ for (DingtalkInfo info : emptyDingtalkIdList) {
+ if (StringUtils.hasText(info.getPhone())) {
+ try {
+ // 閫氳繃鎵嬫満鍙疯幏鍙栭拤閽夌敤鎴稩D
+ com.dingtalk.api.response.OapiV2UserGetbymobileResponse response =
+ simpleExample.getOapiV2UserGetbymobileResponse(info.getPhone(), accessToken);
+
+ if (response != null && response.getResult() != null) {
+ info.setDingtalkId(response.getResult().getUserid());
+ // 鏇存柊鏁版嵁搴�
+ updateById(info);
+ }
+ } catch (Exception e) {
+ log.error("鑾峰彇閽夐拤鐢ㄦ埛ID澶辫触锛屾墜鏈哄彿锛歿}", info.getPhone(), e);
+ }
+ }
+ }
+ }
+
+ // 涓嶅瓨鍦ㄤ负绌虹殑鏁版嵁鎴栬�呭鐞嗗畬绌烘暟鎹悗锛岃繑鍥炴墍鏈夋湁鏁堢殑dingtalkId鍒楄〃
+ return list.stream()
+ .map(DingtalkInfo::getDingtalkId)
+ .filter(StringUtils::hasText)
+ .distinct()
+ .collect(Collectors.toList());
+ } catch (Exception e) {
+ log.error("鑾峰彇閽夐拤鐢ㄦ埛鍒楄〃澶辫触", e);
+ return new ArrayList<>();
+ }
+ }
+
+
+ private List<String> getDingtalkUserIdListByPhones(List<String> phoneList) {
+ try {
+ if (phoneList == null || phoneList.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // 鍘婚噸
+ phoneList = phoneList.stream().distinct().collect(Collectors.toList());
+
+ // 鏍规嵁sid鏌ヨDingtalkInfo
+ List<DingtalkInfo> list = baseMapper.selectList(
+ new LambdaQueryWrapper<DingtalkInfo>().in(DingtalkInfo::getPhone, phoneList)
+ );
+
+ if (list == null || list.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // 浣跨敤stream娴佽繃婊ゅ嚭list涓璬ingtalkId涓虹┖鐨勬暟鎹�
+ List<DingtalkInfo> emptyDingtalkIdList = list.stream()
+ .filter(info -> !StringUtils.hasText(info.getDingtalkId()))
+ .collect(Collectors.toList());
+
+ // 濡傛灉瀛樺湪涓虹┖鐨勬暟鎹氨閫氳繃閽夐拤鐨勬帴鍙h幏鍙栵紝涓篸ingtalkId璧嬪�硷紝骞朵笖鏇存柊鏁版嵁搴�
+ if (!emptyDingtalkIdList.isEmpty()) {
+ String accessToken = simpleExample.getAccessToken();
+
+ for (DingtalkInfo info : emptyDingtalkIdList) {
+ if (StringUtils.hasText(info.getPhone())) {
+ try {
+ // 閫氳繃鎵嬫満鍙疯幏鍙栭拤閽夌敤鎴稩D
+ com.dingtalk.api.response.OapiV2UserGetbymobileResponse response =
+ simpleExample.getOapiV2UserGetbymobileResponse(info.getPhone(), accessToken);
+
+ if (response != null && response.getResult() != null) {
+ info.setDingtalkId(response.getResult().getUserid());
+ // 鏇存柊鏁版嵁搴�
+ updateById(info);
+ }
+ } catch (Exception e) {
+ log.error("鑾峰彇閽夐拤鐢ㄦ埛ID澶辫触锛屾墜鏈哄彿锛歿}", info.getPhone(), e);
+ }
+ }
+ }
+ }
+
+ // 涓嶅瓨鍦ㄤ负绌虹殑鏁版嵁鎴栬�呭鐞嗗畬绌烘暟鎹悗锛岃繑鍥炴墍鏈夋湁鏁堢殑dingtalkId鍒楄〃
+ return list.stream()
+ .map(DingtalkInfo::getDingtalkId)
+ .filter(StringUtils::hasText)
+ .distinct()
+ .collect(Collectors.toList());
+ } catch (Exception e) {
+ log.error("鑾峰彇閽夐拤鐢ㄦ埛鍒楄〃澶辫触", e);
+ return new ArrayList<>();
+ }
+ }
+
+ private OapiMessageCorpconversationAsyncsendV2Response sendMessage(String userIdListStr, String message) throws Exception {
+
+ String accessToken = simpleExample.getAccessToken();
+
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+ OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+ request.setAgentId(4104598880L);
+ request.setUseridList(userIdListStr);
+ request.setToAllUser(false);
+
+ OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+ msg.setMsgtype("text");
+ msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
+ msg.getText().setContent(message);
+ request.setMsg(msg);
+
+ return client.execute(request, accessToken);
+
+ }
+
+ /**
+ * 鍙戦�乴ink娑堟伅锛堝湪閽夐拤鍐呯疆娴忚鍣ㄤ腑鎵撳紑锛�
+ *
+ * @param userIdListStr 鐢ㄦ埛ID鍒楄〃锛岄�楀彿鍒嗛殧
+ * @param title 娑堟伅鏍囬
+ * @param text 娑堟伅鍐呭
+ * @param messageUrl 鐐瑰嚮娑堟伅鍚庤烦杞殑URL
+ * @param picUrl 鍥剧墖URL锛堝彲閫夛級
+ * @return 鍝嶅簲缁撴灉
+ * @throws Exception 寮傚父
+ */
+ private OapiMessageCorpconversationAsyncsendV2Response sendLinkMessage(String userIdListStr, String title, String text, String messageUrl, String picUrl) throws Exception {
+
+ String accessToken = simpleExample.getAccessToken();
+
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+ OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+ request.setAgentId(4104598880L);
+ request.setUseridList(userIdListStr);
+ request.setToAllUser(false);
+
+ OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+ msg.setMsgtype("link");
+ msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
+ msg.getLink().setTitle(title);
+ msg.getLink().setText(text);
+ msg.getLink().setMessageUrl(messageUrl);
+ if (StringUtils.hasText(picUrl)) {
+ msg.getLink().setPicUrl(picUrl);
+ }
+ request.setMsg(msg);
+
+ return client.execute(request, accessToken);
+
+ }
+
+ /**
+ * 鍙戦�丄ctionCard娑堟伅锛堝湪澶栭儴娴忚鍣ㄤ腑鎵撳紑閾炬帴锛岄�傚悎BI绛夊閮ㄧ郴缁燂級
+ *
+ * @param userIdListStr 鐢ㄦ埛ID鍒楄〃锛岄�楀彿鍒嗛殧
+ * @param title 娑堟伅鏍囬
+ * @param markdown 娑堟伅鍐呭锛堟敮鎸丮arkdown鏍煎紡锛�
+ * @param singleTitle 鎸夐挳鏂囧瓧锛屼緥濡傦細"鏌ョ湅璇︽儏"
+ * @param singleUrl 鐐瑰嚮鎸夐挳鍚庤烦杞殑URL锛堝閮ㄩ摼鎺ワ級
+ * @return 鍝嶅簲缁撴灉
+ * @throws Exception 寮傚父
+ */
+ private OapiMessageCorpconversationAsyncsendV2Response sendActionCardMessage(String userIdListStr, String title, String markdown, String singleTitle, String singleUrl) throws Exception {
+
+ String accessToken = simpleExample.getAccessToken();
+
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+ OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+ request.setAgentId(4104598880L);
+ request.setUseridList(userIdListStr);
+ request.setToAllUser(false);
+
+ OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+ msg.setMsgtype("action_card");
+ msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
+ msg.getActionCard().setTitle(title);
+ msg.getActionCard().setMarkdown(markdown);
+ msg.getActionCard().setSingleTitle(singleTitle);
+ msg.getActionCard().setSingleUrl(singleUrl);
+ request.setMsg(msg);
+
+ return client.execute(request, accessToken);
+
+ }
+
+ /**
+ * 涓婁紶鏂囦欢鍒伴拤閽夋湇鍔″櫒锛岃幏鍙杕edia_id
+ *
+ * @param filePath 鏈湴鏂囦欢璺緞
+ * @param fileType 鏂囦欢绫诲瀷锛歠ile(鏅�氭枃浠�), voice(璇煶鏂囦欢), video(瑙嗛鏂囦欢), image(鍥剧墖鏂囦欢)
+ * @return media_id
+ * @throws Exception 寮傚父
+ */
+ private String uploadMedia(String filePath, String fileType) throws Exception {
+ String accessToken = simpleExample.getAccessToken();
+
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/media/upload");
+ com.dingtalk.api.request.OapiMediaUploadRequest request = new com.dingtalk.api.request.OapiMediaUploadRequest();
+ request.setType(fileType);
+
+ // 浣跨敤 FileItem 鍖呰鏂囦欢
+ File file = new File(filePath);
+ FileItem fileItem = new FileItem(file);
+ request.setMedia(fileItem);
+
+ com.dingtalk.api.response.OapiMediaUploadResponse response = client.execute(request, accessToken);
+
+ if (response.getErrcode() == 0) {
+ log.info("鏂囦欢涓婁紶鎴愬姛锛宮edia_id: {}", response.getMediaId());
+ return response.getMediaId();
+ } else {
+ log.error("鏂囦欢涓婁紶澶辫触锛岄敊璇爜: {}, 閿欒淇℃伅: {}", response.getErrcode(), response.getErrmsg());
+ throw new Exception("鏂囦欢涓婁紶澶辫触: " + response.getErrmsg());
+ }
+ }
+
+ /**
+ * 閫氳繃media_id鍙戦�佹枃浠舵秷鎭�
+ *
+ * @param userIdListStr 鐢ㄦ埛ID鍒楄〃锛岄�楀彿鍒嗛殧
+ * @param mediaId 鏂囦欢鐨刴edia_id锛堥�氳繃uploadMedia鏂规硶鑾峰彇锛�
+ * @return 鍝嶅簲缁撴灉
+ * @throws Exception 寮傚父
+ */
+ private OapiMessageCorpconversationAsyncsendV2Response sendFileMessageByMediaId(String userIdListStr, String mediaId) throws Exception {
+
+ String accessToken = simpleExample.getAccessToken();
+
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+ OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+ request.setAgentId(4104598880L);
+ request.setUseridList(userIdListStr);
+ request.setToAllUser(false);
+
+ OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+ msg.setMsgtype("file");
+ msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File());
+ msg.getFile().setMediaId(mediaId);
+ request.setMsg(msg);
+
+ return client.execute(request, accessToken);
+
+ }
+
+ /**
+ * 鑾峰彇isSendDingtalk=1鐨勭敤鎴风殑閽夐拤鐢ㄦ埛ID鍒楄〃锛堜繚鐣欏師鏈夋柟娉曪紝鍚戝悗鍏煎锛�
+ */
+ private List<String> getDingtalkUserIdList() {
+ try {
+ LambdaQueryWrapper<DingtalkInfo> wrapper = new LambdaQueryWrapper<>();
+ wrapper.ge(DingtalkInfo::getIsSendDingtalk, 1);
+ List<DingtalkInfo> list = list(wrapper);
+
+ if (list == null || list.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // 浣跨敤stream娴佽繃婊ゅ嚭list涓璬ingtalkId涓虹┖鐨勬暟鎹�
+ List<DingtalkInfo> emptyDingtalkIdList = list.stream()
+ .filter(info -> !StringUtils.hasText(info.getDingtalkId()))
+ .collect(Collectors.toList());
+
+ // 濡傛灉瀛樺湪涓虹┖鐨勬暟鎹氨閫氳繃閽夐拤鐨勬帴鍙h幏鍙栵紝涓篸ingtalkId璧嬪�硷紝骞朵笖鏇存柊鏁版嵁搴�
+ if (!emptyDingtalkIdList.isEmpty()) {
+ String accessToken = simpleExample.getAccessToken();
+
+ for (DingtalkInfo info : emptyDingtalkIdList) {
+ if (StringUtils.hasText(info.getPhone())) {
+ try {
+ // 閫氳繃鎵嬫満鍙疯幏鍙栭拤閽夌敤鎴稩D
+ com.dingtalk.api.response.OapiV2UserGetbymobileResponse response =
+ simpleExample.getOapiV2UserGetbymobileResponse(info.getPhone(), accessToken);
+
+ if (response != null && response.getResult() != null) {
+ info.setDingtalkId(response.getResult().getUserid());
+ // 鏇存柊鏁版嵁搴�
+ updateById(info);
+ }
+ } catch (Exception e) {
+ log.error("鑾峰彇閽夐拤鐢ㄦ埛ID澶辫触锛屾墜鏈哄彿锛歿}", info.getPhone(), e);
+ }
+ }
+ }
+ }
+
+ // 涓嶅瓨鍦ㄤ负绌虹殑鏁版嵁鎴栬�呭鐞嗗畬绌烘暟鎹悗锛岃繑鍥炴墍鏈夋湁鏁堢殑dingtalkId鍒楄〃
+ return list.stream()
+ .map(DingtalkInfo::getDingtalkId)
+ .filter(StringUtils::hasText)
+ .distinct()
+ .collect(Collectors.toList());
+ } catch (Exception e) {
+ log.error("鑾峰彇閽夐拤鐢ㄦ埛鍒楄〃澶辫触", e);
+ return new ArrayList<>();
+ }
+ }
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbMonthServiceImpl.java b/src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbMonthServiceImpl.java
new file mode 100644
index 0000000..73a7b4f
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbMonthServiceImpl.java
@@ -0,0 +1,22 @@
+package com.gs.dingtalk.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gs.dingtalk.entity.VwCjScSjTsBbMonth;
+import com.gs.dingtalk.mapper.VwCjScSjTsBbMonthMapper;
+import com.gs.dingtalk.service.VwCjScSjTsBbMonthService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�怴W_CJ_SC_SJ_TS_BB_MONTH銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2025-11-12 19:45:00
+ */
+@Service
+public class VwCjScSjTsBbMonthServiceImpl extends ServiceImpl<VwCjScSjTsBbMonthMapper, VwCjScSjTsBbMonth>
+ implements VwCjScSjTsBbMonthService {
+
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbServiceImpl.java b/src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbServiceImpl.java
new file mode 100644
index 0000000..577c362
--- /dev/null
+++ b/src/main/java/com/gs/dingtalk/service/impl/VwCjScSjTsBbServiceImpl.java
@@ -0,0 +1,193 @@
+package com.gs.dingtalk.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gs.dingtalk.entity.VwCjScSjTsBb;
+import com.gs.dingtalk.entity.VwCjScSjTsBbMonth;
+import com.gs.dingtalk.mapper.VwCjScSjTsBbMapper;
+import com.gs.dingtalk.service.DingtalkInfoService;
+import com.gs.dingtalk.service.VwCjScSjTsBbMonthService;
+import com.gs.dingtalk.service.VwCjScSjTsBbService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�怴W_CJ_SC_SJ_TS_BB銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2025-11-12 16:42:06
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class VwCjScSjTsBbServiceImpl extends ServiceImpl<VwCjScSjTsBbMapper, VwCjScSjTsBb>
+ implements VwCjScSjTsBbService {
+
+ private final DingtalkInfoService dingtalkInfoService;
+ private final VwCjScSjTsBbMonthService vwCjScSjTsBbMonthService;
+
+ @Override
+ public boolean exportAndSendToDingtalk() throws Exception {
+ String exportFilePath = null;
+ try {
+
+ // 2. 鍑嗗瀵煎嚭鏂囦欢璺緞
+ String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+ String fileName = "鐢熶骇鏁版嵁鎶ヨ〃_" + timestamp + ".xlsx";
+ exportFilePath = "D:\\BIFile\\" + fileName;
+
+ // 纭繚鐩綍瀛樺湪
+ FileUtil.mkdir("D:\\BIFile");
+
+ // 3. 瀵煎嚭鍒癊xcel
+ log.info("寮�濮嬪鍑篍xcel鏂囦欢: {}", exportFilePath);
+ exportToExcel(exportFilePath);
+ log.info("Excel鏂囦欢瀵煎嚭鎴愬姛");
+
+ // 4. 鍙戦�侀拤閽夋秷鎭�
+ log.info("寮�濮嬪彂閫侀拤閽夋枃浠舵秷鎭�...");
+ boolean sendResult = dingtalkInfoService.sendFileMessage(exportFilePath);
+
+ if (sendResult) {
+ log.info("閽夐拤鏂囦欢娑堟伅鍙戦�佹垚鍔�");
+ } else {
+ log.warn("閽夐拤鏂囦欢娑堟伅鍙戦�佸け璐�");
+ }
+
+ return sendResult;
+
+ } catch (Exception e) {
+ log.error("瀵煎嚭骞跺彂閫佸け璐�", e);
+ throw e;
+ } finally {
+ // 鍙�夛細鍙戦�佸悗鍒犻櫎涓存椂鏂囦欢
+ // if (exportFilePath != null && FileUtil.exist(exportFilePath)) {
+ // FileUtil.del(exportFilePath);
+ // log.info("涓存椂鏂囦欢宸插垹闄�: {}", exportFilePath);
+ // }
+ }
+ }
+
+ /**
+ * 瀵煎嚭鏁版嵁鍒癊xcel锛堜袱涓猻heet椤碉級
+ *
+ * @param filePath 鏂囦欢璺緞
+ */
+ private void exportToExcel(String filePath) {
+ // 璁$畻鏄ㄥぉ鐨勬棩鏈�
+ LocalDate yesterday = LocalDate.now().minusDays(1);
+ String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+ // 璁$畻鏈湀鐨勮捣姝㈡棩鏈�
+ LocalDate today = LocalDate.now();
+ LocalDate firstDayOfMonth = today.withDayOfMonth(1);
+ LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
+ String firstDayStr = firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ String lastDayStr = lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+ log.info("鏄ㄥぉ鏃ユ湡: {}", yesterdayStr);
+ log.info("鏈湀鑼冨洿: {} 鑷� {}", firstDayStr, lastDayStr);
+
+ // 杩囨护鏁版嵁锛氶璁″紑宸ュ湪鏄ㄥぉ鐨勬暟鎹�
+ List<VwCjScSjTsBb> yesterdayData = list();
+
+ // 杩囨护鏁版嵁锛氶璁″紑宸ュ湪鏈湀鐨勬暟鎹�
+ List<VwCjScSjTsBbMonth> thisMonthData = vwCjScSjTsBbMonthService.list();
+
+ log.info("鏄ㄥぉ鏁版嵁: {} 鏉�", yesterdayData.size());
+ log.info("鏈湀鏁版嵁: {} 鏉�", thisMonthData.size());
+
+ // 鍒涘缓Excel鍐欏叆鍣紙绗竴涓猻heet锛�
+ ExcelWriter writer = ExcelUtil.getWriter(filePath, "鏄ㄥぉ鍏ュ簱宸ュ崟鐢宠");
+
+ // 鍐欏叆绗竴涓猻heet锛氭槰澶╅璁″紑宸ョ殑鏁版嵁
+ writeSheetData(writer, "鏄ㄥぉ鍏ュ簱宸ュ崟鐢宠鏁版嵁锛�" + yesterdayStr + "锛�", yesterdayData);
+
+ // 鍒涘缓绗簩涓猻heet
+ writer.setSheet("鏈湀鍏ュ簱宸ュ崟鐢宠");
+
+ // 鍐欏叆绗簩涓猻heet锛氭湰鏈堥璁″紑宸ョ殑鏁版嵁
+ writeSheetData(writer, thisMonthData, "鏈湀鍏ュ簱宸ュ崟鐢宠鏁版嵁锛�" + firstDayStr + " 鑷� " + lastDayStr + "锛�");
+
+ // 鍏抽棴writer锛岄噴鏀惧唴瀛�
+ writer.close();
+ }
+
+ /**
+ * 鍐欏叆鍗曚釜sheet鐨勬暟鎹�
+ *
+ * @param writer Excel鍐欏叆鍣�
+ * @param dataList 鏁版嵁鍒楄〃
+ * @param title 鏍囬
+ */
+ private void writeSheetData(ExcelWriter writer, String title, List<VwCjScSjTsBb> dataList) {
+ // 娓呯┖涔嬪墠鐨勫埆鍚嶈缃�
+ writer.clearHeaderAlias();
+
+ // 璁剧疆琛ㄥご鍒悕锛堜腑鏂囧垪鍚嶏級
+ writer.addHeaderAlias("departmentname", "杞﹂棿");
+ writer.addHeaderAlias("lineName", "绾夸綋鍚嶇О");
+ writer.addHeaderAlias("itemNo", "浜у搧缂栫爜");
+ writer.addHeaderAlias("itemName", "浜у搧鍚嶇О");
+ writer.addHeaderAlias("daa001", "宸ュ崟鍙�");
+ writer.addHeaderAlias("daa008", "宸ュ崟鏁�");
+ writer.addHeaderAlias("sq", "鐢宠鏁�");
+ writer.addHeaderAlias("rk", "鍏ュ簱鏁�");
+ writer.addHeaderAlias("sqwwg", "鐢宠鏈畬宸ユ暟");
+ writer.addHeaderAlias("rkwwg", "鍏ュ簱鏈畬宸�");
+ writer.addHeaderAlias("sqwrk", "鐢宠鏈叆搴�");
+ writer.addHeaderAlias("yjkg", "棰勮寮�宸�");
+ writer.addHeaderAlias("sjkg", "瀹為檯寮�宸�");
+
+ // 鍚堝苟鍗曞厓鏍间綔涓烘爣棰樿
+ writer.merge(14, title);
+
+ // 鍐欏叆鏁版嵁锛岄粯璁や細浣跨敤鍒悕浣滀负琛ㄥご
+ writer.write(dataList, true);
+
+ // 璁剧疆鍒楀鑷�傚簲
+ writer.autoSizeColumnAll();
+ }
+
+
+ private void writeSheetData(ExcelWriter writer, List<VwCjScSjTsBbMonth> dataList, String title) {
+ // 娓呯┖涔嬪墠鐨勫埆鍚嶈缃�
+ writer.clearHeaderAlias();
+
+ // 璁剧疆琛ㄥご鍒悕锛堜腑鏂囧垪鍚嶏級
+ writer.addHeaderAlias("departmentname", "杞﹂棿");
+ writer.addHeaderAlias("lineName", "绾夸綋鍚嶇О");
+ writer.addHeaderAlias("itemNo", "浜у搧缂栫爜");
+ writer.addHeaderAlias("itemName", "浜у搧鍚嶇О");
+ writer.addHeaderAlias("daa001", "宸ュ崟鍙�");
+ writer.addHeaderAlias("daa008", "宸ュ崟鏁�");
+ writer.addHeaderAlias("sq", "鐢宠鏁�");
+ writer.addHeaderAlias("rk", "鍏ュ簱鏁�");
+ writer.addHeaderAlias("sqwwg", "鐢宠鏈畬宸ユ暟");
+ writer.addHeaderAlias("rkwwg", "鍏ュ簱鏈畬宸�");
+ writer.addHeaderAlias("sqwrk", "鐢宠鏈叆搴�");
+ writer.addHeaderAlias("yjkg", "棰勮寮�宸�");
+ writer.addHeaderAlias("sjkg", "瀹為檯寮�宸�");
+
+ // 鍚堝苟鍗曞厓鏍间綔涓烘爣棰樿
+ writer.merge(14, title);
+
+ // 鍐欏叆鏁版嵁锛岄粯璁や細浣跨敤鍒悕浣滀负琛ㄥご
+ writer.write(dataList, true);
+
+ // 璁剧疆鍒楀鑷�傚簲
+ writer.autoSizeColumnAll();
+ }
+}
+
+
+
+
diff --git a/src/main/java/com/gs/dingtalk/task/ScheduledTasks.java b/src/main/java/com/gs/dingtalk/task/ScheduledTasks.java
index 84636de..0da632c 100644
--- a/src/main/java/com/gs/dingtalk/task/ScheduledTasks.java
+++ b/src/main/java/com/gs/dingtalk/task/ScheduledTasks.java
@@ -2,54 +2,90 @@
import com.gs.dingtalk.service.SendDingtalkService;
+import com.gs.dingtalk.service.VwCjScSjTsBbService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
+
+import java.util.concurrent.atomic.AtomicBoolean;
@Component
@RequiredArgsConstructor
@Slf4j
public class ScheduledTasks {
- private final SendDingtalkService sendDingtalkService;
+// private final SendDingtalkService sendDingtalkService;
+
+ private final VwCjScSjTsBbService vwCjScSjTsBbService;
+
+ private final AtomicBoolean exportTaskRunning = new AtomicBoolean(false);
+
+// /**
+// * 姣忎袱鍒嗛挓鎵ц涓�娆�
+// * 鑾峰彇璁惧鏈�杩戠殑涓�鏉¤褰�
+// *
+// * @return void
+// * @author tjx
+// * @description TODO
+// * @date 2024/9/27 21:48
+// */
+// @Scheduled(cron = "0 0/2 * * * ?")
+// public void getDeviceRealTimeData() {
+// try {
+// sendDingtalkService.sendDingTalkFiveMinute();
+// log.info("瀹氭椂浠诲姟 getDeviceRealTimeData 鎵ц鎴愬姛");
+// } catch (Exception e) {
+// log.error("瀹氭椂浠诲姟 getDeviceRealTimeData 鎵ц澶辫触: ", e);
+// }
+// }
+//
+// @Scheduled(cron = "0 0/3 * * * ?")
+// public void sendDingTalkFifteenMinute() {
+// try {
+// sendDingtalkService.sendDingTalkFifteenMinute();
+// log.info("瀹氭椂浠诲姟 sendDingTalkFifteenMinute 鎵ц鎴愬姛");
+// } catch (Exception e) {
+// log.error("瀹氭椂浠诲姟 sendDingTalkFifteenMinute 鎵ц澶辫触: ", e);
+// }
+// }
+//
+// @Scheduled(cron = "0 0/4 * * * ?")
+// public void sendDingTalkThirtyMinute() {
+// try {
+// sendDingtalkService.sendDingTalkthirtyMinute();
+// log.info("瀹氭椂浠诲姟 sendDingTalkThirtyMinute 鎵ц鎴愬姛");
+// } catch (Exception e) {
+// log.error("瀹氭椂浠诲姟 sendDingTalkThirtyMinute 鎵ц澶辫触: ", e);
+// }
+// }
/**
- * 姣忎袱鍒嗛挓鎵ц涓�娆�
- * 鑾峰彇璁惧鏈�杩戠殑涓�鏉¤褰�
- *
- * @return void
- * @author tjx
- * @description TODO
- * @date 2024/9/27 21:48
+ * 姣忓ぉ涓婂崍9鐐规墽琛�
+ * 瀵煎嚭鐢熶骇鏁版嵁骞跺彂閫侀拤閽夋秷鎭�
*/
- @Scheduled(cron = "0 0/2 * * * ?")
- public void getDeviceRealTimeData() {
- try {
- sendDingtalkService.sendDingTalkFiveMinute();
- log.info("瀹氭椂浠诲姟 getDeviceRealTimeData 鎵ц鎴愬姛");
- } catch (Exception e) {
- log.error("瀹氭椂浠诲姟 getDeviceRealTimeData 鎵ц澶辫触: ", e);
+ @Async("taskExecutor")
+ @Scheduled(cron = "0 0 12,16 * * ?")
+ public void exportAndSendProductionDataTask() {
+ if (!exportTaskRunning.compareAndSet(false, true)) {
+ log.warn("鐢熶骇鏁版嵁瀵煎嚭浠诲姟姝e湪鎵ц涓紝璺宠繃鏈鎵ц");
+ return;
}
- }
- @Scheduled(cron = "0 0/3 * * * ?")
- public void sendDingTalkFifteenMinute() {
try {
- sendDingtalkService.sendDingTalkFifteenMinute();
- log.info("瀹氭椂浠诲姟 sendDingTalkFifteenMinute 鎵ц鎴愬姛");
- } catch (Exception e) {
- log.error("瀹氭椂浠诲姟 sendDingTalkFifteenMinute 鎵ц澶辫触: ", e);
- }
- }
+ log.info("寮�濮嬫墽琛岀敓浜ф暟鎹鍑哄苟鍙戦�侀拤閽変换鍔�");
+ boolean result = vwCjScSjTsBbService.exportAndSendToDingtalk();
- @Scheduled(cron = "0 0/4 * * * ?")
- public void sendDingTalkThirtyMinute() {
- try {
- sendDingtalkService.sendDingTalkthirtyMinute();
- log.info("瀹氭椂浠诲姟 sendDingTalkThirtyMinute 鎵ц鎴愬姛");
+ if (result) {
+ log.info("鐢熶骇鏁版嵁瀵煎嚭骞跺彂閫侀拤閽変换鍔℃墽琛屾垚鍔�");
+ } else {
+ log.error("鐢熶骇鏁版嵁瀵煎嚭骞跺彂閫侀拤閽変换鍔℃墽琛屽け璐�");
+ }
} catch (Exception e) {
- log.error("瀹氭椂浠诲姟 sendDingTalkThirtyMinute 鎵ц澶辫触: ", e);
+ log.error("鐢熶骇鏁版嵁瀵煎嚭骞跺彂閫侀拤閽変换鍔℃墽琛屽紓甯�", e);
+ } finally {
+ exportTaskRunning.set(false);
}
}
}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index ef0a82f..694f200 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -5,9 +5,9 @@
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: oracle.jdbc.OracleDriver
- url: jdbc:oracle:thin:@192.168.0.100:1521/orcl
- username: yc_dev
- password: ycdev
+ url: jdbc:oracle:thin:@192.168.1.22:1521/orcl
+ username: hm_prd
+ password: hmprd
druid:
initialSize: 5
minIdle: 5
diff --git a/src/main/resources/mapper/DingtalkInfoMapper.xml b/src/main/resources/mapper/DingtalkInfoMapper.xml
new file mode 100644
index 0000000..bc8d407
--- /dev/null
+++ b/src/main/resources/mapper/DingtalkInfoMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gs.dingtalk.mapper.DingtalkInfoMapper">
+
+</mapper>
diff --git a/src/main/resources/mapper/DingtalkMsgMapper.xml b/src/main/resources/mapper/DingtalkMsgMapper.xml
new file mode 100644
index 0000000..70b8b4a
--- /dev/null
+++ b/src/main/resources/mapper/DingtalkMsgMapper.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gs.dingtalk.mapper.DingtalkMsgMapper">
+
+
+</mapper>
diff --git a/src/main/resources/mapper/MesStaffMapper.xml b/src/main/resources/mapper/MesStaffMapper.xml
new file mode 100644
index 0000000..8a682b3
--- /dev/null
+++ b/src/main/resources/mapper/MesStaffMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gs.dingtalk.mapper.MesStaffMapper">
+ <update id="updateStaff">
+ update SYS_USER a
+ set SID = (select ID from MES_STAFF where STAFF_NO = a.FCODE and STAFF_NAME = a.FNAME)
+ where 1 = 1
+ </update>
+ <delete id="deleteStaff">
+ delete
+ from MES_STAFF
+ where 1 = 1
+ </delete>
+
+
+ <select id="getNextVal" resultType="java.lang.Long">
+ select SEQ_MES_STAFF.NextVal
+ from dual
+ </select>
+</mapper>
diff --git a/src/main/resources/mapper/VwCjScSjTsBbMapper.xml b/src/main/resources/mapper/VwCjScSjTsBbMapper.xml
new file mode 100644
index 0000000..aeb7f25
--- /dev/null
+++ b/src/main/resources/mapper/VwCjScSjTsBbMapper.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gs.dingtalk.mapper.VwCjScSjTsBbMapper">
+
+
+</mapper>
diff --git a/src/main/resources/mapper/VwCjScSjTsBbMonthMapper.xml b/src/main/resources/mapper/VwCjScSjTsBbMonthMapper.xml
new file mode 100644
index 0000000..72ff221
--- /dev/null
+++ b/src/main/resources/mapper/VwCjScSjTsBbMonthMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gs.dingtalk.mapper.VwCjScSjTsBbMonthMapper">
+
+</mapper>
--
Gitblit v1.9.3