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