浏览代码

Merge remote-tracking branch 'origin/mjava-lanyun_8-22' into mjava-lanyun_8-22

# Conflicts:
#	mjava-lanyun/src/main/java/com/malk/lanyun/controller/TimerController.java
#	mjava-lanyun/src/main/java/com/malk/lanyun/service/TimerService.java
#	mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/TimerServiceImpl.java
#	mjava-lanyun/src/main/resources/application-dev.yml
pruple_boy 9 月之前
父节点
当前提交
4f1bd57738

+ 9 - 0
mjava-lanyun/pom.xml

@@ -15,6 +15,7 @@
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
+        <sqlserver-jdbc.version>6.4.0.jre8</sqlserver-jdbc.version>
     </properties>
 
     <dependencies>
@@ -24,6 +25,14 @@
             <artifactId>mjava</artifactId>
             <version>${mjava.version}</version>
         </dependency>
+
+        <!-- sqlserver依赖 -->
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <scope>runtime</scope>
+            <version>${sqlserver-jdbc.version}</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 43 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/Mapper/ProjectAnalysisMapper.java

@@ -0,0 +1,43 @@
+package com.malk.lanyun.Mapper;
+
+import com.malk.lanyun.entity.ProjectAnalysis;
+import org.springframework.jdbc.core.RowMapper;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+
+public class ProjectAnalysisMapper implements RowMapper<ProjectAnalysis> {
+    @Override
+    public ProjectAnalysis mapRow(ResultSet resultSet, int i) throws SQLException {
+        ProjectAnalysis projectAnalysis = new ProjectAnalysis();
+        projectAnalysis.setProjectName(resultSet.getString("project_name"));
+//        projectAnalysis.setBelongProject(resultSet.getString("belong_name"));
+        projectAnalysis.setMonth(resultSet.getString("month"));
+//        projectAnalysis.setStatus(resultSet.getString("status"));
+//        projectAnalysis.setDLevel(resultSet.getString("d_level"));
+        projectAnalysis.setPredictIncome(resultSet.getBigDecimal("predict_income"));
+        projectAnalysis.setOpen(resultSet.getBigDecimal("open"));
+        projectAnalysis.setIncome(resultSet.getBigDecimal("income"));
+        projectAnalysis.setPerson(resultSet.getBigDecimal("person"));
+        projectAnalysis.setPersonCost(resultSet.getBigDecimal("person_cost"));
+        projectAnalysis.setMaterial(resultSet.getBigDecimal("material"));
+        projectAnalysis.setOtherCost(resultSet.getBigDecimal("other_cost"));
+        projectAnalysis.setCostSum(resultSet.getBigDecimal("cost_sum"));
+        projectAnalysis.setTaxes(resultSet.getBigDecimal("taxes"));
+        projectAnalysis.setGrossProfit(resultSet.getBigDecimal("gross_profit"));
+        projectAnalysis.setGrossMargin(resultSet.getBigDecimal("gross_margin"));
+        projectAnalysis.setOverhead(resultSet.getBigDecimal("overhead"));
+        projectAnalysis.setCorporateIncomeTax(resultSet.getBigDecimal("corporate_income_tax"));
+        projectAnalysis.setNetProfit(resultSet.getBigDecimal("net_profit"));
+        projectAnalysis.setNetMargin(resultSet.getBigDecimal("net_margin"));
+//        projectAnalysis.setFormat(resultSet.getString("format"));
+//        projectAnalysis.setCustomerSystem(resultSet.getString("customer_system"));
+//        projectAnalysis.setProfitLoss(resultSet.getString("profit_loss"));
+//        projectAnalysis.setApproachDate(resultSet.getString("approach_date"));
+//        projectAnalysis.setLevel(resultSet.getString("level"));
+//        projectAnalysis.setNotes(resultSet.getString("notes"));
+
+        return projectAnalysis;
+    }
+}

+ 58 - 11
mjava-lanyun/src/main/java/com/malk/lanyun/controller/TimerController.java

@@ -1,14 +1,32 @@
 package com.malk.lanyun.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.malk.lanyun.entity.ProjectAnalysis;
+import com.alibaba.fastjson.JSON;
+import com.malk.lanyun.entity.ProjectAnalysis;
+import com.malk.lanyun.service.NCService;
 import com.malk.lanyun.service.TimerService;
+import com.malk.server.common.McException;
 import com.malk.server.common.McR;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Dedicated;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilExcel;
