廖井涛
2024-10-21 e131f6e16de1df9fdcb7ede55cb9f4dc93e48ae8
north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java
@@ -12,15 +12,20 @@
import com.example.erp.dto.sd.OrderDTO;
import com.example.erp.dto.sd.OrderDetailProductDTO;
import com.example.erp.entity.sd.*;
import com.example.erp.entity.userInfo.Log;
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.LogService;
import com.example.erp.service.userInfo.SysErrorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLOutput;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
@@ -36,9 +41,10 @@
    private final SysErrorService sysErrorService;
    private final OrderOtherMoneyMapper orderOtherMoneyMapper;
    private final ProductMapper productMapper;
    private final LogService logService;
    private final OrderProcessDetailMapper orderProcessDetailMapper;
    public OrderService(OrderMapper orderMapper, OrderDetailMapper orderDetailMapper, OrderGlassDetailMapper orderGlassDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, SysErrorService sysErrorService, OrderOtherMoneyMapper orderOtherMoneyMapper, ProductMapper productMapper) {
    public OrderService(OrderMapper orderMapper, OrderDetailMapper orderDetailMapper, OrderGlassDetailMapper orderGlassDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, SysErrorService sysErrorService, OrderOtherMoneyMapper orderOtherMoneyMapper, ProductMapper productMapper, LogService logService) {
        this.orderMapper = orderMapper;
        this.orderDetailMapper = orderDetailMapper;
        this.orderGlassDetailMapper = orderGlassDetailMapper;
@@ -46,6 +52,7 @@
        this.sysErrorService = sysErrorService;
        this.orderOtherMoneyMapper = orderOtherMoneyMapper;
        this.productMapper = productMapper;
        this.logService = logService;
    }
    public boolean saveOrder(Map<String,Object> orderMap) throws Exception {
@@ -63,16 +70,25 @@
        Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
        //判断传入id参数是否为空,未传入id为空插入订单表,传入更新表
        try{
            Log log = new Log();
            log.setOperator(orderJson.getString("creator"));
            log.setOperatorId(orderJson.getString("creatorId"));
            log.setContent(orderMap.toString());
            if(order.getOrderId() == null || order.getOrderId().isEmpty()){
                insertOrder(order,OrderDetails,orderOtherMoneyList,orderIdType);
                log.setFunction("saveOrder创建:"+order.getOrderId());
            }else {
                updateOrder(order,OrderDetails,orderOtherMoneyList);
                log.setFunction("saveOrder修改:"+order.getOrderId());
            }
            logService.saveLog(log);
        }catch (Exception e){
            TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
            //将异常传入数据库
            SysError sysError = new SysError();
            sysError.setError(e.toString());
            sysError.setError(e.toString()+Arrays.toString(e.getStackTrace()));
            sysError.setFunc("saveOrder");
            sysErrorService.insert(sysError);
            saveState = false;
@@ -91,11 +107,22 @@
        Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
        //判断传入id参数是否为空,未传入id为空插入订单表,传入更新表
        try{
            Log log = new Log();
            log.setOperator(order.getCreator());
            log.setOperatorId(order.getCreatorId());
            log.setContent(orderMap.toString());
            log.setFunction("saveOrderTitle保存表头:"+order.getOrderId());
            Order order1 = orderMapper.selectOrderId(order.getOrderId());
            order.setCalculateType(order1.getCalculateType());
            LambdaUpdateWrapper<Order> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(Order::getOrderId, order.getOrderId());
            order.setCreateTime(null);
            orderMapper.update(order,updateWrapper);
            //修改订单主表面积与周长以及重量
            orderMapper.updateOrderParameter(order.getOrderId());
            logService.saveLog(log);
        }catch (Exception e){
            TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
@@ -155,6 +182,13 @@
            String formattedDate = dateFormat.format(currentDate);
            orderId =  "NG"+formattedDate+formattedNumber;
        }else if(dateType.equals("year")){
            Integer maxOrderId = orderMapper.selectMaxOrderIdByYear();
            String formattedNumber = String.format("%06d", maxOrderId+1);
            Date currentDate = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yy");
            String formattedDate = dateFormat.format(currentDate);
            orderId =  "NG"+formattedDate+formattedNumber;
        }
        return orderId;
@@ -163,36 +197,42 @@
    //修改订单数据,并且重新生成多个副表数据
    public void updateOrder(Order order,List<OrderDetail> OrderDetails,List<OrderOtherMoney> orderOtherMoneyList) {
        order.setCreateTime(null);
        LambdaUpdateWrapper<Order> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Order::getOrderId, order.getOrderId());
        orderMapper.update(order,updateWrapper);
            //删除订单明细表
            orderDetailMapper.delete(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getOrderId()));
            //删除订单小片表
            orderGlassDetailMapper.delete(new LambdaQueryWrapper<OrderGlassDetail>().eq(OrderGlassDetail::getOrderId, order.getOrderId()));
            //删除其他金额明细表
            orderOtherMoneyMapper.delete(new LambdaQueryWrapper<OrderOtherMoney>().eq(OrderOtherMoney::getOrderId, order.getOrderId()));
        //删除订单明细表
        orderDetailMapper.delete(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getOrderId()));
        //删除订单小片表
        orderGlassDetailMapper.delete(new LambdaQueryWrapper<OrderGlassDetail>().eq(OrderGlassDetail::getOrderId, order.getOrderId()));
        //删除其他金额明细表
        orderOtherMoneyMapper.delete(new LambdaQueryWrapper<OrderOtherMoney>().eq(OrderOtherMoney::getOrderId, order.getOrderId()));
        //删除订单工艺表
        // orderProcessDetailMapper.delete(new LambdaQueryWrapper<OrderProcessDetail>().eq(OrderProcessDetail::getOrderId, order.getOrderId()));
            //删除订单工艺表
            // orderProcessDetailMapper.delete(new LambdaQueryWrapper<OrderProcessDetail>().eq(OrderProcessDetail::getOrderId, order.getOrderId()));
            insertOtherDetail(order.getOrderId(),OrderDetails,orderOtherMoneyList);
        insertOtherDetail(order.getOrderId(),OrderDetails,orderOtherMoneyList);
    }
    //插入其他副表数据,被其他方法引用
    public void insertOtherDetail(String orderId,List<OrderDetail> OrderDetails,List<OrderOtherMoney> orderOtherMoneyList) {
        //先把其他金额副表的金额与数量置0
        orderOtherMoneyList.forEach(orderOtherMoney -> {
            orderOtherMoney.setQuantity(0.0);
        });
        if(orderOtherMoneyList!=null){
            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).getQuantity())));
            OrderDetails.get(i).setMonolithicPerimeter(Double.valueOf(String.format("%.3f",(OrderDetails.get(i).getWidth()+OrderDetails.get(i).getHeight())*2/1000)));
            Product product = productMapper.selectById(OrderDetails.get(i).getProductId());
            OrderDetails.get(i).setWeight(Double.valueOf(String.format("%.2f",product.getThickness()*OrderDetails.get(i).getWidth()*OrderDetails.get(i).getHeight()/1000000*2.5)));
