package com.example.northglasserpclient.service.sd.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.northglasserpclient.domain.dto.sd.OrderDTO;
import com.example.northglasserpclient.domain.dto.sd.OrderDetailDTO;
import com.example.northglasserpclient.domain.po.sd.Order;
import com.example.northglasserpclient.domain.po.sd.OrderDetail;
import com.example.northglasserpclient.domain.po.sd.OrderGlassDetail;
import com.example.northglasserpclient.domain.po.sd.OrderProcessDetail;
import com.example.northglasserpclient.mapper.sd.OrderMapper;
import com.example.northglasserpclient.mapper.sd.OrderProcessDetailMapper;
import com.example.northglasserpclient.service.sd.IOrderDetailService;
import com.example.northglasserpclient.service.sd.IOrderGlassDetailService;
import com.example.northglasserpclient.service.sd.IOrderProcessDetailService;
import com.example.northglasserpclient.service.sd.IOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.*;
/**
*
* 服务实现类
*
*
* @author guo
* @since 2025-09-18
*/
@Service
@RequiredArgsConstructor
public class OrderServiceImpl extends ServiceImpl implements IOrderService {
private final IOrderDetailService orderDetailService;
private final IOrderProcessDetailService orderProcessDetailService;
private final IOrderGlassDetailService orderGlassDetailService;
private final OrderProcessDetailMapper orderProcessDetailMapper;
@Override
public List getUnfinishedOrder(String customId) {
List orders = list(
new LambdaQueryWrapper()
.eq(Order::getCustomerId, customId)
.eq(Order::getCreateOrder, 2)
.ne(Order::getDelivery, 2)
.orderByDesc(Order::getId)
);
List ordersDTO = JSON.parseObject(
JSON.toJSONString(orders),
new TypeReference>(){}
);
//循环所有订单,获取订单按照产品分类进行订单明细 汇总查询
ordersDTO.forEach(order -> {
List details = orderDetailService.list(
new QueryWrapper()
.select("order_id,order_number,product_id,product_name," +
"sum(quantity) as quantity," +
"sum(warehouse_num+delivery_num) as warehouse_num,"+
"sum(delivery_num) as delivery_num"
)
.eq("order_id", order.getOrderId())
.groupBy("product_id")
);
//list转换成DTO,返回前端显示
List detailsDTO = JSON.parseObject(
JSON.toJSONString(details),
new TypeReference>(){}
);
//循环获取每个产品的完成数
detailsDTO.forEach(detail -> {
//获取产品生产订单号例:"NG25082706A"做条件,查询生产订单明细表,获取生产总数量
OrderGlassDetail glassDetail = orderGlassDetailService
.getOne(new LambdaQueryWrapper()
.eq(OrderGlassDetail::getOrderId, detail.getOrderId())
.eq(OrderGlassDetail::getOrderNumber, detail.getOrderNumber())
.orderByAsc(OrderGlassDetail::getId)
.last("limit 1")
);
//给产品信息添加生产数量
if(glassDetail != null){
Integer getReportingWorkNum = orderProcessDetailMapper
.getProductionQuantity(detail.getOrderId(),
glassDetail.getProductionId()
);
detail.setQuantityByProduced(getReportingWorkNum);
}else{
detail.setQuantityByProduced(0);
}
});
Integer deliveryNum = detailsDTO.stream().map(OrderDetail::getDeliveryNum).reduce(Integer::sum).get();
order.setPercent(deliveryNum/Math.toIntExact(order.getQuantity())*100);
order.setOrderDetails(detailsDTO);
});
return ordersDTO;
}
@Override
public List getOrderProgress(String orderId, String productId) {
//获取此订单 产品所有订单明细
List detailList = orderDetailService.list(
new LambdaQueryWrapper()
.eq(OrderDetail::getOrderId, orderId)
.eq(OrderDetail::getProductId, productId)
);
List detailListDTO = JSON.parseObject(
JSON.toJSONString(detailList),
new TypeReference>(){}
);
//获取订单生产明细
detailListDTO.forEach(detail1 -> {
List processDetailsGroupByProcessId = orderProcessDetailService.list(
new LambdaQueryWrapper()
.eq(OrderProcessDetail::getOrderId, detail1.getOrderId())
.eq(OrderProcessDetail::getOrderNumber, detail1.getOrderNumber())
.groupBy(OrderProcessDetail::getProcessId)
.groupBy(OrderProcessDetail::getTechnologyNumber)
.orderByAsc(OrderProcessDetail::getOrderNumber)
.orderByAsc(OrderProcessDetail::getTechnologyNumber)
);
//定义一个map,key为生产工序号+工艺号,value为生产明细
Map> orderProcessDetailCount = new HashMap<>();
processDetailsGroupByProcessId.forEach(detail2 -> {
List processDetails = orderProcessDetailService.list(
new LambdaQueryWrapper()
.eq(OrderProcessDetail::getOrderId, detail2.getOrderId())
.eq(OrderProcessDetail::getOrderNumber, detail2.getOrderNumber())
.eq(OrderProcessDetail::getProcessId, detail2.getProcessId())
.eq(OrderProcessDetail::getTechnologyNumber, detail2.getTechnologyNumber())
);
orderProcessDetailCount.put(detail2.getProcessId()+"/"+detail2.getTechnologyNumber(),
processDetails);
});
//给订单明细添加生产明细
detail1.setOrderProcessDetails(orderProcessDetailCount);
});
return detailListDTO;
}
@Override
public Map getFinishedOrder(Map object) {
List dates = (List) object.get("searchDate");
String endDate = LocalDate.now().toString();
String startDate = LocalDate.now().minusDays(180).toString();
if(dates !=null && dates.size()==2){
if(!dates.get(0).isEmpty()){
startDate = dates.get(0);
}
if(!dates.get(1).isEmpty()){
endDate = dates.get(1);
}
}
//获取此客户所有完成的订单
List orders = list(
new LambdaQueryWrapper()
.eq(Order::getCustomerId, object.get("customerId"))
.eq(Order::getCreateOrder, 2)
.eq(Order::getDelivery, 2)
.between(Order::getCreateTime, startDate, endDate)
.orderByDesc(Order::getId)
);
List ordersDTO = JSON.parseObject(
JSON.toJSONString(orders),
new TypeReference>(){}
);
Map result = new HashMap<>();
result.put("orders",ordersDTO);
List list = new ArrayList<>();
list.add(startDate);
list.add(endDate);
result.put("searchDate",list);
return result;
}
@Override
public List getOrderDetail(String orderId) {
return orderDetailService.list(new LambdaQueryWrapper().eq(OrderDetail::getOrderId,orderId));
}
}