|  |  | 
 |  |  | package com.dy.pmsProduct.order; | 
 |  |  |  | 
 |  |  | import cn.hutool.core.codec.Base64; | 
 |  |  | import com.dy.common.webFilter.UserTokenContext; | 
 |  |  | import com.dy.common.webUtil.QueryResultVo; | 
 |  |  | import com.dy.pmsGlobal.daoOth.OthFileMapper; | 
 |  |  | import com.dy.pmsGlobal.daoPr.*; | 
 |  |  | import com.dy.pmsGlobal.dyFile.FileOperate; | 
 |  |  | import com.dy.pmsGlobal.pojoBa.BaUser; | 
 |  |  | import com.dy.pmsGlobal.pojoPlt.PltProduct; | 
 |  |  | import com.dy.pmsGlobal.pojoPr.*; | 
 |  |  | import com.dy.pmsGlobal.util.UserUtil; | 
 |  |  | import com.dy.pmsProduct.order.QueryVo; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.dubbo.common.utils.PojoUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.io.IOException; | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | 
 |  |  |     private PrOrderMapper orderDao; | 
 |  |  |     private PrOrderItemMapper orderItemDao; | 
 |  |  |     private UserUtil userUtil; | 
 |  |  |     private FileOperate fileOperate; | 
 |  |  |     private OthFileMapper othFileMapper; | 
 |  |  |     @Value("${dy.webFile.fmUrl}") | 
 |  |  |     private String fmUrl; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setOrderDao(PrOrderMapper orderDao) { | 
 |  |  | 
 |  |  |         this.userUtil = userUtil; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setFileOperate(FileOperate fileOperate) { | 
 |  |  |         this.fileOperate = fileOperate; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setOthFileMapper(OthFileMapper othFileMapper) { | 
 |  |  |         this.othFileMapper = othFileMapper; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @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); | 
 |  |  | 
 |  |  |  | 
 |  |  |     public PrOrder selectById(String proId) { | 
 |  |  |         PrOrder pro = orderDao.selectByPrimaryKey(Long.valueOf(proId)); | 
 |  |  |         changeRate(pro); | 
 |  |  |         return pro; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         prOrder.setItems(items); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<PrOrder> selectAll(QueryVo queryVo) { | 
 |  |  |         Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo); | 
 |  |  |         return orderDao.selectAll(params); | 
 |  |  |         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("开始日期不能大于结束日期"); | 
 |  |  |         }*/ | 
 |  |  |     } | 
 |  |  | } |