فهرست منبع

员工产量统计功能

wukai 3 ماه پیش
والد
کامیت
7f54745410

+ 83 - 0
jjt-admin/src/main/resources/application-devt.yml

@@ -0,0 +1,83 @@
+# 数据源配置
+spring:
+  # redis 配置
+  redis:
+    # 地址
+    host: localhost
+    # 端口,默认为6379
+    port: 36379
+    # 数据库索引
+    database: 0
+    # 密码
+    password: redis@123
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    druid:
+      # 主库数据源
+      master:
+        url: jdbc:sqlserver://192.168.188.88:1433;DataBaseName=twin2025
+        username: sa
+        password: abcd@1234
+      # 从库数据源
+      slave:
+        # 从数据源开关/默认关闭
+        enabled: false
+        url:
+        username:
+        password:
+      # 初始连接数
+      initialSize: 5
+      # 最小连接池数量
+      minIdle: 10
+      # 最大连接池数量
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置连接超时时间
+      connectTimeout: 30000
+      # 配置网络超时时间
+      socketTimeout: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      # 配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 900000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        url-pattern: /druid/*
+        # 控制台管理用户名和密码
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 慢SQL记录
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true

+ 3 - 3
jjt-admin/src/main/resources/application-test.yml

@@ -3,9 +3,9 @@ spring:
   # redis 配置
   redis:
     # 地址
-    host: localhost
+    host: 192.168.188.66
     # 端口,默认为6379
-    port: 36379
+    port: 6379
     # 数据库索引
     database: 0
     # 密码
@@ -28,7 +28,7 @@ spring:
     druid:
       # 主库数据源
       master:
-        url: jdbc:sqlserver://192.168.188.88:1433;DataBaseName=twin2025
+        url: jdbc:sqlserver://192.168.188.66:1433;DataBaseName=twin2025
         username: sa
         password: abcd@1234
       # 从库数据源

+ 32 - 0
jjt-biz/src/main/java/com/jjt/biz/vo/EmpCalcEmpVO.java

@@ -0,0 +1,32 @@
+package com.jjt.biz.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 员工产量统计对象 TWIN_EMP_CALC
+ *
+ * @author wukai
+ * @date 2025-01-18
+ */
+@ApiModel(value = "TwinEmpCalcVO", description = "员工产量统计VO")
+@Data
+public class EmpCalcEmpVO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("姓名")
+    private String empName;
+
+    @ApiModelProperty("稼动率")
+    private BigDecimal efficiency;
+
+    @ApiModelProperty("产量")
+    private BigDecimal length;
+
+    @ApiModelProperty("总价")
+    private BigDecimal totalPrice;
+
+}

+ 47 - 0
jjt-biz/src/main/java/com/jjt/biz/vo/EmpCalcTrendVO.java

@@ -0,0 +1,47 @@
+package com.jjt.biz.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 员工产量统计对象 TWIN_EMP_CALC
+ *
+ * @author wukai
+ * @date 2025-01-18
+ */
+@ApiModel(value = "TwinEmpCalcVO", description = "员工产量统计VO")
+@Data
+public class EmpCalcTrendVO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date empDate;
+
+    @ApiModelProperty("稼动率")
+    private BigDecimal efficiency;
+    @ApiModelProperty("A班稼动率")
+    private BigDecimal efficiencyA;
+    @ApiModelProperty("B班稼动率")
+    private BigDecimal efficiencyB;
+
+    @ApiModelProperty("产量")
+    private BigDecimal length;
+    @ApiModelProperty("A班产量")
+    private BigDecimal lengthA;
+    @ApiModelProperty("B班产量")
+    private BigDecimal lengthB;
+
+    @ApiModelProperty("总价")
+    private BigDecimal totalPrice;
+    @ApiModelProperty("A班总价")
+    private BigDecimal totalPriceA;
+    @ApiModelProperty("B班总价")
+    private BigDecimal totalPriceB;
+
+}

+ 106 - 1
jjt-biz/src/main/java/com/jjt/emp/controller/TwinEmpCalcController.java

@@ -1,5 +1,7 @@
 package com.jjt.emp.controller;
 
+import com.jjt.biz.vo.EmpCalcEmpVO;
+import com.jjt.biz.vo.EmpCalcTrendVO;
 import com.jjt.common.annotation.Log;
 import com.jjt.common.core.controller.BaseController;
 import com.jjt.common.core.domain.AjaxResult;
@@ -11,12 +13,17 @@ import com.jjt.emp.domain.TwinEmpCalc;
 import com.jjt.emp.service.ITwinEmpCalcService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 员工产量统计Controller
@@ -37,6 +44,104 @@ public class TwinEmpCalcController extends BaseController {
         return toAjax(twinEmpCalcService.calc(DateUtils.parseDate(date)));
     }
 