+import com.malk.utils.UtilMap;
+import com.malk.utils.UtilString;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 错误抛出与拦截详见 CatchException
@@ -21,6 +39,10 @@ public class TimerController {
     @Autowired
     private TimerService timerService;
 
+    @Autowired
+    private NCService ncService;
+
+
     /**
      * 月度定额更新
      */
@@ -33,32 +55,57 @@ public class TimerController {
 
     @RequestMapping("test")
     McR test() {
+        return McR.success();
+    }
 
-        log.info("test");
+    @RequestMapping("testOne")
+    McR testOne() {
+        ncService.getNcInfo();
+        return McR.success();
+    }
+    @RequestMapping("testTwo")
+    McR testTwo() {
+        ncService.getNcCgInfo();
+        return McR.success();
+    }
+    @RequestMapping("testThree")
+    McR testThree() {
+        ncService.getNcCost();
+        return McR.success();
+    }
+    @RequestMapping("testFour")
+    McR testFour() {
+        ncService.getNcCollection();
+        return McR.success();
+    }
 
+    @RequestMapping("testFive")
+    McR testFive() {
+        ncService.getSupplierPay();
         return McR.success();
     }
 
     /**
      * 采购订单导出excel
-     * @param data
-     * @param response
-     * @param request
+     * @param data 前端传入数据
+     * @param response 响应头
+     * @param request  请求头
      */
     @PostMapping("exportExecl")
     void exportAttendance(@RequestBody Map data, HttpServletResponse response, HttpServletRequest request) {
-        timerService.execlExport(response,request);
+        timerService.execlExport(data,response,request);
     }
 
-
     /**
-     * 催款函
+     * 分组查询项目点经营分析报表
+     * @param data 传参年月
+     * @return 返回封装McR
      */
-    @GetMapping("sendReminderLetter")
-    public void updateBigOut() {
-        timerService.sendReminderLetter();
+    @PostMapping("projectAnalysisGroup")
+    McR<ProjectAnalysis> projectAnalysisGroup(@RequestBody Map<String,Object> data) {
+        List<ProjectAnalysis> projectAnalyses = timerService.projectAnalysisGroup(data);
+        return McR.success(projectAnalyses);
     }
 
 
-
 }

+ 39 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/entity/ProjectAnalysis.java

@@ -0,0 +1,39 @@
+package com.malk.lanyun.entity;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class ProjectAnalysis implements Serializable {
+    private String projectName;
+    private String belongProject;
+    private String month;
+    private String status;
+    private String dLevel;
+    private BigDecimal predictIncome;
+    private BigDecimal open;
+    private BigDecimal income;
+    private BigDecimal person;
+    private BigDecimal personCost;
+    private BigDecimal material;
+    private BigDecimal otherCost;
+    private BigDecimal costSum;
+    private BigDecimal taxes;
+    private BigDecimal grossProfit;
+    private BigDecimal grossMargin;
+    private BigDecimal overhead;
+    private BigDecimal corporateIncomeTax;
+    private BigDecimal netProfit;
+    private BigDecimal netMargin;
+    private String format;
+    private String customerSystem;
+    private String profitLoss;
+    private String approachDate;
+    private String level;
+    private String notes;
+
+}

+ 18 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/entity/SqlServerBean.java

@@ -0,0 +1,18 @@
+package com.malk.lanyun.entity;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "sqlserver")
+public class SqlServerBean {
+
+    private String username;
+    private String password;
+    private String url;
+
+
+}

+ 30 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/schedule/ScheduleTask.java

@@ -1,5 +1,6 @@
 package com.malk.lanyun.schedule;
 
+import com.malk.lanyun.service.SyncAssetsService;
 import com.malk.lanyun.service.TimerService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -7,6 +8,7 @@ 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 org.springframework.web.bind.annotation.GetMapping;
 
 import java.util.Date;
 
@@ -22,6 +24,8 @@ public class ScheduleTask {
     @Autowired
     private TimerService timerService;
 
+    @Autowired
+    private SyncAssetsService syncAssetsService;
     /**
      * 每月1日凌晨2点自动执行
      */
@@ -39,4 +43,30 @@ public class ScheduleTask {
         timerService.updateBigOut();
         log.info("定时方法执行时间 :" + new Date());
     }
+
+    /**
+     * 每月1日上午8点自动发起风控绩效流程
+     */
+    @Scheduled(cron = "0 0 8 1 * ?")
+    public void monthRiskMerits() {
+        timerService.monthRiskMerits();
+        log.info("定时方法执行时间 :" + new Date());
+    }
+
+    /**
+     * 各项目经营分析每月1日上午4点自动插入数据库
+     */
+    @Scheduled(cron = "0 0 4 1 * ?")
+    void insertAnalysisList(){
+        timerService.insertAnalysisList();
+    }
+
+    /**
+     * 每月1号 凌晨3点跑批计算净值
+     */
+    @Scheduled(cron = "0 0 3 1 * ?")
+    void synAssetsItem(){
+        syncAssetsService.SynAssetsItem();
+    }
+
 }

+ 22 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/NCService.java

@@ -0,0 +1,22 @@
+package com.malk.lanyun.service;
+
+public interface NCService {
+
+
+    //财务月度经营情况
+    void getNcInfo();
+
+
+    //月度物耗成本
+    void getNcCgInfo();
+
+    //大业主项目物料成本管控
+    void getNcCost();
+
+    //部门费用达成明细
+    void getNcCollection();
+
+    //供应商付款
+    void getSupplierPay();
+
+}

+ 8 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/SyncAssetsService.java

@@ -0,0 +1,8 @@
+package com.malk.lanyun.service;
+
+public interface SyncAssetsService {
+
+    void SynAssetsItem();
+
+
+}

+ 33 - 3
mjava-lanyun/src/main/java/com/malk/lanyun/service/TimerService.java

@@ -1,7 +1,12 @@
 package com.malk.lanyun.service;
 
+import com.malk.lanyun.entity.ProjectAnalysis;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Map;
 
 public interface TimerService {
 
@@ -10,12 +15,37 @@ public interface TimerService {
      */
     String updateYuedudinge();
 
+    /**
+     * 每月月初更新业主产值每月累计
+     */
     void updateBigOut();
 
+    /**
+     * 刷新版本数据
+     */
     void fresh();
-    void execlExport(HttpServletResponse response, HttpServletRequest request);
 
+    /**
+     * 采购订单档案导出
+     * @param data 前端传流程ID
+     * @param response 响应头
+     * @param request 请求头
+     */
+    void execlExport(Map data, HttpServletResponse response, HttpServletRequest request);
 
-    // 催款函
-    void sendReminderLetter();
+    /**
+     * 每月月初发起风控绩效流程
+     */
+    void monthRiskMerits();
+
+    /**
+     * 分组求和各项目经营分析
+     * @param data 分组条件
+     */
+    List<ProjectAnalysis> projectAnalysisGroup(Map<String, Object> data);
+
+    /**
+     * 每日同步各项目分析报表
+     */
+    void insertAnalysisList();
 }

+ 361 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/NCServiceImpl.java

@@ -0,0 +1,361 @@
+package com.malk.lanyun.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.malk.lanyun.entity.SqlServerBean;
+import com.malk.lanyun.service.NCService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Service;
+
+import java.sql.*;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class NCServiceImpl implements NCService {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private SqlServerBean sqlBean;
+
+
+    // 获取当前日期
+    LocalDate today = LocalDate.now();
+    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    @Override
+    public void getNcInfo() {
+        // 获取当前年
+        int year = today.getYear();
+
+        Connection connection = null;
+        Statement statement = null;
+        ResultSet resultSet = null;
+        try {
+            // 加载 JDBC 驱动
+            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+            // 建立连接
+            connection = DriverManager.getConnection(sqlBean.getUrl(), sqlBean.getUsername(), sqlBean.getPassword());
+            // 创建 Statement 对象
+            statement = connection.createStatement();
+
+            // 执行查询
+            String sql = "SELECT b.adjustperiod AS adjustperiod, b.pk_accasoa AS pk_accasoa, a.name AS accasoa_name, SUM ( b.creditamount ) AS creditamount\n" +
+                    "            FROM gl_detail b JOIN bd_accasoa a ON b.pk_accasoa = a.pk_accasoa WHERE  b.yearv = "+year+"\n" +
+                    "            AND b.accountcode IN ( '50010101', '500102', '500103', '500117', '500114', '500115', '500118', '500119', '500109', '500133' )\n" +
+                    "            AND b.pk_accountingbook IN ( SELECT pk_accountingbook FROM org_accountingbook WHERE code IN ( 'A01-0004', 'A02-0004', 'A03-0004', 'A04-0004', 'A05-0004', 'A06-0004', 'A10-0004', 'A11-0004' ) )\n" +
+                    "            GROUP BY b.adjustperiod,  b.pk_accasoa, a.name";
+
+            resultSet = statement.executeQuery(sql);
+
+            // 处理结果集
+            while (resultSet.next()) {
+                Map hashMap = new HashMap();
+
+                String yearAndNonth = year +"-"+resultSet.getString("adjustperiod");
+                hashMap.put("dateField_m0dkzhwp", UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                hashMap.put("textField_m0dkzhwo", yearAndNonth);
+                hashMap.put("textField_m0dkzhwu",resultSet.getString("pk_accasoa"));
+                hashMap.put("textField_m0dkzhwv",resultSet.getString("accasoa_name"));
+                hashMap.put("numberField_m0dkzhx1",resultSet.getBigDecimal("creditamount"));
+
+                log.info("yearv:"+UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                log.info("periodv:"+resultSet.getString("pk_accasoa"));
+                log.info("periodv:"+resultSet.getString("accasoa_name"));
+                log.info("creditamount:"+resultSet.getBigDecimal("creditamount"));
+
+                //写入月度项目经营情况
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                        .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                        .formUuid("FORM-D7FAD41DA72041ED96431F4219F082B7DTNH")
+                        .formDataJson(JSON.toJSONString(hashMap))
+                        .build(), YDConf.FORM_OPERATION.create);
+            }
+        } catch (Exception e) {
+            log.info("数据库连接异常"+e.toString());
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            try {
+                if (resultSet != null) resultSet.close();
+                if (statement != null) statement.close();
+                if (connection != null) connection.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public void getNcCgInfo() {
+        // 获取当前年
+        int year = today.getYear();
+
+        Connection connection = null;
+        Statement statement = null;
+        ResultSet resultSet = null;
+        try {
+            // 加载 JDBC 驱动
+            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+            // 建立连接
+            connection = DriverManager.getConnection(sqlBean.getUrl(), sqlBean.getUsername(), sqlBean.getPassword());
+
+            // 创建 Statement 对象
+            statement = connection.createStatement();
+
+            // 测试sql 执行查询
+            String sql = "SELECT b.adjustperiod AS adjustperiod, b.pk_accasoa AS pk_accasoa,a.name AS accasoa_name, SUM ( b.creditamount ) AS creditamount\n" +
+                    "            FROM gl_detail b JOIN bd_accasoa a ON b.pk_accasoa = a.pk_accasoa WHERE b.yearv = "+year+" AND b.accountcode IN ( '500114', '500115' )\n" +
+                    "            AND b.pk_accountingbook IN ( SELECT pk_accountingbook FROM org_accountingbook WHERE code IN ( 'A01-0004', 'A02-0004', 'A03-0004', 'A04-0004', 'A05-0004', 'A06-0004', 'A10-0004', 'A11-0004' ))\n" +
+                    "            GROUP BY b.adjustperiod,  b.pk_accasoa,  a.name";
+
+
+            resultSet = statement.executeQuery(sql);
+
+            while (resultSet.next()) {
+                Map hashMap = new HashMap();
+
+                String yearAndNonth = year +"-"+resultSet.getString("adjustperiod");
+                hashMap.put("dateField_m0dkzhwp", UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                hashMap.put("textField_m0dkzhwo", yearAndNonth);
+                hashMap.put("textField_m0dkzhwu",resultSet.getString("pk_accasoa"));
+                hashMap.put("textField_m0dkzhwv",resultSet.getString("accasoa_name"));
+                hashMap.put("numberField_m0dkzhx1",resultSet.getBigDecimal("creditamount"));
+
+                log.info("yearv:"+UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                log.info("periodv:"+resultSet.getString("pk_accasoa"));
+                log.info("periodv:"+resultSet.getString("accasoa_name"));
+                log.info("creditamount:"+resultSet.getBigDecimal("creditamount"));
+
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                        .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                        .formUuid("FORM-EC67BCB875264EE9AE25C9D663568CAFCYU6")
+                        .formDataJson(JSON.toJSONString(hashMap))
+                        .build(), YDConf.FORM_OPERATION.create);
+            }
+        } catch (Exception e) {
+            log.info("数据库连接异常"+e.toString());
+            e.printStackTrace();
+
+        } finally {
+            // 关闭资源
+            try {
+                if (resultSet != null) resultSet.close();
+                if (statement != null) statement.close();
+                if (connection != null) connection.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 大业主项目
+     */
+    @Override
+    public void getNcCost() {
+        // 获取当前年
+        int year = today.getYear();
+
+        Connection connection = null;
+        Statement statement = null;
+        ResultSet resultSet = null;
+        try {
+            // 加载 JDBC 驱动
+            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+            // 建立连接
+            connection = DriverManager.getConnection(sqlBean.getUrl(), sqlBean.getUsername(), sqlBean.getPassword());
+
+            // 创建 Statement 对象
+            statement = connection.createStatement();
+
+            // 测试sql 执行查询
+            String sql = "SELECT b.adjustperiod AS adjustperiod, b.pk_accasoa AS pk_accasoa,a.name AS accasoa_name, SUM ( b.creditamount ) AS creditamount\n" +
+                    "            FROM gl_detail b JOIN bd_accasoa a ON b.pk_accasoa = a.pk_accasoa WHERE b.yearv = "+year+" AND b.accountcode IN ( '500114', '500115' )\n" +
+                    "            AND b.pk_accountingbook IN ( SELECT pk_accountingbook FROM org_accountingbook WHERE code IN ( 'A01-0004', 'A02-0004', 'A03-0004', 'A04-0004', 'A05-0004', 'A06-0004', 'A10-0004', 'A11-0004' ))\n" +
+                    "            GROUP BY b.adjustperiod,  b.pk_accasoa,  a.name";
+
+
+            resultSet = statement.executeQuery(sql);
+
+            while (resultSet.next()) {
+                Map hashMap = new HashMap();
+
+                String yearAndNonth = year +"-"+resultSet.getString("adjustperiod");
+                hashMap.put("dateField_m0dkzhwp", UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                hashMap.put("textField_m0dkzhwo", yearAndNonth);
+                hashMap.put("textField_m0dkzhwu",resultSet.getString("pk_accasoa"));
+                hashMap.put("textField_m0dkzhwv",resultSet.getString("accasoa_name"));
+                hashMap.put("textField_m0eudqp0","大业主项目ID");
+                hashMap.put("textField_m0eudqp2","大业主项目名称");
+                hashMap.put("numberField_m0dkzhx1",resultSet.getBigDecimal("creditamount"));
+
+                log.info("yearv:"+UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                log.info("periodv:"+resultSet.getString("pk_accasoa"));
+                log.info("periodv:"+resultSet.getString("accasoa_name"));
+                log.info("creditamount:"+resultSet.getBigDecimal("creditamount"));
+
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                        .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                        .formUuid("FORM-87BF51F1E54D4D73A987939613D07BD5ZZE9")
+                        .formDataJson(JSON.toJSONString(hashMap))
+                        .build(), YDConf.FORM_OPERATION.create);
+            }
+        } catch (Exception e) {
+            log.info("数据库连接异常"+e.toString());
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            try {
+                if (resultSet != null) resultSet.close();
+                if (statement != null) statement.close();
+                if (connection != null) connection.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public void getNcCollection() {
+        // 获取当前年
+        int year = today.getYear();
+
+        Connection connection = null;
+        Statement statement = null;
+        ResultSet resultSet = null;
+        try {
+            // 加载 JDBC 驱动
+            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+            // 建立连接
+            connection = DriverManager.getConnection(sqlBean.getUrl(), sqlBean.getUsername(), sqlBean.getPassword());
+
+            // 创建 Statement 对象
+            statement = connection.createStatement();
+
+            // 测试sql 执行查询
+            String sql = "SELECT b.adjustperiod AS adjustperiod, b.pk_accasoa AS pk_accasoa,a.name AS accasoa_name, SUM ( b.creditamount ) AS creditamount\n" +
+                    "            FROM gl_detail b JOIN bd_accasoa a ON b.pk_accasoa = a.pk_accasoa WHERE b.yearv = "+year+" AND b.accountcode like '6602%' " +
+                    "            AND b.pk_accountingbook IN ( SELECT pk_accountingbook FROM org_accountingbook WHERE code IN ( 'A01-0004', 'A02-0004', 'A03-0004', 'A04-0004', 'A05-0004', 'A06-0004', 'A10-0004', 'A11-0004' ))\n" +
+                    "            GROUP BY b.adjustperiod,  b.pk_accasoa,  a.name";
+
+
+            resultSet = statement.executeQuery(sql);
+
+            while (resultSet.next()) {
+                Map hashMap = new HashMap();
+
+                String yearAndNonth = year +"-"+resultSet.getString("adjustperiod");
+                hashMap.put("dateField_m0dkzhwp", UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                hashMap.put("textField_m0dkzhwo", yearAndNonth);
+                hashMap.put("textField_m0dkzhwu",resultSet.getString("pk_accasoa"));
+                hashMap.put("textField_m0dkzhwv",resultSet.getString("accasoa_name"));
+                hashMap.put("textField_m0eudqp0","部门");
+                hashMap.put("numberField_m0dkzhx1",resultSet.getBigDecimal("creditamount"));
+
+                log.info("yearv:"+UtilDateTime.parse(yearAndNonth,"yyyy-MM"));
+                log.info("periodv:"+resultSet.getString("pk_accasoa"));
+                log.info("periodv:"+resultSet.getString("accasoa_name"));
+                log.info("creditamount:"+resultSet.getBigDecimal("creditamount"));
+
+
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                        .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                        .formUuid("FORM-5654B7C22E7546E9BBE7B4EF46DE08BAXZXU")
+                        .formDataJson(JSON.toJSONString(hashMap))
+                        .build(), YDConf.FORM_OPERATION.create);
+            }
+        } catch (Exception e) {
+            log.info("数据库连接异常"+e.toString());
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            try {
+                if (resultSet != null) resultSet.close();
+                if (statement != null) statement.close();
+                if (connection != null) connection.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public void getSupplierPay() {
+        // 获取当前年
+        int year = today.getYear();
+        LocalDate firstDayOfYear = LocalDate.of(year, 1, 1);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String formattedBeginDate = firstDayOfYear.format(formatter);
+        Connection connection = null;
+        Statement statement = null;
+        ResultSet resultSet = null;
+
+        try {
+            // 加载 JDBC 驱动
+            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+            // 建立连接
+            connection = DriverManager.getConnection(sqlBean.getUrl(), sqlBean.getUsername(), sqlBean.getPassword());
+
+            // 创建 Statement 对象
+            statement = connection.createStatement();
+
+            // 测试sql 执行查询
+            String sql = "EXECUTE GetAccountDetails  @IncrementFlag = 0, @BeginDate ='"+formattedBeginDate+"'  ";
+
+
+            resultSet = statement.executeQuery(sql);
+
+            while (resultSet.next()) {
+                Map hashMap = new HashMap();
+
+                String years =resultSet.getString("yearv");
+                hashMap.put("dateField_lzuyn2l8", UtilDateTime.parse(years,"yyyy"));
+                hashMap.put("textField_m0g4itw4", years);
+                hashMap.put("textField_m0g4itw6",resultSet.getString("SupplierCode"));
+                hashMap.put("textField_m0g4itw5",resultSet.getString("SupplierName"));
+                hashMap.put("numberField_m0g4itw7",resultSet.getBigDecimal("BeginMoney")); //期初金额
+                hashMap.put("numberField_m0g4itw8",resultSet.getBigDecimal("InvoiceMoney")); //本年到票金额
+                hashMap.put("numberField_m0g4itw9",resultSet.getBigDecimal("PayMoney"));//到票已付累计
+                hashMap.put("numberField_m0g4itwb",resultSet.getBigDecimal("SumPayMoney")); //到票未付累计
+                hashMap.put("numberField_m0g4itwa",resultSet.getBigDecimal("EstimationMoney")); //暂估金额
+
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                        .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                        .formUuid("FORM-09CDC75CDC6048379567EC87ED6CE7B6T8PP")
+                        .formDataJson(JSON.toJSONString(hashMap))
+                        .build(), YDConf.FORM_OPERATION.create);
+            }
+        } catch (Exception e) {
+            log.info("数据库连接异常"+e.toString());
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            try {
+                if (resultSet != null) resultSet.close();
+                if (statement != null) statement.close();
+                if (connection != null) connection.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 75 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/SyncAssetsImpl.java

@@ -0,0 +1,75 @@
+package com.malk.lanyun.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.malk.lanyun.service.SyncAssetsService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+
+@Service
+@Slf4j
+public class SyncAssetsImpl implements SyncAssetsService {
+
+    @Autowired
+    private YDClient ydClient;
+
+    //同步资产档案净值
+    @Override
+    public void SynAssetsItem() {
+
+        YDParam ydParam = new YDParam();
+        ydParam = YDParam.builder()
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                .formUuid("FORM-F3695066AABE41F6AF241489F8558ACA78OI")  //资产档案
+                .formInstId("FINST-G9766T71XRHMWPDI7JZFU6GVQ1X83AMR8B4YLQM1")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lu2eb47g","否")))//护理对象暂停和正常、月度计划创建只查询正常的护理计划
+                .build();
+        //pagesize设为1获取总数
+        ydParam.setPageSize(1);
+        long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
+        float pageSize = 50;
+        ydParam.setCurrentPage(1);
+        ydParam.setPageSize((int) pageSize);
+        List<Map> dataList = new ArrayList<>();
+        for (int page = 1; page <= Math.ceil(totalCount / pageSize); page++) {
+            ydParam.setCurrentPage(page);
+            //  1次获取50条
+            dataList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
+            dataList.forEach(dataItem -> {
+                Map formMap = (Map) dataItem.get("formData");
+
+                float metValue = UtilMap.getFloat((Map) formMap,"numberField_lu2ejqd4");
+                float depreciation = UtilMap.getFloat((Map) formMap,"numberField_lu2eb47d");
+
+                if (metValue>0 && depreciation>0){
+                    log.info("metValue:"+metValue);
+                    log.info("depreciation:"+depreciation);
+                    float updateDepreciation = metValue - depreciation;
+                    // 更新
+                    ydClient.operateData(YDParam.builder()
+                            .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                            .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                            .formInstanceId((String) dataItem.get("formInstanceId"))
+                            .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_lu2ejqd4",updateDepreciation)))
+                            .build(), YDConf.FORM_OPERATION.update);
+                }
+
+
+            });
+        }
+
+    }
+}

+ 310 - 38
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/TimerServiceImpl.java

@@ -3,22 +3,30 @@ package com.malk.lanyun.service.impl;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.lanyun.Mapper.ProjectAnalysisMapper;
+import com.malk.lanyun.entity.ProjectAnalysis;
 import com.malk.lanyun.service.TimerService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
-import com.malk.service.dingtalk.DDClient;
-import com.malk.service.dingtalk.DDClient_Contacts;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilExcel;
 import com.malk.utils.UtilMap;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -26,7 +34,16 @@ import java.util.*;
 @Service
 @Slf4j
 public class TimerServiceImpl implements TimerService {
-
+    @Value("${spring.datasource.url}")
+    private String url;
+    @Value("${spring.datasource.username}")
+    private String username;
+    @Value("${spring.datasource.password}")
+    private String password;
+    @Value("${spring.datasource.driver-class-name}")
+    private String driver;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
     @Autowired
     private YDService ydService;
 
@@ -179,10 +196,9 @@ public class TimerServiceImpl implements TimerService {
                 .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lrnd0lxr", "小业主")))
                 .build());
         log.info("小业主档案_测试, {}", dataList.size());
-        List<Map> testlist = new  ArrayList<>();
         dataList.forEach(e -> {
             log.info("e1:{}",e.toString());
-                List<Map> list = (List<Map>) e.get("tableField_lr3dmdpk");
+            List<Map> list = (List<Map>) e.get("tableField_lr3dmdpk");
             if (ObjectUtil.isNotNull(e.get("tableField_lr3dmdpk"))){
                 list.forEach(v->{
                     if (v.size()>3){
@@ -198,21 +214,25 @@ public class TimerServiceImpl implements TimerService {
                     .appType("APP_ERBDTFS82HOVBPL3NFH0")
                     .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
                     .formInstanceId(UtilMap.getString(e, "formInstanceId"))
-//                    .useLatestVersion(true)
-                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lr3dmdpk", list)))
+                    .useLatestVersion(true)
+                    .updateFormDataJson(JSONObject.toJSONString(new HashMap<>()))
+//                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lr3dmdpk", list)))
                     .build(), YDConf.FORM_OPERATION.update);
         });
     }
 
     @Override
-    public void execlExport(HttpServletResponse response, HttpServletRequest request) {
-//        data.put("page", 1);
-//        data.put("size", Integer.MAX_VALUE);
+    public void execlExport(Map data,HttpServletResponse response, HttpServletRequest request) {
+        if (data.isEmpty()){
+            return;
+        }
+        String formInstId = data.get("formInstId").toString();
+        log.info("已获取流程实例ID为:{}",data.get("formInstId").toString());
         // 动态表头模板导出
         Map formData = ydClient.queryData(YDParam.builder()
                         .appType("APP_ERBDTFS82HOVBPL3NFH0")
                         .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
-                        .formInstanceId("FINST-8A666OD1MXUM0RFMCLG6XDA2H5MY2NPY2WNYLJ31")
+                        .formInstanceId(formInstId)
                         .build(),
                 YDConf.FORM_QUERY.retrieve_id).getFormData();
         log.info("formData:{}",formData);
@@ -227,45 +247,297 @@ public class TimerServiceImpl implements TimerService {
         });
         Map<String, String> dataMain = UtilMap.map(keys[0], valuses[0]);
         log.info("dataMain:{}",dataMain);
-        String fileName = dataMain.get("textField_ltxyt75m") + dataMain.get("textField_lz2fk0wc") + "采购订单";
+        String fileName = dataMain.get("textField_lr26y1io") + dataMain.get("textField_lz2fk0wc") + "采购订单";
 
         List<Map> dataList = (List<Map>) formData.get("tableField_ltxyt76f");
+        for (int i = 0; i < dataList.size(); i++) {
+            dataList.get(i).put("row",i+1);
+        }
         log.info("dataList:{}",dataList);
-        UtilExcel.exportMapAndListByTemplate(response, dataMain, dataList, Map.class, fileName, "Template_days.xlsx");
-    }
+        String text = "一、订单说明:\n" +
+                "1.供应商需按订单内容,向采购方按时、按量提供质量合格的商品(如一张订单分多次送货的,将以末次送货时间作为该订单的送货时间)。\n" +
+                "2.供应商配送物品与订单不符,采购方接收人有权拒收、要求换货或给与相应的赔偿。\n" +
+                "3.供应商未按订单约定时间配送物品,需按照订单总价的5%作为单日违约金,按照延迟天数向采购方支付。\n" +
+                "4.供应商送货时,需向采购方接收人提供供应商送货签收单据的客户联,采购方将作为付款的书面依据留存。\n" +
+                "5.供应商完成物品配送后,5个工作日内需向采购方提交与订单内容相符的增值税专用发票。\n" +
+                "6.采购方在收到供应商提供的与订单相符的物品及相应发票和单据后,将按照双方约定的付款周期支付货款。\n" +
+                "7.采购方以传真和邮件方式,向供应商提供《采购订单》;供应商接收《采购订单》后,需以传真或邮件方式进行签收。\n" +
+                "8.采购方以供应商传真或邮件签收,作为该《采购订单》正式履行的依据。\n" +
+                "9.采购订单作为供需双方的日常业务办理依据,双方合作的相关法律依据以双方签订的合作协议为准。\n" +
+                "10.严禁除采购以外的任何人员直接向供应商订购物资,如供应商在未收到采购订单的情况下进行物资配送,采购一律不予结算该账款。\n" +
+                "严禁供应商向除采购方以外的任何第三方泄露采购单价,造成采购方名誉、信誉、财产的一切损失将由供应商承担。\n" +
+                "二、备注:采购订单敲章后与发票一起寄回,以便后期确认。\n" +
+                "发票寄送地址:上海市宝山区双城路803弄宝莲城9号楼27层\n" +
+                "联系人:浦水菊  联系电话:60671366  转 828";
+        dataMain.put("text",text);
+        int numSum = dataList.stream().mapToInt(e -> e.get("numberField_ltxyt75z").toString().equals("") ? 0 : Integer.parseInt(e.get("numberField_ltxyt75z").toString())).sum();
+        Double sumTotal = dataList.stream().mapToDouble(e -> e.get("numberField_ltxyt764").toString().equals("") ? 0 : Double.parseDouble(e.get("numberField_ltxyt764").toString())).sum();
+        dataMain.put("num_sum",String.valueOf(numSum));
+        dataMain.put("sum_total",String.valueOf(sumTotal));
 
+        UtilExcel.exportMapAndListByTemplate(response, dataMain, dataList, Map.class, fileName, "Template.xlsx");
+    }
 
-    /**
-     * 应收款通知:
-     * 	每月10日,拉取上月底之前开票档案,已开未有任何回款数据。按照客户纬度汇总生成催款单据
-     *  - 只要有已回款,则不在通知
-     *  - 红字发票不需要通知
-     */
     @Override
-    public void sendReminderLetter() {
-
+    public void monthRiskMerits() {
+        // 获取月初日期
+        long beginTime = DateUtil.beginOfMonth(new Date()).getTime();
         List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
-                .formUuid("FORM-6603375ED27B4D059CBB919C2BEFA44BZVOL")
-                .searchCondition(JSON.toJSONString(UtilMap.map("radioField_m06hhw2p, selectField_lvituew9", "未回款", "正常")))
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                .formUuid("FORM-0536AD7797894C94BCAC4BAC0BBBE86BUQE1")
+//                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lrnd0lxr", "小业主")))
                 .build());
+        dataList.forEach(e->{
+            log.info(e.toString());
+            String department = e.get("departmentSelectField_ls2tx0tf_id").toString();
+            log.info("部门:{}",department);
+            String header = e.get("employeeField_ls2tx0tg_id").toString();
+            log.info("负责人:{}",header);
+            List<Map> tableList = (List<Map>) e.get("tableField_ls2tx0tl");
+            if (tableList.size()>0) {
+                tableList.forEach(f->{
+                    f.forEach((k,v)->{
+                        if (k.toString().equals("textField_ls2tx0tn")){
+                            f.put("textField_ls2u8mc7",v);
+                            f.remove(k);
+                        }
+                    });
+                });
+            }
+            /*关联表单控件*/
+            JSONArray jsonArray = new JSONArray();
+            Map<String, Object> jsonMap = UtilMap.map("appType, formUuid, formType, instanceId, title",
+                    "APP_ERBDTFS82HOVBPL3NFH0","FORM-0536AD7797894C94BCAC4BAC0BBBE86BUQE1","receipt",e.get("instanceId"),e.get("textField_ls2upvtq"));
+            JSONObject jsonObject = new JSONObject(jsonMap);
+            jsonArray.add(jsonObject);
+            /*发起流程*/
+            ydClient.operateData(YDParam.builder()
+                    .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                    .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                    .formUuid("FORM-A4B37CFEB8524947939C00523373532BT3TH")
+                    .formDataJson(JSON.toJSONString(UtilMap.map("dateField_ls2u8mbv, departmentSelectField_ls2u8mbw, employeeField_ls2u8mbx, tableField_ls2u8mc6, associationFormField_ls2u8mcb, dateField_ls1ky8c5, employeeField_ls1ky8c3",
+                            beginTime,department,header,tableList,jsonArray,beginTime,YDConf.PUB_ACCOUNT)))
+                    .build(), YDConf.FORM_OPERATION.start);
+        });
+    }
 
-        // 数据字典
-        UtilMap.map("大业主, 小业主, 工程订单, 日保一次性",
-                UtilMap.map("table, content", "tableField_lvc9x4vt, textField_lvd8pp2t"),
-                UtilMap.map("table, content", "tableField_lvd8pp44, textField_lvd8pp3w"),
-                UtilMap.map("table, content", "tableField_lvdnme13, textField_lvdnme0u")
-        );
-        // 按照客户维度
-        dataList.forEach(e -> {
+    @SneakyThrows
+    @Override
+    public List<ProjectAnalysis> projectAnalysisGroup(Map<String, Object> data){
+        final String[] sql = {"",""};
+        int pageStart = (Integer.parseInt(data.get("page").toString()) - 1) * Integer.parseInt(data.get("num").toString());
+        int pageEnd = Integer.parseInt(data.get("page").toString()) * Integer.parseInt(data.get("num").toString());
+        data.remove("page");
+        data.remove("num");
+        if (!data.containsKey("month")){
+            sql[0] = "SELECT " +
+                    " `month`, " +
+                    " sum( predict_income ) predict_income," +
+                    " NULL as project_name, " +
+                    " SUM( `open` ) `open`, " +
+                    " SUM( income ) income, " +
+                    " SUM( person ) person, " +
+                    " SUM( person_cost ) person_cost, " +
+                    " SUM( material ) material, " +
+                    " SUM( other_cost ) other_cost, " +
+                    " SUM( cost_sum ) cost_sum, " +
+                    " SUM( taxes ) taxes, " +
+                    " SUM( gross_profit ) gross_profit, " +
+                    " SUM( gross_profit )/ SUM( income ) gross_margin, " +
+                    " SUM( overhead ) overhead, " +
+                    " SUM( corporate_income_tax ) corporate_income_tax, " +
+                    " SUM( net_profit ) net_profit, " +
+                    " SUM( net_profit )/ SUM( income ) net_margin  " +
+                    "FROM " +
+                    " lanyun_project_analysis  " +
+                    " WHERE 1=1 " ;
+            if (ObjectUtil.isNotNull(data.get("startDate"))) {
+                sql[0] = sql[0] + " AND `month` >= \"" + data.get("startDate") +"\" " ;
+                sql[1] = sql[1] + " AND `month` >= \"" + data.get("startDate") +"\" " ;
+            } else if (ObjectUtil.isNotNull(data.get("endDate"))) {
+                sql[0] = sql[0] + " AND `month` <= \"" + data.get("endDate") +"\" " ;
+                sql[1] = sql[1] + " AND `month` <= \"" + data.get("endDate") +"\" " ;
+            }
+            sql[0] = sql[0] +
+                    " GROUP BY " +
+                    " `month`" +
+                    " order by `month` DESC LIMIT " + pageStart + "," + pageEnd;
+            sql[1]= "SELECT " +
+                    " '合计' as `month` , " +
+                    " sum( predict_income ) predict_income," +
+                    " NULL as project_name, " +
+                    " SUM( `open` ) `open`, " +
+                    " SUM( income ) income, " +
+                    " SUM( person ) person, " +
+                    " SUM( person_cost ) person_cost, " +
+                    " SUM( material ) material, " +
+                    " SUM( other_cost ) other_cost, " +
+                    " SUM( cost_sum ) cost_sum, " +
+                    " SUM( taxes ) taxes, " +
+                    " SUM( gross_profit ) gross_profit, " +
+                    " SUM( gross_profit )/ SUM( income ) gross_margin, " +
+                    " SUM( overhead ) overhead, " +
+                    " SUM( corporate_income_tax ) corporate_income_tax, " +
+                    " SUM( net_profit ) net_profit, " +
+                    " SUM( net_profit )/ SUM( income ) net_margin  " +
+                    "FROM " +
+                    " lanyun_project_analysis  " ;
+        }else {
+            sql[0] = "SELECT " +
+                    " `month`," +
+                    "  project_name, " +
+                    "  predict_income, " +
+                    "  `open`, " +
+                    "  income, " +
+                    "  person, " +
+                    "  person_cost, " +
+                    "  material, " +
+                    "  other_cost, " +
+                    "  cost_sum, " +
+                    "  taxes, " +
+                    "  gross_profit, " +
+                    "  gross_margin, " +
+                    "  overhead, " +
+                    "  corporate_income_tax, " +
+                    "  net_profit, " +
+                    "  net_margin  " +
+                    "FROM " +
+                    " lanyun_project_analysis " +
+                    " WHERE 1=1";
+            sql[1] = "SELECT " +
+                    " '合计' as `month`, " +
+                    " sum( predict_income ) predict_income," +
+                    " NULL as project_name, " +
+                    " SUM( `open` ) `open`, " +
+                    " SUM( income ) income, " +
+                    " SUM( person ) person, " +
+                    " SUM( person_cost ) person_cost, " +
+                    " SUM( material ) material, " +
+                    " SUM( other_cost ) other_cost, " +
+                    " SUM( cost_sum ) cost_sum, " +
+                    " SUM( taxes ) taxes, " +
+                    " SUM( gross_profit ) gross_profit, " +
+                    " SUM( gross_profit )/ SUM( income ) gross_margin, " +
+                    " SUM( overhead ) overhead, " +
+                    " SUM( corporate_income_tax ) corporate_income_tax, " +
+                    " SUM( net_profit ) net_profit, " +
+                    " SUM( net_profit )/ SUM( income ) net_margin  " +
+                    " FROM " +
+                    " lanyun_project_analysis  " +
+                    " WHERE 1=1 ";
 
-            String type = UtilMap.getString(e, "selectField_lvc9x4vn");
+            if (data.containsKey("startDate") || data.containsKey("endDate")){
+                data.remove("month");
+            }
+            data.forEach((k,v)->{
+                if (k.equals("low") && ObjectUtil.isNotNull(v)){
+                    sql[0] = sql[0] + " AND `net_margin` < 0.05" ;
+                    sql[1] = sql[1] + " AND `net_margin` < 0.05" ;
+                } else if (ObjectUtil.isNotNull(v) && k.equals("startDate")) {
+                    sql[0] = sql[0] + " AND `month` >= \"" + v +"\"" ;
+                    sql[1] = sql[1] + " AND `month` >= \"" + v +"\"" ;
+                } else if (ObjectUtil.isNotNull(v) && k.equals("endDate")) {
+                    sql[0] = sql[0] + " AND `month` <= \"" + v +"\"" ;
+                    sql[1] = sql[1] + " AND `month` <= \"" + v +"\"" ;
+                } else if (ObjectUtil.isNotNull(v) && !k.equals("low")){
+                    sql[0] = sql[0] + " AND `" + k +"` = \"" + v +"\"" ;
+                    sql[1] = sql[1] + " AND `" + k +"` = \"" + v +"\"" ;
+                }
+            });
+            sql[1] = sql[1] +  " GROUP BY `month` ";
+            sql[0] = sql[0] +  "  order by `month` DESC LIMIT " + pageStart + "," + pageEnd;
+        }
+//        Class.forName(driver);
+//        Connection connection = DriverManager.getConnection(url, username, password);
+//        Statement statement = connection.createStatement();
+        List<ProjectAnalysis> analysisList = jdbcTemplate.query(sql[0], new ProjectAnalysisMapper());
+        List<ProjectAnalysis> analysisSum= jdbcTemplate.query(sql[1], new ProjectAnalysisMapper());
+        analysisList.add(analysisSum.get(0));
+        log.info("results:{}",analysisList);
+        if (ObjectUtil.isNotNull(analysisList)&&analysisList.size()>0){
+            return analysisList;
+        }
+        else {
+            return null;
+        }
+    }
 
+    @Override
+    public void insertAnalysisList() {
+        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                .formUuid("FORM-954C78969A864D95A1BC0CE9F69299E8VI38")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("radioField_m0dkcxod", "否")))
+                .build());
 
-            String invoiceNo = UtilMap.getString(e, "textField_m06ij3z9");
-            String invoiceDate = UtilMap.getString(e, "dateField_m06ij3zc");
-            String amount = UtilMap.getString(e, "numberField_m06ij3zf");
-            String customerName = UtilMap.getString(e, "textField_m06ij3z8");
-        });
+        Connection connection = null;
+        PreparedStatement ps = null;
+        try {
+            Class.forName(driver);
+            connection = DriverManager.getConnection(url, username, password);
+            String sql = "INSERT INTO `lanyun_project_analysis`(`project_name`, `belong_project`, `month`, " +
+                    "`status`, `predict_income`, `open`, `income`, `person`, `person_cost`, `material`, `other_cost`, " +
+                    "`cost_sum`, `taxes`, `gross_profit`, `gross_margin`, `overhead`, `corporate_income_tax`, `net_profit`, " +
+                    "`net_margin`, `format`, `customer_system`, `profit_loss`, `approach_date`, `level`, `notes`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
 
+            ps = connection.prepareStatement(sql);
+            for (int i = 0; i < dataList.size(); i++) {
+                ps.setObject(1,dataList.get(i).get("textField_dliiyul"));
+                ps.setObject(2,dataList.get(i).get("textField_bheotm5"));
+                ps.setObject(3,dataList.get(i).get("dateField_lcwv382"));
+                ps.setObject(4,dataList.get(i).get("textField_pa6o780"));
+                ps.setObject(5,dataList.get(i).get("numberField_5wyyb42"));
+                ps.setObject(6,dataList.get(i).get("numberField_c4acnrg"));
+                ps.setObject(7,dataList.get(i).get("numberField_zjdki9k"));
+                ps.setObject(8,dataList.get(i).get("numberField_hg6jznm"));
+                ps.setObject(9,dataList.get(i).get("numberField_7ga9c5w"));
+                ps.setObject(10,dataList.get(i).get("numberField_c3cqsfv"));
+                ps.setObject(11,dataList.get(i).get("numberField_avaexyf"));
+                ps.setObject(12,dataList.get(i).get("numberField_gub2ul5"));
+                ps.setObject(13,dataList.get(i).get("numberField_hqiac12"));
+                ps.setObject(14,dataList.get(i).get("numberField_lz6mt3xq"));
+                ps.setObject(15,dataList.get(i).get("numberField_lz9n3fm9"));
+                ps.setObject(16,dataList.get(i).get("numberField_ln701sy"));
+                ps.setObject(17,dataList.get(i).get("numberField_fmhzxdr"));
+                ps.setObject(18,dataList.get(i).get("numberField_lz6mt3xr"));
+                ps.setObject(19,dataList.get(i).get("numberField_lz9n3fma"));
+                ps.setObject(20,dataList.get(i).get("textField_tpb3m2f"));
+                ps.setObject(21,dataList.get(i).get("textField_2adicsn"));
+                double net_margin = Double.parseDouble(dataList.get(i).get("numberField_lz9n3fma").toString());
+                String profit_loss = "";
+                if (net_margin < 0){
+                    profit_loss = "亏损";
+                }else if (net_margin >=0 && net_margin <=0.05){
+                    profit_loss = "净利较低";
+                }else if(net_margin > 0.05){
+                    profit_loss = "盈利";
+                }
+                ps.setObject(22,dataList.get(i).get("textField_1yw4mx4") == null ? null : profit_loss);
+                ps.setObject(23,dataList.get(i).get("dateField_ji5yfvf"));
+                ps.setObject(24,dataList.get(i).get("textField_h2qx5nz"));
+                ps.setObject(25,dataList.get(i).get("textField_35paoph"));
+                ps.addBatch();
+                if (i%500==0){
+                    ps.executeBatch();
+                    ps.clearBatch();
+                }
+            }
+            ps.executeBatch();
+            connection.close();
+        } catch (Exception exception) {
+            throw new RuntimeException(exception);
+        }
+        dataList.forEach(e->{
+            ydClient.operateData(YDParam.builder()
+                    .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                    .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                    .formInstanceId(UtilMap.getString(e, "formInstanceId"))
+//                    .useLatestVersion(true)
+//                    .updateFormDataJson(JSONObject.toJSONString(new HashMap<>()))
+                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("radioField_m0dkcxod", "是")))
+                    .build(), YDConf.FORM_OPERATION.update);
+        });
     }
 }

+ 20 - 14
mjava-lanyun/src/main/resources/application-dev.yml

@@ -25,17 +25,17 @@ spring:
     database: MYSQL
     database-platform: org.hibernate.dialect.MySQL57Dialect
 
-# filepath
-#file:
-#  path:
-#    file: /Users/malk/server/_Tool/var/mjava/tmp/file
-#    image: /Users/malk/server/_Tool/var/mjava/tmp/image
-#    tmp: /Users/malk/server/_Tool/var/mjava/tmp
-#  source:
-#    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
-#logging:
-#  file:
-#    path: /Users/malk/server/_Tool/var/mjava/log
+#filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
 
 # dingtalk
 dingtalk:
@@ -43,6 +43,12 @@ dingtalk:
   appKey: dingfwn4kpmb4g3dy4fj
   appSecret: OwdkUc9nvBivpwsg0AiaEcyWLtZ678fskqBJwP7B5CQNrycIoyKuWslFTCOOaZG4
   corpId: dingef2eb0ecba261b8935c2f4657eb6378f
-  aesKey: VjFDthsijenVQdqB7wjfQGVNemIBkNixyqzsPHfX9IG
-  token: 3PYhnTADhUjTD
-  operator: ""   # OA管理员账号 [首字符若为0需要转一下字符串]
+  aesKey:
+  token:
+  operator: ""   # OA管理员账号 [首字符若为0需要转一下字符串]
+
+#SqlServer
+sqlserver:
+  url: jdbc:sqlserver://58.246.128.122:2433;databaseName=lanyun
+  username: sa
+  password: "!lanyunnc@2023#"

+ 8 - 1
mjava-lanyun/src/main/resources/application-prod.yml

@@ -22,6 +22,7 @@ spring:
     database: MYSQL
     database-platform: org.hibernate.dialect.MySQL57Dialect
 
+
 # dingtalk
 dingtalk:
   agentId: 2871877887
@@ -30,4 +31,10 @@ dingtalk:
   corpId: dingef2eb0ecba261b8935c2f4657eb6378f
   aesKey:
   token:
-  operator: ""   # OA管理员账号 [首字符若为0需要转一下字符串]
+  operator: ""   # OA管理员账号 [首字符若为0需要转一下字符串]
+
+
+sqlserver:
+  url: jdbc:sqlserver://192.168.0.237:1433;databaseName=lanyun
+  userName: sa
+  password: "LANyunnc!2024#"

二进制
mjava-lanyun/src/main/resources/templates/Purchase_order.xlsx


二进制
mjava-lanyun/src/main/resources/templates/Template.xlsx


+ 22 - 3
mjava-lanyun/src/test/java/test.java

@@ -1,24 +1,43 @@
+import com.alibaba.fastjson.JSON;
 import com.malk.lanyun.Boot;
 import com.malk.lanyun.service.TimerService;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilMap;
+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;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
 
+@Slf4j
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = Boot.class)
 public class test {
     @Resource
     private TimerService timerService;
+    @Autowired
+    private YDService ydService;
 
     @Test
     public void testt(){
-        HttpServletRequest httpServletRequest = null;
-        HttpServletResponse httpServletResponse = null;
-        timerService.execlExport(httpServletResponse, httpServletRequest);
+        timerService.fresh();
+    }
+    @Test
+    public void testService(){
+        List<Map> maps = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                .formUuid("FORM-38649DA9003B48F4A7DC476122E4D6C1JNKU")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("numberField_lu24bwd0", "0")))
+                .build());
+        log.info("maps:{}",maps.toString());
     }
 }