Browse Source

Merge remote-tracking branch 'origin/master'

wzy 1 year ago
parent
commit
62f187cd5d
20 changed files with 2333 additions and 41 deletions
  1. 0 28
      mjava-kuaikeli/src/main/java/com/malk/kuaikeli/schedule/TestTask.java
  2. 1 1
      mjava-kuaikeli/src/main/java/com/malk/kuaikeli/service/impl/KKLImplService.java
  3. 25 12
      mjava-kuaikeli/src/test/java/com/malk/kuaikeli/DdTest.java
  4. 72 0
      mjava-pake/pom.xml
  5. 17 0
      mjava-pake/src/main/java/com/malk/pake/PakeApplication.java
  6. 30 0
      mjava-pake/src/main/java/com/malk/pake/controller/AccessTokenController.java
  7. 49 0
      mjava-pake/src/main/java/com/malk/pake/controller/DingOaController.java
  8. 91 0
      mjava-pake/src/main/java/com/malk/pake/schedule/ScheduleTask.java
  9. 20 0
      mjava-pake/src/main/java/com/malk/pake/service/DingOaService.java
  10. 7 0
      mjava-pake/src/main/java/com/malk/pake/service/PkMaintenanceWarningService.java
  11. 11 0
      mjava-pake/src/main/java/com/malk/pake/service/PkWorkingHoursService.java
  12. 1342 0
      mjava-pake/src/main/java/com/malk/pake/service/impl/DingOaServiceImpl.java
  13. 119 0
      mjava-pake/src/main/java/com/malk/pake/service/impl/PkMaintenanceWarningServiceImpl.java
  14. 133 0
      mjava-pake/src/main/java/com/malk/pake/service/impl/PkWorkingHoursServiceImpl.java
  15. 24 0
      mjava-pake/src/main/resources/application-dev.yml
  16. 24 0
      mjava-pake/src/main/resources/application-prod.yml
  17. 12 0
      mjava-pake/src/main/resources/application.yml
  18. 61 0
      mjava-pake/src/main/resources/logback-spring.xml
  19. 263 0
      mjava-pake/src/test/java/com/malk/pake/DdTest.java
  20. 32 0
      mjava-pake/src/test/java/com/malk/pake/WorkingHoursTest.java

+ 0 - 28
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/schedule/TestTask.java

@@ -1,28 +0,0 @@
-package com.malk.kuaikeli.schedule;
-
-import com.malk.service.dingtalk.DDClient;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
-
-import java.time.LocalDateTime;
-
-@Slf4j
-@Configuration
-@EnableScheduling
-@ConditionalOnProperty(name = {"enable.scheduling"})
-public class TestTask {
-
-    @Autowired
-    private DDClient ddClient;
-
-    @Scheduled(cron = "0/5 * * * * ?")
-    public void sync(){
-//        String accessToken = ddClient.getAccessToken();
-        System.out.println(LocalDateTime.now());
-    }
-
-}

+ 1 - 1
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/service/impl/KKLImplService.java

