|
@@ -1,11 +1,29 @@
|
|
|
package com.jjt.emp.service.impl;
|
|
|
|
|
|
-import java.util.List;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import com.jjt.emp.mapper.TwinEmpCalcMapper;
|
|
|
+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.StringUtils;
|
|
|
+import com.jjt.emp.domain.TwinEmp;
|
|
|
import com.jjt.emp.domain.TwinEmpCalc;
|
|
|
+import com.jjt.emp.domain.TwinEmpConfig;
|
|
|
+import com.jjt.emp.domain.TwinEmpDetail;
|
|
|
+import com.jjt.emp.mapper.TwinEmpCalcMapper;
|
|
|
import com.jjt.emp.service.ITwinEmpCalcService;
|
|
|
+import com.jjt.emp.service.ITwinEmpConfigService;
|
|
|
+import com.jjt.emp.service.ITwinEmpService;
|
|
|
+import com.jjt.utils.Tools;
|
|
|
+import org.apache.ibatis.session.ExecutorType;
|
|
|
+import org.apache.ibatis.session.SqlSession;
|
|
|
+import org.apache.ibatis.session.SqlSessionFactory;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 员工产量统计Service业务层处理
|
|
@@ -17,6 +35,16 @@ import javax.annotation.Resource;
|
|
|
public class TwinEmpCalcServiceImpl implements ITwinEmpCalcService {
|
|
|
@Resource
|
|
|
private TwinEmpCalcMapper twinEmpCalcMapper;
|
|
|
+ @Resource
|
|
|
+ private ITwinCalcHourSpecService hourSpecService;
|
|
|
+ @Resource
|
|
|
+ private ITwinEmpService empService;
|
|
|
+ @Resource
|
|
|
+ private ITwinEmpConfigService empConfigService;
|
|
|
+ @Resource
|
|
|
+ private ITwinCalcDayService twinCalcDayService;
|
|
|
+ @Resource
|
|
|
+ private SqlSessionFactory factory;
|
|
|
|
|
|
/**
|
|
|
* 查询员工产量统计
|
|
@@ -48,7 +76,7 @@ public class TwinEmpCalcServiceImpl implements ITwinEmpCalcService {
|
|
|
*/
|
|
|
@Override
|
|
|
public int insertTwinEmpCalc(TwinEmpCalc twinEmpCalc) {
|
|
|
- return twinEmpCalcMapper.insertTwinEmpCalc(twinEmpCalc);
|
|
|
+ return twinEmpCalcMapper.insertTwinEmpCalc(twinEmpCalc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -83,4 +111,140 @@ public class TwinEmpCalcServiceImpl implements ITwinEmpCalcService {
|
|
|
public int deleteTwinEmpCalcByCalcId(Long calcId) {
|
|
|
return twinEmpCalcMapper.deleteTwinEmpCalcByCalcId(calcId);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按日统计
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int calc(Date date) {
|
|
|
+ //先删除
|
|
|
+ twinEmpCalcMapper.deleteTwinEmpCalcByDate(date);
|
|
|
+
|
|
|
+ //获取统计数据
|
|
|
+ List<TwinCalcHourSpec> specHourList = hourSpecService.selectTwinCalcHourSpecListByDate(date);
|
|
|
+ specHourList.forEach(obj -> obj.setTeam());
|
|
|
+ // 按照deviceId、density、mick、team,并统计每组的length总和
|
|
|
+ Map<String, List<TwinCalcHourSpec>> specHourMap = specHourList.stream().collect(Collectors.groupingBy(o -> o.getDeviceId() + "-" + o.getTeam(), LinkedHashMap::new, Collectors.toList()));
|
|
|
+ List<TwinCalcDay> twinCalcDays = twinCalcDayService.selectTwinCalcDayListByTime(date, date);
|
|
|
+ Map<Long, TwinCalcDay> calcMap = twinCalcDays.stream().collect(Collectors.toMap(TwinCalcDay::getDeviceId, o -> o));
|
|
|
+ TwinEmp emp = empService.selectTwinEmpByDate(date);
|
|
|
+
|
|
|
+ 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<TwinEmpCalc> calcList = new ArrayList<>();
|
|
|
+ process(true, emp, calcMap, configMap, calcList, specHourMap);
|
|
|
+ process(false, emp, calcMap, configMap, calcList, specHourMap);
|
|
|
+ if (calcList.size() > 0) {
|
|
|
+ try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
|
|
|
+ TwinEmpCalcMapper mapper = sqlSession.getMapper(TwinEmpCalcMapper.class);
|
|
|
+ calcList.forEach(mapper::insertTwinEmpCalc);
|
|
|
+ sqlSession.commit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param flag true为A班false为B班
|
|
|
+ */
|
|
|
+ private void process(boolean flag, TwinEmp emp, Map<Long, TwinCalcDay> calcMap, Map<BigDecimal, BigDecimal> configMap, List<TwinEmpCalc> calcList, Map<String, List<TwinCalcHourSpec>> specHourMap) {
|
|
|
+ List<TwinEmpDetail> list = emp.getTwinEmpDetailListA();
|
|
|
+ String team = "A";
|
|
|
+ if (!flag) {
|
|
|
+ team = "B";
|
|
|
+ list = emp.getTwinEmpDetailListB();
|
|
|
+ }
|
|
|
+ for (TwinEmpDetail d : list) {
|
|
|
+ Long[] devices = getDevices(d.getDevices());
|
|
|
+ for (int i = 0; i < devices.length; i++) {
|
|
|
+ Long deviceId = devices[i];
|
|
|
+ List<TwinCalcHourSpec> specs = specHourMap.get(deviceId + "-" + team);
|
|
|
+ //按密度和米克重、毛高分组统计
|
|
|
+ Map<String, BigDecimal> resultMap = specs.stream().collect(Collectors.groupingBy(t -> t.getDensity() + "-" + t.getMick() + "-" + t.getHeight(), 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(deviceId);
|
|
|
+ TwinEmpCalc calc = new TwinEmpCalc();
|
|
|
+ calc.setDeviceId(deviceId);
|
|
|
+ if (StringUtils.isNotEmpty(temp[2]) && !"null".equals(temp[2])) {
|
|
|
+ BigDecimal height = new BigDecimal(temp[2]).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ calc.setHeight(height);
|
|
|
+ }
|
|
|
+ calc.setEfficiency(td.getEfficiencyA());
|
|
|
+ calc.setEmpDate(td.getTime());
|
|
|
+ BigDecimal length = resultMap.get(ss);
|
|
|
+ if (!flag) {
|
|
|
+ calc.setEfficiency(td.getEfficiencyB());
|
|
|
+ }
|
|
|
+ if (length.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ calc.setLength(length);
|
|
|
+ calc.setEmpTeam(d.getEmpTeam());
|
|
|
+ calc.setEmpName(d.getEmpName());
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Long[] getDevices(String d) {
|
|
|
+ String[] temp = d.split(",");
|
|
|
+ Set<Long> set = new HashSet<>();
|
|
|
+ for (String s : temp) {
|
|
|
+ String[] ss = s.split("-");
|
|
|
+ if (ss.length > 1) {
|
|
|
+ Long st = Long.parseLong(ss[0]);
|
|
|
+ Long ed = Long.parseLong(ss[1]);
|
|
|
+ for (long i = st; i <= ed; i++) {
|
|
|
+ set.add(i);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ set.add(Long.parseLong(s));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Long[] devices = new Long[set.size()];
|
|
|
+ set.toArray(devices);
|
|
|
+ return devices;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按日查询
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<TwinEmpCalc> selectTwinEmpCalcListByDate(Date date) {
|
|
|
+ TwinEmpCalc search = new TwinEmpCalc();
|
|
|
+ search.setEmpDate(date);
|
|
|
+ return selectTwinEmpCalcList(search);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按月查询
|
|
|
+ *
|
|
|
+ * @param month 月份
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<TwinEmpCalc> selectTwinEmpCalcListByMonth(String month) {
|
|
|
+ return twinEmpCalcMapper.selectTwinEmpCalcListByMonth(month);
|
|
|
+ }
|
|
|
}
|