|  |  | 
 |  |  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | 
 |  |  |     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("订单名称不能重复"); | 
 |  |  |         } | 
 |  |  |         p.setDeleted(false); | 
 |  |  |         extractedCheck(p); | 
 |  |  |         p.deleted = false; | 
 |  |  |         BaUser loginUser = userUtil.getUser(UserTokenContext.get()); | 
 |  |  |         if (loginUser != null) { | 
 |  |  |             p.creator = loginUser.id; | 
 |  |  | 
 |  |  |         if (orderDao.exists(p.name, p.id)) { | 
 |  |  |             throw new RuntimeException("订单名称不能重复"); | 
 |  |  |         } | 
 |  |  |         extractedCheck(p); | 
 |  |  |         int count = orderDao.updateByPrimaryKeySelective(p); | 
 |  |  |         if (count > 0) { | 
 |  |  |             saveOrderItems(p); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void changeRate(PrOrder prOrder) { | 
 |  |  |         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%"); | 
 |  |  |         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; | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |         } | 
 |  |  |         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("开始日期不能大于结束日期"); | 
 |  |  |         }*/ | 
 |  |  |     } | 
 |  |  | } |