| package com.matrix.system.hive.service.imp; | 
|   | 
| import com.matrix.core.constance.MatrixConstance; | 
| import com.matrix.core.exception.GlobleException; | 
| import com.matrix.core.pojo.PaginationVO; | 
| import com.matrix.core.tools.DateUtil; | 
| import com.matrix.core.tools.WebUtil; | 
| import com.matrix.system.common.bean.SysUsers; | 
| import com.matrix.system.constance.Dictionary; | 
| import com.matrix.system.hive.bean.SysAllotDetail; | 
| import com.matrix.system.hive.bean.SysAllottedInfo; | 
| import com.matrix.system.hive.bean.SysStoreInfo; | 
| import com.matrix.system.hive.dao.SysAllotDetailDao; | 
| import com.matrix.system.hive.dao.SysAllottedInfoDao; | 
| import com.matrix.system.hive.dao.SysStoreInfoDao; | 
| import com.matrix.system.hive.service.SysAllottedInfoService; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.List; | 
|   | 
|   | 
| /** | 
|  * | 
|  *  | 
|  * @date 2016-07-18 18:11 | 
|  */ | 
|   | 
| @Service("sysAllottedInfoService") | 
| public class SysAllottedInfoServiceImpl implements SysAllottedInfoService { | 
|   | 
|     @Autowired | 
|     private SysAllottedInfoDao sysAllottedInfoDao; | 
|     @Autowired | 
|     private SysAllotDetailDao sysAllotDetailDao; | 
|     @Autowired | 
|     private SysStoreInfoDao sysStoreInfoDao; | 
|   | 
|     @Override | 
|     public int update(SysAllottedInfo sysAllottedInfo) { | 
|         return sysAllottedInfoDao.update(sysAllottedInfo); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int add(SysAllottedInfo sysAllottedInfo) { | 
|   | 
|         sysAllottedInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH); | 
|         // 设置编号 | 
|         sysAllottedInfo.setAllottedId(DateUtil.getTimeMark()); | 
|   | 
|         int i = sysAllottedInfoDao.insert(sysAllottedInfo); | 
|         // 获得id | 
|         Long id = sysAllottedInfo.getId(); | 
|         // 添加明细 | 
|         batchAddDetail(sysAllottedInfo, id); | 
|         return i; | 
|   | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int modify(SysAllottedInfo sysAllottedInfo) { | 
|         // 验证单据状态,如已通过则无法修改 | 
|         SysAllottedInfo checkAllottedInfo = sysAllottedInfoDao.selectById(sysAllottedInfo.getId()); | 
|         if (checkAllottedInfo != null && !(checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH))) { | 
|             throw new GlobleException("已审核,不能再修改!"); | 
|         } | 
|         // 获得id | 
|         Long id = sysAllottedInfo.getId(); | 
|         sysAllotDetailDao.deletebyAllottedInfoId(id); | 
|         batchAddDetail(sysAllottedInfo, id); | 
|         return sysAllottedInfoDao.update(sysAllottedInfo); | 
|     } | 
|   | 
|     /** | 
|      * 批量设置明细 | 
|      * | 
|      * @param sysAllottedInfo | 
|      * @param id | 
|      */ | 
|     private void batchAddDetail(SysAllottedInfo sysAllottedInfo, Long id) { | 
|         // 添加明细 | 
|         List<SysAllotDetail> allotDetails = sysAllottedInfo.getSysAllotDetails(); | 
|         List<SysAllotDetail> addList = new ArrayList<SysAllotDetail>(); | 
|         for (SysAllotDetail sAllotDetail : allotDetails) { | 
|             if (sAllotDetail.getSkuId() != null) { | 
|                 sAllotDetail.setAllotId(id); | 
|                 sAllotDetail.setRealTotal(0); | 
|                 sAllotDetail.setReceiveTotal(0); | 
|                 addList.add(sAllotDetail); | 
|             } | 
|         } | 
|         sysAllotDetailDao.batchInsert(addList); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int remove(List<Long> list) { | 
|   | 
|         for (Long id : list) { | 
|   | 
|             // 如果存在明细,则不能删除 | 
|             SysAllottedInfo sysAllottedInfo = this.sysAllottedInfoDao.selectById(id); | 
|   | 
|             if (!sysAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH)) { | 
|                 throw new GlobleException("编号为" + sysAllottedInfo.getAllottedId() + "的调拨单已审核,不能被删除"); | 
|             } | 
|   | 
|             if (sysAllottedInfo.getSysAllotDetails() != null && sysAllottedInfo.getSysAllotDetails().size() > 0) { | 
|                 List<SysAllotDetail> allotDetails = sysAllottedInfo.getSysAllotDetails(); | 
|                 this.sysAllotDetailDao.deleteByBeans(allotDetails); | 
|             } | 
|         } | 
|         return sysAllottedInfoDao.deleteByIds(list); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int removeById(Long id) { | 
|         // 如果存在明细,则不能删除 | 
|         SysAllottedInfo sysAllottedInfo = this.sysAllottedInfoDao.selectById(id); | 
|         if (!sysAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH)) { | 
|             throw new GlobleException("编号为" + sysAllottedInfo.getAllottedId() + "的调拨单已审核,不能被删除"); | 
|         } | 
|         if (sysAllottedInfo.getSysAllotDetails() != null && sysAllottedInfo.getSysAllotDetails().size() > 0) { | 
|             return 0; | 
|         } | 
|         return sysAllottedInfoDao.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public List<SysAllottedInfo> findInPage(SysAllottedInfo sysAllottedInfo, PaginationVO pageVo) { | 
|   | 
|         return sysAllottedInfoDao.selectInPage(sysAllottedInfo, pageVo); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public List<SysAllottedInfo> findByModel(SysAllottedInfo sysAllottedInfo) { | 
|   | 
|         return sysAllottedInfoDao.selectByModel(sysAllottedInfo); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public int findTotal(SysAllottedInfo sysAllottedInfo) { | 
|   | 
|         return sysAllottedInfoDao.selectTotalRecord(sysAllottedInfo); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public SysAllottedInfo findById(Long id) { | 
|   | 
|         return sysAllottedInfoDao.selectById(id); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int check(SysAllottedInfo newsysAllottedInfo) { | 
|         // 验证权限 | 
|         SysUsers user=(SysUsers)WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); | 
|         if (user.getRoleName().contains(Dictionary.STAFF_POST_PLZG) | 
|                 || user.getRoleName().contains(Dictionary.STAFF_POST_CKZG)) { | 
|             // 验证单据状态 | 
|             SysAllottedInfo checkAllottedInfo = sysAllottedInfoDao.selectById(newsysAllottedInfo.getId()); | 
|             if (!checkAllottedInfo.getAppManId().equals(user.getSuId())) { | 
|                 throw new GlobleException("无权审核该单据!"); | 
|             } | 
|             if (!(checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH))) { | 
|                 throw new GlobleException("该单据状态为" + checkAllottedInfo.getCheckStatus() + ",不可再审核!"); | 
|             } | 
|   | 
|             for (SysAllotDetail newSysAllotDetail : newsysAllottedInfo.getSysAllotDetails()) { | 
|                 sysAllotDetailDao.update(newSysAllotDetail); | 
|             } | 
|             // 保存调拨单状态,调拨明细单审核数量 | 
|             newsysAllottedInfo.setCheckStatus(Dictionary.CHECK_STATUS_SHTG); | 
|             int i = this.sysAllottedInfoDao.update(newsysAllottedInfo); | 
|             return i; | 
|         } else { | 
|             throw new GlobleException("审核人岗位必须为配料主管或者仓库主管!"); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 发货 操作者为审核人 | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int sendGoods(SysAllottedInfo sysAllottedInfo) { | 
|   | 
|         // 验证权限 | 
|         SysUsers user=(SysUsers)WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); | 
|         if (user.getRoleName().contains(Dictionary.STAFF_POST_PLZG) | 
|                 || user.getRoleName().contains(Dictionary.STAFF_POST_CKZG)) { | 
|             // 验证单据状态 | 
|             SysAllottedInfo checkAllottedInfo = sysAllottedInfoDao.selectById(sysAllottedInfo.getId()); | 
|             if (!checkAllottedInfo.getAppManId().equals(user.getSuId())) { | 
|                 throw new GlobleException("无权操作该单据!"); | 
|             } | 
|             if (!(checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_SHTG))) { | 
|                 throw new GlobleException("该单据状态为" + checkAllottedInfo.getCheckStatus() + ",不可发货!"); | 
|             } | 
|             // 保存调拨单状态,调拨明细单审核数量 | 
|             checkAllottedInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSHOUHUO); | 
|             int i = this.sysAllottedInfoDao.update(checkAllottedInfo); | 
|             // 先更新调拨明细信息 | 
|   | 
|             List<SysAllotDetail> sysAllotDetails = sysAllotDetailDao.selectAllottedDetailByOrderId(checkAllottedInfo.getId()); | 
|             for (SysAllotDetail newSysAllotDetail : sysAllotDetails) { | 
|                 // 出库 | 
|                 SysStoreInfo outStoreInfo = sysStoreInfoDao.selectById(newSysAllotDetail.getStoreId()); | 
|                 Double newStoreTotal = outStoreInfo.getStoreTotal() - newSysAllotDetail.getRealTotal(); | 
|   | 
|                 if (newStoreTotal > -1 | 
|                         || Dictionary.SHOP_NAME_ZONGDIAN.equals(checkAllottedInfo.getAllottedOutstoreName())) { | 
|                     outStoreInfo.setStoreTotal(newStoreTotal); | 
|                     sysStoreInfoDao.update(outStoreInfo); | 
|                 } else { | 
|                     throw new GlobleException("库存不足"); | 
|                 } | 
|             } | 
|             return i; | 
|         } else { | 
|             throw new GlobleException("操作人岗位必须为配料主管或者仓库主管!"); | 
|         } | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 收货 操作者为制单人 | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int rejectGoods(SysAllottedInfo sysAllottedInfo) { | 
|   | 
|         // 验证权限 | 
|         SysUsers user=(SysUsers)WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); | 
|         SysAllottedInfo checkAllottedInfo = sysAllottedInfoDao.selectById(sysAllottedInfo.getId()); | 
|         /* | 
|          * if(!checkAllottedInfo.getMakingManId().equals(user.getSuId())){ | 
|          * throw new GlobleException("无权操作该单据!"); } | 
|         // 不是同一个店铺的无权限收货 | 
|         if (!checkAllottedInfo.getAllottedInstoreId().equals(user.getShopId())) { | 
|             throw new GlobleException("不是本店用户,无权操作该单据!"); | 
|         } | 
|         */ | 
|         // 验证单据状态 | 
|         if (!(checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSHOUHUO))) { | 
|             throw new GlobleException("该单据状态为" + checkAllottedInfo.getCheckStatus() + ",不可再确认收货!"); | 
|         } | 
|   | 
|         // 保存调拨单状态,调拨明细单审核数量 | 
|         sysAllottedInfo.setCheckStatus(Dictionary.CHECK_STATUS_YWC); | 
|         int i = this.sysAllottedInfoDao.update(sysAllottedInfo); | 
|   | 
|         // 更新调拨单明细 | 
|         for (SysAllotDetail newSysAllotDetail : sysAllottedInfo.getSysAllotDetails()) { | 
|             sysAllotDetailDao.update(newSysAllotDetail); | 
|         } | 
|   | 
|         SysAllottedInfo newAllottedInfo = sysAllottedInfoDao.selectById(sysAllottedInfo.getId()); | 
|         List<SysAllotDetail> sysAllotDetails = sysAllotDetailDao.selectAllottedDetailByOrderId(newAllottedInfo.getId()); | 
|         // 更新库存 | 
|         for (SysAllotDetail newSysAllotDetail :sysAllotDetails) { | 
|             if (newSysAllotDetail.getReceiveTotal() > newSysAllotDetail.getRealTotal()) { | 
|                 throw new GlobleException("实际接收数不能大于实际调拨数!"); | 
|             } | 
|             //如果是同一批次的活则叠加库存 | 
|             SysStoreInfo srcStoreInfo= sysStoreInfoDao.selectById(newSysAllotDetail.getStoreId()); | 
|             // 入库 | 
|             SysStoreInfo inStoreInfo = sysStoreInfoDao.selectStoInfo(srcStoreInfo.getBatch(), | 
|                     checkAllottedInfo.getAllottedInstoreId()); | 
|             // 第一次调拨该批次商品 | 
|             if (inStoreInfo == null) { | 
|                 inStoreInfo = new SysStoreInfo(); | 
|                 inStoreInfo.setSkuId(newSysAllotDetail.getSkuId()); | 
|                 inStoreInfo.setStoreId(checkAllottedInfo.getAllottedInstoreId()); | 
|                 inStoreInfo.setStoreTotal((double) newSysAllotDetail.getReceiveTotal()); | 
|                 inStoreInfo.setBatch(srcStoreInfo.getBatch()); | 
|                 inStoreInfo.setGoodsPrice(newSysAllotDetail.getWholesale()); | 
|                 inStoreInfo.setTime(srcStoreInfo.getTime()); | 
|                 sysStoreInfoDao.insert(inStoreInfo); | 
|                 // 非第一次调拨商品 | 
|             } else { | 
|                 inStoreInfo.setStoreTotal(inStoreInfo.getStoreTotal() + newSysAllotDetail.getReceiveTotal()); | 
|                 sysStoreInfoDao.update(inStoreInfo); | 
|             } | 
|         } | 
|         return i; | 
|     } | 
|   | 
|     /** | 
|      * 撤销审核 | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public int unCheck(SysAllottedInfo newsysAllottedInfo) { | 
|         // 验证权限 | 
|         SysUsers user=(SysUsers)WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); | 
|         if (user.getRoleName().contains(Dictionary.STAFF_POST_PLZG) | 
|                 || user.getRoleName().contains(Dictionary.STAFF_POST_CKZG)) { | 
|             // 验证单据状态 | 
|             SysAllottedInfo checkAllottedInfo = sysAllottedInfoDao.selectById(newsysAllottedInfo.getId()); | 
|             if (!checkAllottedInfo.getAppManId().equals(user.getSuId())) { | 
|                 throw new GlobleException("无权撤销该单据!"); | 
|             } | 
|             if ((checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH))) { | 
|                 throw new GlobleException("该单据状态为" + checkAllottedInfo.getCheckStatus() + ",不可撤销审核!"); | 
|             } | 
|             // 保存调拨单状态,调拨明细单审核数量 | 
|             if (checkAllottedInfo.getAppRemark() != null) { | 
|                 checkAllottedInfo.setAppRemark(checkAllottedInfo.getAppRemark().replace("[弃审]", "") + "[弃审]"); | 
|             } else { | 
|                 checkAllottedInfo.setAppRemark("[弃审]"); | 
|             } | 
|             // 若果状态为审核通过则无库存数据返回 | 
|             if (!checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_SHTG)) { | 
|   | 
|                 // 先更新调拨明细信息 | 
|                 for (SysAllotDetail newSysAllotDetail : checkAllottedInfo.getSysAllotDetails()) { | 
|   | 
|                     // 出库 | 
|                     SysStoreInfo outStoreInfo =null;// sysStoreInfoDao.selectStoInfo(newSysAllotDetail.getSkuId(),checkAllottedInfo.getAllottedOutstoreId()); | 
|   | 
|                     double newStoreTotal = outStoreInfo.getStoreTotal() + newSysAllotDetail.getRealTotal(); | 
|   | 
|                     outStoreInfo.setStoreTotal(newStoreTotal); | 
|                     // 更新库存 | 
|                     sysStoreInfoDao.update(outStoreInfo); | 
|   | 
|                     if (checkAllottedInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_YWC)) { | 
|                         // TODO 去掉撤销审核这个功能 | 
|                         SysStoreInfo inStoreInfo = null;//sysStoreInfoDao.selectStoInfo(newSysAllotDetail.getSkuId(),checkAllottedInfo.getAllottedInstoreId()); | 
|                         if (inStoreInfo.getStoreTotal() - newSysAllotDetail.getReceiveTotal() <= 0 | 
|                                 || Dictionary.SHOP_NAME_ZONGDIAN.equals(checkAllottedInfo.getAllottedOutstoreName())) { | 
|                             throw new GlobleException(inStoreInfo.getGoods().getName() + "库存不足,撤消失败!"); | 
|                         } else { | 
|                             inStoreInfo | 
|                                     .setStoreTotal(inStoreInfo.getStoreTotal() - newSysAllotDetail.getReceiveTotal()); | 
|                         } | 
|                         sysStoreInfoDao.update(inStoreInfo); | 
|                     } | 
|   | 
|                 } | 
|             } | 
|             checkAllottedInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH); | 
|             return sysAllottedInfoDao.update(checkAllottedInfo); | 
|         } else { | 
|             throw new GlobleException("审核人岗位必须为配料主管或者仓库主管!"); | 
|         } | 
|     } | 
| } |