@@ -112,7 +112,7 @@ public class KKLImplService implements KKLService {
      */
     @Override
     @SneakyThrows
-//    @Synchronized
+    @Synchronized
     public void serviceRate(Map data) {
 
         // todo: 宜搭更新,校验的超时等待在3s, 因此方法修改为异步. 容错定时任务?匹配不一致数据

+ 25 - 12
mjava-kuaikeli/src/test/java/com/malk/kuaikeli/DdTest.java

@@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.HashMap;
 import java.util.Map;
 
 @Slf4j
@@ -37,22 +38,22 @@ public class DdTest {
 
     @Test
     public void test(){
-//        Map form = ydClient.queryData(YDParam.builder()
+        Map form = ydClient.queryData(YDParam.builder()
 //                .appType("APP_K8EYBJO1GLUWYIXT12DI")
 //                .systemToken("7C766871QS1GIKQ68SWX0BS71RSZ1LONSB2PLA")
-//                .formInstanceId(String.valueOf("0b8d83d3-65e8-47ce-94f0-5ac326ec7992"))
-//                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
-//        System.out.println(JSONObject.toJSONString(form));
-        ydClient.operateData(YDParam.builder()
-                        .appType("APP_YSEVMCWNRJAKT4X1HRWZ")
-                .systemToken("TL7661A1OXSJJ5EI6EPT36859MJT383P9MGUL25")
-                .formUuid("FORM-430FF05A3B89497D9AFE0D89660E1E34HKQ5")
-                .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_lvm4l2i7","1001")))
-                .formDataJson(JSONObject.toJSONString(UtilMap.map("textField_lvm4l2i7, textField_lvm4l2i8, textField_lvm4o3p9","1001","张三", RandomUtil.randomString(10))))
-                .build(), YDConf.FORM_OPERATION.upsert);
+                .formInstanceId(String.valueOf("FINST-87D66K71SITKC3IR638H7B7ZNYG83GWMS3WVL5CE1"))
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        System.out.println(JSONObject.toJSONString(form));
+//        ydClient.operateData(YDParam.builder()
+//                        .appType("APP_YSEVMCWNRJAKT4X1HRWZ")
+//                .systemToken("TL7661A1OXSJJ5EI6EPT36859MJT383P9MGUL25")
+//                .formUuid("FORM-430FF05A3B89497D9AFE0D89660E1E34HKQ5")
+//                .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_lvm4l2i7","1001")))
+//                .formDataJson(JSONObject.toJSONString(UtilMap.map("textField_lvm4l2i7, textField_lvm4l2i8, textField_lvm4o3p9","1001","张三", RandomUtil.randomString(10))))
+//                .build(), YDConf.FORM_OPERATION.upsert);
     }
 
-    String aa="{\"code\":\"GYS-20240429-014\",\"proCode\":\"XM-20240429-015\",\"rate\":\"[\\\"10\\\",\\\"10\\\",\\\"10\\\",\\\"10\\\"]\",\"rate2\":\"[\\\"10\\\",\\\"10\\\",\\\"10\\\",\\\"10\\\"]\",\"proName\":\"测试项目案例\",\"type\":\"[\\\"猪肉类\\\",\\\"冷冻肉类制品\\\",\\\"叶菜类\\\",\\\"水果\\\"]\",\"status\":\"[\\\"已启用\\\",\\\"已启用\\\",\\\"已启用\\\",\\\"已启用\\\"]\"}";
+    String aa="{\"code\":\"GYS-20240508-015\",\"proCode\":\"XM-20240508-017\",\"rate\":\"[\\\"35\\\",\\\"35\\\",\\\"35\\\",\\\"35\\\",\\\"35\\\"]\",\"rate2\":\"[\\\"35\\\",\\\"35\\\",\\\"35\\\",\\\"35\\\",\\\"35\\\"]\",\"proName\":\"联发芯项目2\",\"type\":\"[\\\"叶菜类\\\",\\\"菌类\\\",\\\"茄果类\\\",\\\"瓜类\\\",\\\"其他蔬菜\\\"]\",\"status\":\"[\\\"已启用\\\",\\\"已启用\\\",\\\"已启用\\\",\\\"已启用\\\",\\\"已启用\\\"]\"}";
 
     @Test
     public void tt(){
@@ -65,4 +66,16 @@ public class DdTest {
             e.printStackTrace();
         }
     }
+
+    @Test
+    public void kklTest(){
+        Map form = ydClient.queryData(YDParam.builder()
+                .formInstanceId(String.valueOf("FINST-87D66K71SITKC3IR638H7B7ZNYG83GWMS3WVL5CE1"))
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        Map data=new HashMap();
+        data.put("name",form.get("textField_lln477nh"));
+        data.put("area",form.get("selectField_llm1i9yl"));
+        data.put("list",form.get("tableField_lln477nw"));
+        kklService.validateApprove(data);
+    }
 }

+ 72 - 0
mjava-pake/pom.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.0.RELEASE</version> <!-- 使用最新的稳定版或其他适用版本 -->
+    </parent>
+
+    <groupId>com.malk</groupId>
+    <artifactId>mjava-pake</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+        <!--钉钉相关-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.4.35</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>pake</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>

+ 17 - 0
mjava-pake/src/main/java/com/malk/pake/PakeApplication.java

@@ -0,0 +1,17 @@
+package com.malk.pake;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+public class PakeApplication {
+
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(PakeApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+}

+ 30 - 0
mjava-pake/src/main/java/com/malk/pake/controller/AccessTokenController.java

@@ -0,0 +1,30 @@
+package com.malk.pake.controller;
+
+import com.malk.service.dingtalk.DDClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@RestController
+@RequestMapping("/dingservice")
+@CrossOrigin//解决跨域问题
+public class AccessTokenController {
+
+    @Autowired
+    private DDClient ddClient;
+
+    //获取钉钉中的access_token(帕科)
+    @GetMapping("getAccessToken")
+    public String getAccessToken(){
+
+        String accessToken = ddClient.getAccessToken();
+        return accessToken;
+    }
+}

+ 49 - 0
mjava-pake/src/main/java/com/malk/pake/controller/DingOaController.java

@@ -0,0 +1,49 @@
+package com.malk.pake.controller;
+
+import com.malk.pake.service.DingOaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/yidaservice")
+//@CrossOrigin//解决跨域问题
+public class DingOaController {
+
+    @Autowired
+    private DingOaService dingOaService;
+
+    //更新商机申报表单关联表单控件
+    @PostMapping("updateShangjishenbao")
+    public String updateShangjishenbao(String formInstanceId, String shenbaoName){
+
+        String updateShangjishenbao = dingOaService.updateShangjishenbao(formInstanceId, shenbaoName);
+        return updateShangjishenbao;
+    }
+
+    //商机周报通过后同步创建商机跟进表单
+    @PostMapping("createShangjigenjin")
+    public String createShangjigenjin(String formInstanceId,String user,String time){
+
+        String createShangjigenjin = dingOaService.createShangjigenjin(formInstanceId,user,time);
+        return createShangjigenjin;
+    }
+
+    //商机跟进表单通过后同步创建商机档案表的页签明细
+    @PostMapping("createShangjiDangan")
+    public String createShangjiDangan(String formInstanceId){
+
+        String createShangjiDangan = dingOaService.createShangjiDangan(formInstanceId);
+        return createShangjiDangan;
+    }
+
+    //采购合同发起用印通过后同步更新合同用印表单关联采购合同表单控件
+    @PostMapping("updateHetongyongyin")
+    public String updateHetongyongyin(String caigouhetongliushuihao, String caigouhetongName){
+
+        String updateHetongyongyin = dingOaService.updateHetongyongyin(caigouhetongliushuihao,caigouhetongName);
+        return updateHetongyongyin;
+    }
+}

+ 91 - 0
mjava-pake/src/main/java/com/malk/pake/schedule/ScheduleTask.java

@@ -0,0 +1,91 @@
+package com.malk.pake.schedule;
+
+import cn.hutool.http.HttpUtil;
+import com.malk.pake.service.PkMaintenanceWarningService;
+import com.malk.pake.service.PkWorkingHoursService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class ScheduleTask {
+
+    @Autowired
+    private PkWorkingHoursService pkWorkingHoursService;
+    @Autowired
+    private PkMaintenanceWarningService pkMaintenanceWarningService;
+
+    /**
+     * 工时填写提醒-按月
+     * 每月5-8号10:00提醒一次
+     */
+    @Scheduled(cron = "0 0 10 5-8 * ?")
+    public void fillInReminderMonth() {
+        log.info("工时填写提醒-按月");
+        try {
+            pkWorkingHoursService.fillInReminderMonth();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 工时填写提醒-按天
+     * 每日10:00提醒一次
+     */
+    @Scheduled(cron = "0 0 10 * * ?")
+    public void fillInReminderDay() {
+        log.info("工时填写提醒-按天");
+        try {
+            String result= HttpUtil.get("https://tool.bitefu.net/jiari/?d=".concat(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))));
+            if(result.equals("0")){
+                // 工作日
+                pkWorkingHoursService.fillInReminderDay();
+            }else{
+                log.info("周末或休息日,不提醒。接口返回:{}",result);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 工时填写提醒-指定人员
+     * 每月3-4号10:00提醒一次
+     */
+    @Scheduled(cron = "0 0 10 3-4 * ?")
+    public void fillInReminderPeople() {
+        log.info("工时填写提醒-指定人员");
+        try {
+            pkWorkingHoursService.fillInReminderPeople();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 工程维保项目-维保预警
+     * 每天10:00重新计算维保剩余天数及变更维保预警状态,根据状态发送提醒
+     */
+    @Scheduled(cron = "0 0 10 * * ?")
+    public void maintenanceWarning() {
+        log.info("工程维保项目-维保预警");
+        try {
+            pkMaintenanceWarningService.warning();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 20 - 0
mjava-pake/src/main/java/com/malk/pake/service/DingOaService.java

@@ -0,0 +1,20 @@
+package com.malk.pake.service;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface DingOaService {
+
+    //更新商机申报表单关联表单控件
+    String updateShangjishenbao(String formInstanceId, String shenbaoName);
+
+    //商机周报通过后同步创建商机跟进表单
+    String createShangjigenjin(String formInstanceId, String user, String time);
+
+    //商机跟进表单通过后同步创建商机档案表的页签明细
+    String createShangjiDangan(String formInstanceId);
+
+    //采购合同发起用印通过后同步更新合同用印表单关联采购合同表单控件
+    String updateHetongyongyin(String caigouhetongliushuihao, String caigouhetongName);
+}

+ 7 - 0
mjava-pake/src/main/java/com/malk/pake/service/PkMaintenanceWarningService.java

@@ -0,0 +1,7 @@
+package com.malk.pake.service;
+
+public interface PkMaintenanceWarningService {
+
+    void warning();
+
+}

+ 11 - 0
mjava-pake/src/main/java/com/malk/pake/service/PkWorkingHoursService.java

@@ -0,0 +1,11 @@
+package com.malk.pake.service;
+
+public interface PkWorkingHoursService {
+
+    void fillInReminderMonth();
+
+    void fillInReminderDay();
+
+    void fillInReminderPeople();
+
+}

File diff suppressed because it is too large
+ 1342 - 0
mjava-pake/src/main/java/com/malk/pake/service/impl/DingOaServiceImpl.java


+ 119 - 0
mjava-pake/src/main/java/com/malk/pake/service/impl/PkMaintenanceWarningServiceImpl.java

@@ -0,0 +1,119 @@
+package com.malk.pake.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.pake.service.PkMaintenanceWarningService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Notice;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilEnv;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Period;
+import java.util.*;
+
+@Service
+@Slf4j
+public class PkMaintenanceWarningServiceImpl implements PkMaintenanceWarningService {
+
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Notice ddClient_notice;
+    @Autowired
+    private YDClient ydClient;
+
+    private static String FORM_UUID="FORM-NO96679107GDYGUK9SM8T42G95KA2KZOMUELL4";
+
+    @Override
+    public void warning() {
+        LocalDate now=LocalDate.now();
+        int weekDay=now.getDayOfWeek().getValue();
+        List<Map> list= (List<Map>)ydClient.queryData(YDParam.builder().formUuid(FORM_UUID)
+                .searchFieldJson(JSONObject.toJSONString(UtilMap.map("selectField_lleuoajr","工程维保")))
+                .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+        for (int i = 0; i < list.size(); i++) {
+            Map formData=UtilMap.getMap(list.get(i),"formData");
+            String formInstanceId=UtilMap.getString(list.get(i),"formInstanceId");
+            log.info("进度:{}/{}",i+1,list.size());
+            if(formData.containsKey("dateField_lvkegbgm")&&formData.containsKey("dateField_lvkegbgp")){
+                // 重新计算 维保剩余天数
+                LocalDateTime startTime= UtilDateTime.getLocalDateTimeFromTimestamp(UtilMap.getLong(formData,"dateField_lvkegbgm"));
+                LocalDateTime endTime=UtilDateTime.getLocalDateTimeFromTimestamp(UtilMap.getLong(formData,"dateField_lvkegbgp"));
+                if(startTime.isAfter(LocalDate.now().atStartOfDay())){
+                    startTime=LocalDate.now().atStartOfDay();
+                }
+                Period period=Period.between(startTime.toLocalDate(),endTime.toLocalDate());
+                int days=period.getDays();
+                String stats="";
+                // 提醒人员 仰洪波[033069386520314088]  肖林[810]
+                List<String> users=Arrays.asList("033069386520314088","810");
+                users.addAll(UtilMap.getList(formData,"employeeField_lqq12vtb_id"));
+                users.addAll(UtilMap.getList(formData,"employeeField_llemcq8c_id"));
+                String projectName=UtilMap.getString(formData,"textField_llemcq7b");
+                String url="https://bmogyb.aliwork.com/APP_UNSAR4O4Y7NBDUYXLIP4/formDetail/FORM-NO96679107GDYGUK9SM8T42G95KA2KZOMUELL4?formInstId="+formInstanceId;
+                boolean isSend=!"关闭".equals(UtilMap.getString(formData,"radioField_lw4p0nnl"));
+                if(days<0){
+                    stats="已过期";
+                    // 每天提醒
+                    sendNotice(users,"维保已过期,请及时续约,如无需继续维保,请及时更新系统维保信息。",url,isSend,projectName);
+                }else if(days>=0 && days<=90){
+                    stats="3个月内到期";
+                    // 周一到周五
+                    if(weekDay >= 1 && weekDay <= 5){
+                        sendNotice(users,"维保即将到期,请及时续约",url,isSend,projectName);
+                    }
+                }else if(days>=91 && days<=180){
+                    stats="6个月内到期";
+                    // 周一
+                    if(weekDay == 1){
+                        sendNotice(users,"维保即将到期,请做好维保合同续约准备",url,isSend,projectName);
+                    }
+                }else{
+                    stats="未到期";
+                    // 每年7-12月,每月1号10:00提醒1次
+                    if(now.getDayOfMonth()==1&&now.getMonthValue()>=7){
+                        sendNotice(users,"请提醒客户做好相关维保预算",url,isSend,projectName);
+                    }
+                }
+                Map upMap=new HashMap();
+                upMap.put("numberField_lvkegbgk",days);
+                upMap.put("selectField_lvkegbgn",stats);
+                ydClient.operateData(YDParam.builder().formInstId(formInstanceId).updateFormDataJson(JSONObject.toJSONString(upMap)).build(), YDConf.FORM_OPERATION.update);
+            }else{
+                log.info("未配置时间!");
+            }
+        }
+    }
+
+    private void sendNotice(List<String> users,String msg,String url,boolean isSend,String name){
+        if(!isSend){
+            return;
+        }
+        if(users==null||users.size()<1){
+            log.info("提醒用户列表为空");
+            return;
+        }
+        if(!UtilEnv.ENV_PROD.equals(UtilEnv.getActiveProfile())){
+            log.info("非生产环境,消息转发到开发人员。应收到人员列表:{}",users);
+            users= Arrays.asList("153620324221442254");
+        }
+        Map cardMap=new HashMap();
+        cardMap.put("btn_json_list",Arrays.asList(UtilMap.map("title, action_url","查看详情",url)));
+        cardMap.put("title","项目维保预警提醒");
+        cardMap.put("markdown","### 项目维保预警提醒  \n  项目【"+name+"】  \n  "+msg);
+        cardMap.put("btn_orientation",1);
+        Map msgMap=new HashMap();
+        msgMap.put("msgtype","action_card");
+        msgMap.put("action_card",cardMap);
+        ddClient_notice.sendNotification(ddClient.getAccessToken(),users,null,false,msgMap);
+    }
+}

+ 133 - 0
mjava-pake/src/main/java/com/malk/pake/service/impl/PkWorkingHoursServiceImpl.java

@@ -0,0 +1,133 @@
+package com.malk.pake.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.pake.service.PkWorkingHoursService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Notice;
+import com.malk.utils.UtilEnv;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class PkWorkingHoursServiceImpl implements PkWorkingHoursService {
+
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Notice ddClient_notice;
+    @Autowired
+    private YDClient ydClient;
+
+    private static String FORM_UUID="FORM-F50C31C6F5F34955870B2454275C7846TNPF";
+    private static String NOTICE_MONTH="请及时填写上月工时!";
+    private static String NOTICE_DAY="请及时填写今日工时!";
+    private static String NOTICE_PEOPLE="请及时上传工时填写人员实际出勤时长!";
+
+    @Override
+    public void fillInReminderMonth() {
+        Long lastMonth= LocalDate.now().minusMonths(1).withDayOfMonth(1).atStartOfDay().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
+        int i=0;
+        long total;
+        do {
+            i++;
+            DDR_New ddr_new = ydClient.queryData(YDParam.builder().formUuid(FORM_UUID).pageNumber(i)
+                            .searchFieldJson(JSONObject.toJSONString(UtilMap.map("selectField_lvyvp4ab", "按月"))).build(),
+                    YDConf.FORM_QUERY.retrieve_list);
+            List<Map> list =(List<Map>) ddr_new.getData();
+            total=ddr_new.getTotalCount();
+            log.info("数量,{}",list.size());
+            for (Map map:list){
+                Map formData=UtilMap.getMap(map,"formData");
+                log.info("formData:{}",formData);
+                String url=UtilMap.getString(formData,"textField_lvyvp4at");
+                List<String> users=UtilMap.getList(formData,"employeeField_lvyvp4a9_id");
+                // 判断是否填写
+                List<Map> list2 =(List<Map>) ydClient.queryData(YDParam.builder().formUuid(url.substring(url.indexOf("FORM-"),url.indexOf("?")))
+                                .searchFieldJson(JSONObject.toJSONString(UtilMap.map("employeeField_ls2x7t46, dateField_ls2x7t40", users.get(0),Arrays.asList(lastMonth,lastMonth)))).build(),
+                        YDConf.FORM_QUERY.retrieve_list).getData();
+                if(list2.size()>0){
+                    log.info("{}已填写,跳过",formData.get("employeeField_lvyvp4a9"));
+                    continue;
+                }
+                sendNotice(users,NOTICE_MONTH,url);
+            }
+        }while (i*100<total);
+    }
+
+    @Override
+    public void fillInReminderDay() {
+        Long now= LocalDate.now().atStartOfDay().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
+        int i=0;
+        long total;
+        do {
+            i++;
+            DDR_New ddr_new = ydClient.queryData(YDParam.builder().formUuid(FORM_UUID).pageNumber(i)
+                            .searchFieldJson(JSONObject.toJSONString(UtilMap.map("selectField_lvyvp4ab", "按天"))).build(),
+                    YDConf.FORM_QUERY.retrieve_list);
+            List<Map> list =(List<Map>) ddr_new.getData();
+            total=ddr_new.getTotalCount();
+            log.info("数量,{}",list.size());
+            for (Map map:list){
+                Map formData=UtilMap.getMap(map,"formData");
+                log.info("formData:{}",formData);
+                String url=UtilMap.getString(formData,"textField_lvyvp4at");
+                List<String> users=UtilMap.getList(formData,"employeeField_lvyvp4a9_id");
+                // 判断是否填写
+                List<Map> list2 =(List<Map>) ydClient.queryData(YDParam.builder().formUuid(url.substring(url.indexOf("FORM-"),url.indexOf("?")))
+                                .searchFieldJson(JSONObject.toJSONString(UtilMap.map("employeeField_lrhjd0eq, dateField_lrhl6dm1", users.get(0),Arrays.asList(now,now)))).build(),
+                        YDConf.FORM_QUERY.retrieve_list).getData();
+                if(list2.size()>0){
+                    log.info("{}已填写,跳过",formData.get("employeeField_lvyvp4a9"));
+                    continue;
+                }
+                sendNotice(users,NOTICE_DAY,url);
+            }
+        }while (i*100<total);
+    }
+
+    @Override
+    public void fillInReminderPeople() {
+        Long lastMonth= LocalDate.now().minusMonths(1).withDayOfMonth(1).atStartOfDay().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
+        List<Map> list2 =(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-275444E476654714A0B8E5AC8EDC2735LDZK")
+                        .searchFieldJson(JSONObject.toJSONString(UtilMap.map("dateField_ls72x2hs", Arrays.asList(lastMonth,lastMonth)))).build(),
+                YDConf.FORM_QUERY.retrieve_list).getData();
+        log.info("数量,{}",list2.size());
+        if(list2.size()>0){
+            log.info("已填写,跳过");
+            return;
+        }
+        // 指定接收人员 陈柳润[17101209603456094]
+        sendNotice(Arrays.asList("17101209603456094"),NOTICE_PEOPLE,"https://bmogyb.aliwork.com/APP_UNSAR4O4Y7NBDUYXLIP4/submission/FORM-275444E476654714A0B8E5AC8EDC2735LDZK?corpid=ding2ef56b69014fbfec35c2f4657eb6378f");
+    }
+
+
+    private void sendNotice(List<String> users,String msg,String url){
+        if(!UtilEnv.ENV_PROD.equals(UtilEnv.getActiveProfile())){
+            log.info("非生产环境,消息转发到开发人员。应收到人员列表:{}",users);
+            users=Arrays.asList("153620324221442254");
+        }
+        Map linkMap=new HashMap();
+        linkMap.put("messageUrl",url);
+        linkMap.put("picUrl","@lALOACZwe2Rk");
+        linkMap.put("title","工时填写提醒");
+        linkMap.put("text",msg);
+        Map msgMap=new HashMap();
+        msgMap.put("msgtype","link");
+        msgMap.put("link",linkMap);
+        ddClient_notice.sendNotification(ddClient.getAccessToken(),users,null,false,msgMap);
+    }
+}

+ 24 - 0
mjava-pake/src/main/resources/application-dev.yml

@@ -0,0 +1,24 @@
+server:
+  port: 8104
+  servlet:
+    context-path: /pake
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/pake/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 2664607479
+  appKey: dingn3i8b1htbuealing
+  appSecret: yrKb6sUl2sAT0YoQJ-1us1xYY9AWR4RG5RLlBA1Uaz1cVsbbfwcklVxVTeyDa1y_
+  corpId:
+  aesKey:
+  token:
+# aliwork
+aliwork:
+  appType: APP_UNSAR4O4Y7NBDUYXLIP4
+  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53

+ 24 - 0
mjava-pake/src/main/resources/application-prod.yml

@@ -0,0 +1,24 @@
+server:
+  port: 8104
+  servlet:
+    context-path: /pake
+enable:
+  scheduling: true
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/pake/log/
+  level:
+    com.malk.*: info
+
+# dingtalk
+dingtalk:
+  agentId: 2664607479
+  appKey: dingn3i8b1htbuealing
+  appSecret: yrKb6sUl2sAT0YoQJ-1us1xYY9AWR4RG5RLlBA1Uaz1cVsbbfwcklVxVTeyDa1y_
+  corpId:
+  aesKey:
+  token:
+# aliwork
+aliwork:
+  appType: APP_UNSAR4O4Y7NBDUYXLIP4
+  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53

+ 12 - 0
mjava-pake/src/main/resources/application.yml

@@ -0,0 +1,12 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+  global-config:
+    db-config:
+      id-type: auto

+ 61 - 0
mjava-pake/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.zitoo.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 263 - 0
mjava-pake/src/test/java/com/malk/pake/DdTest.java

@@ -0,0 +1,263 @@
+package com.malk.pake;
+
+import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class DdTest {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Test
+    public void nullData(){
+        List<String> list=FileUtil.readLines("/home/ids.txt","utf-8");
+        for (int i = 0; i < list.size(); i++) {
+            log.info("处理进度:{}/{}",i+1,list.size());
+            String[] str=list.get(i).split("###");
+            String month=str[0].split("-")[1];
+            String id=str[1];
+            Long date=LocalDate.of(2024,Integer.parseInt(month),1).atStartOfDay().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(id)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("dateField_ls2x7t40", date)))
+                    .build(), YDConf.FORM_OPERATION.update);
+        }
+    }
+
+    // 处理数据
+    @Test
+    public void test3(){
+        List<String> list=FileUtil.readLines("/home/ids.txt","utf-8");
+        int i=1;
+        for (String id:list){
+            log.info("处理进度:{}/{}",i,list.size());
+            i++;
+            Map formData =ydClient.queryData(YDParam.builder()
+                    .formInstanceId(id)
+                    .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            Map mainData=new HashMap();
+            mainData.put("textField_lvw66i56",id);
+            mainData.put("selectField_lvw57eo9","成都慧享工时");
+            mainData.put("departmentSelectField_ls2x7t47",formData.get("departmentSelectField_ls2x7t47_id"));
+            mainData.put("employeeField_ls2x7t46",formData.get("employeeField_ls2x7t46_id"));
+            mainData.put("dateField_ls2x7t40",formData.get("dateField_ls2x7t40"));// 月份
+            mainData.put("dateField_lvw40y8e","");// 日期
+            // 项目
+            List<Map> list1=UtilMap.getList(formData,"tableField_ls30qr4f");
+            for (Map map:list1){
+                if(PublicUtil.isNull(map,"textField_ls30qr4a")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","项目");
+                data.put("textField_lrpt148q",map.get("textField_ls30qr4a"));
+                data.put("selectField_lrhiklat",map.get("selectField_luwcwjak"));
+                data.put("numberField_lrhiklas",map.get("numberField_ltqveodc"));
+                saveData(data);
+            }
+            // 商机
+            List<Map> list2=UtilMap.getList(formData,"tableField_lts9jusn");
+            for (Map map:list2){
+                if(PublicUtil.isNull(map,"textField_lts9jush")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","商机");
+                data.put("textField_lrpt148q",map.get("textField_lts9jush"));
+                data.put("selectField_lrhiklat",map.get("selectField_luwcwjal"));
+                data.put("numberField_lrhiklas",map.get("numberField_lts9jusl"));
+                saveData(data);
+            }
+            // 产品
+            List<Map> list3=UtilMap.getList(formData,"tableField_lvvpxztg");
+            for (Map map:list3){
+                if(PublicUtil.isNull(map,"textField_lvvpxzt9")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","产品");
+                data.put("textField_lrpt148q",map.get("textField_lvvpxzt9"));
+                data.put("selectField_lrhiklat",map.get("selectField_lvvpxztb"));
+                data.put("numberField_lrhiklas",map.get("numberField_lvvpxzte"));
+                saveData(data);
+            }
+            // 其他
+            List<Map> list4=UtilMap.getList(formData,"tableField_ls30qr4m");
+            for (Map map:list4){
+                if(PublicUtil.isNull(map,"textField_luwcwjap")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","其他");
+                data.put("textField_lrpt148q",map.get("textField_luwcwjap"));
+                data.put("selectField_lrhiklat",map.get("selectField_luwcwjao"));
+                data.put("numberField_lrhiklas",map.get("numberField_ltqveodd"));
+                saveData(data);
+            }
+        }
+    }
+
+    // 处理数据
+    @Test
+    public void test2(){
+        List<String> list=FileUtil.readLines("/home/ids.txt","utf-8");
+        int i=1;
+        for (String id:list){
+            log.info("处理进度:{}/{}",i,list.size());
+            i++;
+            Map formData =ydClient.queryData(YDParam.builder()
+                    .formInstanceId(id)
+                    .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            Map mainData=new HashMap();
+            mainData.put("textField_lvw66i56",id);
+            mainData.put("selectField_lvw57eo9","运营相关工时");
+            mainData.put("departmentSelectField_ls2x7t47",formData.get("departmentSelectField_ls2x7t47_id"));
+            mainData.put("employeeField_ls2x7t46",formData.get("employeeField_ls2x7t46_id"));
+            mainData.put("dateField_ls2x7t40",formData.get("dateField_ls2x7t40"));// 月份
+            mainData.put("dateField_lvw40y8e","");// 日期
+            // 项目
+            List<Map> list1=UtilMap.getList(formData,"tableField_ls30qr4f");
+            for (Map map:list1){
+                if(PublicUtil.isNull(map,"textField_ls30qr4a")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","项目");
+                data.put("textField_lrpt148q",map.get("textField_ls30qr4a"));
+                data.put("selectField_lrhiklat","");
+                data.put("numberField_lrhiklas",map.get("numberField_lt6zyzpg"));
+                saveData(data);
+            }
+            // 其他
+            List<Map> list3=UtilMap.getList(formData,"tableField_ls30qr4m");
+            for (Map map:list3){
+                if(PublicUtil.isNull(map,"textField_lrsvczk1")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","其他");
+                data.put("textField_lrpt148q","");
+                data.put("selectField_lrhiklat","");
+                data.put("numberField_lrhiklas",map.get("numberField_lt6zyzph"));
+                saveData(data);
+            }
+            // 计费点
+            List<Map> list4=UtilMap.getList(formData,"tableField_ls2x7t4g");
+            for (Map map:list4){
+                if(PublicUtil.isNull(map,"textField_ls2x7t4a")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","计费点");
+                data.put("textField_lrpt148q",map.get("textField_ls2x7t4a"));
+                data.put("selectField_lrhiklat","");
+                data.put("numberField_lrhiklas",map.get("numberField_lt6zyzpf"));
+                saveData(data);
+            }
+        }
+    }
+
+    @Test
+    public void test1(){
+        List<String> list=FileUtil.readLines("/home/ids.txt","utf-8");
+        int i=1;
+        for (String id:list){
+            log.info("处理进度:{}/{}",i,list.size());
+            i++;
+            Map formData =ydClient.queryData(YDParam.builder()
+                    .formInstanceId(id)
+                    .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            Map mainData=new HashMap();
+            mainData.put("textField_lvw66i56",id);
+            mainData.put("selectField_lvw57eo9","项目/研发/产品/运维工时");
+            mainData.put("departmentSelectField_ls2x7t47",formData.get("departmentSelectField_lrhjd0ep_id"));
+            mainData.put("employeeField_ls2x7t46",formData.get("employeeField_lrhjd0eq_id"));
+            mainData.put("dateField_ls2x7t40",formData.get("dateField_luuynvj8"));// 月份
+            mainData.put("dateField_lvw40y8e",formData.get("dateField_lrhl6dm1"));// 日期
+            // 项目
+            List<Map> list1=UtilMap.getList(formData,"tableField_lrhiklaq");
+            for (Map map:list1){
+                if(PublicUtil.isNull(map,"textField_lrpt148q")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","项目");
+                data.put("textField_lrpt148q",map.get("textField_lrpt148q"));
+                data.put("selectField_lrhiklat",map.get("selectField_lrhiklat"));
+                data.put("numberField_lrhiklas",map.get("numberField_lrhiklas"));
+                saveData(data);
+            }
+            // 产品
+            List<Map> list2=UtilMap.getList(formData,"tableField_lrhjxup8");
+            for (Map map:list2){
+                if(PublicUtil.isNull(map,"textField_lrpt148r")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","产品");
+                data.put("textField_lrpt148q",map.get("textField_lrpt148r"));
+                data.put("selectField_lrhiklat",map.get("selectField_lrhjxup6"));
+                data.put("numberField_lrhiklas",map.get("numberField_lrhjxup5"));
+                saveData(data);
+            }
+            // 其他
+            List<Map> list3=UtilMap.getList(formData,"tableField_lrhjxupf");
+            for (Map map:list3){
+                if(PublicUtil.isNull(map,"textField_lrsvczk1")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","其他");
+                data.put("textField_lrpt148q",map.get("textField_lrsvczk1"));
+                data.put("selectField_lrhiklat",map.get("selectField_lrhjxupd"));
+                data.put("numberField_lrhiklas",map.get("numberField_lrhjxupc"));
+                saveData(data);
+            }
+            // 计费点
+            List<Map> list4=UtilMap.getList(formData,"tableField_lrhjxupm");
+            for (Map map:list4){
+                if(PublicUtil.isNull(map,"textField_lrpt148s")){
+                    continue;
+                }
+                Map data=new HashMap(mainData);
+                data.put("selectField_lvw57eo7","计费点");
+                data.put("textField_lrpt148q",map.get("textField_lrpt148s"));
+                data.put("selectField_lrhiklat",map.get("selectField_lrhjxupk"));
+                data.put("numberField_lrhiklas",map.get("numberField_lrhjxupj"));
+                saveData(data);
+            }
+        }
+    }
+
+    private void saveData(Map data){
+        ydClient.operateData(YDParam.builder()
+                .formUuid("FORM-223E89E230F3488885A7BEB44352A9C06HZ5")
+                .formDataJson(JSONObject.toJSONString(data))
+                .userId(String.valueOf(UtilMap.getList(data,"employeeField_ls2x7t46").get(0)))
+                .build(), YDConf.FORM_OPERATION.create);
+    }
+}

+ 32 - 0
mjava-pake/src/test/java/com/malk/pake/WorkingHoursTest.java

@@ -0,0 +1,32 @@
+package com.malk.pake;
+
+
+import com.malk.pake.service.PkMaintenanceWarningService;
+import com.malk.pake.service.PkWorkingHoursService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class WorkingHoursTest {
+
+    @Autowired
+    private PkWorkingHoursService pkWorkingHoursService;
+    @Autowired
+    private PkMaintenanceWarningService pkMaintenanceWarningService;
+
+    @Test
+    public void test(){
+        pkWorkingHoursService.fillInReminderPeople();
+    }
+
+    @Test
+    public void testYd(){
+        pkMaintenanceWarningService.warning();
+    }
+}