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> selectSome(QueryVo queryVo) { Map params = (Map) PojoUtils.generalize(queryVo); //查询符合条件的记录总数 Long itemTotal = orderDao.selectSomeCount(params); QueryResultVo> rsVo = new QueryResultVo<>(queryVo.pageSize, queryVo.pageCurr); //计算分页等信息 rsVo.calculateAndSet(itemTotal, params); List 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 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 selectAll(QueryVo queryVo) { Map params = (Map) PojoUtils.generalize(queryVo); List 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("开始日期不能大于结束日期"); }*/ } }