TwinEmpCalcController.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package com.jjt.emp.controller;
  2. import com.jjt.biz.vo.EmpCalcEmpVO;
  3. import com.jjt.biz.vo.EmpCalcTrendVO;
  4. import com.jjt.common.annotation.Log;
  5. import com.jjt.common.core.controller.BaseController;
  6. import com.jjt.common.core.domain.AjaxResult;
  7. import com.jjt.common.core.page.TableDataInfo;
  8. import com.jjt.common.enums.BusinessType;
  9. import com.jjt.common.utils.DateUtils;
  10. import com.jjt.common.utils.poi.ExcelUtil;
  11. import com.jjt.emp.domain.TwinEmpCalc;
  12. import com.jjt.emp.service.ITwinEmpCalcService;
  13. import io.swagger.annotations.Api;
  14. import io.swagger.annotations.ApiOperation;
  15. import org.springframework.web.bind.annotation.*;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletResponse;
  18. import java.math.BigDecimal;
  19. import java.math.RoundingMode;
  20. import java.util.*;
  21. import java.util.stream.Collectors;
  22. /**
  23. * 员工产量统计Controller
  24. *
  25. * @author wukai
  26. * @date 2025-01-18
  27. */
  28. @Api(tags = "员工产量统计")
  29. @RestController
  30. @RequestMapping("/emp/empCalc")
  31. public class TwinEmpCalcController extends BaseController {
  32. @Resource
  33. private ITwinEmpCalcService twinEmpCalcService;
  34. @GetMapping("/calc")
  35. @ResponseBody
  36. public AjaxResult calc(String date) {
  37. return toAjax(twinEmpCalcService.calc(DateUtils.parseDate(date)));
  38. }
  39. @GetMapping("/calcBl")
  40. @ResponseBody
  41. public AjaxResult calcBl(String date) {
  42. return toAjax(twinEmpCalcService.calcBl(DateUtils.parseDate(date)));
  43. }
  44. @GetMapping("/month/calc")
  45. @ResponseBody
  46. public AjaxResult monthCalc(String date) {
  47. List<TwinEmpCalc> list = twinEmpCalcService.selectTwinEmpCalcListByMonth(date);
  48. Map<String, Object> result = new HashMap<>();
  49. List<EmpCalcTrendVO> trend = list.stream()
  50. .collect(Collectors.groupingBy(TwinEmpCalc::getEmpDate))
  51. .entrySet().stream()
  52. .map(entry -> {
  53. List<TwinEmpCalc> group = entry.getValue();
  54. // 过滤出 A 组和 B 组的数据
  55. List<TwinEmpCalc> groupA = group.stream().filter(d -> "A".equals(d.getEmpTeam())).collect(Collectors.toList());
  56. List<TwinEmpCalc> groupB = group.stream().filter(d -> "B".equals(d.getEmpTeam())).collect(Collectors.toList());
  57. BigDecimal totalPrice = calculateTotalPrice(group);
  58. BigDecimal totalPriceA = calculateTotalPrice(groupA);
  59. BigDecimal totalPriceB = calculateTotalPrice(groupB);
  60. // 计算总生产米数
  61. BigDecimal length = calculateLength(group);
  62. BigDecimal lengthA = calculateLength(groupA);
  63. BigDecimal lengthB = calculateLength(groupB);
  64. // 计算平均稼动率
  65. BigDecimal eff = calculateAverageEfficiency(group);
  66. BigDecimal effA = calculateAverageEfficiency(groupA);
  67. BigDecimal effB = calculateAverageEfficiency(groupB);
  68. EmpCalcTrendVO vo = new EmpCalcTrendVO();
  69. vo.setEmpDate(entry.getKey());
  70. vo.setTotalPrice(totalPrice);
  71. vo.setTotalPriceA(totalPriceA);
  72. vo.setTotalPriceB(totalPriceB);
  73. vo.setLength(length);
  74. vo.setLengthA(lengthA);
  75. vo.setLengthB(lengthB);
  76. vo.setEfficiency(eff);
  77. vo.setEfficiencyA(effA);
  78. vo.setEfficiencyB(effB);
  79. return vo;
  80. }
  81. ).sorted(Comparator.comparing(EmpCalcTrendVO::getEmpDate)).collect(Collectors.toList());
  82. List<EmpCalcEmpVO> emp = list.stream()
  83. .collect(Collectors.groupingBy(TwinEmpCalc::getEmpName))
  84. .entrySet().stream()
  85. .map(entry -> {
  86. List<TwinEmpCalc> group = entry.getValue();
  87. BigDecimal totalPrice = calculateTotalPrice(group);
  88. BigDecimal length = calculateLength(group);
  89. BigDecimal eff = calculateAverageEfficiency(group);
  90. EmpCalcEmpVO vo = new EmpCalcEmpVO();
  91. vo.setEmpName(entry.getKey());
  92. vo.setTotalPrice(totalPrice);
  93. vo.setLength(length);
  94. vo.setEfficiency(eff);
  95. return vo;
  96. }
  97. ).sorted(Comparator.comparing(EmpCalcEmpVO::getTotalPrice).reversed()).collect(Collectors.toList());
  98. result.put("trend", trend);
  99. result.put("emp", emp);
  100. return success(result);
  101. }
  102. /**
  103. * 辅助方法:计算总金额
  104. */
  105. private BigDecimal calculateTotalPrice(List<TwinEmpCalc> group) {
  106. return group.stream()
  107. .map(TwinEmpCalc::getTotalPrice).filter(Objects::nonNull)
  108. .reduce(BigDecimal.ZERO, BigDecimal::add);
  109. }
  110. /**
  111. * 辅助方法:计算总生产米数
  112. */
  113. private BigDecimal calculateLength(List<TwinEmpCalc> group) {
  114. return group.stream()
  115. .map(TwinEmpCalc::getLength)
  116. .reduce(BigDecimal.ZERO, BigDecimal::add);
  117. }
  118. /**
  119. * 辅助方法:计算平均稼动率
  120. */
  121. private BigDecimal calculateAverageEfficiency(List<TwinEmpCalc> group) {
  122. if (group.size() == 0) {
  123. return BigDecimal.ZERO;
  124. }
  125. return group.stream()
  126. .map(TwinEmpCalc::getEfficiency)
  127. .reduce(BigDecimal.ZERO, BigDecimal::add)
  128. .divide(new BigDecimal(group.size()), 4, RoundingMode.HALF_UP);
  129. }
  130. /**
  131. * 查询员工产量统计列表
  132. */
  133. @ApiOperation("查询员工产量统计列表")
  134. //@PreAuthorize("@ss.hasPermi('emp:empCalc:list')")
  135. @GetMapping("/list")
  136. public TableDataInfo list(TwinEmpCalc twinEmpCalc) {
  137. startPage();
  138. List<TwinEmpCalc> list = twinEmpCalcService.selectTwinEmpCalcList(twinEmpCalc);
  139. return getDataTable(list);
  140. }
  141. /**
  142. * 导出员工产量统计列表
  143. */
  144. @ApiOperation("导出员工产量统计列表")
  145. //@PreAuthorize("@ss.hasPermi('emp:empCalc:export')")
  146. @Log(title = "员工产量统计", businessType = BusinessType.EXPORT)
  147. @PostMapping("/export")
  148. public void export(HttpServletResponse response, TwinEmpCalc twinEmpCalc) {
  149. List<TwinEmpCalc> list = twinEmpCalcService.selectTwinEmpCalcList(twinEmpCalc);
  150. ExcelUtil<TwinEmpCalc> util = new ExcelUtil<TwinEmpCalc>(TwinEmpCalc.class);
  151. util.exportExcel(response, list, "员工产量统计数据");
  152. }
  153. /**
  154. * 获取员工产量统计详细信息
  155. */
  156. @ApiOperation("获取员工产量统计详细信息")
  157. //@PreAuthorize("@ss.hasPermi('emp:empCalc:query')")
  158. @GetMapping(value = "/{calcId}")
  159. public AjaxResult getInfo(@PathVariable("calcId") Long calcId) {
  160. return success(twinEmpCalcService.selectTwinEmpCalcByCalcId(calcId));
  161. }
  162. /**
  163. * 新增员工产量统计
  164. */
  165. @ApiOperation("新增员工产量统计")
  166. //@PreAuthorize("@ss.hasPermi('emp:empCalc:add')")
  167. @Log(title = "员工产量统计", businessType = BusinessType.INSERT)
  168. @PostMapping
  169. public AjaxResult add(@RequestBody TwinEmpCalc twinEmpCalc) {
  170. return toAjax(twinEmpCalcService.insertTwinEmpCalc(twinEmpCalc));
  171. }
  172. /**
  173. * 修改员工产量统计
  174. */
  175. @ApiOperation("修改员工产量统计")
  176. //@PreAuthorize("@ss.hasPermi('emp:empCalc:edit')")
  177. @Log(title = "员工产量统计", businessType = BusinessType.UPDATE)
  178. @PutMapping
  179. public AjaxResult edit(@RequestBody TwinEmpCalc twinEmpCalc) {
  180. return toAjax(twinEmpCalcService.updateTwinEmpCalc(twinEmpCalc));
  181. }
  182. /**
  183. * 删除员工产量统计
  184. */
  185. @ApiOperation("删除员工产量统计")
  186. //@PreAuthorize("@ss.hasPermi('emp:empCalc:remove')")
  187. @Log(title = "员工产量统计", businessType = BusinessType.DELETE)
  188. @DeleteMapping("/{calcIds}")
  189. public AjaxResult remove(@PathVariable Long[] calcIds) {
  190. return toAjax(twinEmpCalcService.deleteTwinEmpCalcByCalcIds(calcIds));
  191. }
  192. }