@@ -209,21 +249,26 @@
            Map<String,Object> otherColumns = JSON.parseObject(OrderDetails.get(i).getOtherColumns(), new TypeReference<Map<String, Object>>(){});
            int finalI = i;
            if(otherColumns!=null){
                otherColumns.values().removeIf(value -> value == null || value.equals(""));
                OrderDetails.get(i).setOtherColumns(JSON.toJSONString(otherColumns));
                otherColumns.forEach((key, value) ->{
                    if(value!=null && key.contains("M")) {
                    if(value!=null && !value.equals("") && key.contains("M")) {
                        orderOtherMoneyList.forEach(orderOtherMoney -> {
                            if (orderOtherMoney.getColumn().equals(key)) {
                                orderOtherMoney.setQuantity(orderOtherMoney.getQuantity()+(Double.parseDouble((String) value)  * OrderDetails.get(finalI).getQuantity()));
                                orderOtherMoney.setQuantity(
                                        orderOtherMoney.getQuantity()+(Double.parseDouble((String) value)  * OrderDetails.get(finalI).getQuantity()));
                            }
                        });
                    }
                });
            }else if(OrderDetails.get(i).getOtherColumns()==null){
            }else{
                OrderDetails.get(i).setOtherColumns("{}");
            }
        }
@@ -233,14 +278,19 @@
        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);
        });
        if(orderOtherMoneyList!=null){
            orderOtherMoneyList.forEach(orderOtherMoney ->{
                orderOtherMoney.setId(null);
                orderOtherMoney.setOrderId(orderId);
                if(orderOtherMoney.getQuantity()!=null && orderOtherMoney.getPrice()!=null){
                    orderOtherMoney.setMoney((orderOtherMoney.getQuantity()*orderOtherMoney.getPrice()));
                }else {
                    orderOtherMoney.setMoney(0.0);
                }
                orderOtherMoneyMapper.insert(orderOtherMoney);
            });
        }
        //修改订单主表面积与周长以及重量
        orderMapper.updateOrderParameter(orderId);
