package com.aps.core.service.impl;
|
|
import com.alibaba.fastjson2.JSONObject;
|
import com.aps.common.core.utils.DateUtils;
|
import com.aps.common.core.utils.uuid.IdUtils;
|
import com.aps.common.security.utils.SecurityUtils;
|
import com.aps.core.domain.*;
|
import com.aps.core.mapper.ApsGasPipelineCapacityPlanMapper;
|
import com.aps.core.mapper.ApsGasPipingPlanMapper;
|
import com.aps.core.mapper.ApsGasPipingRouteStatMapper;
|
import com.aps.core.service.IApsGasMaterialUsageService;
|
import com.aps.core.service.IApsGasPipingRouteStatService;
|
import com.aps.core.service.IApsStandardProcessService;
|
import jakarta.servlet.http.HttpServletResponse;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.poi.ss.usermodel.*;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.xssf.streaming.SXSSFCell;
|
import org.apache.poi.xssf.streaming.SXSSFRow;
|
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.YearMonth;
|
import java.time.ZoneId;
|
import java.time.format.DateTimeFormatter;
|
import java.util.*;
|
|
/**
|
* 气体管路产能负载统计Service业务层处理
|
*
|
* @author hjy
|
* @date 2025-04-24
|
*/
|
@Slf4j
|
@Service
|
public class ApsGasPipingRouteStatServiceImpl implements IApsGasPipingRouteStatService
|
{
|
@Autowired
|
private ApsGasPipingRouteStatMapper apsGasPipingRouteStatMapper;
|
|
@Autowired
|
private ApsGasPipingPlanMapper apsGasPipingPlanMapper;
|
|
@Autowired
|
private ApsGasPipelineCapacityPlanMapper apsGasPipelineCapacityPlanMapper;
|
|
@Autowired
|
private IApsGasMaterialUsageService apsGasMaterialUsageService;
|
|
@Autowired
|
private IApsStandardProcessService apsStandardProcessService;
|
|
/**
|
* 查询气体管路产能负载统计
|
*
|
* @param id 气体管路产能负载统计主键
|
* @return 气体管路产能负载统计
|
*/
|
@Override
|
public ApsGasPipingRouteStat selectApsGasPipingRouteStatById(String id)
|
{
|
return apsGasPipingRouteStatMapper.selectApsGasPipingRouteStatById(id);
|
}
|
|
/**
|
* 查询气体管路产能负载统计列表
|
*
|
* @param apsGasPipingRouteStat 气体管路产能负载统计
|
* @return 气体管路产能负载统计
|
*/
|
@Override
|
public List<ApsGasPipingRouteStat> selectApsGasPipingRouteStatList(ApsGasPipingRouteStat apsGasPipingRouteStat)
|
{
|
return apsGasPipingRouteStatMapper.selectApsGasPipingRouteStatList(apsGasPipingRouteStat);
|
}
|
|
/**
|
* 新增气体管路产能负载统计
|
*
|
* @param apsGasPipingRouteStat 气体管路产能负载统计
|
* @return 结果
|
*/
|
@Override
|
public int insertApsGasPipingRouteStat(ApsGasPipingRouteStat apsGasPipingRouteStat)
|
{
|
apsGasPipingRouteStat.setCreateTime(DateUtils.getNowDate());
|
apsGasPipingRouteStat.setCreateBy(SecurityUtils.getUsername());
|
return apsGasPipingRouteStatMapper.insertApsGasPipingRouteStat(apsGasPipingRouteStat);
|
}
|
|
/**
|
* 修改气体管路产能负载统计
|
*
|
* @param apsGasPipingRouteStat 气体管路产能负载统计
|
* @return 结果
|
*/
|
@Override
|
public int updateApsGasPipingRouteStat(ApsGasPipingRouteStat apsGasPipingRouteStat)
|
{
|
apsGasPipingRouteStat.setUpdateBy(SecurityUtils.getUsername());
|
apsGasPipingRouteStat.setUpdateTime(DateUtils.getNowDate());
|
return apsGasPipingRouteStatMapper.updateApsGasPipingRouteStat(apsGasPipingRouteStat);
|
}
|
|
/**
|
* 批量删除气体管路产能负载统计
|
*
|
* @param ids 需要删除的气体管路产能负载统计主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteApsGasPipingRouteStatByIds(String[] ids)
|
{
|
return apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatByIds(ids);
|
}
|
|
/**
|
* 删除气体管路产能负载统计信息
|
*
|
* @param id 气体管路产能负载统计主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteApsGasPipingRouteStatById(String id)
|
{
|
return apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatById(id);
|
}
|
|
@Override
|
public boolean computeCapacity() {
|
// PageHelper.startPage(1, 500);
|
List<ApsGasPipingPlan> apsGasPipingPlans = apsGasPipingPlanMapper.selectApsGasPipingPlanWithProcess(new ApsGasPipingPlan());
|
List<ApsGasPipingRouteStat> apsGasPipingRouteStatList = new ArrayList<>();
|
/*本次计算批次号*/
|
String batchNum = IdUtils.fastSimpleUUID();
|
try {
|
apsGasPipingPlans.forEach(apsGasPipingPlan -> {
|
List<ApsProcessRoute> apsProcessRoutes = apsGasPipingPlan.getApsProcessRoutes();
|
//按照工序序号升序排序
|
apsProcessRoutes.sort((a, b)->b.getProcessNumber().compareTo(a.getProcessNumber()));
|
//是否找到当前工序
|
boolean isCurrentProcess = false;
|
ApsGasPipingRouteStat preApsProcessRoute = null;
|
for (int i=0;i<apsProcessRoutes.size();i++){
|
ApsProcessRoute apsProcessRoute = apsProcessRoutes.get(i);
|
ApsGasPipingRouteStat apsGasPipingRouteStat = new ApsGasPipingRouteStat();
|
//工单号
|
apsGasPipingRouteStat.setWorkOrderNo(apsGasPipingPlan.getDocumentNumber());
|
//料号
|
apsGasPipingRouteStat.setItemNumber(apsGasPipingPlan.getItemNumber());
|
//当前工序号
|
apsGasPipingRouteStat.setCurrentProcessNumber(new BigDecimal(apsGasPipingPlan.getProcessNumber()));
|
//生产数量
|
apsGasPipingRouteStat.setProductionQuantity(apsGasPipingPlan.getProductionQuantity());
|
//工序名称
|
apsGasPipingRouteStat.setProcessName(apsProcessRoute.getProcessName());
|
//工序号
|
apsGasPipingRouteStat.setRoadProcessNumber(apsProcessRoute.getProcessNumber());
|
//标准工时
|
apsGasPipingRouteStat.setStandardTime(apsProcessRoute.getStandardTime());
|
//专业
|
apsGasPipingRouteStat.setMajor(apsGasPipingPlan.getPlanType());
|
//工序总工时 等于 标准工时*生产数量
|
apsGasPipingRouteStat.setProcessTotalTime(apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity()));
|
//计划开工日 如果是当前序
|
if(apsGasPipingPlan.getProcessNumber().equals(apsProcessRoute.getProcessNumber())) {
|
if(apsGasPipingPlan.getOpStatus()==null || apsGasPipingPlan.getOpStatus().equals("完工")){
|
break;
|
}
|
isCurrentProcess = true;
|
}
|
// 上一道工序的结束时间 = 上一道工序的开始时间 + 上一道工序的总工时
|
if(i==0){
|
apsGasPipingRouteStat.setProcessPlanEndDay(apsGasPipingPlan.getPlanEndDay());
|
LocalDate endLocalDate = LocalDate.ofInstant(apsGasPipingPlan.getPlanEndDay().toInstant(), ZoneId.systemDefault());
|
LocalDate nowLocalDate = LocalDate.now();
|
LocalDateTime planEndDay;
|
if(endLocalDate.isBefore(nowLocalDate)){
|
planEndDay = LocalDateTime.now();
|
}else{
|
planEndDay = apsGasPipingPlan.getPlanEndDay().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
}
|
long seconds = apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity()).multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
|
LocalDateTime planStartDay = planEndDay.plusSeconds(-seconds);
|
apsGasPipingRouteStat.setProcessPlanStartDay(Date.from(planStartDay.atZone(ZoneId.systemDefault()).toInstant()));
|
}else{
|
apsGasPipingRouteStat.setProcessPlanEndDay(preApsProcessRoute.getProcessPlanEndDay());
|
LocalDateTime planEndDay = apsGasPipingPlan.getPlanEndDay().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
long seconds = apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity()).multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
|
LocalDateTime planStartDay = planEndDay.plusSeconds(-seconds);
|
apsGasPipingRouteStat.setProcessPlanStartDay(Date.from(planStartDay.atZone(ZoneId.systemDefault()).toInstant()));
|
}
|
//插入 年 月 日
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
String formattedDate = sdf.format(apsGasPipingRouteStat.getProcessPlanStartDay());
|
String[] dateParts = formattedDate.split("-");
|
apsGasPipingRouteStat.setPlanStartYear(String.valueOf(Integer.parseInt(dateParts[0])));
|
apsGasPipingRouteStat.setPlanStartMonth(String.valueOf(Integer.parseInt(dateParts[1])));
|
apsGasPipingRouteStat.setPlanStartDay(String.valueOf(Integer.parseInt(dateParts[2])));
|
//标准用量 查询物料用量表
|
// ApsGasMaterialUsage apsGasMaterialUsage = new ApsGasMaterialUsage();
|
// apsGasMaterialUsage.setItemNumber(apsGasPipingPlan.getItemNumber());
|
// apsGasMaterialUsage.setProcessName(apsProcessRoute.getProcessName());
|
// List<ApsGasMaterialUsage> apsGasMaterialUsageList = apsGasMaterialUsageService.selectApsGasMaterialUsageList(apsGasMaterialUsage);
|
// apsGasPipingRouteStat.setStandardDosage(apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity()));
|
//工序总用量 = 标准用量*生产数量
|
// apsGasPipingRouteStat.setProcessTotalDosage(apsGasPipingRouteStat.getStandardDosage().multiply(apsGasPipingPlan.getProductionQuantity()));
|
apsGasPipingRouteStat.setCreateTime(DateUtils.getNowDate());
|
apsGasPipingRouteStat.setCreateBy("auto");
|
apsGasPipingRouteStat.setBatchNumber(batchNum);
|
apsGasPipingRouteStat.setId(IdUtils.fastSimpleUUID());
|
apsGasPipingRouteStatList.add(apsGasPipingRouteStat);
|
preApsProcessRoute = apsGasPipingRouteStat;
|
if(isCurrentProcess){
|
break;
|
}
|
}
|
});
|
List<ApsGasPipingRouteStat> tempInsertList = new ArrayList<>();
|
for (int i = 0; i < apsGasPipingRouteStatList.size(); i++) {
|
tempInsertList.add(apsGasPipingRouteStatList.get(i));
|
if(tempInsertList.size()==500){
|
apsGasPipingRouteStatMapper.insertApsGasPipingRouteStatBatch(tempInsertList);
|
tempInsertList = new ArrayList<>();
|
}else if(i==apsGasPipingRouteStatList.size()-1){
|
apsGasPipingRouteStatMapper.insertApsGasPipingRouteStatBatch(tempInsertList);
|
}
|
}
|
apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatByBatchNum(batchNum);
|
} catch (Exception e) {
|
e.printStackTrace();
|
return false;
|
}
|
return true;
|
}
|
|
@Override
|
public JSONObject getCapacityPlanData(ApsGasPipingRouteStat apsGasPipingRouteStat) {
|
JSONObject result = new JSONObject();
|
YearMonth yearMonth = YearMonth.parse(apsGasPipingRouteStat.getSearchEndDate());
|
int daysInMonth = yearMonth.lengthOfMonth();
|
LinkedHashSet<String> startPlanTimeSet = new LinkedHashSet<>();
|
//工序分组统计
|
LinkedHashMap<String, List<ApsResourceDateStat>> processMap = new LinkedHashMap<>();
|
List<HashMap<String, List<ApsResourceDateStat>>> processList = new ArrayList<>();
|
try {
|
//获取标准工序名称
|
ApsStandardProcess apsStandardProcess = new ApsStandardProcess();
|
apsStandardProcess.setMajor(apsGasPipingRouteStat.getMajor().equals("gas")?"气柜":"管路");
|
List<ApsStandardProcess> apsStandardProcessList = apsStandardProcessService.selectApsStandardProcessList(apsStandardProcess);
|
apsStandardProcessList.sort((a, b)->a.getProcessName().compareTo(b.getProcessName()));
|
for(ApsStandardProcess temp:apsStandardProcessList){
|
processMap.put(temp.getProcessName(), new ArrayList<ApsResourceDateStat>());
|
}
|
//获取工序计划产能数据
|
HashMap<String, ApsGasPipelineCapacityPlan> apsGasPipingPlanMap = new HashMap<>();
|
ApsGasPipelineCapacityPlan searchCapacityPlan = new ApsGasPipelineCapacityPlan();
|
searchCapacityPlan.setMajor(apsGasPipingRouteStat.getMajor().equals("gas")?"气柜":"管路");
|
if("day".equals(apsGasPipingRouteStat.getSearchType())){
|
searchCapacityPlan.setYear(yearMonth.getYear()+"");
|
searchCapacityPlan.setMonth(yearMonth.getMonthValue()+"");
|
for(int i=1;i<=daysInMonth;i++){
|
startPlanTimeSet.add(yearMonth +"-"+ (i<10?"0"+i:i));
|
}
|
}else if("month".equals(apsGasPipingRouteStat.getSearchType())){
|
searchCapacityPlan.setYear(yearMonth.getYear()+"");
|
YearMonth start = YearMonth.of(Integer.parseInt(apsGasPipingRouteStat.getSearchStartDate().split("-")[0]), Integer.parseInt(apsGasPipingRouteStat.getSearchStartDate().split("-")[1]));
|
YearMonth end = YearMonth.of(Integer.parseInt(apsGasPipingRouteStat.getSearchEndDate().split("-")[0]), Integer.parseInt(apsGasPipingRouteStat.getSearchEndDate().split("-")[1]));
|
List<String> yearMonths = getYearMonthsInRange(start, end);
|
startPlanTimeSet.addAll(yearMonths);
|
}
|
List<ApsGasPipelineCapacityPlan> apsGasPipelineCapacityPlanList = apsGasPipelineCapacityPlanMapper.selectApsGasPipelineCapacityPlanList(searchCapacityPlan);
|
apsGasPipelineCapacityPlanList.forEach(apsGasPipelineCapacityPlan -> {
|
apsGasPipingPlanMap.put(apsGasPipelineCapacityPlan.getProcessName()+"-"+apsGasPipelineCapacityPlan.getYear()+"-"+(Integer.parseInt(apsGasPipelineCapacityPlan.getMonth())<10?"0"+apsGasPipelineCapacityPlan.getMonth():apsGasPipelineCapacityPlan.getMonth()),apsGasPipelineCapacityPlan);
|
});
|
//计算日产能数据
|
DateTimeFormatter formatter = null;
|
List<ApsGasPipingRouteStat> apsGasPipingRouteStats;
|
SimpleDateFormat simpleDateFormat = null;
|
apsGasPipingRouteStat.setSearchStartDate(apsGasPipingRouteStat.getSearchStartDate()+"-01 00:00:00");
|
apsGasPipingRouteStat.setSearchEndDate(apsGasPipingRouteStat.getSearchEndDate()+"-"+ daysInMonth +" 23:59:59");
|
if("day".equals(apsGasPipingRouteStat.getSearchType())){
|
formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
}else if("month".equals(apsGasPipingRouteStat.getSearchType())){
|
formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
simpleDateFormat = new SimpleDateFormat("yyyy-MM");
|
}
|
apsGasPipingRouteStats = apsGasPipingRouteStatMapper.selectApsGasPipingRouteStatList(apsGasPipingRouteStat);
|
//根据开工日进行升序排序
|
apsGasPipingRouteStats.sort((a, b)->a.getProcessPlanStartDay().compareTo(b.getProcessPlanStartDay()));
|
//工序开工日期
|
String planStartDate = "";
|
//统计所有工序对应的开工时间
|
for (ApsGasPipingRouteStat apsGasPipingRouteStatTemp : apsGasPipingRouteStats) {
|
planStartDate = simpleDateFormat.format(apsGasPipingRouteStatTemp.getProcessPlanStartDay());
|
if("month".equals(apsGasPipingRouteStat.getSearchType())){
|
planStartDate = planStartDate+"-01";
|
}
|
ApsResourceDateStat apsResourceDateStat = new ApsResourceDateStat();
|
apsResourceDateStat.setPlanDay(LocalDate.parse(planStartDate, formatter));
|
apsResourceDateStat.setResourceName(apsGasPipingRouteStatTemp.getProcessName());
|
//查询气柜管路产能规划表
|
apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(apsGasPipingRouteStatTemp.getProcessName()+"-"+planStartDate.substring(0, 7))!=null?apsGasPipingPlanMap.get(apsGasPipingRouteStatTemp.getProcessName()+"-"+planStartDate.substring(0, 7)).getDayProduceAllNum():new BigDecimal(0));
|
//查询料号工序产能表
|
apsResourceDateStat.setRequireTimes(apsGasPipingRouteStatTemp.getProcessTotalTime());
|
if(apsResourceDateStat.getDesignTimes().compareTo(BigDecimal.ZERO)>0){
|
apsResourceDateStat.setCapacityLoad(apsResourceDateStat.getRequireTimes()
|
.divide(apsResourceDateStat.getDesignTimes(), 2, RoundingMode.HALF_UP)
|
.multiply(new BigDecimal(100)));
|
}else{
|
apsResourceDateStat.setCapacityLoad(BigDecimal.valueOf(0));
|
}
|
List<ApsResourceDateStat> apsResourceDateStatList = new ArrayList<>();
|
if(processMap.containsKey(apsGasPipingRouteStatTemp.getProcessName())){
|
apsResourceDateStatList = processMap.get(apsGasPipingRouteStatTemp.getProcessName());
|
}
|
apsResourceDateStatList.add(apsResourceDateStat);
|
processMap.put(apsGasPipingRouteStatTemp.getProcessName(), apsResourceDateStatList);
|
}
|
//聚合每道工序的开工时间和产能
|
processMap.forEach((processName, apsResourceDateStatList) -> {
|
LinkedHashMap<String, ApsResourceDateStat> dayMap = new LinkedHashMap<>();
|
apsResourceDateStatList.forEach(apsResourceDateStat -> {
|
// startPlanTimeSet.add(apsResourceDateStat.getPlanDay().toString());
|
if(dayMap.containsKey(apsResourceDateStat.getPlanDay().toString())){
|
ApsResourceDateStat apsResourceDateStatTemp = dayMap.get(apsResourceDateStat.getPlanDay().toString());
|
if("month".equals(apsGasPipingRouteStat.getSearchType())){
|
apsResourceDateStatTemp.setDesignTimes(apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7))!=null?apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7)).getMonthProduceAllNum():new BigDecimal(0));
|
}else{
|
apsResourceDateStatTemp.setDesignTimes(apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7))!=null?apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7)).getDayProduceAllNum():new BigDecimal(0));
|
}
|
apsResourceDateStatTemp.setRequireTimes(apsResourceDateStatTemp.getRequireTimes().add(apsResourceDateStat.getRequireTimes()));
|
if(apsResourceDateStatTemp.getDesignTimes().compareTo(BigDecimal.ZERO) > 0){
|
apsResourceDateStatTemp.setCapacityLoad(apsResourceDateStatTemp.getRequireTimes()
|
.divide(apsResourceDateStatTemp.getDesignTimes(), 2, RoundingMode.HALF_UP)
|
.multiply(new BigDecimal(100)));
|
}else{
|
apsResourceDateStatTemp.setCapacityLoad(new BigDecimal(0));
|
}
|
apsResourceDateStatTemp.setResourceGroupName(processName);
|
apsResourceDateStatTemp.setPlanDay(apsResourceDateStat.getPlanDay());
|
dayMap.put(apsResourceDateStat.getPlanDay().toString(), apsResourceDateStatTemp);
|
}else{
|
dayMap.put(apsResourceDateStat.getPlanDay().toString(), apsResourceDateStat);
|
}
|
});
|
List<ApsResourceDateStat> tempList = new ArrayList<>();
|
dayMap.forEach((key, value) -> {
|
tempList.add(value);
|
});
|
HashMap<String, List<ApsResourceDateStat>> temp = new HashMap<>();
|
temp.put(processName, tempList);
|
processList.add(temp);
|
});
|
//排序时间标题
|
List<String> sortedStartPlanTimeList = new ArrayList<>(startPlanTimeSet);
|
Collections.sort(sortedStartPlanTimeList);
|
for (int i=0;i<processList.size();i++){
|
HashMap<String, List<ApsResourceDateStat>> temp = processList.get(i);
|
for (Map.Entry<String, List<ApsResourceDateStat>> entry : temp.entrySet()){
|
List<ApsResourceDateStat> apsResourceDateStatList = entry.getValue();
|
String key = entry.getKey();
|
List<ApsResourceDateStat> crtList = new ArrayList<>();
|
for(String tempTime:sortedStartPlanTimeList) {
|
if("month".equals(apsGasPipingRouteStat.getSearchType())){
|
tempTime += "-01";
|
}
|
LocalDate crtDate = LocalDate.parse(tempTime, formatter);
|
Optional<ApsResourceDateStat> first = apsResourceDateStatList.stream().filter(x -> x.getPlanDay().equals(crtDate)).findFirst();
|
if (first.isPresent()) {
|
ApsResourceDateStat apsResourceDateStat = first.get();
|
crtList.add(apsResourceDateStat);
|
} else {
|
ApsResourceDateStat apsResourceDateStat = new ApsResourceDateStat();
|
apsResourceDateStat.setPlanDay(LocalDate.parse(tempTime, formatter));
|
if ("month".equals(apsGasPipingRouteStat.getSearchType())) {
|
apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)) != null ? apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)).getMonthProduceAllNum() : new BigDecimal(0));
|
} else {
|
apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)) != null ? apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)).getDayProduceAllNum() : new BigDecimal(0));
|
}
|
apsResourceDateStat.setRequireTimes(new BigDecimal(0));
|
apsResourceDateStat.setCapacityLoad(new BigDecimal(0));
|
apsResourceDateStat.setResourceName(entry.getKey());
|
apsResourceDateStat.setResourceGroupName(entry.getKey());
|
apsResourceDateStatList.add(apsResourceDateStat);
|
crtList.add(apsResourceDateStat);
|
}
|
temp.put(entry.getKey(), crtList);
|
processList.set(i, temp);
|
}
|
}
|
}
|
result.put("planTable", processList);
|
result.put("planTitle", sortedStartPlanTimeList);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return result;
|
}
|
|
@Override
|
public void exportExcel(HttpServletResponse response, ApsGasPipingRouteStat apsGasPipingRouteStat) {
|
SXSSFWorkbook wb = new SXSSFWorkbook(500);
|
wb.createSheet();
|
wb.setSheetName(0, "气柜管路产能负载统计表");
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
response.setCharacterEncoding("utf-8");
|
|
Map<String, CellStyle> styles = createStyles(wb);
|
CellStyle title = styles.get("title");
|
try
|
{
|
JSONObject stat = getCapacityPlanData(apsGasPipingRouteStat);
|
List<String> days = (List<String>) stat.get("planTitle");
|
List<HashMap<String, List<ApsResourceDateStat>>> table= (List<HashMap<String, List<ApsResourceDateStat>>>) stat.get("planTable");
|
SXSSFSheet sheet = wb.getSheetAt(0);
|
/*填写日期列 和 工时列*/
|
SXSSFRow rowDay = sheet.createRow(0);
|
SXSSFRow rowTitle = sheet.createRow(1);
|
|
SXSSFCell daytitle = rowDay.createCell(0);
|
daytitle.setCellValue("日期");
|
daytitle.setCellStyle(title);
|
SXSSFCell titleCell = rowTitle.createCell(0);
|
titleCell.setCellValue("工序");
|
titleCell.setCellStyle(title);
|
|
for (int i = 0; i < days.size(); i++) {
|
SXSSFCell dateCell = rowDay.createCell(i * 3 + 1);
|
SXSSFCell designHoursCell = rowTitle.createCell(i * 3 + 1);
|
SXSSFCell requireHoursCell = rowTitle.createCell(i * 3 + 2);
|
SXSSFCell loadCell = rowTitle.createCell(i * 3 + 3);
|
dateCell.setCellValue(days.get(i));
|
designHoursCell.setCellValue("设计工时");
|
requireHoursCell.setCellValue("需求工时");
|
loadCell.setCellValue("产能负荷");
|
/*set cell style*/
|
dateCell.setCellStyle(title);
|
designHoursCell.setCellStyle(title);
|
requireHoursCell.setCellStyle(title);
|
loadCell.setCellStyle(title);
|
|
/*合并日期单元格*/
|
sheet.addMergedRegion( new CellRangeAddress(0, 0, i*3+1, i*3+3));
|
}
|
for (int i = 0; i < table.size(); i++) {
|
Map<String, List<ApsResourceDateStat>> resourceList = table.get(i);
|
/*创建数据行*/
|
SXSSFRow dataRow = sheet.createRow(i+2);
|
for( Map.Entry<String, List<ApsResourceDateStat>> entry : resourceList.entrySet()){
|
String resourceName = entry.getKey();
|
List<ApsResourceDateStat> resourceDateStats = entry.getValue();
|
dataRow.createCell(0).setCellValue(resourceName);
|
for (int j = 0; j < resourceDateStats.size(); j++) {
|
ApsResourceDateStat apsResourceDateStat = resourceDateStats.get(j);
|
dataRow.createCell(j*3+1).setCellValue(apsResourceDateStat.getDesignTimes().doubleValue());
|
dataRow.createCell(j*3+2).setCellValue(apsResourceDateStat.getRequireTimes().doubleValue());
|
if(apsResourceDateStat.getCapacityLoad()!=null){
|
dataRow.createCell(j*3+3).setCellValue(apsResourceDateStat.getCapacityLoad().doubleValue()+"%");
|
}else{
|
dataRow.createCell(j*3+3).setCellValue("%");
|
}
|
}
|
}
|
|
}
|
wb.write(response.getOutputStream());
|
}
|
catch (Exception e)
|
{
|
log.error("导出Excel异常{}", e.getMessage());
|
}
|
finally
|
{
|
IOUtils.closeQuietly(wb);
|
}
|
}
|
private Map<String,CellStyle> createStyles(SXSSFWorkbook wb)
|
{
|
Map<String,CellStyle> styles=new HashMap<>();
|
CellStyle style = wb.createCellStyle();
|
style.setAlignment(HorizontalAlignment.CENTER);
|
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
Font titleFont = wb.createFont();
|
titleFont.setFontName("Arial");
|
titleFont.setFontHeightInPoints((short) 12);
|
titleFont.setBold(true);
|
style.setFont(titleFont);
|
DataFormat dataFormat = wb.createDataFormat();
|
style.setDataFormat(dataFormat.getFormat("@"));
|
styles.put("title", style);
|
return styles;
|
}
|
|
public static List<String> getYearMonthsInRange(YearMonth start, YearMonth end) {
|
List<String> yearMonths = new ArrayList<>();
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
while (!start.isAfter(end)) {
|
yearMonths.add(start.format(formatter));
|
start = start.plusMonths(1);
|
}
|
|
return yearMonths;
|
}
|
}
|