package com.dy.pmsProduct.order; 
 | 
  
 | 
import com.dy.common.webFilter.UserTokenContext; 
 | 
import com.dy.common.webUtil.QueryResultVo; 
 | 
import com.dy.pmsGlobal.daoPr.*; 
 | 
import com.dy.pmsGlobal.pojoBa.BaUser; 
 | 
import com.dy.pmsGlobal.pojoPr.*; 
 | 
import com.dy.pmsGlobal.util.UserUtil; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.dubbo.common.utils.PojoUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.math.RoundingMode; 
 | 
import java.time.LocalDate; 
 | 
import java.time.format.DateTimeFormatter; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
  
 | 
@Slf4j 
 | 
@Service 
 | 
public class OrderSv { 
 | 
    private PrOrderMapper orderDao; 
 | 
    private PrOrderItemMapper orderItemDao; 
 | 
    private UserUtil userUtil; 
 | 
  
 | 
    @Autowired 
 | 
    public void setOrderDao(PrOrderMapper orderDao) { 
 | 
        this.orderDao = orderDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    public void setOrderItemDao(PrOrderItemMapper orderItemDao) { 
 | 
        this.orderItemDao = orderItemDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    public void setUserUtil(UserUtil userUtil) { 
 | 
        this.userUtil = userUtil; 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    public int save(PrOrder p) { 
 | 
        p.id = null; 
 | 
        //判断产品不能重名 
 | 
        if (orderDao.exists(p.name, p.id)) { 
 | 
            throw new RuntimeException("订单名称不能重复"); 
 | 
        } 
 | 
        extractedCheck(p); 
 | 
        p.deleted = false; 
 | 
        BaUser loginUser = userUtil.getUser(UserTokenContext.get()); 
 | 
        if (loginUser != null) { 
 | 
            p.creator = loginUser.id; 
 | 
        } 
 | 
        int count = orderDao.insertSelective(p); 
 | 
        saveOrderItems(p); 
 | 
        return count; 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    public int update(PrOrder p) { 
 | 
        if (orderDao.exists(p.name, p.id)) { 
 | 
            throw new RuntimeException("订单名称不能重复"); 
 | 
        } 
 | 
        extractedCheck(p); 
 | 
        int count = orderDao.updateByPrimaryKeySelective(p); 
 | 
        if (count > 0) { 
 | 
            saveOrderItems(p); 
 | 
        } 
 | 
        return count; 
 | 
    } 
 | 
  
 | 
    private void saveOrderItems(PrOrder p) { 
 | 
        p.items.forEach(param -> { 
 | 
            param.orderId = p.id; 
 | 
            if (param.id != null) { 
 | 
                orderItemDao.updateByPrimaryKeySelective(param); 
 | 
            } else { 
 | 
                param.deleted = false; 
 | 
                orderItemDao.insert(param); 
 | 
            } 
 | 
        }); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 逻辑删除实体 
 | 
     * 
 | 
     * @param id 实体ID 
 | 
     * @return 影响记录数量 
 | 
     */ 
 | 
    @Transactional 
 | 
    public int delete(Long id) { 
 | 
        return orderDao.deleteLogicById(id); 
 | 
    } 
 | 
  
 | 
    public PrOrder selectById(String proId) { 
 | 
        PrOrder pro = orderDao.selectByPrimaryKey(Long.valueOf(proId)); 
 | 
        changeRate(pro); 
 | 
        return pro; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取订单列表 
 | 
     */ 
 | 
    public QueryResultVo<List<PrOrder>> selectSome(QueryVo queryVo) { 
 | 
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo); 
 | 
  
 | 
        //查询符合条件的记录总数 
 | 
        Long itemTotal = orderDao.selectSomeCount(params); 
 | 
  
 | 
        QueryResultVo<List<PrOrder>> rsVo = new QueryResultVo<>(queryVo.pageSize, queryVo.pageCurr); 
 | 
        //计算分页等信息 
 | 
        rsVo.calculateAndSet(itemTotal, params); 
 | 
  
 | 
        List<PrOrder> orderList = orderDao.selectSome(params); 
 | 
        for (PrOrder prOrder : orderList) { 
 | 
            changeRate(prOrder); 
 | 
        } 
 | 
        //查询符合条件的记录 
 | 
        rsVo.obj = orderList; 
 | 
        return rsVo; 
 | 
    } 
 | 
  
 | 
    private void changeRate(PrOrder prOrder) { 
 | 
        if (prOrder != null && prOrder.items != null) { 
 | 
            List<PrOrderItem> items = prOrder.items; 
 | 
            for (int i = 1; i < items.size(); i++) { 
 | 
                for (int j = i - 1; j >= 0; j--) { 
 | 
                    //拿着i依次跟上一个比较,如果产品相同,则上一个记录complete_number - number 如果 > 0 分给i ,如果 < 0 则将 complete_number 置为0 
 | 
                    if (items.get(j).getProId().intValue() == items.get(i).getProId().intValue()) { 
 | 
                        int remainNumber = items.get(j).getCompleteNumber() - items.get(j).getNumber(); 
 | 
                        if (remainNumber > 0) { 
 | 
                            items.get(j).setCompleteNumber(items.get(j).getNumber()); 
 | 
                            items.get(j).setCompleteRate("100.00%"); 
 | 
                            items.get(i).setCompleteNumber(remainNumber); 
 | 
                            BigDecimal remainBig = new BigDecimal(remainNumber * 100); 
 | 
                            BigDecimal iNumberBig = new BigDecimal(items.get(i).getNumber()); 
 | 
                            BigDecimal result = remainBig.divide(iNumberBig, 2, RoundingMode.HALF_UP); 
 | 
                            items.get(i).setCompleteRate(result.toString() + "%"); 
 | 
                        } else { 
 | 
                            items.get(i).setCompleteNumber(0); 
 | 
                            items.get(i).setCompleteRate("0.00%"); 
 | 
                        } 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public List<PrOrder> selectAll(QueryVo queryVo) { 
 | 
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo); 
 | 
        List<PrOrder> orderList = orderDao.selectAll(params); 
 | 
        for (PrOrder prOrder : orderList) { 
 | 
            changeRate(prOrder); 
 | 
        } 
 | 
        return orderList; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 只更新状态,不更新其他字段 
 | 
     * 
 | 
     * @param order 更新状态  如果有在执行中的任务,不让暂停 
 | 
     * @return 
 | 
     */ 
 | 
    @Transactional 
 | 
    public int updateStatus(PrOrder order) { 
 | 
        if (order.status == OrderStatusEnum.NORMAL.getCode()) { 
 | 
            PrOrder prOrder = orderDao.selectByPrimaryKey(order.id); 
 | 
            prOrder.status = order.status; 
 | 
            extractedCheck(prOrder); 
 | 
        } 
 | 
        PrOrder param = new PrOrder(); 
 | 
        param.id = order.id; 
 | 
        param.status = order.status; 
 | 
        return orderDao.updateByPrimaryKeySelective(param); 
 | 
    } 
 | 
  
 | 
    //如果交期小于当前时间,不允许设置为正常 
 | 
    private void extractedCheck(PrOrder order) { 
 | 
        if (order.status == OrderStatusEnum.NORMAL.getCode()) { 
 | 
            String deliveryDateStr = order.getDeliveryDate(); 
 | 
            LocalDate endDate = LocalDate.parse(deliveryDateStr, DateTimeFormatter.ISO_LOCAL_DATE); 
 | 
            LocalDate nextDay = endDate.plusDays(1); 
 | 
            LocalDate today = LocalDate.now(); // 获取当前日期 
 | 
            if (nextDay.isBefore(today)) { 
 | 
                throw new RuntimeException("交付日期必须大于等于当前日期,请修改交付日期"); 
 | 
            } 
 | 
        } 
 | 
        //如果有在生产的任务不能设置为暂停 或 结束 
 | 
 /* 
 | 
        PrProductionProcess process = processDao.selectByPrimaryKey(order.processId); 
 | 
        if(process == null || !process.proId.equals(order.proId)){ 
 | 
            throw new RuntimeException("产品与生产流程不匹配"); 
 | 
        } 
 | 
        //开始日期要小于结束日期 
 | 
        if(order.startDate.compareTo(order.endDate) > 0){ 
 | 
            throw new RuntimeException("开始日期不能大于结束日期"); 
 | 
        }*/ 
 | 
    } 
 | 
} 
 |