@@ -353,30 +403,85 @@
        Order order = JSONObject.parseObject(JSONObject.toJSONString(jsonObject.get("order")), Order.class);
        List<OrderDetail> OrderDetails = JSONArray.parseArray(JSONObject.toJSONString(jsonObject.get("detail")), OrderDetail.class);
        List<OrderOtherMoney> orderOtherMoneyList = JSONArray.parseArray(JSONObject.toJSONString(jsonObject.get("otherMoney")), OrderOtherMoney.class);
        if(orderOtherMoneyList != null ){
            orderOtherMoneyList = orderOtherMoneyList.stream().filter(o -> o.getColumn().indexOf("M")==0).collect(Collectors.toList());
        }
        if(orderOtherMoneyList!=null){
            orderOtherMoneyList.forEach(orderOtherMoney -> {
                orderOtherMoney.setQuantity(0.0);
            });
        }
        Log log = new Log();
        log.setOperator(order.getCreator());
        log.setOperatorId(order.getCreatorId());
        log.setContent(jsonObject.toString());
        log.setFunction("updateOrderMoney金额重置:"+order.getOrderId());
        //删除其他金额明细表
        orderOtherMoneyMapper.delete(new LambdaQueryWrapper<OrderOtherMoney>().eq(OrderOtherMoney::getOrderId, order.getOrderId()));
        List<OrderOtherMoney> orderOtherMoneyLists=orderOtherMoneyList;
        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()));
            BigDecimal getGrossAmount= BigDecimal.valueOf(orderDetail.getGrossAmount());
            money+=getGrossAmount.doubleValue();
            Map<String,Object> otherColumns = JSON.parseObject(orderDetail.getOtherColumns(), new TypeReference<Map<String, Object>>(){});
            if(otherColumns!=null){
                otherColumns.values().removeIf(value -> value == null || value.equals(""));
                orderDetail.setOtherColumns(JSON.toJSONString(otherColumns));
                OrderDetail finalOrderDetail = orderDetail;
                otherColumns.forEach((key, value) ->{
                    if(value!=null && !value.equals("") && key.contains("M")) {
                        orderOtherMoneyLists.forEach(orderOtherMoney -> {
                            if (orderOtherMoney.getColumn().equals(key)) {
                                orderOtherMoney.setQuantity(
                                        orderOtherMoney.getQuantity()+(Double.parseDouble((String) value)  * finalOrderDetail.getQuantity()));
                            }
                        });
                    }
                });
            }else{
                orderDetail.setOtherColumns("{}");
            }
            orderOtherMoneyMapper.update(orderOtherMoney,new QueryWrapper<OrderOtherMoney>()
                    .eq("order_id",orderOtherMoney.getOrderId())
                    .eq("`column`",orderOtherMoney.getColumn()));
        });
        }
        if(orderOtherMoneyLists!=null){
            orderOtherMoneyLists.forEach(orderOtherMoney ->{
                orderOtherMoney.setId(null);
                orderOtherMoney.setOrderId(order.getOrderId());
                if(orderOtherMoney.getQuantity()!=null && orderOtherMoney.getPrice()!=null){
                    orderOtherMoney.setMoney((orderOtherMoney.getQuantity()*orderOtherMoney.getPrice()));
                }else {
                    orderOtherMoney.setMoney(0.0);
                }
                orderOtherMoneyMapper.insert(orderOtherMoney);
            });
        }
        order.setMoney(money+orderOtherMoneyMapper.selectGrossAmount(order.getOrderId()));
        order.setOtherMoney(orderOtherMoneyMapper.selectGrossAmount(order.getOrderId()));
        orderMapper.updateMoney(order);
        orderDetailMapper.updateOrderMoney(OrderDetails);
        logService.saveLog(log);
        return false;
    }
    private OrderDetail updateOrderMoneyComputed(OrderDetail orderDetail, Integer calculateType) {
        BigDecimal getPrice= BigDecimal.valueOf(orderDetail.getPrice());
        BigDecimal getQuantity= BigDecimal.valueOf(orderDetail.getQuantity());
        BigDecimal getComputeGrossArea= BigDecimal.valueOf(orderDetail.getComputeGrossArea());
        if (calculateType == 3) {
            orderDetail.setGrossAmount(orderDetail.getPrice() * orderDetail.getQuantity());
            orderDetail.setGrossAmount(getPrice.multiply(getQuantity).setScale(2, RoundingMode.HALF_UP).doubleValue());
        } else {
            orderDetail.setGrossAmount(orderDetail.getComputeGrossArea() * orderDetail.getPrice());
            orderDetail.setGrossAmount(getPrice.multiply(getComputeGrossArea).setScale(2, RoundingMode.HALF_UP).doubleValue());
        }
        return orderDetail;
    }
