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)); } }