TwinEmpCalcController.java 8.2 KB

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