+    @GetMapping("/month/calc")
+    @ResponseBody
+    public AjaxResult monthCalc(String date) {
+        List<TwinEmpCalc> list = twinEmpCalcService.selectTwinEmpCalcListByMonth(date);
+        Map<String, Object> result = new HashMap<>();
+        List<EmpCalcTrendVO> trend = list.stream()
+                .collect(Collectors.groupingBy(TwinEmpCalc::getEmpDate))
+                .entrySet().stream()
+                .map(entry -> {
+                            List<TwinEmpCalc> group = entry.getValue();
+                            // 过滤出 A 组和 B 组的数据
+                            List<TwinEmpCalc> groupA = group.stream().filter(d -> "A".equals(d.getEmpTeam())).collect(Collectors.toList());
+                            List<TwinEmpCalc> groupB = group.stream().filter(d -> "B".equals(d.getEmpTeam())).collect(Collectors.toList());
+                            BigDecimal totalPrice = calculateTotalPrice(group);
+                            BigDecimal totalPriceA = calculateTotalPrice(groupA);
+                            BigDecimal totalPriceB = calculateTotalPrice(groupB);
+
+                            // 计算总生产米数
+                            BigDecimal length = calculateLength(group);
+                            BigDecimal lengthA = calculateLength(groupA);
+                            BigDecimal lengthB = calculateLength(groupB);
+
+                            // 计算平均稼动率
+                            BigDecimal eff = calculateAverageEfficiency(group);
+                            BigDecimal effA = calculateAverageEfficiency(groupA);
+                            BigDecimal effB = calculateAverageEfficiency(groupB);
+
+                            EmpCalcTrendVO vo = new EmpCalcTrendVO();
+                            vo.setEmpDate(entry.getKey());
+                            vo.setTotalPrice(totalPrice);
+                            vo.setTotalPriceA(totalPriceA);
+                            vo.setTotalPriceB(totalPriceB);
+
+                            vo.setLength(length);
+                            vo.setLengthA(lengthA);
+                            vo.setLengthB(lengthB);
+
+                            vo.setEfficiency(eff);
+                            vo.setEfficiencyA(effA);
+                            vo.setEfficiencyB(effB);
+                            return vo;
+                        }
+                ).sorted(Comparator.comparing(EmpCalcTrendVO::getEmpDate)).collect(Collectors.toList());
+
+
+        List<EmpCalcEmpVO> emp = list.stream()
+                .collect(Collectors.groupingBy(TwinEmpCalc::getEmpName))
+                .entrySet().stream()
+                .map(entry -> {
+                            List<TwinEmpCalc> group = entry.getValue();
+                            BigDecimal totalPrice = calculateTotalPrice(group);
+                            BigDecimal length = calculateLength(group);
+                            BigDecimal eff = calculateAverageEfficiency(group);
+                            EmpCalcEmpVO vo = new EmpCalcEmpVO();
+                            vo.setEmpName(entry.getKey());
+                            vo.setTotalPrice(totalPrice);
+                            vo.setLength(length);
+                            vo.setEfficiency(eff);
+                            return vo;
+                        }
+                ).sorted(Comparator.comparing(EmpCalcEmpVO::getEmpName)).collect(Collectors.toList());
+
+        result.put("trend", trend);
+        result.put("emp", emp);
+        return success(result);
+    }
+
+    /**
+     * 辅助方法:计算总金额
+     */
+    private BigDecimal calculateTotalPrice(List<TwinEmpCalc> group) {
+        return group.stream()
+                .map(TwinEmpCalc::getTotalPrice)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    /**
+     * 辅助方法:计算总生产米数
+     */
+    private BigDecimal calculateLength(List<TwinEmpCalc> group) {
+        return group.stream()
+                .map(TwinEmpCalc::getLength)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    /**
+     * 辅助方法:计算平均稼动率
+     */
+    private BigDecimal calculateAverageEfficiency(List<TwinEmpCalc> group) {
+        if (group.size() == 0) {
+            return BigDecimal.ZERO;
+        }
+        return group.stream()
+                .map(TwinEmpCalc::getEfficiency)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .divide(new BigDecimal(group.size()), 4, RoundingMode.HALF_UP);
+    }
+
     /**
      * 查询员工产量统计列表
      */

+ 1 - 1
jjt-biz/src/main/resources/mapper/emp/TwinEmpCalcMapper.xml

@@ -132,6 +132,6 @@
     <select id="selectTwinEmpCalcListByMonth" resultMap="TwinEmpCalcResult">
         <include refid="selectTwinEmpCalcVo"/>
         where FORMAT(EMP_DATE, 'yyyy-MM') = #{month}
-        order by DENSITY,EMP_DATE
+        order by EMP_DATE,DENSITY
     </select>
 </mapper>