package com.goafanti.order.service.impl; import java.math.BigDecimal; import java.text.ParseException; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.goafanti.common.bo.Error; import com.goafanti.common.constant.AFTConstants; import com.goafanti.common.dao.NewOrderChangeMapper; import com.goafanti.common.dao.OrderChangeLogMapper; import com.goafanti.common.dao.OrderExamineMapper; import com.goafanti.common.dao.OrderRefundInvoiceMapper; import com.goafanti.common.dao.TOrderBillNewMapper; import com.goafanti.common.dao.TOrderDunMapper; import com.goafanti.common.dao.TOrderInvoiceMapper; import com.goafanti.common.dao.TOrderLogMapper; import com.goafanti.common.dao.TOrderNewMapper; import com.goafanti.common.dao.TOrderTaskMapper; import com.goafanti.common.error.BusinessException; import com.goafanti.common.model.OrderChangeLog; import com.goafanti.common.model.OrderExamine; import com.goafanti.common.model.OrderRefundInvoice; import com.goafanti.common.model.TOrderDun; import com.goafanti.common.model.TOrderNew; import com.goafanti.common.model.NewOrderChange; import com.goafanti.common.utils.DateUtils; import com.goafanti.common.utils.StringUtils; import com.goafanti.core.mybatis.BaseMybatisDao; import com.goafanti.core.mybatis.JDBCIdGenerator; import com.goafanti.core.mybatis.page.Pagination; import com.goafanti.core.shiro.token.TokenManager; import com.goafanti.order.bo.BillBo; import com.goafanti.order.bo.InvoiceBo; import com.goafanti.order.bo.NewOrderChangeBo; import com.goafanti.order.bo.OrderChangeLogBo; import com.goafanti.order.bo.TOrderLogBo; import com.goafanti.order.bo.TOrderTaskBo; import com.goafanti.order.service.OrderChangeService; import com.goafanti.order.service.OrderService; @Service public class OrderChangeServiceImpl extends BaseMybatisDao implements OrderChangeService { @Autowired private NewOrderChangeMapper newOrderChangeMapper; @Autowired private OrderChangeLogMapper orderChangeLogMapper; @Autowired private TOrderNewMapper tOrderNewMapper; @Autowired private TOrderDunMapper tOrderDunMapper; @Autowired private TOrderLogMapper tOrderLogMapper; @Autowired private TOrderTaskMapper tOrderTaskMapper; @Autowired private TOrderBillNewMapper tOrderBillNewMapper; @Autowired private TOrderInvoiceMapper tOrderInvoiceMapper; @Autowired private OrderRefundInvoiceMapper orderRefundInvoiceMapper; @Autowired private OrderExamineMapper orderExamineMapper; @Autowired private OrderService orderService; @Autowired private JDBCIdGenerator idGenerator; @Override public int addOrderChange(NewOrderChangeBo t,String startRemarks) { TOrderNew ton=new TOrderNew(); ton.setOrderNo(t.getOrderNo()); ton.setDeleteSign(2);//将订单置为锁定 t.setProcessState(1);//设置营销管理员来审核 tOrderNewMapper.updateByPrimaryKeySelective(ton); BigDecimal invoiceAmount=tOrderInvoiceMapper.conutAmountByOrderNo(t.getOrderNo()); t.setInvoiceAmount(invoiceAmount);//开票金额 BigDecimal paymentAmount=tOrderBillNewMapper.conutAmountByOrderNo(t.getOrderNo()); t.setPaymentAmount(paymentAmount);//收款金额 //预计成本与预计退款:预计成本=项目价格*数量 预计退款=收款-预计成本 BigDecimal estimateCost=new BigDecimal(tOrderTaskMapper.selectEstimateCost(t.getOrderNo())); t.setEstimateCost(estimateCost); t.setEstimateRefundable(paymentAmount.subtract(estimateCost)); newOrderChangeMapper.insertSelective(t); NewOrderChangeBo ncb=newOrderChangeMapper.selectByorderNo(t.getOrderNo()); OrderChangeLog ocl=new OrderChangeLog(); ocl.setAuditor(TokenManager.getAdminId()); ocl.setOrderNo(t.getOrderNo()); ocl.setRemarks(startRemarks); ocl.setChangeId(ncb.getId()); ocl.setStatus(0); orderChangeLogMapper.insertSelective(ocl); return 1; } /* * 新增审核流程中的 */ private void insertOrderExamine(String orderNo) { List list=tOrderTaskMapper.selectOrderTask(orderNo); for (TOrderTaskBo t : list) { if (t.getConsultantId()!=null) { OrderExamine o=new OrderExamine(); o.setAid(t.getConsultantId()); o.setOrderNo(orderNo); o.setCreateTime(new Date()); o.setType(0);//咨询师 o.setStatus(0);//正常 orderExamineMapper.insertSelective(o); } if (t.getConsultantId()!=null) { OrderExamine o=new OrderExamine(); o.setAid(t.getConsultantId()); o.setOrderNo(orderNo); o.setCreateTime(new Date()); o.setType(1);//咨询师经理 o.setStatus(0);//正常 orderExamineMapper.insertSelective(o); } } } @Override public NewOrderChangeBo orderChangeDetails(String orderNo) { NewOrderChangeBo nb=newOrderChangeMapper.selectByorderNo(orderNo); return nb; } @Override public NewOrderChangeBo orderChangeDetailsById(Integer id) { NewOrderChangeBo nb=newOrderChangeMapper.selectById(id); return nb; } @Override public int pushOrderChangeAudit(String orderNo, String remarks, Integer status,Integer processState,Integer rejectState) { NewOrderChangeBo nb=newOrderChangeMapper.selectByorderNo(orderNo); if (processState==null||(nb.getProcessState()!=9&&processState !=nb.getProcessState()) ) { throw new BusinessException(new Error( "变更流程与您所操作流程不匹配","变更流程与您所操作流程不匹配")); } if (nb.getStatus()==4) { throw new BusinessException(new Error( "变更流程已通过审核","变更流程已通过审核")); } //2通过 3驳回 if (status==2) { //变更类型 0退单退款 1项目及金额变更 2仅项目变更 3仅金额变更 4重报 5赠送 if(nb.getType() !=null){ if (nb.getChangeAmount().compareTo(new BigDecimal("0.2"))<0) {//小于则总裁通过,大于则董事长 if(nb.getProcessState()==7) {//总裁项目变更通过 nb.setStatus(2); } }else { if(nb.getProcessState()==8) {//董事长项目变更通过 nb.setStatus(2); } } if(nb.getProcessState()==1){//营销管理通过则设置技术管理员通过表 nb.setProcessState(nb.getProcessState()+1); insertOrderExamine(orderNo); }else if(nb.getProcessState()==2){//咨询师 //找出当时人的审核改为通过 orderExamineMapper.updateByOrderNoAndAid(orderNo,TokenManager.getAdminId(),0); //全部通过了则跳下个流程 if (orderExamineMapper.checkCountStatus(orderNo,0)<1) { nb.setProcessState(nb.getProcessState()+1); } }else if(nb.getProcessState()==3){//咨询师经理 //找出当时人的审核改为通过 orderExamineMapper.updateByOrderNoAndAid(orderNo,TokenManager.getAdminId(),1); //全部通过了则跳下个流程 if (orderExamineMapper.checkCountStatus(orderNo,1)<1) { nb.setProcessState(nb.getProcessState()+1); } }else if(nb.getProcessState()!=7&&nb.getProcessState()!=8) { nb.setProcessState(nb.getProcessState()+1); } } /*else { if(nb.getProcessState()==9) { //changgeAdopt(nb); 取消订单变更完成 } //流程状态 0营销员 1营销管理员 2技术员 3技术经理 4技术总监 5财务专员(退单) 6财务总监 7总裁 8董事长 9 财务专员(非退单) if (nb.getProcessState()==1) nb.setProcessState(7); else if (nb.getProcessState()==7)nb.setProcessState(9); }*/ //去掉第二条线 if(nb.getStatus()==3) { nb.setStatus(1);//如果驳回数据则改为正常数据 } }else { nb.setProcessState(rejectState); nb.setStatus(3);//订单变更设置为驳回 } OrderChangeLog ocl=new OrderChangeLog(); ocl.setAuditor(TokenManager.getAdminId()); ocl.setOrderNo(orderNo); ocl.setRemarks(remarks); ocl.setChangeId(nb.getId()); ocl.setStatus(status); orderChangeLogMapper.insertSelective(ocl); newOrderChangeMapper.updateByPrimaryKeySelective(nb); return 1; } private void changgeAdopt(NewOrderChangeBo nb) { TOrderNew t1=tOrderNewMapper.selectByPrimaryKey(nb.getOrderNo()); List td1=tOrderDunMapper.selectByOrderNo(nb.getOrderNo()); List tt1=tOrderTaskMapper.selectOrderTask(nb.getOrderNo()); List tl1=tOrderLogMapper.selectOrderByNo(nb.getOrderNo()); String newOrderNo=idGenerator.generateId().toString(); t1.setOrderNo(newOrderNo); t1.setDeleteSign(1);//将原订单作废,只能查看 tOrderNewMapper.insertSelective(t1); for (TOrderTaskBo tOrderTaskBo : tt1) { tOrderTaskBo.setId(null); tOrderTaskBo.setOrderNo(newOrderNo); tOrderTaskMapper.insertSelective(tOrderTaskBo); } for (TOrderDun tOrderDun : td1) { tOrderDun.setId(UUID.randomUUID().toString()); tOrderDun.setOrderNo(newOrderNo); tOrderDunMapper.insertSelective(tOrderDun); } for (TOrderLogBo tOrderLogBo : tl1) { tOrderLogBo.setId(null); tOrderLogBo.setOrderNo(newOrderNo); tOrderLogMapper.insertSelective(tOrderLogBo); } nb.setStatus(4); //将订单恢复正常 TOrderNew orderNew =new TOrderNew(); TOrderNew additionalOrder =new TOrderNew(); String additionalOrderNo; orderNew.setOrderNo(nb.getOrderNo()); orderNew.setDeleteSign(3);//设置为变更中 orderNew.setPrimaryOrder(newOrderNo); if (nb.getType()==4||nb.getType()==5) {//重报或者赠送 additionalOrderNo=idGenerator.generateId().toString(); orderNew.setAdditionalOrder(additionalOrderNo); additionalOrder.setOrderNo(additionalOrderNo); additionalOrder.setCreater(TokenManager.getAdminId()); additionalOrder.setContractNo(t1.getContractNo()); additionalOrder.setSalesmanId(t1.getSalesmanId()); additionalOrder.setOrderType(t1.getOrderType()); additionalOrder.setBuyerId(t1.getBuyerId()); tOrderNewMapper.insertSelective(additionalOrder); } tOrderNewMapper.updateByPrimaryKeySelective(orderNew); } @Override public boolean checkOderNo(String orderNo) { int i=newOrderChangeMapper.checkOderNo(orderNo); if (i>0) { return true; } return false; } @Override public List selectOrderChangeLogList(String changeId) { return orderChangeLogMapper.selectOrderChangeLogList(changeId); } @SuppressWarnings("unchecked") @Override public Pagination selectOrderChangeList(String userName,Integer processState,Integer timeType,String startTime,String endTime, String depId,String salesmanName,Integer complete,Integer pageSize, Integer pageNo) { Map parameter=new HashMap(); if(pageSize==null||pageSize<0)pageSize=10; if(pageNo==null||pageNo<0)pageNo=1; parameter.put("processState", processState==null?0:processState); parameter.put("complete", complete==null?0:complete); if (StringUtils.isNotBlank(userName)) parameter.put("userName", userName); if (null!=processState) parameter.put("processState", processState); if (null!=timeType) parameter.put("timeType", timeType); if (StringUtils.isNotBlank(startTime)) parameter.put("startTime", startTime); if (StringUtils.isNotBlank(endTime)) parameter.put("endTime", endTime+" 23:59:59"); if (StringUtils.isNotBlank(depId)) parameter.put("depId", depId); if (StringUtils.isNotBlank(salesmanName)) parameter.put("salesmanName", salesmanName); parameter.put("aid", TokenManager.getAdminId()); parameter.put("deps", orderService.selectMyDeps()); Pagination data = (Pagination)findPage("selectOrderChangeList", "selectOrderChangeCount", parameter, pageNo, pageSize); return data; } @Override public int updateOrderChange(NewOrderChangeBo t,Integer changeType,String startRemarks) { NewOrderChange noc=new NewOrderChange(); noc.setId(t.getId()); if (changeType==0) { noc.setRemarks(t.getRemarks()); noc.setType(t.getType()); noc.setVoucherUrl(t.getVoucherUrl()); noc.setTotalAmount(t.getTotalAmount()); noc.setSettlementAmount(t.getSettlementAmount()); noc.setChangeAmount(t.getChangeAmount()); noc.setApplicant(t.getApplicant()); noc.setStatus(1);//订单置为正常 noc.setProcessState(1);//流程置为营销管理员 noc.setDepName(t.getDepName()); OrderChangeLog ocl=new OrderChangeLog(); ocl.setAuditor(TokenManager.getAdminId()); ocl.setOrderNo(t.getOrderNo()); ocl.setRemarks(startRemarks); ocl.setChangeId(noc.getId()); ocl.setStatus(0); orderChangeLogMapper.insertSelective(ocl); }else if (changeType==2) { try { noc.setPaymentTime(DateUtils.StringToDate(t.getPaymentTimes(), AFTConstants.YYYYMMDD)); noc.setInvoiceTime(DateUtils.StringToDate(t.getInvoiceTimes(), AFTConstants.YYYYMMDD)); } catch (ParseException e) { e.printStackTrace(); } noc.setCwCost(t.getCwCost()); noc.setRefundableAmount(t.getRefundableAmount()); } return newOrderChangeMapper.updateByPrimaryKeySelective(noc); } @Override public int addOrderRefundInvoice(OrderRefundInvoice o) { o.setCreateTime(new Date()); newOrderChangeMapper.addRefundInvoice(o.getOrderNo(),o.getAmount()); return orderRefundInvoiceMapper.insertSelective(o); } @Override public int deleteOrderRefundInvoice(Integer id) { OrderRefundInvoice or=orderRefundInvoiceMapper.selectByPrimaryKey(id); newOrderChangeMapper.subtractRefundInvoice(or.getOrderNo(),or.getAmount()); return orderRefundInvoiceMapper.deleteByPrimaryKey(id); } @Override public List listOrderRefundInvoice(String orderNo) { return orderRefundInvoiceMapper.selectByorderNo(orderNo); } @Override public int pushCompleteOrderChange(NewOrderChangeBo nb) { changgeAdopt(nb); newOrderChangeMapper.updateByPrimaryKeySelective(nb); return 1; } @Override public Map listOrderInvoiceAndBill(String orderNo) { Map map=new HashMap<>(); Listlist=tOrderBillNewMapper.selectByOrderNo(orderNo); Listlist2=tOrderInvoiceMapper.selectByOrderNo(orderNo); map.put("bill", list); map.put("invoice", list2); return map; } }