package com.example.erp.service.sd; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.example.erp.common.Constants; import com.example.erp.dto.sd.OrderDTO; import com.example.erp.entity.sd.*; import com.example.erp.entity.userInfo.SysError; import com.example.erp.exception.ServiceException; import com.example.erp.mapper.sd.*; import com.example.erp.service.userInfo.SysErrorService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @Service @DS("sd") @Transactional(rollbackFor = Exception.class) public class OrderService { private final OrderMapper orderMapper; private final OrderDetailMapper orderDetailMapper; private final OrderGlassDetailMapper orderGlassDetailMapper; private final SysErrorService sysErrorService; private final OrderOtherMoneyMapper orderOtherMoneyMapper; private final OrderProcessDetailMapper orderProcessDetailMapper; public OrderService(OrderMapper orderMapper, OrderDetailMapper orderDetailMapper, OrderGlassDetailMapper orderGlassDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, SysErrorService sysErrorService, OrderOtherMoneyMapper orderOtherMoneyMapper) { this.orderMapper = orderMapper; this.orderDetailMapper = orderDetailMapper; this.orderGlassDetailMapper = orderGlassDetailMapper; this.orderProcessDetailMapper = orderProcessDetailMapper; this.sysErrorService = sysErrorService; this.orderOtherMoneyMapper = orderOtherMoneyMapper; } public boolean saveOrder(Map orderMap) throws Exception { JSONObject orderJson = new JSONObject(orderMap); Order order = JSONObject.parseObject(JSONObject.toJSONString(orderJson.get("title")), Order.class); List OrderDetails = JSONArray.parseArray(JSONObject.toJSONString(orderJson.get("detail")), OrderDetail.class); List orderOtherMoneyList = JSONArray.parseArray(JSONObject.toJSONString(orderJson.get("otherMoney")), OrderOtherMoney.class); orderOtherMoneyList = orderOtherMoneyList.stream().filter(o -> o.getColumn().indexOf("M")==0).collect(Collectors.toList()); boolean saveState = true; //设置回滚点 Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); //判断传入id参数是否为空,未传入id为空插入订单表,传入更新表 try{ if(order.getOrderId() == null || order.getOrderId().isEmpty()){ insertOrder(order,OrderDetails,orderOtherMoneyList); }else { updateOrder(order,OrderDetails,orderOtherMoneyList); } }catch (Exception e){ TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint); //将异常传入数据库 SysError sysError = new SysError(); sysError.setError(e.toString()); sysError.setFunc("saveOrder"); sysErrorService.insert(sysError); saveState = false; //throw new Exception(); } return saveState; } public boolean saveOrderTitle(Map orderMap) throws Exception { JSONObject orderJson = new JSONObject(orderMap); Order order = JSONObject.parseObject(JSONObject.toJSONString(orderJson.get("title")), Order.class); boolean saveState = true; //设置回滚点 Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); //判断传入id参数是否为空,未传入id为空插入订单表,传入更新表 try{ LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Order::getOrderId, order.getOrderId()); orderMapper.update(order,updateWrapper); //修改订单主表面积与周长以及重量 orderMapper.updateOrderParameter(order.getOrderId()); }catch (Exception e){ TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint); //将异常传入数据库 SysError sysError = new SysError(); sysError.setError(e.toString()); sysError.setFunc("saveOrder"); sysErrorService.insert(sysError); saveState = false; //throw new Exception(); } return saveState; } public Map selectOrder(Map orderMap) throws Exception { JSONObject orderJson = new JSONObject(orderMap); Order order = JSONObject.parseObject(JSONObject.toJSONString(orderJson.get("title")), Order.class); Map map = new HashMap<>(); if(order.getOrderId()!=null && !order.getOrderId().isEmpty()){ map.put("data",0); }else{ map.put("data",orderMapper.selectOrder(order)); } return map; } //生成订单数据 public void insertOrder(Order order,List OrderDetails,List orderOtherMoneyList) { String orderId = getOrderId("day"); //往主表插数据 order.setOrderId(orderId); order.setCreateOrder(2); orderMapper.insert(order); insertOtherDetail(orderId,OrderDetails,orderOtherMoneyList); } private String getOrderId(String dateType){ String orderId = null; if(dateType.equals("day")){ Integer maxOrderId = orderMapper.selectMaxOrderId(); //查询订单id,并且自增 String formattedNumber = String.format("%02d", maxOrderId+1); //格式化当前日期 Date currentDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd"); String formattedDate = dateFormat.format(currentDate); orderId = "NG"+formattedDate+formattedNumber; }else if(dateType.equals("month")){ Integer maxOrderId = orderMapper.selectMaxOrderIdByMonth(); String formattedNumber = String.format("%04d", maxOrderId+1); Date currentDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMM"); String formattedDate = dateFormat.format(currentDate); orderId = "NG"+formattedDate+formattedNumber; } return orderId; } //修改订单数据,并且重新生成多个副表数据 public void updateOrder(Order order,List OrderDetails,List orderOtherMoneyList) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Order::getOrderId, order.getOrderId()); orderMapper.update(order,updateWrapper); //删除订单明细表 orderDetailMapper.delete(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, order.getOrderId())); //删除订单小片表 orderGlassDetailMapper.delete(new LambdaQueryWrapper().eq(OrderGlassDetail::getOrderId, order.getOrderId())); //删除其他金额明细表 orderOtherMoneyMapper.delete(new LambdaQueryWrapper().eq(OrderOtherMoney::getOrderId, order.getOrderId())); //删除订单工艺表 // orderProcessDetailMapper.delete(new LambdaQueryWrapper().eq(OrderProcessDetail::getOrderId, order.getOrderId())); insertOtherDetail(order.getOrderId(),OrderDetails,orderOtherMoneyList); } //插入其他副表数据,被其他方法引用 public void insertOtherDetail(String orderId,List OrderDetails,List orderOtherMoneyList) { //先把其他金额副表的金额与数量置0 orderOtherMoneyList.forEach(orderOtherMoney -> { orderOtherMoney.setQuantity(0.0); }); //循环给订单明细表字段添加序号和周长 for (int i = 0; i < OrderDetails.size(); i++) { OrderDetails.get(i).setOrderNumber(i+1); OrderDetails.get(i).setOrderId(orderId); OrderDetails.get(i).setPerimeter(Double.valueOf(String.format("%.3f",(OrderDetails.get(i).getWidth()+OrderDetails.get(i).getHeight())*2/1000))); OrderDetails.get(i).setWeight(1.0); if(OrderDetails.get(i).getBendRadius()!=null && OrderDetails.get(i).getBendRadius()!=0){ //获取弯钢弧度 Double bendRadius = OrderDetails.get(i).getBendRadius(); //获取宽 Double width = OrderDetails.get(i).getWidth(); //获取拱高 String archRiseS = String.format("%.1f",bendRadius-(bendRadius*Math.cos(width/2/bendRadius))); Double archRise = Double.parseDouble(archRiseS); OrderDetails.get(i).setArchRise(archRise); } Map otherColumns = JSON.parseObject(OrderDetails.get(i).getOtherColumns(), new TypeReference>(){}); int finalI = i; if(otherColumns!=null){ otherColumns.forEach((key, value) ->{ if(value!=null && key.contains("M")) { orderOtherMoneyList.forEach(orderOtherMoney -> { if (orderOtherMoney.getColumn().equals(key)) { orderOtherMoney.setQuantity(orderOtherMoney.getQuantity()+(Double.parseDouble((String) value) * OrderDetails.get(finalI).getQuantity())); } }); } }); } } //往明细表插数据 orderDetailMapper.insertBatch(OrderDetails); //往小片表传入产品数据 orderGlassDetailMapper.insertOrderGlassDetail(orderId); orderOtherMoneyList.forEach(orderOtherMoney ->{ orderOtherMoney.setId(null); orderOtherMoney.setOrderId(orderId); if(orderOtherMoney.getQuantity()!=null && orderOtherMoney.getPrice()!=null){ orderOtherMoney.setMoney((orderOtherMoney.getQuantity()*orderOtherMoney.getPrice())); } orderOtherMoneyMapper.insert(orderOtherMoney); }); //修改订单主表面积与周长以及重量 orderMapper.updateOrderParameter(orderId); } public static List getOrderProcessDetails(List orderGlassDetails) { List orderProcessDetailList = new ArrayList<>(); for (OrderGlassDetail orderGlassDetail : orderGlassDetails) { String[] processList = orderGlassDetail.getProcess().split("->"); for (String process : processList) { OrderProcessDetail orderProcessDetail = new OrderProcessDetail(); orderProcessDetail.setOrderId(orderGlassDetail.getOrderId()); orderProcessDetail.setOrderNumber(orderGlassDetail.getOrderNumber()); orderProcessDetail.setTechnologyNumber(orderGlassDetail.getTechnologyNumber()); orderProcessDetail.setProcess(process); orderProcessDetailList.add(orderProcessDetail); } } return orderProcessDetailList; } //查询获取列表 public Map getOrderList(Integer pageNum, Integer pageSize, List selectDate, Order order,Integer orderType) { Integer offset = (pageNum-1)*pageSize; String endDate = LocalDate.now().toString(); String startDate = LocalDate.now().minusDays(15).toString(); if(selectDate !=null && selectDate.size()==2){ if(!selectDate.get(0).isEmpty()){ startDate = selectDate.get(0); } if(!selectDate.get(1).isEmpty()){ endDate = selectDate.get(1); } } Map map = new HashMap<>(); map.put("data",orderMapper.getOrderList(offset, pageSize, startDate, endDate, order,orderType)); map.put("total",orderMapper.getPageTotal(offset, pageSize, startDate, endDate, order,orderType)); List list = new ArrayList<>(); list.add(startDate); list.add(endDate); map.put("selectDate",list); return map; } //删除订单 public Integer deleteOrder(String id) { return orderMapper.delete( new QueryWrapper().eq("order_id",id) ); } //查询订单主表与副表信息 public Map getOrderById(String id) { Order order = orderMapper.selectOne(new QueryWrapper().eq("order_id",id)); List orderDetails = orderDetailMapper.selectList(new QueryWrapper().eq("order_id",id)); List orderOtherMoneyList = orderOtherMoneyMapper.findById(id); Map map = new HashMap<>(); map.put("order",order); map.put("orderDetails",orderDetails); map.put("orderOtherMoneyList",orderOtherMoneyList); return map; } //订单审核 public boolean reviewOrderById(String id, Integer status, String userId, String userName) { Order order = orderMapper.selectOne(new QueryWrapper().eq("order_id",id)); if(order.getProcessReview()!=2){ throw new ServiceException(Constants.Code_600,"该订单还未审核"); }else if(status==0){ return orderMapper.reviewOrderByIds(id,status,userId,userName); }else{ return orderMapper.reviewOrderById(id,status,userId,userName); } } //工艺审核界面审核更新数据 public boolean reviewProcessById(String id, Integer status,List orderGlassDetails) { if(!orderGlassDetails.isEmpty() && status==2){ orderGlassDetails.forEach(orderGlassDetail ->{ double area = Math.round((orderGlassDetail.getChildWidth()*orderGlassDetail.getChildHeight()/1000000) * 100) * 0.01d; orderGlassDetail.setArea(area); }); orderGlassDetailMapper.updateSizeAndProcess(orderGlassDetails); orderProcessDetailMapper.delete(new QueryWrapper().eq("order_id",id)); //查询订单小片表获取工艺传入小片工艺表 //List orderGlassDetailList = orderGlassDetailMapper.selectOrderGlassDetail(id); // List orderProcessDetailList = getOrderProcessDetails(orderGlassDetailList); // //赋值订单工艺表 // orderProcessDetailMapper.insertOrderProcessDetail(orderProcessDetailList); } return orderMapper.reviewProcessById(id,status); } //工艺审核界面数据查询 public Map getOrderCraftById(String id) { Order order = orderMapper.selectOne(new QueryWrapper().eq("order_id",id)); List orderGlassDetails = orderGlassDetailMapper.selectOrderGlassDetailByOrderId(id); Map map = new HashMap<>(); map.put("order",order); map.put("orderGlassDetails",orderGlassDetails); return map; } public boolean updateOrderMoney(Map map) { JSONObject jsonObject = new JSONObject(map); Order order = JSONObject.parseObject(JSONObject.toJSONString(jsonObject.get("order")), Order.class); List OrderDetails = JSONArray.parseArray(JSONObject.toJSONString(jsonObject.get("detail")), OrderDetail.class); List orderOtherMoneyList = JSONArray.parseArray(JSONObject.toJSONString(jsonObject.get("otherMoney")), OrderOtherMoney.class); double money = 0; for (OrderDetail orderDetail : OrderDetails) { orderDetail = updateOrderMoneyComputed(orderDetail,order.getCalculateType()); money+= orderDetail.getGrossAmount(); } orderOtherMoneyList.forEach(orderOtherMoney -> { if(orderOtherMoney.getQuantity()!=null && orderOtherMoney.getPrice()!=null){ orderOtherMoney.setMoney((orderOtherMoney.getQuantity()*orderOtherMoney.getPrice())); } orderOtherMoneyMapper.update(orderOtherMoney,new QueryWrapper() .eq("order_id",orderOtherMoney.getOrderId()) .eq("`column`",orderOtherMoney.getColumn())); }); order.setMoney(money+orderOtherMoneyMapper.selectGrossAmount(order.getOrderId())); orderMapper.updateMoney(order); orderDetailMapper.updateOrderMoney(OrderDetails); return false; } private OrderDetail updateOrderMoneyComputed(OrderDetail orderDetail, Integer calculateType) { if (calculateType == 3) { orderDetail.setGrossAmount(orderDetail.getPrice() * orderDetail.getQuantity()); } else { orderDetail.setGrossAmount(orderDetail.getComputeGrossArea() * orderDetail.getPrice()); } return orderDetail; } public Integer cancelOrder(String id) { return orderMapper.cancelOrder(id); } public Map getOrderReport(Integer pageNum, Integer pageSize, List selectDate, OrderDetail orderDetail) { Integer offset = (pageNum-1)*pageSize; String endDate = LocalDate.now().toString(); String startDate = LocalDate.now().minusDays(15).toString(); if(selectDate !=null && selectDate.size()==2){ if(!selectDate.get(0).isEmpty()){ startDate = selectDate.get(0); } if(!selectDate.get(1).isEmpty()){ endDate = selectDate.get(1); } } Map map = new HashMap<>(); map.put("data",orderDetailMapper.getOrderReport(offset, pageSize, startDate, endDate, orderDetail)); map.put("total",orderDetailMapper.getOrderReportTotal(offset, pageSize, startDate, endDate, orderDetail,"order")); List list = new ArrayList<>(); list.add(startDate); list.add(endDate); map.put("selectDate",list); // map.put("total",orderMapper.getPageTotal(offset, pageSize, startDate, endDate, orderDetail)); return map; } public List exportOrderReport(List dates) { return orderDetailMapper.exportOrderReport(dates); } public Map getOrderProductSummary(Integer pageNum, Integer pageSize, List selectDate, OrderDetail orderDetail) { Integer offset = (pageNum-1)*pageSize; String endDate = LocalDate.now().toString(); String startDate = LocalDate.now().minusDays(15).toString(); if(selectDate !=null && selectDate.size()==2){ if(!selectDate.get(0).isEmpty()){ startDate = selectDate.get(0); } if(!selectDate.get(1).isEmpty()){ endDate = selectDate.get(1); } } Map map = new HashMap<>(); map.put("data",orderDetailMapper.getOrderProductSummary(offset, pageSize, startDate, endDate, orderDetail)); map.put("total",orderDetailMapper.getOrderProductSummaryTotal(offset, pageSize, startDate, endDate, orderDetail, "product")); List list = new ArrayList<>(); list.add(startDate); list.add(endDate); map.put("selectDate",list); // map.put("total",orderMapper.getPageTotal(offset, pageSize, startDate, endDate, orderDetail)); return map; } public List exportOrderProductSummary(List dates) { return orderDetailMapper.exportOrderProductSummary(dates); } public Map getOrderProductDetailTag(String orderId) { return orderDetailMapper.getOrderProductDetailTag(orderId); } public List getOrderDetailById(String id) { return orderDetailMapper.selectList(new QueryWrapper().eq("order_id",id)); } public List getOrderCraftDetailById(String id) { return orderGlassDetailMapper.selectOrderGlassDetailByOrderId(id); } public Object printOrderProductDetail(String orderId) { List> orderProductDistinct = orderDetailMapper.getOrderProductDistinctById(orderId); List> orderProductDetail = new ArrayList<>(); orderProductDistinct.forEach(map->{ Map orderProductDetailMap = new HashMap<>(); orderProductDetailMap.put("productId",map.get("productId")); orderProductDetailMap.put("productName",map.get("productName")); List orderDetails = orderDetailMapper.getOrderProductByProductId(map.get("productId"),orderId); orderDetails.forEach(orderDetail->{ orderDetail.setGrossArea( Double.parseDouble(String.format("%.3f",Double.parseDouble( String.format("%.3f", orderDetail.getWidth()*orderDetail.getHeight()/1000000) ) * orderDetail.getQuantity())) ); }); orderProductDetailMap.put("productDetail",orderDetails); orderProductDetail.add(orderProductDetailMap); }); Map returns = new HashMap<>(); returns.put("orderProductDetail",orderProductDetail); returns.put("order",orderMapper.selectOne(new QueryWrapper().eq("order_id",orderId))); return returns; } public Object printOrderProductDetails(String orderId,List productId) { List> orderProductDistinct; if (productId.size()>0){ orderProductDistinct = orderDetailMapper.getOrderProductDistinctByIds(orderId,productId); }else{ orderProductDistinct = orderDetailMapper.getOrderProductDistinctById(orderId); } List> orderProductDetail = new ArrayList<>(); orderProductDistinct.forEach(map->{ Map orderProductDetailMap = new HashMap<>(); orderProductDetailMap.put("productId",map.get("productId")); orderProductDetailMap.put("productName",map.get("productName")); List orderDetails = orderDetailMapper.getOrderProductByProductId(map.get("productId"),orderId); orderDetails.forEach(orderDetail->{ orderDetail.setGrossArea( Double.parseDouble(String.format("%.3f",Double.parseDouble( String.format("%.3f", orderDetail.getWidth()*orderDetail.getHeight()/1000000) ) * orderDetail.getQuantity())) ); }); orderProductDetailMap.put("productDetail",orderDetails); orderProductDetail.add(orderProductDetailMap); }); Map returns = new HashMap<>(); returns.put("orderProductDetail",orderProductDetail); returns.put("order",orderMapper.selectOne(new QueryWrapper().eq("order_id",orderId))); return returns; } public Object printOrderProductGlassDetail(String orderId) { Map returns = new HashMap<>(); returns.put("order",orderMapper.selectOne(new QueryWrapper().eq("order_id",orderId))); List> orderProductDistinct = orderDetailMapper.getOrderProductDistinctById(orderId); List> orderProductDetail = new ArrayList<>(); orderProductDistinct.forEach(map->{ Map orderProductDetailMap = new HashMap<>(); orderProductDetailMap.put("productId",map.get("productId")); orderProductDetailMap.put("productName",map.get("productName")); List orderDetails = orderDetailMapper.getOrderProductByProductId(map.get("productId"),orderId); orderDetails.forEach(orderDetail->{ orderDetail.setGrossArea( Double.parseDouble(String.format("%.3f",Double.parseDouble( String.format("%.3f", orderDetail.getWidth()*orderDetail.getHeight()/1000000) ) * orderDetail.getQuantity())) ); List orderGlassDetails = orderGlassDetailMapper.selectList( new QueryWrapper(). eq("order_id",orderId). eq("order_number",orderDetail.getOrderNumber()) ); Integer differentSize = orderGlassDetailMapper.getDifferentSizeNumber(orderId,orderDetail.getOrderNumber()); orderDetail.setDifferentSize(differentSize); orderDetail.setOrderGlassDetails(orderGlassDetails); }); orderProductDetailMap.put("productDetail",orderDetails); orderProductDetail.add(orderProductDetailMap); }); returns.put("orderDetail",orderProductDetail); return returns; } }