wukai 1 miesiąc temu
rodzic
commit
78434e74e2

+ 30 - 0
jjt-admin/src/test/java/com/jjt/wk/EmpCalcTest.java

@@ -0,0 +1,30 @@
+package com.jjt.wk;
+
+import com.jjt.JjtApplication;
+import com.jjt.common.utils.DateUtils;
+import com.jjt.emp.service.ITwinEmpCalcService;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * DataProcess$
+ *
+ * @author wukai
+ * @date 2024/5/7 11:49
+ */
+@SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class EmpCalcTest {
+    @Resource
+    private ITwinEmpCalcService empCalcService;
+
+    @Test
+    public void test() {
+        String s = "2025-04-28";
+        Date date = DateUtils.parseDate(s);
+        empCalcService.calcNew(date);
+    }
+}
+

+ 5 - 0
jjt-biz/src/main/java/com/jjt/calc/domain/TwinCalcHourSpec.java

@@ -96,6 +96,11 @@ public class TwinCalcHourSpec extends BaseEntity {
     @ApiModelProperty("班组")
     private String team;
 
+    @ApiModelProperty("员工号")
+    private String empId;
+
+    @ApiModelProperty("员工姓名")
+    private String empName;
     public void setTeam() {
         if (this.hour >= 7 && this.hour < 19) {
             //A班

+ 7 - 0
jjt-biz/src/main/java/com/jjt/emp/service/ITwinEmpCalcService.java

@@ -80,4 +80,11 @@ public interface ITwinEmpCalcService {
      * @return 结果
      */
     List<TwinEmpCalc> selectTwinEmpCalcListByMonth(String  month);
+    /**
+     * 按日统计,从MES同步过来的
+     *
+     * @param date 日期
+     * @return 结果
+     */
+    void calcNew(Date date);
 }

+ 120 - 0
jjt-biz/src/main/java/com/jjt/emp/service/impl/TwinEmpCalcServiceImpl.java

@@ -4,6 +4,7 @@ import com.jjt.calc.domain.TwinCalcDay;
 import com.jjt.calc.domain.TwinCalcHourSpec;
 import com.jjt.calc.service.ITwinCalcDayService;
 import com.jjt.calc.service.ITwinCalcHourSpecService;
+import com.jjt.common.utils.DateUtils;
 import com.jjt.common.utils.StringUtils;
 import com.jjt.emp.domain.TwinEmp;
 import com.jjt.emp.domain.TwinEmpCalc;
@@ -14,6 +15,8 @@ import com.jjt.emp.service.ITwinEmpCalcService;
 import com.jjt.emp.service.ITwinEmpConfigService;
 import com.jjt.emp.service.ITwinEmpService;
 import com.jjt.utils.Tools;
+import com.jjt.wkEmp.domain.TwinWkEmpRota;
+import com.jjt.wkEmp.service.ITwinWkEmpRotaService;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -22,6 +25,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -45,6 +49,8 @@ public class TwinEmpCalcServiceImpl implements ITwinEmpCalcService {
     private ITwinCalcDayService twinCalcDayService;
     @Resource
     private SqlSessionFactory factory;
+    @Resource
+    private ITwinWkEmpRotaService rotaService;
 
     /**
      * 查询员工产量统计
@@ -250,4 +256,118 @@ public class TwinEmpCalcServiceImpl implements ITwinEmpCalcService {
     public List<TwinEmpCalc> selectTwinEmpCalcListByMonth(String month) {
         return twinEmpCalcMapper.selectTwinEmpCalcListByMonth(month);
     }
+
+    /**
+     * 按日统计,从MES同步过来的
+     *
+     * @param date 日期
+     * @return 结果
+     */
+    @Override
+    public void calcNew(Date date) {
+        //先删除
+        twinEmpCalcMapper.deleteTwinEmpCalcByDate(date);
+        // 获取稼动率
+        List<TwinCalcDay> twinCalcDays = twinCalcDayService.selectTwinCalcDayListByTime(date, date);
+        Map<Long, TwinCalcDay> calcMap = twinCalcDays.stream().collect(Collectors.toMap(TwinCalcDay::getDeviceId, o -> o));
+
+        //获取价格配置
+        List<TwinEmpConfig> configs = empConfigService.selectTwinEmpConfigList(new TwinEmpConfig());
+        Map<BigDecimal, BigDecimal> configMap = configs.stream().collect(Collectors.toMap(o -> o.getDensity().setScale(2, RoundingMode.HALF_UP), TwinEmpConfig::getPrice));
+
+        //获取统计数据
+        List<TwinCalcHourSpec> specHourList = hourSpecService.selectTwinCalcHourSpecListByDate(date);
+        //设置分组
+        specHourList.forEach(TwinCalcHourSpec::setTeam);
+        // 按照deviceId分组
+        Map<Long, List<TwinCalcHourSpec>> specHourMap = specHourList.stream().collect(Collectors.groupingBy(TwinCalcHourSpec::getDeviceId, LinkedHashMap::new, Collectors.toList()));
+        //按设备。。。小时。。。(员工号/姓名) 存储
+        Map<Long, Map<Integer, String>> empMap = new HashMap<>(16);
+        List<TwinWkEmpRota> rotas = rotaService.selectTwinWkEmpRotaListByDate(date);
+        for (TwinWkEmpRota rota : rotas) {
+            String[] devices = rota.getDevices().split(",");
+            LocalDateTime st = DateUtils.toLocalDateTime(rota.getInTime());
+            LocalDateTime et = DateUtils.toLocalDateTime(rota.getOutTime());
+            Map<Integer, String> hourMap = new HashMap<>(16);
+            while (st.isBefore(et)) {
+                int hour = st.getHour();
+                String str = rota.getEmpId() + "/" + rota.getEmpName();
+                hourMap.put(hour, str);
+                st = st.plusHours(1);
+            }
+            for (String s : devices) {
+                Long id = Long.parseLong(s);
+                Map<Integer, String> map = empMap.get(id);
+                if (map != null) {
+                    map.putAll(hourMap);
+                } else {
+                    empMap.put(id, hourMap);
+                }
+            }
+        }
+
+        List<TwinEmpCalc> calcList = new ArrayList<>();
+        for (Long id : specHourMap.keySet()) {
+            List<TwinCalcHourSpec> list = specHourMap.get(id);
+            Map<Integer, String> map = empMap.get(id);
+            if (map == null) {
+                continue;
+            }
+            list.forEach(spec -> {
+                String str = map.get(spec.getHour());
+                if (StringUtils.isNotEmpty(str)) {
+                    String[] tmp = str.split("/");
+                    spec.setEmpId(tmp[0]);
+                    spec.setEmpName(tmp[1]);
+                }
+            });
+
+            //按密度和米克重、毛高分组统计
+            Map<String, BigDecimal> resultMap = list.stream().collect(Collectors.groupingBy(t -> t.getDensity() + "-" + t.getMick() + "-" + t.getHeight() + "-" + t.getEmpName() + "-" + t.getTeam() + "-", Collectors.reducing(BigDecimal.ZERO, TwinCalcHourSpec::getLength, BigDecimal::add)));
+            for (String ss : resultMap.keySet()) {
+                String[] temp = ss.split("-");
+                BigDecimal density = new BigDecimal(temp[0]).setScale(2, RoundingMode.HALF_UP);
+                Integer mick = Integer.parseInt(temp[1]);
+                TwinCalcDay td = calcMap.get(id);
+                TwinEmpCalc calc = new TwinEmpCalc();
+                calc.setDeviceId(id);
+                if (StringUtils.isNotEmpty(temp[2]) && !"null".equals(temp[2])) {
+                    BigDecimal height = new BigDecimal(temp[2]).setScale(2, RoundingMode.HALF_UP);
+                    calc.setHeight(height);
+                }
+                String name = temp[3];
+                String team = temp[4];
+                calc.setEmpDate(td.getTime());
+                if ("A".equals(team)) {
+                    calc.setEfficiency(td.getEfficiencyA());
+                } else {
+                    calc.setEfficiency(td.getEfficiencyB());
+                }
+                BigDecimal length = resultMap.get(ss);
+                if (length.compareTo(BigDecimal.ZERO) == 0) {
+                    continue;
+                }
+                calc.setLength(length);
+                calc.setEmpTeam(team);
+                calc.setEmpName(name);
+                calc.setMick(mick);
+                calc.setDensity(density);
+                BigDecimal price = configMap.get(Tools.density(density));
+                calc.setPrice(price);
+                if (price != null) {
+                    BigDecimal total = length.multiply(price);
+                    calc.setTotalPrice(total);
+                }
+                calcList.add(calc);
+            }
+        }
+
+        if (calcList.size() > 0) {
+            try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+                TwinEmpCalcMapper mapper = sqlSession.getMapper(TwinEmpCalcMapper.class);
+                calcList.forEach(mapper::insertTwinEmpCalc);
+                sqlSession.commit();
+            }
+        }
+    }
 }

+ 8 - 2
jjt-biz/src/main/java/com/jjt/task/EmpTask.java

@@ -24,10 +24,16 @@ public class EmpTask {
     /**
      * 绩效日报数据
      */
-
-    public void day() {
+    public void old() {
         LocalDate localDate = LocalDate.now().minusDays(1);
         empCalcService.calc(DateUtils.toDate(localDate));
     }
+    /**
+     * 绩效日报数据
+     */
+    public void day(){
+        LocalDate localDate = LocalDate.now().minusDays(1);
+        empCalcService.calcNew(DateUtils.toDate(localDate));
+    }
 
 }

+ 8 - 0
jjt-biz/src/main/java/com/jjt/wkEmp/service/ITwinWkEmpRotaService.java

@@ -3,6 +3,7 @@ package com.jjt.wkEmp.service;
 import com.jjt.biz.vo.KnittingEmpVO;
 import com.jjt.wkEmp.domain.TwinWkEmpRota;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -66,4 +67,11 @@ public interface ITwinWkEmpRotaService {
      * @param data 接口数据
      */
     void sync(KnittingEmpVO data);
+
+    /**
+     * 按时间查询列表
+     * @param date 时间
+     * @return 结果
+     */
+    List<TwinWkEmpRota> selectTwinWkEmpRotaListByDate(Date date);
 }

+ 15 - 0
jjt-biz/src/main/java/com/jjt/wkEmp/service/impl/TwinWkEmpRotaServiceImpl.java

@@ -47,6 +47,20 @@ public class TwinWkEmpRotaServiceImpl implements ITwinWkEmpRotaService {
     }
 
     /**
+     * 按时间查询列表
+     *
+     * @param date 时间
+     * @return 结果
+     */
+    @Override
+    public List<TwinWkEmpRota> selectTwinWkEmpRotaListByDate(Date date) {
+        TwinWkEmpRota twinWkEmpRota = new TwinWkEmpRota();
+        twinWkEmpRota.setEmpDate(date);
+        return selectTwinWkEmpRotaList(twinWkEmpRota);
+    }
+
+
+    /**
      * 新增经编车间员工排班
      *
      * @param twinWkEmpRota 经编车间员工排班
@@ -119,6 +133,7 @@ public class TwinWkEmpRotaServiceImpl implements ITwinWkEmpRotaService {
         }
     }
 
+
     /**
      * 按时间和员工号查询记录
      */

+ 8 - 0
jjt-common/src/main/java/com/jjt/common/utils/DateUtils.java

@@ -180,6 +180,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     }
 
     /**
+     * 增加 date--> LocalDate
+     */
+    public static LocalDateTime toLocalDateTime(Date date) {
+        LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        return ldt;
+    }
+
+    /**
      * LocalDateTime转字符串
      *
      * @param time 转换前的时间