package com.nanometer.smartlab.service; import com.nanometer.smartlab.dao.BaseMetaDao; import com.nanometer.smartlab.dao.EmailStatusDao; import com.nanometer.smartlab.dao.OpeOrderDao; import com.nanometer.smartlab.entity.*; import com.nanometer.smartlab.entity.enumtype.ApplyStatus; import com.nanometer.smartlab.entity.enumtype.ArrivalStatus; import com.nanometer.smartlab.entity.enumtype.EmailSendStatus; import com.nanometer.smartlab.entity.enumtype.OperateStatus; import com.nanometer.smartlab.entity.enumtype.StoreType; import com.nanometer.smartlab.exception.AlarmCode; import com.nanometer.smartlab.exception.AlarmException; import com.nanometer.smartlab.exception.BusinessException; import com.nanometer.smartlab.exception.ExceptionEnumCode; import com.nanometer.smartlab.util.IDUtils; import com.nanometer.smartlab.util.MessageUtil; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.context.annotation.Lazy; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by johnny on 17/12/14. */ @Service("opeOrderService") public class OpeOrderServiceImpl implements OpeOrderService { private static Logger logger = Logger.getLogger(OpeOrderService.class); @Resource(name = "opeOrderDao") OpeOrderDao opeOrderDao; @Resource private OpeApplyOrderService opeApplyOrderService; @Resource private SysSequenceService sysSequenceService; @Resource private OpeApplyService opeApplyService; @Lazy @Resource private OpeReagentStatusService opeReagentStatusService; @Lazy @Resource private OpeWarehouseReserveService opeWarehouseReserveService; @Lazy @Resource private OpeUseFlowService opeUseFlowService; @Resource EmailStatusDao emailStatusDao; @Resource(name="baseMetaDao") BaseMetaDao baseMetaDao; @Transactional(propagation = Propagation.REQUIRED) public List getOpeOrderList(String orderCode, String orderName, Timestamp startTime, Timestamp endTime, Integer status, String orderUserName, Integer first, Integer pageSize) { try { Map params = new HashMap(); if (StringUtils.isNotBlank(orderCode)) { params.put("orderCode", "%" + orderCode + "%"); } if (StringUtils.isNotBlank(orderName)) { params.put("orderName", "%" + orderName + "%"); } params.put("startTime", startTime); params.put("endTime", endTime); params.put("status", status); if (StringUtils.isNotBlank(orderUserName)) { params.put("orderUserName", "%" + orderUserName + "%"); } params.put("first", first); params.put("pageSize", pageSize); return this.opeOrderDao.getOpeOrderList(params); } catch (DataAccessException e) { logger.error(e.getMessage(), e); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e); } } @Transactional(propagation = Propagation.REQUIRED) public int getOpeOrderTotalCount(String orderCode, String orderName, Timestamp startTime, Timestamp endTime, Integer status, String orderUserName) { try { Map params = new HashMap(); if (StringUtils.isNotBlank(orderCode)) { params.put("orderCode", "%" + orderCode + "%"); } if (StringUtils.isNotBlank(orderName)) { params.put("orderName", "%" + orderName + "%"); } params.put("startTime", startTime); params.put("endTime", endTime); params.put("status", status); if (StringUtils.isNotBlank(orderUserName)) { params.put("orderUserName", "%" + orderUserName + "%"); } return this.opeOrderDao.getOpeOrderTotalCount(params); } catch (DataAccessException e) { logger.error(e.getMessage(), e); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e); } } @Transactional(propagation = Propagation.REQUIRED) public OpeOrder getOpeOrder(String id) { try { return this.opeOrderDao.getOpeOrder(id); } catch (DataAccessException e) { logger.error(e.getMessage(), e); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e); } } @Transactional(propagation = Propagation.REQUIRED) public OpeOrder insertOpeOrder(OpeOrder opeOrder) { try { opeOrder.setId(IDUtils.uuid()); this.opeOrderDao.insertOpeOrder(opeOrder); return opeOrder; } catch (DuplicateKeyException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_DUPLICATE, MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode())); } catch (DataIntegrityViolationException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode())); } catch (DataAccessException ex) { logger.error(ex.getMessage(), ex); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex); } } @Transactional(propagation = Propagation.REQUIRED) public boolean updateOpeOrder(OpeOrder opeOrder) { try { int row = this.opeOrderDao.updateOpeOrder(opeOrder); return row != 0; } catch (DuplicateKeyException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_DUPLICATE, MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode())); } catch (DataIntegrityViolationException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode())); } catch (DataAccessException ex) { logger.error(ex.getMessage(), ex); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex); } } @Transactional(propagation = Propagation.REQUIRED) public boolean deleteOpeOrder(List opeOrderList) { try { if (opeOrderList == null || opeOrderList.size() == 0) { return false; } List ids = new ArrayList(); for (OpeOrder opeOrder : opeOrderList) { ids.add(opeOrder.getId()); // 取消订单对应的申购 this.cancelOrderApply(opeOrder.getId()); } int row = this.opeOrderDao.deleteOpeOrder(ids); return row != 0; } catch (DataIntegrityViolationException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode())); } catch (DataAccessException ex) { logger.error(ex.getMessage(), ex); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex); } } @Transactional(propagation = Propagation.REQUIRED) public void createOpeOrder(OpeOrder opeOrder, List opeApplyList, SysUser orderUser) { if (opeOrder == null || opeApplyList == null || orderUser == null) { return; } opeOrder.setOrderCode(this.sysSequenceService.getOrderCode()); opeOrder.setStatus(ApplyStatus.PENDING_PURCHASE); opeOrder.setConsigneeUserId(null); opeOrder.setOrderUserId(orderUser.getId()); opeOrder.setArrivalTime(null); opeOrder.setSupplyId(opeApplyList.get(0).getReagent().getSupplierId()); opeOrder.setSupplyName(opeApplyList.get(0).getReagent().getSupplierName()); this.insertOpeOrder(opeOrder); OpeApplyOrder opeApplyOrder = null; for (OpeApply opeApply : opeApplyList) { opeApply.setStatus(ApplyStatus.PENDING_PURCHASE); this.opeApplyService.updateOpeApply(opeApply); opeApplyOrder = new OpeApplyOrder(); opeApplyOrder.setOpeOrderId(opeOrder.getId()); opeApplyOrder.setOpeApplyId(opeApply.getId()); this.opeApplyOrderService.insertOpeApplyOrder(opeApplyOrder); } } @Transactional(propagation = Propagation.REQUIRED) public void rukuOpeOrder(OpeOrder opeOrder, List opeApplyList) { if (opeOrder == null || opeApplyList == null) { return; } Integer applyNum = null; Integer arrivalNum = null; ApplyStatus flag = ApplyStatus.STORAGE; // 更新订单所对应的申购状态为已入库 for (OpeApply opeApply : opeApplyList) { applyNum = opeApply.getNum(); arrivalNum = opeApply.getArrivalNum(); if(applyNum > arrivalNum) { flag = ApplyStatus.UNCOMPLETED; opeApply.setStatus(ApplyStatus.UNCOMPLETED); }else { opeApply.setStatus(ApplyStatus.STORAGE); } this.opeApplyService.updateOpeApply(opeApply); } // 更新订单状态为已入库 opeOrder.setStatus(flag); this.updateOpeOrder(opeOrder); // 将入库的物品更新库存 OpeReagentStatus opeReagentStatus = null; BigInteger startReagentCode = null; BigInteger endReagentCode = null; String reagentCode = null; OpeWarehouseReserve opeWarehouseReserve = null; OpeUseFlow opeUseFlow = null; for (OpeApply opeApply : opeApplyList) { if(StringUtils.isNotBlank(opeApply.getStartReagentCode()) && StringUtils.isNotBlank(opeApply.getEndReagentCode())){ startReagentCode = new BigInteger(opeApply.getStartReagentCode()); endReagentCode = new BigInteger(opeApply.getEndReagentCode()); for (BigInteger i = startReagentCode; i.compareTo(endReagentCode) < 1; i = i.add(BigInteger.ONE)) { reagentCode = String.valueOf(i); if (this.opeReagentStatusService.isOpeReagentStatusExist(reagentCode)) { throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_EXIST, "申购编号:" + opeApply.getApplyCode() + "的试剂条形码[" + reagentCode + "]已存在。"); } opeReagentStatus = new OpeReagentStatus(); opeReagentStatus.setReagentId(opeApply.getReagent().getId()); opeReagentStatus.setArticleNumber(opeApply.getArticleNumber()); opeReagentStatus.setReagentCode(reagentCode); opeReagentStatus.setStatus(ArrivalStatus.WAREHOUSE); opeReagentStatus.setHouseId(opeApply.getHouseId()); opeReagentStatus.setContainerId(opeApply.getContainerId()); opeReagentStatus.setUserId(opeOrder.getConsigneeUserId()); opeReagentStatus.setPlace(opeApply.getPlaceId()); opeReagentStatus.setRemainder(opeApply.getReagent().getMainMetering() != null ? (opeApply.getReagent().getMainMetering()) : new BigDecimal(0)); opeReagentStatus.setStoreType(StoreType.APPLY); this.opeReagentStatusService.insertOpeReagentStatus(opeReagentStatus); opeUseFlow = new OpeUseFlow(); opeUseFlow.setReagentCode(opeReagentStatus.getReagentCode()); opeUseFlow.setStatus(opeReagentStatus.getStatus()); opeUseFlow.setHouseId(opeReagentStatus.getHouseId()); opeUseFlow.setContainerId(opeReagentStatus.getContainerId()); opeUseFlow.setUserId(opeReagentStatus.getUserId()); opeUseFlow.setPlace(opeReagentStatus.getPlace()); opeUseFlow.setRemainder(opeApply.getReagent().getMainMetering()!=null?(opeApply.getReagent().getMainMetering()):new BigDecimal(0)); opeUseFlow.setStoreType(StoreType.APPLY); Map metaMap = new HashMap<>(); metaMap.put("groupId", "operate_status"); metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEIN.getKey())); List baseMetaList = baseMetaDao.getBaseMetaList(metaMap); opeUseFlow.setOperateState(baseMetaList.get(0).getId()); this.opeUseFlowService.insertOpeUseFlow(opeUseFlow); } } opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve(opeApply.getReagent().getId(), opeApply.getArticleNumber()); if (opeWarehouseReserve == null) { opeWarehouseReserve = new OpeWarehouseReserve(); opeWarehouseReserve.setReagentId(opeApply.getReagent().getId()); opeWarehouseReserve.setArticleNumber(opeApply.getArticleNumber()); opeWarehouseReserve.setReserve(0); } opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() + opeApply.getArrivalNum()); if (StringUtils.isBlank(opeWarehouseReserve.getId())) { this.opeWarehouseReserveService.insertOpeWarehouseReserve(opeWarehouseReserve); } else { this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve); } } } public List getOpeApplyListByOrder(String orderId) { List result = null; List opeApplyOrderList = this.opeApplyOrderService.getOpeApplyOrderList(orderId, null); if (opeApplyOrderList != null && opeApplyOrderList.size() > 0) { result = new ArrayList(); for (OpeApplyOrder opeApplyOrder : opeApplyOrderList) { result.add(this.opeApplyService.getOpeApply(opeApplyOrder.getOpeApplyId())); } } return result; } public boolean isOrderPendingPurchase(OpeOrder opeOrder) { return opeOrder != null && opeOrder.getStatus() != null && opeOrder.getStatus().getKey() == ApplyStatus.PENDING_PURCHASE.getKey(); } @Transactional(propagation = Propagation.REQUIRED) public void cancelOrderApply(String orderId) { List opeApplyList = this.getOpeApplyListByOrder(orderId); if (opeApplyList != null && opeApplyList.size() > 0) { for (OpeApply opeApply : opeApplyList) { opeApply.setStatus(ApplyStatus.CANCEL); this.opeApplyService.updateOpeApply(opeApply); } } } @Transactional(propagation = Propagation.REQUIRED) public void emailStatusSave(OpeOrder opeOrder, List opeApplyList) { EmailStatus emailStatus = null; for (OpeApply opeApply : opeApplyList) { emailStatus = new EmailStatus(); emailStatus.setId(IDUtils.uuid()); emailStatus.setOrderCode(opeOrder.getOrderCode()); emailStatus.setApplyCode(opeApply.getApplyCode()); emailStatus.setReagentId(opeApply.getReagent().getId()); emailStatus.setNum(opeApply.getArrivalNum()); emailStatus.setApplyUserId(opeApply.getApplyUserId()); emailStatus.setStatus(EmailSendStatus.UN_SEND); // 待发送邮件保存 this.emailStatusDao.insertEmailStatus(emailStatus); } } @Transactional(propagation = Propagation.REQUIRED) public List getUnsendEmailList() { try { Map params = new HashMap(); params.put("status", EmailSendStatus.UN_SEND); return this.emailStatusDao.getEmailStatusList(params); } catch (DataAccessException e) { logger.error(e.getMessage(), e); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e); } } @Transactional(propagation = Propagation.REQUIRED) public int getUnsendEmailCount() { try { Map params = new HashMap(); params.put("status", EmailSendStatus.UN_SEND); return this.emailStatusDao.getEmailStatusTotalCount(params); } catch (DataAccessException e) { logger.error(e.getMessage(), e); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e); } } @Transactional(propagation = Propagation.REQUIRED) public boolean updateEmailStatus(EmailStatus emailStatus) { try { int row = this.emailStatusDao.updateEmailStatus(emailStatus); return row != 0; } catch (DuplicateKeyException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_DUPLICATE, MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode())); } catch (DataIntegrityViolationException ex) { logger.warn(ex.getMessage(), ex); throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode())); } catch (DataAccessException ex) { logger.error(ex.getMessage(), ex); throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex); } } /** * 由于修改条形码重新入库 * @param opeOrder * @param opeOrderApplyList */ @Transactional @Override public void reRukuInfo(OpeOrder opeOrder, List opeOrderApplyList) { if (opeOrder == null || opeOrderApplyList == null) { return; } // 将之前入库的信息删除 BigInteger startReagentCode = null; BigInteger endReagentCode = null; String reagentCode = null; OpeWarehouseReserve opeWarehouseReserve = null; //记录需要重新入库的信息LIST List reRukuopeOrderApplyList = new ArrayList<>(); for (OpeApply opeApply : opeOrderApplyList) { OpeApply opeApply1 = this.opeApplyService.selectOpeApplyByPrimaryKey(opeApply.getId()); if(opeApply.getArrivalNum().equals(opeApply1.getArrivalNum()) && opeApply.getStartReagentCode().equals(opeApply1.getStartReagentCode()) && opeApply.getEndReagentCode().equals(opeApply1.getEndReagentCode()) && opeApply.getArticleNumber().equals(opeApply1.getArticleNumber())){ //如果到货数量、批号、条形码开始、条形码结束都跟之前填入的一致,就不需要重新入库 continue; } reRukuopeOrderApplyList.add(opeApply); //删除入库信息 if(StringUtils.isNotBlank(opeApply1.getStartReagentCode()) && StringUtils.isNotBlank(opeApply1.getEndReagentCode())){ startReagentCode = new BigInteger(opeApply1.getStartReagentCode()); endReagentCode = new BigInteger(opeApply1.getEndReagentCode()); for (BigInteger i = startReagentCode; i.compareTo(endReagentCode) < 1; i = i.add(BigInteger.ONE)) { reagentCode = String.valueOf(i); this.opeReagentStatusService.deleteByReagentCode(reagentCode); this.opeUseFlowService.deleteByReagentCode(reagentCode); } } opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve(opeApply.getReagent().getId(), opeApply.getArticleNumber()); if (opeWarehouseReserve == null) { opeWarehouseReserve = new OpeWarehouseReserve(); opeWarehouseReserve.setReagentId(opeApply.getReagent().getId()); opeWarehouseReserve.setArticleNumber(opeApply.getArticleNumber()); opeWarehouseReserve.setReserve(0); } opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() - opeApply1.getArrivalNum()); if (StringUtils.isBlank(opeWarehouseReserve.getId())) { this.opeWarehouseReserveService.insertOpeWarehouseReserve(opeWarehouseReserve); } else { this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve); } } //进行重新入库操作 if(!reRukuopeOrderApplyList.isEmpty()){ rukuOpeOrder(opeOrder,reRukuopeOrderApplyList); } } @Override public List selectByReId(String id) { return this.emailStatusDao.selectByReId(id); } @Override public void updateByReId(String newReId, String oldReId) { Map params=new HashMap(); params.put("newReId",newReId); params.put("oldReId",oldReId); this.emailStatusDao.updateByReId(params); } @Override public OpeOrder getOrder(String id) { return opeOrderDao.selectParentOrder(id); } @Override @Transactional public void updateOpeOrderStatus(OpeOrder oo) { opeOrderDao.updateOpeOrderStatus(oo); } }