@@ -413,6 +518,34 @@
    public List<OrderDTO> exportOrderReport(List<LocalDate> dates) {
        return orderDetailMapper.exportOrderReport(dates);
    }
    public Map<String,Object> getOrderSummaryReport(Integer pageNum, Integer pageSize, List<String> selectDate, Order order) {
        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<String,Object> map = new HashMap<>();
        map.put("data",orderDetailMapper.getOrderSummaryReport(offset, pageSize, startDate, endDate, order));
        map.put("total",orderDetailMapper.getOrderSummaryReportTotal(offset, pageSize, startDate, endDate, order,"order"));
        List<String> 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<Order> exportOrderSummary(List<LocalDate> dates) {
        return orderDetailMapper.exportOrderSummary(dates);
    }
    public Map<String,Object> getOrderProductSummary(Integer pageNum, Integer pageSize, List<String> selectDate, OrderDetail orderDetail) {
@@ -465,16 +598,6 @@
            orderProductDetailMap.put("productId",map.get("productId"));
            orderProductDetailMap.put("productName",map.get("productName"));
            List<OrderDetail> 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);
        });
@@ -576,10 +699,11 @@
            List<OrderDetail> orderDetails = orderDetailMapper.getOrderProductByProductId(map.get("productId"),orderId);
            orderDetails.forEach(orderDetail->{
                orderDetail.setGrossArea(
                        Double.parseDouble(String.format("%.3f",Double.parseDouble(
                        /*Double.parseDouble(String.format("%.3f",Double.parseDouble(
                                String.format("%.3f",
                                        orderDetail.getWidth()*orderDetail.getHeight()/1000000)
                        ) * orderDetail.getQuantity()))
                        ) * orderDetail.getQuantity()))*/
                        orderDetail.getComputeGrossArea()
                );
                List<OrderGlassDetail> orderGlassDetails =
@@ -613,4 +737,62 @@
    public boolean updateOrderPrintNumber(String orderId) {
        return orderMapper.updateOrderPrintNumber(orderId);
    }
    public String updateOrderId(Map<String, Object> map) {
        String saveState = "true";
        JSONObject orderJson = new JSONObject(map);
        String oldOrderId = orderJson.getString("oldOrderId");
        String newOrderId = orderJson.getString("newOrderId");
        String orderIdType = orderJson.getString("orderIdType");
        Log log = new Log();
        log.setContent(map.toString());
        log.setFunction("updateOrderId修改订单号");
        log.setOperator(orderJson.getString("creator"));
        if(!Objects.equals(newOrderId, oldOrderId)){
            if(newOrderId.length()!=10){
                return "false4";
            }
            if(!newOrderId.substring(2, 10).matches("\\d+")){
                return "false5";
            }
            if(Objects.equals(orderIdType, "day")){
                if(orderMapper.selectOrderIdDay(oldOrderId)==1){
                    return "false6";
                }
            }else if(Objects.equals(orderIdType, "month")){
                if(orderMapper.selectOrderIdMonth(oldOrderId)==1){
                    return "false6";
                }
            }else if(Objects.equals(orderIdType, "year")){
                if(orderMapper.selectOrderIdYear(oldOrderId)==1){
                    return "false6";
                }
            }
            String substring = newOrderId.substring(1, 3);
            Integer substringInt = Integer.parseInt(newOrderId.substring(2, 10));
            if(!substring.equals("NG")){
                substring="NG";
            }
            //大于输入订单号的数量
            Integer count1 = orderMapper.selectOrderIdMin(substringInt);
            //输入订单号存在的数量
            Integer count2 = orderMapper.selectOrderIdIs(substringInt);
            if(count1>0 && count2==0){
                orderMapper.updateOrderId(oldOrderId,newOrderId);
                saveState= "true";
                logService.saveLog(log);
            }else if(count1==0){
                saveState= "false1";
                ;
            }else if(count2>0){
                saveState= "false2";
            }
        }else{
            saveState= "false3";
        }
        return saveState;
    }
}